[pypy-svn] pypy jit-longlong: Intermediate check-in, breaks everything by exposing cases of

arigo commits-noreply at bitbucket.org
Sun Jan 9 23:33:34 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40545:9a472ddf9893
Date: 2011-01-09 23:33 +0100
http://bitbucket.org/pypy/pypy/changeset/9a472ddf9893/

Log:	Intermediate check-in, breaks everything by exposing cases of
	constant arguments that are not correctly handled so far. /me is
	again annoyed by the API of regalloc.py, which seems to be very
	reasonable, until we hit these cases.

diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -1174,6 +1174,13 @@
         self.mc.SBB_rr(resloc.value, resloc.value)
         self.mc.NEG_r(resloc.value)
 
+    def genop_llong_lt(self, op, arglocs, resloc):
+        # XXX just a special case for now: "x < 0"
+        loc1, = arglocs
+        self.mc.PMOVMSKB_rx(resloc.value, loc1.value)
+        self.mc.SHR_ri(resloc.value, 7)
+        self.mc.AND_ri(resloc.value, 1)
+
     def genop_new_with_vtable(self, op, arglocs, result_loc):
         assert result_loc is eax
         loc_vtable = arglocs[-1]
@@ -1784,6 +1791,7 @@
             if isinstance(op.getdescr(), LongLongCallDescr):
                 self.mc.MOV_br(resloc.value, eax.value)      # long long
                 self.mc.MOV_br(resloc.value + 4, edx.value)
+                # XXX should ideally not move the result on the stack
             else:
                 self.mc.FSTP_b(resloc.value)   # float return
         elif size == WORD:

diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -894,7 +894,8 @@
                 args = op.args
                 op1 = self.prepare_builtin_call(op, "llong_%s", args)
                 op2 = self._handle_oopspec_call(op1, args,
-                                                EffectInfo.OS_LLONG_%s)
+                                                EffectInfo.OS_LLONG_%s,
+                                                EffectInfo.EF_PURE)
                 return op2
         ''' % (_op, _oopspec.lower(), _oopspec)).compile()
 
@@ -1273,7 +1274,7 @@
 
     def _handle_oopspec_call(self, op, args, oopspecindex, extraeffect=None):
         calldescr = self.callcontrol.getcalldescr(op, oopspecindex)
-        if extraeffect:
+        if extraeffect is not None:
             calldescr.get_extra_info().extraeffect = extraeffect
         if isinstance(op.args[0].value, str):
             pass  # for tests only

diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -653,6 +653,22 @@
         self.PerformLLong(op, [loc1, loc2, loc3], loc0)
         self.xrm.possibly_free_vars(args)
 
+    def _maybe_consider_llong_lt(self, op):
+        # XXX just a special case for now
+        from pypy.rlib.longlong2float import longlong2float
+        box = op.getarg(2)
+        if not isinstance(box, ConstFloat):
+            return False
+        if not (box.value == longlong2float(r_longlong(0))):
+            return False
+        # "x < 0"
+        box = op.getarg(1)
+        loc1 = self.xrm.make_sure_var_in_reg(box, imm_fine=False)
+        loc0 = self.rm.force_allocate_reg(op.result)
+        self.PerformLLong(op, [loc1], loc0)
+        self.xrm.possibly_free_var(box)
+        return True
+
     def _consider_llong_to_int(self, op):
         # accept an argument in a xmm register or in the stack
         loc1 = self.xrm.loc(op.getarg(1))
@@ -769,6 +785,9 @@
                 if (oopspecindex == EffectInfo.OS_LLONG_EQ or
                     oopspecindex == EffectInfo.OS_LLONG_NE):
                     return self._consider_llong_cmp_xx(op)
+                if oopspecindex == EffectInfo.OS_LLONG_LT:
+                    if self._maybe_consider_llong_lt(op):
+                        return
         #
         self._consider_call(op)
 


More information about the Pypy-commit mailing list