Author: Richard Plangger <planri...@gmail.com> Branch: memop-simplify2 Changeset: r80971:14b59b151355 Date: 2015-11-26 13:17 +0100 http://bitbucket.org/pypy/pypy/changeset/14b59b151355/
Log: added tests for raw_load_i/f transformation to gc_load_i/f diff --git a/rpython/jit/backend/llsupport/rewrite.py b/rpython/jit/backend/llsupport/rewrite.py --- a/rpython/jit/backend/llsupport/rewrite.py +++ b/rpython/jit/backend/llsupport/rewrite.py @@ -117,6 +117,8 @@ itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) ptr_box, index_box = op.getarglist() + assert itemsize <= ofs + offset = 0 factor = 1 # i * f + c @@ -147,6 +149,16 @@ ConstInt(offset), ConstInt(itemsize)]) self.replace_op_with(op, newload) + def handle_rawload(self, op): + itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) + ptr_box, index_box = op.getarglist() + + if sign: + itemsize = -itemsize + newload = ResOperation(OpHelpers.get_gc_load(op.type), + [ptr_box, index_box, ConstInt(itemsize)]) + self.replace_op_with(op, newload) + def rewrite(self, operations): # we can only remember one malloc since the next malloc can possibly # collect; but we can try to collapse several known-size mallocs into @@ -164,9 +176,13 @@ if op is self._changed_op: op = self._changed_op_to # ---------- GC_LOAD -------------- - if op.is_getarrayitem(): # TODO + if op.is_getarrayitem() or op.getopnum() in ( + rop.GETARRAYITEM_RAW_I, + rop.GETARRAYITEM_RAW_F): self.handle_getarrayitem(op) - pass + if op.getopnum() in (rop.RAW_LOAD_I, rop.RAW_LOAD_F): + self.handle_rawload(op) + # TODO # ---------- GETFIELD_GC ---------- if op.getopnum() in (rop.GETFIELD_GC_I, rop.GETFIELD_GC_F, rop.GETFIELD_GC_R): diff --git a/rpython/jit/backend/llsupport/test/test_rewrite.py b/rpython/jit/backend/llsupport/test/test_rewrite.py --- a/rpython/jit/backend/llsupport/test/test_rewrite.py +++ b/rpython/jit/backend/llsupport/test/test_rewrite.py @@ -1154,3 +1154,22 @@ i3 = gc_load_{suffix}(p0,{index},{params}) jump() """.format(**locals())) + + @py.test.mark.parametrize('fromto', [ + 'raw_load_i(p0,i1,descr=adescr) -> gc_load_i(p0,i1,-8)', + 'raw_load_f(p0,i1,descr=fdescr) -> gc_load_f(p0,i1,8)', + 'raw_load_i(p0,i1,descr=sfdescr) -> gc_load_i(p0,i1,4)', + ]) + def test_raw_load_rewrite(self, fromto): + for factor in [(1,), (1,2,4,8), (1,2,4), (1,4)]: + self.cpu.load_supported_factors = factor + f, t = fromto.split(' -> ') + self.check_rewrite(""" + [p0,i1] + i2 = {f} + jump() + """.format(**locals()), """ + [p0,i1] + i2 = {t} + jump() + """.format(**locals())) diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -1483,9 +1483,7 @@ def _genop_gc_load(self, op, arglocs, resloc): base_loc, ofs_loc, size_loc, sign_loc = arglocs - assert isinstance(ofs, ImmedLoc) assert isinstance(size_loc, ImmedLoc) - scale = get_scale(size_loc.value) self.load_from_mem(resloc, ofs_loc, size_loc, sign_loc) genop_gc_load_i = _genop_gc_load diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py --- a/rpython/jit/backend/x86/regalloc.py +++ b/rpython/jit/backend/x86/regalloc.py @@ -1173,15 +1173,16 @@ consider_raw_load_f = _consider_getarrayitem def _consider_gc_load(self, op): - ptr, index, size, sign = op.getarglist() + args = op.getarglist() base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args) ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args) result_loc = self.force_allocate_reg(op) - if sign.value: + size = op.getarg(2).value + size_loc = imm(abs(size)) + if size < 0: sign_loc = imm1 else: sign_loc = imm0 - size_loc = imm(size.value) self.perform(op, [base_loc, ofs_loc, size_loc, sign_loc], result_loc) consider_gc_load_i = _consider_gc_load diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -401,6 +401,10 @@ rop.GETARRAYITEM_GC_PURE_F, rop.GETARRAYITEM_GC_PURE_R) + def is_rawarrayitem(self): + return self.opnum in (rop.GETARRAYITEM_RAW_I, rop.GETARRAYITEM_RAW_F, + rop.GETARRAYITEM_RAW_R, rop.GETARRAYITEM_GC_PURE_I,) + def is_real_call(self): opnum = self.opnum return (opnum == rop.CALL_I or _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit