Author: Armin Rigo <ar...@tunes.org>
Branch: 
Changeset: r67900:e12176e1a61c
Date: 2013-11-09 17:33 +0100
http://bitbucket.org/pypy/pypy/changeset/e12176e1a61c/

Log:    Support ptradd() with types different than CCHARP.

diff --git a/rpython/jit/codewriter/jtransform.py 
b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -1162,10 +1162,19 @@
                                   v_result)
 
     def rewrite_op_direct_ptradd(self, op):
-        # xxx otherwise, not implemented:
-        assert op.args[0].concretetype == rffi.CCHARP
+        v_shift = op.args[1]
+        assert v_shift.concretetype == lltype.Signed
+        ops = []
         #
-        return SpaceOperation('int_add', [op.args[0], op.args[1]], op.result)
+        if op.args[0].concretetype != rffi.CCHARP:
+            v_prod = varoftype(lltype.Signed)
+            by = llmemory.sizeof(op.args[0].concretetype.TO.OF)
+            c_by = Constant(by, lltype.Signed)
+            ops.append(SpaceOperation('int_mul', [v_shift, c_by], v_prod))
+            v_shift = v_prod
+        #
+        ops.append(SpaceOperation('int_add', [op.args[0], v_shift], op.result))
+        return ops
 
     # ----------
     # Long longs, for 32-bit only.  Supported operations are left unmodified,
diff --git a/rpython/jit/codewriter/test/test_flatten.py 
b/rpython/jit/codewriter/test/test_flatten.py
--- a/rpython/jit/codewriter/test/test_flatten.py
+++ b/rpython/jit/codewriter/test/test_flatten.py
@@ -993,6 +993,16 @@
             int_return %i2
         """, transform=True)
 
+    def test_direct_ptradd_2(self):
+        def f(p, n):
+            return lltype.direct_ptradd(p, n + 2)
+        self.encoding_test(f, [lltype.nullptr(rffi.SHORTP.TO), 123], """
+            int_add %i1, $2 -> %i2
+            int_mul %i2, $<ItemOffset <SHORT> 1> -> %i3
+            int_add %i0, %i3 -> %i4
+            int_return %i4
+        """, transform=True)
+
     def test_convert_float_bytes(self):
         from rpython.rlib.longlong2float import float2longlong, longlong2float
         def f(x):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to