[pypy-svn] pypy jit-longlong: Remove constants of type (Un)signedLongLong.

arigo commits-noreply at bitbucket.org
Fri Jan 7 11:00:38 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40440:80408b4bf193
Date: 2011-01-07 10:56 +0100
http://bitbucket.org/pypy/pypy/changeset/80408b4bf193/

Log:	Remove constants of type (Un)signedLongLong.

diff --git a/pypy/jit/codewriter/test/test_longlong.py b/pypy/jit/codewriter/test/test_longlong.py
--- a/pypy/jit/codewriter/test/test_longlong.py
+++ b/pypy/jit/codewriter/test/test_longlong.py
@@ -22,8 +22,8 @@
         return False
 
 class FakeCPU:
-    def __init__(self, supports_longlong):
-        self.supports_longlong = supports_longlong
+    def __init__(self):
+        self.supports_longlong = []
         self.rtyper = FakeRTyper()
 
 
@@ -36,8 +36,8 @@
         vlist = [varoftype(ARG) for ARG in ARGS]
         v_result = varoftype(RESULT)
         op = SpaceOperation(opname, vlist, v_result)
-        tr = Transformer(FakeCPU([]), FakeBuiltinCallControl())
-        op1 = tr.rewrite_operation(op)
+        tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+        [op1] = tr.rewrite_operation(op)
         #
         def is_ll(TYPE):
             return (TYPE == lltype.SignedLongLong or
@@ -61,7 +61,7 @@
                       [lltype.SignedLongLong], lltype.Bool)
 
 ##    def test_unary_op(self):
-##        tr = Transformer(FakeCPU([]), FakeBuiltinCallControl())
+##        tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
 ##        for opname, oopspecindex in [
 ##                ('llong_neg',     EffectInfo.OS_LLONG_NEG),
 ##                ('llong_invert',  EffectInfo.OS_LLONG_INVERT),
@@ -84,7 +84,7 @@
                       [lltype.UnsignedLongLong, lltype.UnsignedLongLong],
                       lltype.UnsignedLongLong)
 
-##        tr = Transformer(FakeCPU([]), FakeBuiltinCallControl())
+##        tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
 ##        for opname, oopspecindex in [
 ##                ('llong_add',    EffectInfo.OS_LLONG_ADD),
 ##                ('llong_sub',    EffectInfo.OS_LLONG_SUB),
@@ -158,14 +158,26 @@
 ##                ('', EffectInfo.OS_LLONG_TO_FLOAT),
 
 
-##    def test_prebuilt_constant_32(self):
-##        c_x = const(r_longlong(-171))
-##        op = SpaceOperation('foobar', [c_x], None)
-##        oplist = Transformer(FakeCPU(['foobar'])).rewrite_operation(op)
-##        assert len(oplist) == 2
-##        assert oplist[0].opname == 'cast_int_to_longlong'
-##        assert oplist[0].args == [c_x]
-##        v = oplist[0].result
-##        assert isinstance(v, Variable)
-##        assert oplist[1].opname == 'foobar'
-##        assert oplist[1].args == [v]
+    def test_prebuilt_constant_32(self):
+        c_x = const(r_longlong(-171))
+        v_y = varoftype(lltype.SignedLongLong)
+        v_z = varoftype(lltype.SignedLongLong)
+        op = SpaceOperation('llong_add', [c_x, v_y], v_z)
+        tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
+        oplist = tr.rewrite_operation(op)
+        assert len(oplist) == 2
+        assert oplist[0].opname == 'residual_call_irf_f'
+        assert oplist[0].args[0].value == 'llong_from_int'
+        assert oplist[0].args[1] == 'calldescr-84'
+        assert list(oplist[0].args[2]) == [const(-171)]
+        assert list(oplist[0].args[3]) == []
+        assert list(oplist[0].args[4]) == []
+        v_x = oplist[0].result
+        assert isinstance(v_x, Variable)
+        assert oplist[1].opname == 'residual_call_irf_f'
+        assert oplist[1].args[0].value == 'llong_add'
+        assert oplist[1].args[1] == 'calldescr-70'
+        assert list(oplist[1].args[2]) == []
+        assert list(oplist[1].args[3]) == []
+        assert list(oplist[1].args[4]) == [v_x, v_y]
+        assert oplist[1].result == v_z

diff --git a/pypy/jit/codewriter/support.py b/pypy/jit/codewriter/support.py
--- a/pypy/jit/codewriter/support.py
+++ b/pypy/jit/codewriter/support.py
@@ -237,6 +237,10 @@
     z = x + y
     return longlong2float(z)
 
+def _ll_1_llong_from_int(x):
+    xf = r_longlong(x)
+    return longlong2float(xf)
+
 
 # libffi support
 # --------------

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
@@ -783,14 +783,39 @@
     # and unsupported ones are turned into a call to a function from
     # jit.codewriter.support.
 
+    @staticmethod
+    def _is_longlong(TYPE):
+        return TYPE == lltype.SignedLongLong or TYPE == lltype.UnsignedLongLong
+
+    def _remove_longlong_constants(self, args, oplist):
+        for i in range(len(args)):
+            if (isinstance(args[i], Constant) and
+                    self._is_longlong(args[i].concretetype)):
+                v_x = varoftype(args[i].concretetype)
+                value = args[i].value
+                assert -2147483648 <= value <= 2147483647     # XXX!
+                c_x = Constant(int(value), lltype.Signed)
+                op0 = SpaceOperation('llong_from_int', [c_x], v_x)
+                op1 = self.prepare_builtin_call(op0, "llong_from_int", [c_x])
+                op2 = self._handle_oopspec_call(op1, [c_x],
+                                                EffectInfo.OS_LLONG_FROM_INT)
+                oplist.append(op2)
+                args = args[:]
+                args[i] = v_x
+        return args
+
     for _op in ['is_true',
                 'add',
                 ]:
         exec py.code.Source('''
             def rewrite_op_llong_%s(self, op):
-                op1 = self.prepare_builtin_call(op, "llong_%s", op.args)
-                return self._handle_oopspec_call(op1, op.args,
-                                                 EffectInfo.OS_LLONG_%s)
+                oplist = []
+                args = self._remove_longlong_constants(op.args, oplist)
+                op1 = self.prepare_builtin_call(op, "llong_%s", args)
+                op2 = self._handle_oopspec_call(op1, args,
+                                                EffectInfo.OS_LLONG_%s)
+                oplist.append(op2)
+                return oplist
             rewrite_op_ullong_%s = rewrite_op_llong_%s
         ''' % (_op, _op, _op.upper(), _op, _op)).compile()
 


More information about the Pypy-commit mailing list