Author: Richard Plangger <planri...@gmail.com>
Branch: memop-simplify2
Changeset: r80943:ddb6d7bd0eca
Date: 2015-11-25 16:00 +0100
http://bitbucket.org/pypy/pypy/changeset/ddb6d7bd0eca/

Log:    added basic transformation tests that check getarrayitem_gc_irf ->
        gc_load_irf

diff --git a/rpython/jit/backend/llsupport/llmodel.py 
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -35,7 +35,7 @@
     # can an ISA instruction handle a constant offset?
     load_constant_offset = False
     # can an ISA instruction handle a factor to the offset?
-    load_supported_factors = [1]
+    load_supported_factors = (1,)
 
     vector_extension = False
     vector_register_size = 0 # in bytes
diff --git a/rpython/jit/backend/llsupport/rewrite.py 
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -10,6 +10,7 @@
 from rpython.jit.backend.llsupport.descr import SizeDescr, ArrayDescr,\
      FLAG_POINTER
 from rpython.jit.metainterp.history import JitCellToken
+from rpython.jit.backend.llsupport.descr import (unpack_arraydescr,)
 
 FLAG_ARRAY = 0
 FLAG_STR = 1
@@ -114,7 +115,7 @@
 
     def handle_getarrayitem(self, op):
         itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
-        ptr_box, index_box = op.getargs()
+        ptr_box, index_box = op.getarglist()
 
         offset = 0
         factor = 1
@@ -122,22 +123,25 @@
         if itemsize in self.cpu.load_supported_factors:
             factor = itemsize
         else:
-            index_box = ResOperation(rop.INT_MUL, [index_box, Const(factor)])
+            index_box = ResOperation(rop.INT_MUL, [index_box, 
ConstInt(itemsize)])
             self.emit_op(index_box)
         # adjust the constant offset
         if self.cpu.load_constant_offset:
-            offset = ofs
+            offset = 0
         else:
-            index_box = ResOperation(rop.INT_ADD, [index_box, Const(ofs)])
-            self.emit_op(index_box)
+            offset = 0
+            pass
+            # ofs is NOT the offset!
+            #index_box = ResOperation(rop.INT_ADD, [index_box, ConstInt(ofs)])
+            #self.emit_op(index_box)
         if factor == 1 and offset == 0:
             newload = ResOperation(OpHelpers.get_gc_load(op.type),
-                        [ptr_box, index_box, Const(itemsize), Const(sign)])
-            self.replace_op_with(newload, op)
+                        [ptr_box, index_box, ConstInt(itemsize), 
ConstInt(sign)])
+            self.replace_op_with(op, newload)
         else:
             newload = ResOperation(OpHelpers.get_gc_load_scaled(op.type),
-                        [ptr_box, index_box, Const(factor), Const(offset), 
Const(sign)])
-            self.replace_op_with(newload, op)
+                        [ptr_box, index_box, ConstInt(factor), 
ConstInt(itemsize), ConstInt(sign)])
+            self.replace_op_with(op, newload)
 
     def rewrite(self, operations):
         # we can only remember one malloc since the next malloc can possibly
diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py 
b/rpython/jit/backend/llsupport/test/test_rewrite.py
--- a/rpython/jit/backend/llsupport/test/test_rewrite.py
+++ b/rpython/jit/backend/llsupport/test/test_rewrite.py
@@ -1,3 +1,4 @@
+import py
 from rpython.jit.backend.llsupport.descr import get_size_descr,\
      get_field_descr, get_array_descr, ArrayDescr, FieldDescr,\
      SizeDescr, get_interiorfield_descr
@@ -68,6 +69,11 @@
         wbdescr = self.gc_ll_descr.write_barrier_descr
         WORD = globals()['WORD']
         #
+        F = lltype.GcArray(lltype.Float)
+        fdescr = get_array_descr(self.gc_ll_descr, F)
+        SF = lltype.GcArray(lltype.SingleFloat)
+        sfdescr = get_array_descr(self.gc_ll_descr, SF)
+        #
         strdescr     = self.gc_ll_descr.str_descr
         unicodedescr = self.gc_ll_descr.unicode_descr
         strlendescr     = strdescr.lendescr
@@ -124,6 +130,9 @@
 class BaseFakeCPU(object):
     JITFRAME_FIXED_SIZE = 0
 
+    load_constant_offset = False
+    load_supported_factors = (1,)
+
     def __init__(self):
         self.tracker = FakeTracker()
         self._cache = {}
@@ -1081,3 +1090,23 @@
             guard_false(i2) [i5, i0]
             jump()
         """)
+
+    @py.test.mark.parametrize('factors,suffix,ops,index,descr,off,factor', [
+        [ (1,), 'i', ['i2 = int_mul(i1,8)'], 'i2', 'adescr', 8, 1 ],
+        [ (1,), 'f', ['i2 = int_mul(i1,8)'], 'i2', 'fdescr', 8, 0 ],
+        [ (1,), 'i', ['i2 = int_mul(i1,4)'], 'i2', 'sfdescr', 4, 0 ],
+        [ (1,), 'r', ['i2 = int_mul(i1,8)'], 'i2', 'cdescr', 8, 0 ],
+    ])
+    def test_getarrayitem(self, factors, suffix, ops, index, descr, off, 
factor):
+        self.cpu.load_supported_factors = factors
+        ops = '\n'.join(ops)
+        self.check_rewrite("""
+            [p0,i1]
+            i2 = getarrayitem_gc_{suffix}(p0,i1,descr={descr})
+            jump()
+        """.format(**locals()), """
+            [p0,i1]
+            {ops}
+            i3 = gc_load_{suffix}(p0,{index},{off},{factor})
+            jump()
+        """.format(**locals()))
diff --git a/rpython/jit/backend/x86/runner.py 
b/rpython/jit/backend/x86/runner.py
--- a/rpython/jit/backend/x86/runner.py
+++ b/rpython/jit/backend/x86/runner.py
@@ -27,7 +27,7 @@
     # can an ISA instruction handle a constant offset?
     load_constant_offset = False
     # can an ISA instruction handle a factor to the offset?
-    load_supported_factors = [1]
+    load_supported_factors = (1,)
 
     from rpython.jit.backend.x86.arch import JITFRAME_FIXED_SIZE
     all_reg_indexes = gpr_reg_mgr_cls.all_reg_indexes
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -1099,8 +1099,8 @@
     #
     '_ALWAYS_PURE_LAST',  # ----- end of always_pure operations -----
 
-    'GC_LOAD/3/rfi',
-    'GC_LOAD_INDEX/4/rfi',
+    'GC_LOAD/4/rfi',
+    'GC_LOAD_INDEX/5/rfi',
 
     '_RAW_LOAD_FIRST',
     'GETARRAYITEM_GC/2d/rfi',
@@ -1616,7 +1616,7 @@
             return rop.GC_LOAD_R
 
     @staticmethod
-    def get_gc_load_scaled(tp):
+    def get_gc_load_caled(tp):
         if tp == 'i':
             return rop.GC_LOAD_SCALED_I
         elif tp == 'f':
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to