[pypy-commit] pypy faster-rstruct-2: shuffle the order of arguments of llop.gc_store_indexed to match the existing rop.GC_STORE_INDEXED

antocuni pypy.commits at gmail.com
Fri May 12 10:29:23 EDT 2017


Author: Antonio Cuni <anto.cuni at gmail.com>
Branch: faster-rstruct-2
Changeset: r91265:d5941a454db5
Date: 2017-05-12 16:02 +0200
http://bitbucket.org/pypy/pypy/changeset/d5941a454db5/

Log:	shuffle the order of arguments of llop.gc_store_indexed to match the
	existing rop.GC_STORE_INDEXED

diff --git a/rpython/jit/backend/llgraph/runner.py b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -747,29 +747,29 @@
         return llop.gc_load_indexed(longlong.FLOATSTORAGE,
                                     struct, index, scale, base_ofs)
 
-    def bh_gc_store_indexed_i(self, struct, index, scale, base_ofs, val, bytes,
+    def bh_gc_store_indexed_i(self, struct, index, val, scale, base_ofs, bytes,
                               descr):
         T = self._get_int_type_from_size(bytes)
         val = lltype.cast_primitive(T, val)
         if descr.A.OF == lltype.SingleFloat:
             val = longlong.int2singlefloat(val)
-        llop.gc_store_indexed(lltype.Void, struct, index, scale, base_ofs, val)
+        llop.gc_store_indexed(lltype.Void, struct, index, val, scale, base_ofs)
 
-    def bh_gc_store_indexed_f(self, struct, index, scale, base_ofs, val, bytes,
+    def bh_gc_store_indexed_f(self, struct, index, val, scale, base_ofs, bytes,
                               descr):
         if bytes != 8:
             raise Exception("gc_store_indexed_f is only for 'double'!")
         val = longlong.getrealfloat(val)
-        llop.gc_store_indexed(lltype.Void, struct, index, scale, base_ofs, val)
+        llop.gc_store_indexed(lltype.Void, struct, index, val, scale, base_ofs)
 
-    def bh_gc_store_indexed(self, struct, index, scale, base_ofs, val, bytes,
+    def bh_gc_store_indexed(self, struct, index, val, scale, base_ofs, bytes,
                             descr):
         if descr.A.OF == lltype.Float:
-            self.bh_gc_store_indexed_f(struct, index, scale, base_ofs,
-                                       val, bytes, descr)
+            self.bh_gc_store_indexed_f(struct, index, val, scale, base_ofs,
+                                       bytes, descr)
         else:
-            self.bh_gc_store_indexed_i(struct, index, scale, base_ofs,
-                                       val, bytes, descr)
+            self.bh_gc_store_indexed_i(struct, index, val, scale, base_ofs,
+                                       bytes, descr)
 
     def bh_increment_debug_counter(self, addr):
         p = rffi.cast(rffi.CArrayPtr(lltype.Signed), addr)
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
@@ -1132,19 +1132,18 @@
                                op.args[2], op.args[3], c_bytes], op.result)
 
     def rewrite_op_gc_store_indexed(self, op):
-        T = op.args[4].concretetype
+        T = op.args[2].concretetype
         kind = getkind(T)[0]
         assert kind != 'r'
         descr = self.cpu.arraydescrof(rffi.CArray(T))
-        if (not isinstance(op.args[2], Constant) or
-            not isinstance(op.args[3], Constant)):
+        if (not isinstance(op.args[3], Constant) or
+            not isinstance(op.args[4], Constant)):
             raise NotImplementedError("gc_store_indexed: 'scale' and 'base_ofs'"
                                       " should be constants")
-        # xxx hard-code the size in bytes at translation time, which is
-        # probably fine and avoids lots of issues later
+        # According to the comment in resoperation.py, "itemsize is not signed
+        # (always > 0)", so we don't need the "bytes = -bytes" line which is
+        # in rewrite_op_gc_load_indexed
         bytes = descr.get_item_size_in_bytes()
-        if descr.is_item_signed():
-            bytes = -bytes
         c_bytes = Constant(bytes, lltype.Signed)
         return SpaceOperation('gc_store_indexed_%s' % kind,
                               [op.args[0], op.args[1], op.args[2],
diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1479,11 +1479,11 @@
         return cpu.bh_gc_load_indexed_f(addr, index,scale,base_ofs, bytes)
 
     @arguments("cpu", "r", "i", "i", "i", "i", "i")
-    def bhimpl_gc_store_indexed_i(cpu, addr, index, scale, base_ofs, val, bytes):
-        return cpu.bh_gc_store_indexed_i(addr, index,scale,base_ofs, val, bytes)
-    @arguments("cpu", "r", "i", "i", "i", "f", "i")
-    def bhimpl_gc_store_indexed_f(cpu, addr, index, scale, base_ofs, val, bytes):
-        return cpu.bh_gc_store_indexed_f(addr, index,scale,base_ofs, val, bytes)
+    def bhimpl_gc_store_indexed_i(cpu, addr, index, val, scale, base_ofs, bytes):
+        return cpu.bh_gc_store_indexed_i(addr, index, val, scale,base_ofs, bytes)
+    @arguments("cpu", "r", "i", "f", "i", "i", "i")
+    def bhimpl_gc_store_indexed_f(cpu, addr, index, val, scale, base_ofs, bytes):
+        return cpu.bh_gc_store_indexed_f(addr, index, val, scale,base_ofs, bytes)
 
     @arguments("r", "d", "d")
     def bhimpl_record_quasiimmut_field(struct, fielddescr, mutatefielddescr):
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -251,8 +251,8 @@
     else:
         return BoxInt(cpu.bh_raw_load_i(addr, offset, arraydescr))
 
-def do_gc_store_indexed(cpu, _, addrbox, indexbox, scalebox,
-                        base_ofsbox, valuebox, bytesbox, arraydescr):
+def do_gc_store_indexed(cpu, _, addrbox, indexbox, valuebox, scalebox,
+                        base_ofsbox, bytesbox, arraydescr):
     addr = addrbox.getref_base()
     index = indexbox.getint()
     scale = scalebox.getint()
@@ -262,11 +262,11 @@
         raise AssertionError("cannot store GC pointers in gc_store_indexed for now")
     elif arraydescr.is_array_of_floats():
         floatval = valuebox.getfloat()
-        cpu.bh_gc_store_indexed_i(addr, index, scale, base_ofs, floatval, bytes,
+        cpu.bh_gc_store_indexed_i(addr, index, floatval, scale, base_ofs, bytes,
                                   arraydescr)
     else:
         intval = valuebox.getint()
-        cpu.bh_gc_store_indexed_i(addr, index, scale, base_ofs, intval, bytes,
+        cpu.bh_gc_store_indexed_i(addr, index, intval, scale, base_ofs, bytes,
                                   arraydescr)
 
 
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -828,16 +828,16 @@
                             self._remove_symbolics(baseofsbox), bytesbox)
 
     @arguments("box", "box", "box", "box", "box", "box", "descr")
-    def _opimpl_gc_store_indexed(self, addrbox, indexbox,
-                                 scalebox, baseofsbox, valuebox, bytesbox,
+    def _opimpl_gc_store_indexed(self, addrbox, indexbox, valuebox,
+                                 scalebox, baseofsbox, bytesbox,
                                  arraydescr):
         return self.execute_with_descr(rop.GC_STORE_INDEXED,
                                        arraydescr,
                                        addrbox,
                                        indexbox,
+                                       valuebox,
                                        self._remove_symbolics(scalebox),
                                        self._remove_symbolics(baseofsbox),
-                                       valuebox,
                                        bytesbox)
     opimpl_gc_store_indexed_i = _opimpl_gc_store_indexed
     opimpl_gc_store_indexed_f = _opimpl_gc_store_indexed
diff --git a/rpython/rtyper/lltypesystem/opimpl.py b/rpython/rtyper/lltypesystem/opimpl.py
--- a/rpython/rtyper/lltypesystem/opimpl.py
+++ b/rpython/rtyper/lltypesystem/opimpl.py
@@ -728,7 +728,7 @@
     return p[0]
 op_gc_load_indexed.need_result_type = True
 
-def op_gc_store_indexed(p, index, scale, base_ofs, newvalue):
+def op_gc_store_indexed(p, index, newvalue, scale, base_ofs):
     # 'base_ofs' should be a CompositeOffset(..., ArrayItemsOffset).
     # 'scale' should be a llmemory.sizeof().
     from rpython.rtyper.lltypesystem import rffi
diff --git a/rpython/rtyper/test/test_llop.py b/rpython/rtyper/test/test_llop.py
--- a/rpython/rtyper/test/test_llop.py
+++ b/rpython/rtyper/test/test_llop.py
@@ -28,7 +28,7 @@
     scale_factor = llmemory.sizeof(lltype.Char)
     value = lltype.cast_primitive(TYPE, value)
     llop.gc_store_indexed(lltype.Void, ll_items, 0,
-                          scale_factor, base_ofs, value)
+                          value, scale_factor, base_ofs)
     return lst
 
 
diff --git a/rpython/translator/c/funcgen.py b/rpython/translator/c/funcgen.py
--- a/rpython/translator/c/funcgen.py
+++ b/rpython/translator/c/funcgen.py
@@ -731,10 +731,10 @@
     def OP_GC_STORE_INDEXED(self, op):
         addr = self.expr(op.args[0])
         index = self.expr(op.args[1])
-        scale = self.expr(op.args[2])
-        base_ofs = self.expr(op.args[3])
-        value = self.expr(op.args[4])
-        TYPE = op.args[4].concretetype
+        value = self.expr(op.args[2])
+        scale = self.expr(op.args[3])
+        base_ofs = self.expr(op.args[4])
+        TYPE = op.args[2].concretetype
         typename = cdecl(self.db.gettype(TYPE).replace('@', '*@'), '')
         return (
           "((%(typename)s) (((char *)%(addr)s) + "


More information about the pypy-commit mailing list