[pypy-svn] r72402 - pypy/trunk/pypy/jit/backend/x86

arigo at codespeak.net arigo at codespeak.net
Fri Mar 19 03:31:58 CET 2010


Author: arigo
Date: Fri Mar 19 03:31:56 2010
New Revision: 72402

Modified:
   pypy/trunk/pypy/jit/backend/x86/assembler.py
Log:
Minimal change to avoid JP in case it's not needed.
A slightly larger change would be to remove JP also
for GUARD_LT and GUARD_LE, by exchanging the two
arguments so that they become GUARD_GT and GUARD_GE.


Modified: pypy/trunk/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/x86/assembler.py	(original)
+++ pypy/trunk/pypy/jit/backend/x86/assembler.py	Fri Mar 19 03:31:56 2010
@@ -568,7 +568,7 @@
                     return self.implement_guard(addr, getattr(self.mc, name)), 0
         return genop_cmp_guard
 
-    def _cmpop_guard_float(cond, false_cond):
+    def _cmpop_guard_float(cond, false_cond, need_jp):
         def genop_cmp_guard_float(self, op, guard_op, addr, arglocs,
                                   result_loc):
             guard_opnum = guard_op.opnum
@@ -576,13 +576,17 @@
             if guard_opnum == rop.GUARD_FALSE:
                 mc = self.mc._mc
                 name = 'J' + cond
-                mc.JP(rel32(mc.tell() + 12))
+                if need_jp:
+                    mc.JP(rel32(mc.tell() + 12))
                 getattr(mc, name)(rel32(addr))
                 return mc.tell() - 4, 0
             else:
                 name = 'J' + false_cond
                 addr1 = self.implement_guard(addr, getattr(self.mc, name))
-                addr2 = self.implement_guard(addr, self.mc.JP)
+                if need_jp:
+                    addr2 = self.implement_guard(addr, self.mc.JP)
+                else:
+                    addr2 = 0
                 return addr1, addr2
         return genop_cmp_guard_float
 
@@ -672,11 +676,11 @@
     genop_guard_uint_le = _cmpop_guard("BE", "AE", "A", "B")
     genop_guard_uint_ge = _cmpop_guard("AE", "BE", "B", "A")
 
-    genop_guard_float_lt = _cmpop_guard_float("B", "AE")
-    genop_guard_float_le = _cmpop_guard_float("BE", "A")
-    genop_guard_float_eq = _cmpop_guard_float("E", "NE")
-    genop_guard_float_gt = _cmpop_guard_float("A", "BE")
-    genop_guard_float_ge = _cmpop_guard_float("AE", "B")
+    genop_guard_float_lt = _cmpop_guard_float("B", "AE", True)
+    genop_guard_float_le = _cmpop_guard_float("BE", "A", True)
+    genop_guard_float_eq = _cmpop_guard_float("E", "NE", True)
+    genop_guard_float_gt = _cmpop_guard_float("A", "BE", False)
+    genop_guard_float_ge = _cmpop_guard_float("AE", "B", False)
 
     def genop_guard_float_ne(self, op, guard_op, addr, arglocs, result_loc):
         guard_opnum = guard_op.opnum



More information about the Pypy-commit mailing list