Author: Richard Plangger <planri...@gmail.com> Branch: memop-simplify2 Changeset: r80973:b3214e1778f7 Date: 2015-11-26 14:36 +0100 http://bitbucket.org/pypy/pypy/changeset/b3214e1778f7/
Log: added gc_load_indexed scaled to the assembler 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 @@ -116,47 +116,36 @@ def handle_getarrayitem(self, op): itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) ptr_box, index_box = op.getarglist() - - assert itemsize <= ofs - - offset = 0 - factor = 1 - # i * f + c - if itemsize in self.cpu.load_supported_factors: - factor = itemsize - else: - index_box = ResOperation(rop.INT_MUL, [index_box, ConstInt(itemsize)]) - self.emit_op(index_box) - # adjust the constant offset - if self.cpu.load_constant_offset: - offset = 0 - else: - offset = 0 - pass - # ofs is NOT the offset! - #index_box = ResOperation(rop.INT_ADD, [index_box, ConstInt(ofs)]) - #self.emit_op(index_box) - - if sign: - itemsize = -itemsize - if factor == 1 and offset == 0: - newload = ResOperation(OpHelpers.get_gc_load(op.type), - [ptr_box, index_box, ConstInt(itemsize)]) - self.replace_op_with(op, newload) - else: - newload = ResOperation(OpHelpers.get_gc_load_indexed(op.type), - [ptr_box, index_box, ConstInt(factor), - ConstInt(offset), ConstInt(itemsize)]) - self.replace_op_with(op, newload) + self.emit_gc_load_or_indexed(op, ptr_box, index_box, itemsize, itemsize, ofs, sign) def handle_rawload(self, op): itemsize, ofs, sign = unpack_arraydescr(op.getdescr()) 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): + # factor + if factor != 1 and factor not in self.cpu.load_supported_factors: + index_box = ResOperation(rop.INT_MUL, [index_box, ConstInt(factor)]) + self.emit_op(index_box) + factor = 0 + # adjust the constant offset + if offset != 0 and not self.cpu.load_constant_offset: + index_box = ResOperation(rop.INT_ADD, [index_box, ConstInt(offset)]) + self.emit_op(index_box) + offset = 0 + # if sign: + # encode signed into the itemsize value itemsize = -itemsize - newload = ResOperation(OpHelpers.get_gc_load(op.type), - [ptr_box, index_box, ConstInt(itemsize)]) + # + if factor == 1 and offset == 0: + args = [ptr_box, index_box, ConstInt(itemsize)] + newload = ResOperation(OpHelpers.get_gc_load(op.type), args) + else: + args = [ptr_box, index_box, ConstInt(factor), + ConstInt(offset), ConstInt(itemsize)] + newload = ResOperation(OpHelpers.get_gc_load_indexed(op.type), args) self.replace_op_with(op, newload) def rewrite(self, operations): 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 @@ -1491,6 +1491,17 @@ genop_gc_load_r = _genop_gc_load genop_gc_load_f = _genop_gc_load + def _genop_gc_load_indexed(self, op, arglocs, resloc): + base_loc, ofs_loc, scale_loc, offset_loc, size_loc, sign_loc = arglocs + assert isinstance(size_loc, ImmedLoc) + scale = get_scale(size_loc.value) + src_addr = addr_add(base_loc, ofs_loc, offset_loc.value, scale) + self.load_from_mem(resloc, src_addr, size_loc, sign_loc) + + genop_gc_load_indexed_i = _genop_gc_load_indexed + 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) 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 @@ -1183,12 +1183,35 @@ 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 consider_gc_load_r = _consider_gc_load consider_gc_load_f = _consider_gc_load + def _consider_gc_load_indexed(self, op): + 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) + scale = op.getarg(2).value + 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: + sign_loc = imm0 + locs = [base_loc, ofs_loc, imm(scale), imm(offset), size_loc, sign_loc] + self.perform(op, locs, result_loc) + + consider_gc_load_indexed_i = _consider_gc_load_indexed + consider_gc_load_indexed_r = _consider_gc_load_indexed + consider_gc_load_indexed_f = _consider_gc_load_indexed + + def _consider_getinteriorfield(self, op): t = unpack_interiorfielddescr(op.getdescr()) ofs, itemsize, fieldsize, sign = imm(t[0]), imm(t[1]), imm(t[2]), t[3] diff --git a/rpython/jit/backend/x86/runner.py b/rpython/jit/backend/x86/runner.py --- a/rpython/jit/backend/x86/runner.py +++ b/rpython/jit/backend/x86/runner.py @@ -25,9 +25,9 @@ frame_reg = regloc.ebp # can an ISA instruction handle a constant offset? - load_constant_offset = False + load_constant_offset = True # can an ISA instruction handle a factor to the offset? - load_supported_factors = (1,) + load_supported_factors = (1,2,4,8) from rpython.jit.backend.x86.arch import JITFRAME_FIXED_SIZE all_reg_indexes = gpr_reg_mgr_cls.all_reg_indexes 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 @@ -1103,8 +1103,18 @@ # '_ALWAYS_PURE_LAST', # ----- end of always_pure operations ----- + # parameters GC_LOAD + # 1: pointer to complex object + # 2: integer describing the offset + # 3: constant integer. byte size of datatype to load (negative if it is signed) 'GC_LOAD/3/rfi', - 'GC_LOAD_INDEXED/4/rfi', + # parameters GC_LOAD_INDEXED + # 1: pointer to complex object + # 2: integer describing the offset + # 3: constant integer scale factor + # 4: constant integer offset + # 5: constant integer. byte size of datatype to load (negative if it is signed) + 'GC_LOAD_INDEXED/5/rfi', '_RAW_LOAD_FIRST', 'GETARRAYITEM_GC/2d/rfi', _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit