[pypy-commit] pypy vecopt: fixed guard_false for packed arguments, the last test (set_slice) not working

plan_rich noreply at buildbot.pypy.org
Sat Jun 27 19:24:29 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78332:ccca4d45dd30
Date: 2015-06-27 19:24 +0200
http://bitbucket.org/pypy/pypy/changeset/ccca4d45dd30/

Log:	fixed guard_false for packed arguments, the last test (set_slice)
	not working

diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -570,12 +570,12 @@
     def test_any_float(self):
         result = self.run("float_any")
         assert int(result) == 1
-        self.check_vectorized(2, 2)
+        self.check_vectorized(1, 1)
 
     def test_any_float32(self):
         result = self.run("float32_any")
         assert int(result) == 1
-        self.check_vectorized(1, 1)
+        self.check_vectorized(2, 2)
 
     def test_any(self):
         result = self.run("any")
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1644,7 +1644,7 @@
             self.mc.MOVD32_xr(resloc.value, eax.value)
             self.mc.PUNPCKLDQ_xx(resloc.value, loc1.value)
 
-    def _guard_vector_arg(self, guard_op, loc, zero=False):
+    def _guard_vector_true(self, guard_op, loc, zero=False):
         arg = guard_op.getarg(0)
         assert isinstance(arg, BoxVector)
         size = arg.item_size
@@ -1653,8 +1653,7 @@
         self.mc.PXOR(temp, temp)
         # if the vector is not fully packed blend 1s
         if not arg.fully_packed(self.cpu.vector_register_size):
-            if not zero:
-                self.mc.PCMPEQQ(temp, temp) # fill with ones
+            self.mc.PCMPEQQ(temp, temp) # fill with ones
             select = 0
             bits_used = (arg.item_count * arg.item_size * 8)
             index = bits_used // 16
@@ -1663,8 +1662,7 @@
                 index += 1
             self.mc.PBLENDW_xxi(loc.value, temp.value, select)
             # reset to zeros
-            if not zero:
-                self.mc.PXOR(temp, temp)
+            self.mc.PXOR(temp, temp)
 
         self.mc.PCMPEQ(size, loc, temp)
         self.mc.PCMPEQQ(temp, temp)
@@ -1673,7 +1671,7 @@
     def genop_guard_guard_true(self, ign_1, guard_op, guard_token, locs, ign_2):
         loc = locs[0]
         if loc.is_xmm:
-            self._guard_vector_arg(guard_op, loc, zero=False)
+            self._guard_vector_true(guard_op, loc)
             self.implement_guard(guard_token, 'NZ')
         else:
             self.mc.TEST(loc, loc)
@@ -1752,11 +1750,29 @@
         self.mc.IMUL(arglocs[0], arglocs[1])
         return self._gen_guard_overflow(guard_op, guard_token)
 
+    def _guard_vector_false(self, guard_op, loc):
+        arg = guard_op.getarg(0)
+        assert isinstance(arg, BoxVector)
+        #
+        # if the vector is not fully packed blend 1s
+        if not arg.fully_packed(self.cpu.vector_register_size):
+            temp = X86_64_XMM_SCRATCH_REG
+            self.mc.PXOR(temp, temp)
+            select = 0
+            bits_used = (arg.item_count * arg.item_size * 8)
+            index = bits_used // 16
+            while index < 8:
+                select |= (1 << index)
+                index += 1
+            self.mc.PBLENDW_xxi(loc.value, temp.value, select)
+
+        self.mc.PTEST(loc, loc)
+
     def genop_guard_guard_false(self, ign_1, guard_op, guard_token, locs, ign_2):
         loc = locs[0]
         if loc.is_xmm:
-            self._guard_vector_arg(guard_op, loc, zero=True)
-            self.implement_guard(guard_token, 'Z')
+            self._guard_vector_false(guard_op, loc)
+            self.implement_guard(guard_token, 'NZ')
         else:
             self.mc.TEST(loc, loc)
             self.implement_guard(guard_token, 'NZ')
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -1375,6 +1375,7 @@
         guard_false(i36, descr=<rpython.jit.metainterp.compile.ResumeGuardFalseDescr object at 0x7f09b34b7c10>) [p7, p6, p3, p0, i35, i24, i33, i27, None, None, i16, p9, p15, None, i10, p12, None]
         jump(p0, p9, i10, p3, i24, p12, i33, p6, i35, p7, p15, i16, i27, i18, i19, i20, i21)
         """
+        # schedule 885 -> ptype is non for raw_load?
         opt = self.vectorize(self.parse_loop(trace))
         self.debug_print_operations(opt.loop)
 


More information about the pypy-commit mailing list