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