Author: Antonio Cuni <anto.c...@gmail.com>
Branch: faster-rstruct-2
Changeset: r91261:0f9bab52cf32
Date: 2017-05-12 00:52 +0200
http://bitbucket.org/pypy/pypy/changeset/0f9bab52cf32/

Log:    WIP: start to add support for llop.gc_store_indexed in the JIT,
        which means to add stuff a bit everywhere. But interp_operations
        does not support returning GCREFs, so we need to tweak the tests
        differently

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
@@ -716,16 +716,28 @@
         else:
             return self.bh_raw_load_i(struct, offset, descr)
 
+    def _get_int_type_from_size(self, size):
+        if   size == 1:
+            return rffi.UCHAR
+        elif size == 2:
+            return rffi.USHORT
+        elif size == 4:
+            return rffi.UINT
+        elif size == 8:
+            return rffi.ULONGLONG
+        elif size == -1:
+            return rffi.SIGNEDCHAR
+        elif size == -2:
+            return rffi.SHORT
+        elif size == -4:
+            return rffi.INT
+        elif size == -8:
+            return rffi.LONGLONG
+        else:
+            raise NotImplementedError(size)
+    
     def bh_gc_load_indexed_i(self, struct, index, scale, base_ofs, bytes):
-        if   bytes == 1: T = rffi.UCHAR
-        elif bytes == 2: T = rffi.USHORT
-        elif bytes == 4: T = rffi.UINT
-        elif bytes == 8: T = rffi.ULONGLONG
-        elif bytes == -1: T = rffi.SIGNEDCHAR
-        elif bytes == -2: T = rffi.SHORT
-        elif bytes == -4: T = rffi.INT
-        elif bytes == -8: T = rffi.LONGLONG
-        else: raise NotImplementedError(bytes)
+        T = self._get_int_type_from_size(bytes)
         x = llop.gc_load_indexed(T, struct, index, scale, base_ofs)
         return lltype.cast_primitive(lltype.Signed, x)
 
@@ -735,6 +747,11 @@
         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):
+        T = self._get_int_type_from_size(bytes)
+        val = lltype.cast_primitive(T, val)
+        llop.gc_store_indexed(lltype.Void, struct, index, scale, base_ofs, val)
+
     def bh_increment_debug_counter(self, addr):
         p = rffi.cast(rffi.CArrayPtr(lltype.Signed), addr)
         p[0] += 1
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
@@ -1131,6 +1131,27 @@
                               [op.args[0], op.args[1],
                                op.args[2], op.args[3], c_bytes], op.result)
 
+    def rewrite_op_gc_store_indexed(self, op):
+        T = op.args[4].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)):
+            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
+        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],
+                               op.args[3], op.args[4], c_bytes, descr], None)
+
+
+
     def _rewrite_equality(self, op, opname):
         arg0, arg1 = op.args
         if isinstance(arg0, Constant) and not arg0.value:
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
@@ -1478,6 +1478,13 @@
     def bhimpl_gc_load_indexed_f(cpu, addr, index, scale, base_ofs, bytes):
         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)
+
     @arguments("r", "d", "d")
     def bhimpl_record_quasiimmut_field(struct, fielddescr, mutatefielddescr):
         pass
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,6 +251,22 @@
     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):
+    addr = addrbox.getref_base()
+    index = indexbox.getint()
+    scale = scalebox.getint()
+    base_ofs = base_ofsbox.getint()
+    bytes = bytesbox.getint()
+    if arraydescr.is_array_of_pointers():
+        raise AssertionError("cannot store GC pointers in gc_store_indexed for 
now")
+    elif arraydescr.is_array_of_floats():
+        import pdb;pdb.set_trace()
+    else:
+        intval = valuebox.getint()
+        cpu.bh_gc_store_indexed_i(addr, index, scale, base_ofs, intval, bytes)
+
+
 def exec_new_with_vtable(cpu, descr):
     return cpu.bh_new_with_vtable(descr)
 
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
@@ -827,6 +827,19 @@
                             self._remove_symbolics(scalebox),
                             self._remove_symbolics(baseofsbox), bytesbox)
 
+    @arguments("box", "box", "box", "box", "box", "box", "descr")
+    def opimpl_gc_store_indexed_i(self, addrbox, indexbox,
+                                  scalebox, baseofsbox, valuebox, bytesbox,
+                                  arraydescr):
+        return self.execute_with_descr(rop.GC_STORE_INDEXED,
+                                       arraydescr,
+                                       addrbox,
+                                       indexbox,
+                                       self._remove_symbolics(scalebox),
+                                       self._remove_symbolics(baseofsbox),
+                                       valuebox,
+                                       bytesbox)
+
     @arguments("box")
     def opimpl_hint_force_virtualizable(self, box):
         self.metainterp.gen_store_back_in_vable(box)
diff --git a/rpython/jit/metainterp/test/test_llop.py 
b/rpython/jit/metainterp/test/test_llop.py
--- a/rpython/jit/metainterp/test/test_llop.py
+++ b/rpython/jit/metainterp/test/test_llop.py
@@ -2,7 +2,8 @@
 import sys
 import struct
 from rpython.rtyper.lltypesystem import lltype, rffi
-from rpython.rtyper.test.test_llop import BaseLLOpTest, str_gc_load
+from rpython.rtyper.test.test_llop import (BaseLLOpTest, str_gc_load,
+                                           newlist_and_gc_store)
 from rpython.jit.codewriter import longlong
 from rpython.jit.metainterp.history import getkind
 from rpython.jit.metainterp.test.support import LLJitMixin
@@ -28,6 +29,12 @@
             return longlong.int2singlefloat(res)
         return res
 
+    def newlist_and_gc_store(self, TYPE, value):
+        def f(value):
+            return newlist_and_gc_store(TYPE, value)
+        return self.interp_operations(f, [value], supports_singlefloats=True)
+
+
     def test_force_virtual_str_storage(self):
         byteorder = sys.byteorder
         size = rffi.sizeof(lltype.Signed)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to