Author: Antonio Cuni <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit