Author: Richard Plangger <planri...@gmail.com> Branch: memop-simplify2 Changeset: r80974:2b979e24b5a8 Date: 2015-11-26 15:07 +0100 http://bitbucket.org/pypy/pypy/changeset/2b979e24b5a8/
Log: added gc_store/gc_store_indexed as operation, started migration of setarrayitem in the backend to the new operations (also added the rewrite logic) 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 @@ -113,6 +113,24 @@ assert not op.get_forwarded() op.set_forwarded(newop) + def handle_setarrayitem(self, op): + itemsize, ofs, _ = unpack_arraydescr(op.getdescr()) + args = op.getarglist() + base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args) + if itemsize == 1: + need_lower_byte = True + else: + need_lower_byte = False + value_loc = self.make_sure_var_in_reg(op.getarg(2), args, + need_lower_byte=need_lower_byte) + ofs_loc = self.rm.make_sure_var_in_reg(op.getarg(1), args) + self.perform_discard(op, [base_loc, ofs_loc, value_loc, + imm(itemsize), imm(ofs)]) + + def emit_gc_store_or_indexed(self, op, ptr_box, index_box, itemsize, factor, offset, sign): + self._emit_mul_add_if_factor_offset_not_supported(factor, offset) + # + def handle_getarrayitem(self, op): itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) ptr_box, index_box = op.getarglist() @@ -123,7 +141,7 @@ ptr_box, index_box = op.getarglist() self.emit_gc_load_or_indexed(op, ptr_box, index_box, itemsize, 1, ofs, sign) - def emit_gc_load_or_indexed(self, op, ptr_box, index_box, itemsize, factor, offset, sign): + def _emit_mul_add_if_factor_offset_not_supported(self, factor, offset): # factor if factor != 1 and factor not in self.cpu.load_supported_factors: index_box = ResOperation(rop.INT_MUL, [index_box, ConstInt(factor)]) @@ -134,6 +152,9 @@ index_box = ResOperation(rop.INT_ADD, [index_box, ConstInt(offset)]) self.emit_op(index_box) offset = 0 + + def emit_gc_load_or_indexed(self, op, ptr_box, index_box, itemsize, factor, offset, sign): + self._emit_mul_add_if_factor_offset_not_supported(factor, offset) # if sign: # encode signed into the itemsize value @@ -165,10 +186,14 @@ if op is self._changed_op: op = self._changed_op_to # ---------- GC_LOAD -------------- - if op.is_getarrayitem() or op.getopnum() in ( - rop.GETARRAYITEM_RAW_I, - rop.GETARRAYITEM_RAW_F): + if op.is_getarrayitem() or \ + op.getopnum() in (rop.GETARRAYITEM_RAW_I, + rop.GETARRAYITEM_RAW_F, + rop.GETARRAYITEM_RAW_R): self.handle_getarrayitem(op) + if op.getopnum() in (rop.SETARRAYITEM_GC, rop.SETARRAYITEM_RAW, + rop.RAW_STORE_I, rop.RAW_STORE_F): + self.handle_setarrayitem(op) if op.getopnum() in (rop.RAW_LOAD_I, rop.RAW_LOAD_F): self.handle_rawload(op) # TODO 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 @@ -1502,31 +1502,6 @@ genop_gc_load_indexed_r = _genop_gc_load_indexed genop_gc_load_indexed_f = _genop_gc_load_indexed - def _genop_getarrayitem(self, op, arglocs, resloc): - base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs - assert isinstance(ofs, ImmedLoc) - assert isinstance(size_loc, ImmedLoc) - scale = get_scale(size_loc.value) - src_addr = addr_add(base_loc, ofs_loc, ofs.value, scale) - self.load_from_mem(resloc, src_addr, size_loc, sign_loc) - - genop_getarrayitem_gc_i = _genop_getarrayitem - genop_getarrayitem_gc_r = _genop_getarrayitem - genop_getarrayitem_gc_f = _genop_getarrayitem - genop_getarrayitem_gc_pure_i = _genop_getarrayitem - genop_getarrayitem_gc_pure_r = _genop_getarrayitem - genop_getarrayitem_gc_pure_f = _genop_getarrayitem - genop_getarrayitem_raw_i = _genop_getarrayitem - genop_getarrayitem_raw_f = _genop_getarrayitem - - def _genop_raw_load(self, op, arglocs, resloc): - base_loc, ofs_loc, size_loc, ofs, sign_loc = arglocs - assert isinstance(ofs, ImmedLoc) - src_addr = addr_add(base_loc, ofs_loc, ofs.value, 0) - self.load_from_mem(resloc, src_addr, size_loc, sign_loc) - genop_raw_load_i = _genop_raw_load - genop_raw_load_f = _genop_raw_load - def _imul_const_scaled(self, mc, targetreg, sourcereg, itemsize): """Produce one operation to do roughly targetreg = sourcereg * itemsize 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 @@ -1105,11 +1105,12 @@ consider_unicodesetitem = consider_strsetitem - def consider_setarrayitem_gc(self, op): + def consider_gc_store(self, op): itemsize, ofs, _ = unpack_arraydescr(op.getdescr()) args = op.getarglist() base_loc = self.rm.make_sure_var_in_reg(op.getarg(0), args) - if itemsize == 1: + itemsize = abs(size) + if size < 0: need_lower_byte = True else: need_lower_byte = False @@ -1183,7 +1184,6 @@ sign_loc = imm1 else: sign_loc = imm0 - print("GC_LOAD execute", base_loc, "+", ofs_loc, "scale", scale, "offset", offset) self.perform(op, [base_loc, ofs_loc, size_loc, sign_loc], result_loc) consider_gc_load_i = _consider_gc_load @@ -1199,7 +1199,6 @@ offset = op.getarg(3).value size = op.getarg(4).value size_loc = imm(abs(size)) - print("GC_LOAD_INDEXED execute", base_loc, "+", ofs_loc, "scale", scale, "offset", offset) if size < 0: sign_loc = imm1 else: 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,10 +401,6 @@ 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 @@ -1142,6 +1138,10 @@ # must be forced, however we need to execute it anyway '_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations ----- + # same paramters as GC_LOAD, but one additional for the value to store + 'GC_STORE/5d/n', + 'GC_STORE_INDEXED/6d/n', + 'INCREMENT_DEBUG_COUNTER/1/n', '_RAW_STORE_FIRST', 'SETARRAYITEM_GC/3d/n', _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit