Author: Armin Rigo <ar...@tunes.org> Branch: ffi-backend Changeset: r55809:964863171373 Date: 2012-06-24 19:18 +0200 http://bitbucket.org/pypy/pypy/changeset/964863171373/
Log: (fijal, arigo) Phew 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 @@ -1515,6 +1515,19 @@ 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 + ll_p = rffi.cast(rffi.CCHARP, struct) + ll_p = rffi.cast(rffi.CArrayPtr(size.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 + 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) + def do_new(size): TYPE = symbolic.Size2Type[size] x = lltype.malloc(TYPE, zero=True) @@ -1921,6 +1934,7 @@ setannotation(do_getinteriorfield_gc_int, annmodel.SomeInteger()) setannotation(do_getinteriorfield_gc_ptr, annmodel.SomePtr(llmemory.GCREF)) setannotation(do_getinteriorfield_gc_float, s_FloatStorage) +setannotation(do_raw_load_int, annmodel.SomeInteger()) setannotation(do_new, annmodel.SomePtr(llmemory.GCREF)) setannotation(do_new_array, annmodel.SomePtr(llmemory.GCREF)) setannotation(do_setarrayitem_gc_int, annmodel.s_None) @@ -1937,6 +1951,7 @@ setannotation(do_setinteriorfield_gc_int, annmodel.s_None) setannotation(do_setinteriorfield_gc_ptr, annmodel.s_None) setannotation(do_setinteriorfield_gc_float, annmodel.s_None) +setannotation(do_raw_store_int, annmodel.s_None) setannotation(do_newstr, annmodel.SomePtr(llmemory.GCREF)) setannotation(do_strsetitem, annmodel.s_None) setannotation(do_newunicode, annmodel.SomePtr(llmemory.GCREF)) 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,6 +482,11 @@ 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_new(self, sizedescr): assert isinstance(sizedescr, Descr) return llimpl.do_new(sizedescr.ofs) 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,7 +856,7 @@ def rewrite_op_raw_store(self, op): T = op.args[2].concretetype kind = getkind(T)[0] - c_size = Constant(rffi.sizeof(T), lltype.Signed) + c_size = Constant(llmemory.sizeof(T), lltype.Signed) return SpaceOperation('raw_store_%s' % kind, [op.args[0], op.args[1], c_size, op.args[2]], None) @@ -864,7 +864,7 @@ def rewrite_op_raw_load(self, op): T = op.result.concretetype kind = getkind(T)[0] - c_size = Constant(rffi.sizeof(T), lltype.Signed) + c_size = Constant(llmemory.sizeof(T), lltype.Signed) return SpaceOperation('raw_load_%s' % kind, [op.args[0], op.args[1], c_size], op.result) 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,6 +1269,14 @@ 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", "i", returns="i") + def bhimpl_raw_load_i(cpu, struct, offset, size): + return cpu.bh_raw_load_i(struct, offset, size) + @arguments("r", "d", "d") def bhimpl_record_quasiimmut_field(struct, fielddescr, mutatefielddescr): pass _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit