Author: Richard Plangger <planri...@gmail.com> Branch: memop-simplify2 Changeset: r80998:92f1f9606cd7 Date: 2015-11-27 13:28 +0100 http://bitbucket.org/pypy/pypy/changeset/92f1f9606cd7/
Log: raw_store got the wrong scaling factor passed in rewrite 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 @@ -184,11 +184,19 @@ op.getopnum() in (rop.GETARRAYITEM_RAW_I, rop.GETARRAYITEM_RAW_F): self.handle_getarrayitem(op) - if op.getopnum() in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW, - rop.RAW_STORE): + if op.getopnum() in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW): self.handle_setarrayitem(op) + if op.getopnum() == rop.RAW_STORE: + itemsize, ofs, _ = unpack_arraydescr(op.getdescr()) + ptr_box = op.getarg(0) + index_box = op.getarg(1) + value_box = op.getarg(2) + self.emit_gc_store_or_indexed(op, ptr_box, index_box, value_box, itemsize, 1, ofs) if op.getopnum() in (rop.RAW_LOAD_I, rop.RAW_LOAD_F): - self.handle_rawload(op) + itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) + ptr_box = op.getarg(0) + index_box = op.getarg(1) + self.emit_gc_load_or_indexed(op, ptr_box, index_box, itemsize, 1, ofs, sign) def rewrite(self, operations): # we can only remember one malloc since the next malloc can possibly 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 @@ -1136,9 +1136,9 @@ [True, None, 'i3 = raw_load_i(p0,i1,descr=adescr)->gc_load_indexed_i(p0,i1,1,8,-8)'], [True, None, 'i3 = raw_load_f(p0,i1,descr=fdescr)->gc_load_indexed_f(p0,i1,1,8,8)'], [True, None, 'i3 = raw_load_i(p0,i1,descr=sfdescr)->gc_load_indexed_i(p0,i1,1,8,4)'], - [True, (1,2,4,8), 'i3 = raw_store(p0,i1,i2,descr=raw_sfdescr)->gc_store_indexed(p0,i1,i2,4,8,4)'], + [True, (1,2,4,8), 'i3 = raw_store(p0,i1,i2,descr=raw_sfdescr)->gc_store_indexed(p0,i1,i2,1,8,4)'], [False, (1,), 'i3 = raw_store(p0,i1,i2,descr=raw_sfdescr)' '->' - 'i4 = int_mul(i1,4);i5 = int_add(i4,8);gc_store(p0,i5,i2,4)'], + 'i5 = int_add(i1,8);gc_store(p0,i5,i2,4)'], ]) def test_gc_load_store_transform(self, support_offset, factors, fromto): self.cpu.load_constant_offset = support_offset 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 @@ -1484,7 +1484,7 @@ def _genop_gc_load(self, op, arglocs, resloc): base_loc, ofs_loc, size_loc, sign_loc = arglocs assert isinstance(size_loc, ImmedLoc) - rc_addr = addr_add(base_loc, ofs_loc, 0, 0) + src_addr = addr_add(base_loc, ofs_loc, 0, 0) self.load_from_mem(resloc, src_addr, size_loc, sign_loc) genop_gc_load_i = _genop_gc_load @@ -1585,7 +1585,7 @@ genop_discard_setinteriorfield_raw = genop_discard_setinteriorfield_gc def genop_discard_gc_store(self, op, arglocs): - base_loc, ofs_loc, size_loc = arglocs + base_loc, ofs_loc, value_loc, size_loc = arglocs assert isinstance(size_loc, ImmedLoc) scale = get_scale(size_loc.value) dest_addr = AddressLoc(base_loc, ofs_loc, 0, 0) 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 @@ -921,8 +921,8 @@ args = op.getarglist() N = len(args) # we force all arguments in a reg (unless they are Consts), - # because it will be needed anyway by the following setfield_gc - # or setarrayitem_gc. It avoids loading it twice from the memory. + # because it will be needed anyway by the following gc_load + # It avoids loading it twice from the memory. arglocs = [self.rm.make_sure_var_in_reg(op.getarg(i), args) for i in range(N)] self.perform_discard(op, arglocs) @@ -1163,30 +1163,6 @@ base_loc = self.loc(op.getarg(0)) self.perform_discard(op, [base_loc]) - def _consider_getarrayitem(self, op): - itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) - 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: - sign_loc = imm1 - else: - sign_loc = imm0 - self.perform(op, [base_loc, ofs_loc, imm(itemsize), imm(ofs), - sign_loc], result_loc) - - consider_getarrayitem_gc_i = _consider_getarrayitem - consider_getarrayitem_gc_r = _consider_getarrayitem - consider_getarrayitem_gc_f = _consider_getarrayitem - consider_getarrayitem_raw_i = _consider_getarrayitem - consider_getarrayitem_raw_f = _consider_getarrayitem - consider_getarrayitem_gc_pure_i = _consider_getarrayitem - consider_getarrayitem_gc_pure_r = _consider_getarrayitem - consider_getarrayitem_gc_pure_f = _consider_getarrayitem - consider_raw_load_i = _consider_getarrayitem - consider_raw_load_f = _consider_getarrayitem - def _consider_gc_load(self, op): args = op.getarglist() base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit