[pypy-svn] pypy jit-longlong: Finish the first set of operations in the codewriter.

arigo commits-noreply at bitbucket.org
Fri Jan 7 11:48:14 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: jit-longlong
Changeset: r40446:a02e00903fdc
Date: 2011-01-07 11:40 +0100
http://bitbucket.org/pypy/pypy/changeset/a02e00903fdc/

Log:	Finish the first set of operations in the codewriter.

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
@@ -39,20 +39,22 @@
         tr = Transformer(FakeCPU(), FakeBuiltinCallControl())
         [op1] = tr.rewrite_operation(op)
         #
-        def is_ll(TYPE):
+        def is_llf(TYPE):
             return (TYPE == lltype.SignedLongLong or
-                    TYPE == lltype.UnsignedLongLong)
-        assert [ARG for ARG in ARGS if is_ll(ARG)]
-        if is_ll(RESULT):
+                    TYPE == lltype.UnsignedLongLong or
+                    TYPE == lltype.Float)
+        if is_llf(RESULT):
             assert op1.opname == 'residual_call_irf_f'
         else:
             assert op1.opname == 'residual_call_irf_i'
         gotindex = getattr(EffectInfo, 'OS_' + op1.args[0].value.upper())
         assert gotindex == oopspecindex
         assert op1.args[1] == 'calldescr-%d' % oopspecindex
-        assert list(op1.args[2]) == []
+        assert list(op1.args[2]) == [v for v in vlist
+                                     if not is_llf(v.concretetype)]
         assert list(op1.args[3]) == []
-        assert list(op1.args[4]) == vlist
+        assert list(op1.args[4]) == [v for v in vlist
+                                     if is_llf(v.concretetype)]
         assert op1.result == v_result
 
     def test_is_true(self):
@@ -115,27 +117,28 @@
                 T = lltype.SignedLongLong
             self.do_check(opname, oopspecindex, [T, T], T)
 
+    def test_shifts(self):
+        for opname, oopspecindex in [
+                ('llong_lshift',  EffectInfo.OS_LLONG_LSHIFT),
+                ('llong_rshift',  EffectInfo.OS_LLONG_RSHIFT),
+                ('ullong_lshift', EffectInfo.OS_LLONG_LSHIFT),
+                ('ullong_rshift', EffectInfo.OS_LLONG_URSHIFT),
+                ]:
+            if opname.startswith('u'):
+                T = lltype.UnsignedLongLong
+            else:
+                T = lltype.SignedLongLong
+            self.do_check(opname, oopspecindex, [T, lltype.Signed], T)
 
-
-##                ('llong_lshift', EffectInfo.OS_LLONG_LSHIFT),
-##                ('', EffectInfo.OS_LLONG_RSHIFT),
-
-
-##    'llong_lshift':         LLOp(canfold=True),
-##    'llong_rshift':         LLOp(canfold=True),
-
-##    'ullong_lshift':        LLOp(canfold=True),
-##    'ullong_rshift':        LLOp(canfold=True),
-
-##            ]:
-
-
-
-##                ('', EffectInfo.OS_LLONG_FROM_INT),
-##                ('', EffectInfo.OS_LLONG_TO_INT),
-##                ('', EffectInfo.OS_LLONG_FROM_FLOAT),
-##                ('', EffectInfo.OS_LLONG_TO_FLOAT),
-
+    def test_casts(self):
+        self.do_check('cast_int_to_longlong', EffectInfo.OS_LLONG_FROM_INT,
+                      [lltype.Signed], lltype.SignedLongLong)
+        self.do_check('truncate_longlong_to_int', EffectInfo.OS_LLONG_TO_INT,
+                      [lltype.SignedLongLong], lltype.Signed)
+        self.do_check('cast_float_to_longlong', EffectInfo.OS_LLONG_FROM_FLOAT,
+                      [lltype.Float], lltype.SignedLongLong)
+        self.do_check('cast_longlong_to_float', EffectInfo.OS_LLONG_TO_FLOAT,
+                      [lltype.SignedLongLong], lltype.Float)
 
     def test_prebuilt_constant_32(self):
         c_x = const(r_longlong(-171))

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
@@ -19,7 +19,7 @@
 from pypy.rpython.annlowlevel import MixLevelHelperAnnotator
 from pypy.jit.metainterp.typesystem import deref
 from pypy.rlib import rgc
-from pypy.rlib.rarithmetic import r_longlong, r_ulonglong
+from pypy.rlib.rarithmetic import r_longlong, r_ulonglong, intmask
 from pypy.rlib.longlong2float import longlong2float, float2longlong
 
 def getargtypes(annotator, values):
@@ -327,10 +327,37 @@
     z = x ^ y
     return longlong2float(z)
 
+def _ll_2_llong_lshift(xf, y):
+    x = float2longlong(xf)
+    z = x << y
+    return longlong2float(z)
+
+def _ll_2_llong_rshift(xf, y):
+    x = float2longlong(xf)
+    z = x >> y
+    return longlong2float(z)
+
+def _ll_2_llong_urshift(xf, y):
+    x = float2longlong(xf)
+    z = r_ulonglong(x) >> y
+    return longlong2float(r_longlong(z))
+
 def _ll_1_llong_from_int(x):
     y = r_longlong(x)
     return longlong2float(y)
 
+def _ll_1_llong_to_int(xf):
+    x = float2longlong(xf)
+    return intmask(x)
+
+def _ll_1_llong_from_float(xf):
+    y = r_longlong(xf)
+    return longlong2float(y)
+
+def _ll_1_llong_to_float(xf):
+    x = float2longlong(xf)
+    return float(x)
+
 
 # libffi support
 # --------------

diff --git a/pypy/jit/codewriter/effectinfo.py b/pypy/jit/codewriter/effectinfo.py
--- a/pypy/jit/codewriter/effectinfo.py
+++ b/pypy/jit/codewriter/effectinfo.py
@@ -72,6 +72,7 @@
     OS_LLONG_ULE                = 89
     OS_LLONG_UGT                = 90
     OS_LLONG_UGE                = 91
+    OS_LLONG_URSHIFT            = 92
 
     def __new__(cls, readonly_descrs_fields,
                 write_descrs_fields, write_descrs_arrays,

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
@@ -833,6 +833,14 @@
                           ('ullong_and',    'AND'),
                           ('ullong_or',     'OR'),
                           ('ullong_xor',    'XOR'),
+                          ('llong_lshift',  'LSHIFT'),
+                          ('llong_rshift',  'RSHIFT'),
+                          ('ullong_lshift', 'LSHIFT'),
+                          ('ullong_rshift', 'URSHIFT'),
+                          ('cast_int_to_longlong',     'FROM_INT'),
+                          ('truncate_longlong_to_int', 'TO_INT'),
+                          ('cast_float_to_longlong',   'FROM_FLOAT'),
+                          ('cast_longlong_to_float',   'TO_FLOAT'),
                           ]:
         exec py.code.Source('''
             def rewrite_op_%s(self, op):


More information about the Pypy-commit mailing list