Author: Richard Plangger <planri...@gmail.com>
Branch: memop-simplify2
Changeset: r80974:2b979e24b5a8
Date: 2015-11-26 15:07 +0100
http://bitbucket.org/pypy/pypy/changeset/2b979e24b5a8/

Log:    added gc_store/gc_store_indexed as operation, started migration of
        setarrayitem in the backend to the new operations (also added the
        rewrite logic)

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
@@ -113,6 +113,24 @@
         assert not op.get_forwarded()
         op.set_forwarded(newop)
 
+    def handle_setarrayitem(self, op):
+        itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
+        args = op.getarglist()
+        base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
+        if itemsize == 1:
+            need_lower_byte = True
+        else:
+            need_lower_byte = False
+        value_loc = self.make_sure_var_in_reg(op.getarg(2), args,
+                                          need_lower_byte=need_lower_byte)
+        ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args)
+        self.perform_discard(op, [base_loc, ofs_loc, value_loc,
+                                 imm(itemsize), imm(ofs)])
+
+    def emit_gc_store_or_indexed(self, op, ptr_box, index_box, itemsize, 
factor, offset, sign):
+        self._emit_mul_add_if_factor_offset_not_supported(factor, offset)
+        #
+
     def handle_getarrayitem(self, op):
         itemsize, ofs, sign = unpack_arraydescr(op.getdescr())
         ptr_box, index_box = op.getarglist()
@@ -123,7 +141,7 @@
         ptr_box, index_box = op.getarglist()
         self.emit_gc_load_or_indexed(op, ptr_box, index_box, itemsize, 1, ofs, 
sign)
 
-    def emit_gc_load_or_indexed(self, op, ptr_box, index_box, itemsize, 
factor, offset, sign):
+    def _emit_mul_add_if_factor_offset_not_supported(self, factor, offset):
         # factor
         if factor != 1 and factor not in self.cpu.load_supported_factors:
             index_box = ResOperation(rop.INT_MUL, [index_box, 
ConstInt(factor)])
@@ -134,6 +152,9 @@
             index_box = ResOperation(rop.INT_ADD, [index_box, 
ConstInt(offset)])
             self.emit_op(index_box)
             offset = 0
+
+    def emit_gc_load_or_indexed(self, op, ptr_box, index_box, itemsize, 
factor, offset, sign):
+        self._emit_mul_add_if_factor_offset_not_supported(factor, offset)
         #
         if sign:
             # encode signed into the itemsize value
@@ -165,10 +186,14 @@
             if op is self._changed_op:
                 op = self._changed_op_to
             # ---------- GC_LOAD --------------
-            if op.is_getarrayitem() or op.getopnum() in (
-                rop.GETARRAYITEM_RAW_I,
-                rop.GETARRAYITEM_RAW_F):
+            if op.is_getarrayitem() or \
+               op.getopnum() in (rop.GETARRAYITEM_RAW_I,
+                                 rop.GETARRAYITEM_RAW_F,
+                                 rop.GETARRAYITEM_RAW_R):
                 self.handle_getarrayitem(op)
+            if op.getopnum() in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW,
+                                 rop.RAW_STORE_I, rop.RAW_STORE_F):
+                self.handle_setarrayitem(op)
             if op.getopnum() in (rop.RAW_LOAD_I, rop.RAW_LOAD_F):
                 self.handle_rawload(op)
             # TODO
diff --git a/rpython/jit/backend/x86/assembler.py 
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -1502,31 +1502,6 @@
     genop_gc_load_indexed_r = _genop_gc_load_indexed
     genop_gc_load_indexed_f = _genop_gc_load_indexed
 
-    def _genop_getarrayitem(self, op, arglocs, resloc):
-        base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs
-        assert isinstance(ofs, ImmedLoc)
-        assert isinstance(size_loc, ImmedLoc)
-        scale = get_scale(size_loc.value)
-        src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale)
-        self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
-
-    genop_getarrayitem_gc_i = _genop_getarrayitem
-    genop_getarrayitem_gc_r = _genop_getarrayitem
-    genop_getarrayitem_gc_f = _genop_getarrayitem
-    genop_getarrayitem_gc_pure_i = _genop_getarrayitem
-    genop_getarrayitem_gc_pure_r = _genop_getarrayitem
-    genop_getarrayitem_gc_pure_f = _genop_getarrayitem
-    genop_getarrayitem_raw_i = _genop_getarrayitem
-    genop_getarrayitem_raw_f = _genop_getarrayitem
-
-    def _genop_raw_load(self, op, arglocs, resloc):
-        base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs
-        assert isinstance(ofs, ImmedLoc)
-        src_addr = addr_add(base_loc, ofs_loc, ofs.value, 0)
-        self.load_from_mem(resloc, src_addr, size_loc, sign_loc)
-    genop_raw_load_i = _genop_raw_load
-    genop_raw_load_f = _genop_raw_load
-
     def _imul_const_scaled(self, mc, targetreg, sourcereg, itemsize):
         """Produce one operation to do roughly
                targetreg = sourcereg * itemsize
diff --git a/rpython/jit/backend/x86/regalloc.py 
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -1105,11 +1105,12 @@
 
     consider_unicodesetitem = consider_strsetitem
 
-    def consider_setarrayitem_gc(self, op):
+    def consider_gc_store(self, op):
         itemsize, ofs, _ = unpack_arraydescr(op.getdescr())
         args = op.getarglist()
         base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args)
-        if itemsize == 1:
+        itemsize = abs(size)
+        if size < 0:
             need_lower_byte = True
         else:
             need_lower_byte = False
@@ -1183,7 +1184,6 @@
             sign_loc = imm1
         else:
             sign_loc = imm0
-        print("GC_LOAD execute", base_loc, "+", ofs_loc, "scale", scale, 
"offset", offset)
         self.perform(op, [base_loc, ofs_loc, size_loc, sign_loc], result_loc)
 
     consider_gc_load_i = _consider_gc_load
@@ -1199,7 +1199,6 @@
         offset = op.getarg(3).value
         size = op.getarg(4).value
         size_loc = imm(abs(size))
-        print("GC_LOAD_INDEXED execute", base_loc, "+", ofs_loc, "scale", 
scale, "offset", offset)
         if size < 0:
             sign_loc = imm1
         else:
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
@@ -401,10 +401,6 @@
                               rop.GETARRAYITEM_GC_PURE_F,
                               rop.GETARRAYITEM_GC_PURE_R)
 
-    def is_rawarrayitem(self):
-        return self.opnum in (rop.GETARRAYITEM_RAW_I, rop.GETARRAYITEM_RAW_F,
-                              rop.GETARRAYITEM_RAW_R, 
rop.GETARRAYITEM_GC_PURE_I,)
-
     def is_real_call(self):
         opnum = self.opnum
         return (opnum == rop.CALL_I or
@@ -1142,6 +1138,10 @@
     # must be forced, however we need to execute it anyway
     '_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
 
+    # same paramters as GC_LOAD, but one additional for the value to store
+    'GC_STORE/5d/n',
+    'GC_STORE_INDEXED/6d/n',
+
     'INCREMENT_DEBUG_COUNTER/1/n',
     '_RAW_STORE_FIRST',
     'SETARRAYITEM_GC/3d/n',
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to