Author: Armin Rigo <ar...@tunes.org> Branch: ffi-backend Changeset: r55810:d6ba51cd8e29 Date: 2012-06-24 20:44 +0200 http://bitbucket.org/pypy/pypy/changeset/d6ba51cd8e29/
Log: (fijal, arigo) Pass the first test (test_rawmem.py,test_raw_storage_int). A bit of garbage-collection on the sources, but really just starting, here. diff --git a/pypy/jit/backend/llgraph/llimpl.py b/pypy/jit/backend/llgraph/llimpl.py --- a/pypy/jit/backend/llgraph/llimpl.py +++ b/pypy/jit/backend/llgraph/llimpl.py @@ -823,9 +823,7 @@ op_getfield_gc_pure = op_getfield_gc def op_getfield_raw(self, fielddescr, struct): - if fielddescr.arg_types == 'dynamic': # abuse of .arg_types - return do_getfield_raw_dynamic(struct, fielddescr) - elif fielddescr.typeinfo == REF: + if fielddescr.typeinfo == REF: return do_getfield_raw_ptr(struct, fielddescr.ofs) elif fielddescr.typeinfo == INT: return do_getfield_raw_int(struct, fielddescr.ofs) @@ -836,6 +834,26 @@ op_getfield_raw_pure = op_getfield_raw + def op_raw_store(self, arraydescr, addr, offset, value): + if arraydescr.typeinfo == REF: + xxx + elif arraydescr.typeinfo == INT: + do_raw_store_int(addr, offset, arraydescr.ofs, value) + elif arraydescr.typeinfo == FLOAT: + xxx + else: + raise NotImplementedError + + def op_raw_load(self, arraydescr, addr, offset): + if arraydescr.typeinfo == REF: + xxx + elif arraydescr.typeinfo == INT: + return do_raw_load_int(addr, offset, arraydescr.ofs) + elif arraydescr.typeinfo == FLOAT: + xxx + else: + raise NotImplementedError + def op_new(self, size): return do_new(size.ofs) @@ -1515,18 +1533,18 @@ else: return libffi._struct_getfield(lltype.Signed, addr, ofs) -def do_raw_load_int(struct, offset, size): - assert isinstance(size, llmemory.ItemOffset) and size.repeat == 1 +def do_raw_load_int(struct, offset, descrofs): + TYPE = symbolic.Size2Type[descrofs] ll_p = rffi.cast(rffi.CCHARP, struct) - ll_p = rffi.cast(rffi.CArrayPtr(size.TYPE), rffi.ptradd(ll_p, offset)) + ll_p = rffi.cast(lltype.Ptr(TYPE), rffi.ptradd(ll_p, offset)) value = ll_p[0] return rffi.cast(lltype.Signed, value) -def do_raw_store_int(struct, offset, size, value): - assert isinstance(size, llmemory.ItemOffset) and size.repeat == 1 +def do_raw_store_int(struct, offset, descrofs, value): + TYPE = symbolic.Size2Type[descrofs] ll_p = rffi.cast(rffi.CCHARP, struct) - ll_p = rffi.cast(rffi.CArrayPtr(size.TYPE), rffi.ptradd(ll_p, offset)) - ll_p[0] = rffi.cast(size.TYPE, value) + ll_p = rffi.cast(lltype.Ptr(TYPE), rffi.ptradd(ll_p, offset)) + ll_p[0] = rffi.cast(TYPE.OF, value) def do_new(size): TYPE = symbolic.Size2Type[size] diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py --- a/pypy/jit/backend/llgraph/runner.py +++ b/pypy/jit/backend/llgraph/runner.py @@ -482,10 +482,12 @@ return llimpl.do_setinteriorfield_gc_float(array, index, descr.ofs, value) - def bh_raw_store_i(self, struct, offset, size, newvalue): - return llimpl.do_raw_store_int(struct, offset, size, newvalue) - def bh_raw_load_i(self, struct, offset, size): - return llimpl.do_raw_load_int(struct, offset, size) + def bh_raw_store_i(self, struct, offset, descr, newvalue): + assert isinstance(descr, Descr) + return llimpl.do_raw_store_int(struct, offset, descr.ofs, newvalue) + def bh_raw_load_i(self, struct, offset, descr): + assert isinstance(descr, Descr) + return llimpl.do_raw_load_int(struct, offset, descr.ofs) def bh_new(self, sizedescr): assert isinstance(sizedescr, Descr) diff --git a/pypy/jit/backend/llgraph/symbolic.py b/pypy/jit/backend/llgraph/symbolic.py --- a/pypy/jit/backend/llgraph/symbolic.py +++ b/pypy/jit/backend/llgraph/symbolic.py @@ -1,8 +1,7 @@ -import ctypes from pypy.rpython.lltypesystem import lltype, rffi, rclass -Size2Type = [None] +Size2Type = [None] * 100 Type2Size = {} def get_size(TYPE): @@ -14,7 +13,7 @@ Type2Size[TYPE] = size return size -TokenToField = [None] +TokenToField = [None] * 100 FieldToToken = {} def get_field_token(STRUCT, fieldname): @@ -26,21 +25,3 @@ FieldToToken[STRUCT, fieldname] = token return token get_field_token(rclass.OBJECT, 'typeptr') # force the index 1 for this - -def get_array_token(T): - # T can be an array or a var-sized structure - if isinstance(T, lltype.Struct): - assert T._arrayfld is not None, "%r is not variable-sized" % (T,) - cstruct = ll2ctypes.get_ctypes_type(T) - cfield = getattr(cstruct, T._arrayfld) - before_array_part = cfield.offset - T = getattr(T, T._arrayfld) - else: - before_array_part = 0 - carray = ll2ctypes.get_ctypes_type(T) - assert carray.length.size == 4 - ofs_length = before_array_part + carray.length.offset - basesize = before_array_part + carray.items.offset - carrayitem = ll2ctypes.get_ctypes_type(T.OF) - itemsize = ctypes.sizeof(carrayitem) - return basesize, itemsize, ofs_length diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py --- a/pypy/jit/codewriter/jtransform.py +++ b/pypy/jit/codewriter/jtransform.py @@ -856,17 +856,17 @@ def rewrite_op_raw_store(self, op): T = op.args[2].concretetype kind = getkind(T)[0] - c_size = Constant(llmemory.sizeof(T), lltype.Signed) + descr = self.cpu.arraydescrof(rffi.CArray(T)) return SpaceOperation('raw_store_%s' % kind, - [op.args[0], op.args[1], c_size, op.args[2]], + [op.args[0], op.args[1], descr, op.args[2]], None) def rewrite_op_raw_load(self, op): T = op.result.concretetype kind = getkind(T)[0] - c_size = Constant(llmemory.sizeof(T), lltype.Signed) + descr = self.cpu.arraydescrof(rffi.CArray(T)) return SpaceOperation('raw_load_%s' % kind, - [op.args[0], op.args[1], c_size], op.result) + [op.args[0], op.args[1], descr], op.result) def _rewrite_equality(self, op, opname): arg0, arg1 = op.args diff --git a/pypy/jit/codewriter/test/test_jtransform.py b/pypy/jit/codewriter/test/test_jtransform.py --- a/pypy/jit/codewriter/test/test_jtransform.py +++ b/pypy/jit/codewriter/test/test_jtransform.py @@ -867,7 +867,7 @@ assert op1.opname == 'raw_store_i' assert op1.args[0] == v_storage assert op1.args[1] == v_index - assert op1.args[2].value == rffi.sizeof(lltype.Signed) + assert op1.args[2] == ('arraydescr', rffi.CArray(lltype.Signed)) assert op1.args[3] == v_item def test_raw_load(): @@ -879,7 +879,7 @@ assert op1.opname == 'raw_load_i' assert op1.args[0] == v_storage assert op1.args[1] == v_index - assert op1.args[2].value == rffi.sizeof(lltype.Signed) + assert op1.args[2] == ('arraydescr', rffi.CArray(lltype.Signed)) assert op1.result == v_res def test_promote_1(): diff --git a/pypy/jit/metainterp/blackhole.py b/pypy/jit/metainterp/blackhole.py --- a/pypy/jit/metainterp/blackhole.py +++ b/pypy/jit/metainterp/blackhole.py @@ -1269,13 +1269,13 @@ def bhimpl_setfield_raw_f(cpu, struct, fielddescr, newvalue): cpu.bh_setfield_raw_f(struct, fielddescr, newvalue) - @arguments("cpu", "i", "i", "i", "i") - def bhimpl_raw_store_i(cpu, struct, offset, size, newvalue): - cpu.bh_raw_store_i(struct, offset, size, newvalue) + @arguments("cpu", "i", "i", "d", "i") + def bhimpl_raw_store_i(cpu, addr, offset, arraydescr, newvalue): + cpu.bh_raw_store_i(addr, offset, arraydescr, newvalue) - @arguments("cpu", "i", "i", "i", returns="i") - def bhimpl_raw_load_i(cpu, struct, offset, size): - return cpu.bh_raw_load_i(struct, offset, size) + @arguments("cpu", "i", "i", "d", returns="i") + def bhimpl_raw_load_i(cpu, addr, offset, arraydescr): + return cpu.bh_raw_load_i(addr, offset, arraydescr) @arguments("r", "d", "d") def bhimpl_record_quasiimmut_field(struct, fielddescr, mutatefielddescr): diff --git a/pypy/jit/metainterp/executor.py b/pypy/jit/metainterp/executor.py --- a/pypy/jit/metainterp/executor.py +++ b/pypy/jit/metainterp/executor.py @@ -180,6 +180,26 @@ else: cpu.bh_setfield_raw_i(struct, fielddescr, itembox.getint()) +def do_raw_store(cpu, _, addrbox, offsetbox, valuebox, arraydescr): + addr = addrbox.getint() + offset = offsetbox.getint() + if arraydescr.is_array_of_pointers(): + xxx + elif arraydescr.is_array_of_floats(): + xxx + else: + cpu.bh_raw_store_i(addr, offset, arraydescr, valuebox.getint()) + +def do_raw_load(cpu, _, addrbox, offsetbox, arraydescr): + addr = addrbox.getint() + offset = offsetbox.getint() + if arraydescr.is_array_of_pointers(): + xxx + elif arraydescr.is_array_of_floats(): + xxx + else: + return BoxInt(cpu.bh_raw_load_i(addr, offset, arraydescr)) + def exec_new_with_vtable(cpu, clsbox): from pypy.jit.codewriter import heaptracker vtable = clsbox.getint() @@ -343,8 +363,6 @@ rop.DEBUG_MERGE_POINT, rop.JIT_DEBUG, rop.SETARRAYITEM_RAW, - rop.GETINTERIORFIELD_RAW, - rop.SETINTERIORFIELD_RAW, rop.CALL_RELEASE_GIL, rop.QUASIIMMUT_FIELD, rop.CALL_MALLOC_GC, diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py --- a/pypy/jit/metainterp/optimizeopt/heap.py +++ b/pypy/jit/metainterp/optimizeopt/heap.py @@ -250,7 +250,7 @@ opnum == rop.SETFIELD_RAW or # no effect on GC struct/array opnum == rop.SETARRAYITEM_GC or # handled specially opnum == rop.SETARRAYITEM_RAW or # no effect on GC struct - opnum == rop.SETINTERIORFIELD_RAW or # no effect on GC struct + opnum == rop.RAW_STORE or # no effect on GC struct opnum == rop.STRSETITEM or # no effect on GC struct/array opnum == rop.UNICODESETITEM or # no effect on GC struct/array opnum == rop.DEBUG_MERGE_POINT or # no effect whatsoever diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py --- a/pypy/jit/metainterp/pyjitpl.py +++ b/pypy/jit/metainterp/pyjitpl.py @@ -649,6 +649,18 @@ opimpl_setfield_raw_r = _opimpl_setfield_raw_any opimpl_setfield_raw_f = _opimpl_setfield_raw_any + @arguments("box", "box", "descr", "box") + def _opimpl_raw_store(self, addrbox, offsetbox, arraydescr, valuebox): + self.execute_with_descr(rop.RAW_STORE, arraydescr, + addrbox, offsetbox, valuebox) + opimpl_raw_store_i = _opimpl_raw_store + + @arguments("box", "box", "descr") + def _opimpl_raw_load(self, addrbox, offsetbox, arraydescr): + return self.execute_with_descr(rop.RAW_LOAD, arraydescr, + addrbox, offsetbox) + opimpl_raw_load_i = _opimpl_raw_load + @arguments("box", "descr", "descr", "orgpc") def opimpl_record_quasiimmut_field(self, box, fielddescr, mutatefielddescr, orgpc): diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py --- a/pypy/jit/metainterp/resoperation.py +++ b/pypy/jit/metainterp/resoperation.py @@ -471,7 +471,7 @@ 'GETARRAYITEM_GC/2d', 'GETARRAYITEM_RAW/2d', 'GETINTERIORFIELD_GC/2d', - 'GETINTERIORFIELD_RAW/2d', + 'RAW_LOAD/2d', 'GETFIELD_GC/1d', 'GETFIELD_RAW/1d', '_MALLOC_FIRST', @@ -490,7 +490,7 @@ 'SETARRAYITEM_GC/3d', 'SETARRAYITEM_RAW/3d', 'SETINTERIORFIELD_GC/3d', - 'SETINTERIORFIELD_RAW/3d', + 'RAW_STORE/3d', 'SETFIELD_GC/2d', 'SETFIELD_RAW/2d', 'STRSETITEM/3', diff --git a/pypy/jit/metainterp/test/test_rawmem.py b/pypy/jit/metainterp/test/test_rawmem.py --- a/pypy/jit/metainterp/test/test_rawmem.py +++ b/pypy/jit/metainterp/test/test_rawmem.py @@ -32,7 +32,7 @@ self.check_operations_history({'call': 2, 'guard_no_exception': 1, 'finish': 1}) - def test_raw_storage(self): + def test_raw_storage_int(self): def f(): p = alloc_raw_storage(15) raw_storage_setitem(p, 3, 24) @@ -42,4 +42,5 @@ res = self.interp_operations(f, []) assert res == 24 self.check_operations_history({'call': 2, 'guard_no_exception': 1, + 'raw_store': 1, 'raw_load': 1, 'finish': 1}) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit