[pypy-commit] pypy vecopt: finished impl of float_ne with guards

plan_rich noreply at buildbot.pypy.org
Wed Jul 29 13:00:55 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt
Changeset: r78706:924ff20716c0
Date: 2015-07-29 13:00 +0200
http://bitbucket.org/pypy/pypy/changeset/924ff20716c0/

Log:	finished impl of float_ne with guards

diff --git a/rpython/jit/backend/x86/vector_ext.py b/rpython/jit/backend/x86/vector_ext.py
--- a/rpython/jit/backend/x86/vector_ext.py
+++ b/rpython/jit/backend/x86/vector_ext.py
@@ -197,9 +197,10 @@
         guard_opnum = guard_op.getopnum()
         if guard_opnum == rop.GUARD_TRUE:
             self._guard_vector_true(op, arglocs[0])
+            self.implement_guard(guard_token, 'NZ')
         else:
             self._guard_vector_false(op, arglocs[0])
-        self.implement_guard(guard_token, 'NZ')
+            self.implement_guard(guard_token, 'NZ')
 
     def genop_vec_int_mul(self, op, arglocs, resloc):
         loc0, loc1, itemsize_loc = arglocs
@@ -289,16 +290,6 @@
         elif size == 8:
             self.mc.XORPD(src, heap(self.float_const_neg_addr))
 
-    def genop_guard_vec_float_eq(self, op, guard_op, guard_token, arglocs, resloc):
-        lhsloc, rhsloc, sizeloc = arglocs
-        self.genop_vec_float_eq(op, arglocs, lhsloc) # yields one bits if they are equal
-        self.mc.PTEST(lhsloc, lhsloc)
-        guard_opnum = guard_op.getopnum()
-        if guard_opnum == rop.GUARD_TRUE:
-            self.implement_guard(guard_token, 'NZ')
-        else:
-            self.implement_guard(guard_token, 'Z')
-
     def genop_vec_float_eq(self, op, arglocs, resloc):
         _, rhsloc, sizeloc = arglocs
         size = sizeloc.value
@@ -307,16 +298,6 @@
         else:
             self.mc.CMPPD_xxi(resloc.value, rhsloc.value, 0)
 
-    def genop_guard_vec_float_ne(self, op, guard_op, guard_token, arglocs, resloc):
-        lhsloc, rhsloc, sizeloc = arglocs
-        self.genop_vec_float_ne(op, arglocs, lhsloc) # yields one bits if they are equal
-        self.mc.PTEST(lhsloc, lhsloc)
-        guard_opnum = guard_op.getopnum()
-        if guard_opnum == rop.GUARD_TRUE:
-            self.implement_guard(guard_token, 'NZ')
-        else:
-            self.implement_guard(guard_token, 'Z')
-
     def genop_vec_float_ne(self, op, arglocs, resloc):
         _, rhsloc, sizeloc = arglocs
         size = sizeloc.value
@@ -326,6 +307,28 @@
         else:
             self.mc.CMPPD_xxi(resloc.value, rhsloc.value, 1 << 2)
 
+    def gen_float_cmp(func):
+        def genop_float_cmp(self, op, guard_op, guard_token, arglocs, resloc):
+            lhsloc, rhsloc, sizeloc = arglocs
+            size = sizeloc.value
+            func(self, op, arglocs, lhsloc) # yields one bits if they are equal
+            guard_opnum = guard_op.getopnum()
+            if guard_opnum == rop.GUARD_TRUE:
+                temp = X86_64_XMM_SCRATCH_REG
+                self.mc.PXOR(temp, temp) # set all to zero
+                self.mc.PCMPEQ(lhsloc, temp, size)
+                self.mc.PCMPEQQ(temp, temp) # set all bits to 1
+                self.mc.PTEST(lhsloc, temp)
+                self.implement_guard(guard_token, 'NZ')
+            else:
+                self.mc.PTEST(lhsloc, lhsloc)
+                self.implement_guard(guard_token, 'NZ')
+        return genop_float_cmp
+
+    genop_guard_vec_float_eq = gen_float_cmp(genop_vec_float_eq)
+    genop_guard_vec_float_ne = gen_float_cmp(genop_vec_float_ne)
+    del gen_float_cmp
+
     def genop_vec_int_signext(self, op, arglocs, resloc):
         srcloc, sizeloc, tosizeloc = arglocs
         size = sizeloc.value


More information about the pypy-commit mailing list