Author: hager <sven.ha...@uni-duesseldorf.de> Branch: ppc-jit-backend Changeset: r51257:65654d65854a Date: 2012-01-11 16:26 -0800 http://bitbucket.org/pypy/pypy/changeset/65654d65854a/
Log: Use get_scratch_reg to obtain an additional scratch register in prepare_(set/get)arrayitem_gc diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py --- a/pypy/jit/backend/ppc/ppcgen/opassembler.py +++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py @@ -547,17 +547,12 @@ self.mc.load(res.value, base_loc.value, ofs.value) def emit_setarrayitem_gc(self, op, arglocs, regalloc): - value_loc, base_loc, ofs_loc, scale, ofs = arglocs + value_loc, base_loc, ofs_loc, scratch_loc, scale, ofs = arglocs assert ofs_loc.is_reg() - # use r20 as scratch reg - SAVE_SCRATCH = r.r20 - # save value temporarily - self.mc.mtctr(SAVE_SCRATCH.value) - if scale.value > 0: #scale_loc = r.SCRATCH - scale_loc = SAVE_SCRATCH + scale_loc = scratch_loc if IS_PPC_32: self.mc.slwi(scale_loc.value, ofs_loc.value, scale.value) else: @@ -581,23 +576,14 @@ else: assert 0, "scale %s not supported" % (scale.value) - # restore value of SAVE_SCRATCH - self.mc.mfctr(SAVE_SCRATCH.value) - emit_setarrayitem_raw = emit_setarrayitem_gc def emit_getarrayitem_gc(self, op, arglocs, regalloc): - res, base_loc, ofs_loc, scale, ofs = arglocs + res, base_loc, ofs_loc, scratch_loc, scale, ofs = arglocs assert ofs_loc.is_reg() - # use r20 as scratch reg - SAVE_SCRATCH = r.r20 - # save value temporarily - self.mc.mtctr(SAVE_SCRATCH.value) - if scale.value > 0: - #scale_loc = r.SCRATCH - scale_loc = SAVE_SCRATCH + scale_loc = scratch_loc if IS_PPC_32: self.mc.slwi(scale_loc.value, ofs_loc.value, scale.value) else: @@ -621,9 +607,6 @@ else: assert 0 - # restore value of SAVE_SCRATCH - self.mc.mfctr(SAVE_SCRATCH.value) - #XXX Hack, Hack, Hack if not we_are_translated(): descr = op.getdescr() diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py --- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py +++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py @@ -585,6 +585,7 @@ if op.result: regalloc.possibly_free_var(op.result) regalloc.possibly_free_vars_for_op(op) + regalloc.free_temp_vars() regalloc._check_invariants() def can_merge_with_next_guard(self, op, i, operations): diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py --- a/pypy/jit/backend/ppc/ppcgen/regalloc.py +++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py @@ -105,6 +105,14 @@ forbidden_vars=forbidden_vars) return reg, box + def get_scratch_reg(self, type=INT, forbidden_vars=[], selected_reg=None): + assert type == INT or type == REF + box = TempBox() + self.temp_boxes.append(box) + reg = self.force_allocate_reg(box, forbidden_vars=forbidden_vars, + selected_reg=selected_reg) + return reg + class PPCFrameManager(FrameManager): def __init__(self): FrameManager.__init__(self) @@ -287,6 +295,15 @@ box = thing return loc, box + def get_scratch_reg(self, type, forbidden_vars=[], selected_reg=None): + if type == FLOAT: + assert 0, "not implemented yet" + else: + return self.rm.get_scratch_reg(type, forbidden_vars, selected_reg) + + def free_temp_vars(self): + self.rm.free_temp_vars() + def make_sure_var_in_reg(self, var, forbidden_vars=[], selected_reg=None, need_lower_byte=False): return self.rm.make_sure_var_in_reg(var, forbidden_vars, @@ -606,7 +623,10 @@ ofs_loc, _ = self._ensure_value_is_boxed(a1, args) value_loc, _ = self._ensure_value_is_boxed(a2, args) assert _check_imm_arg(ofs) - return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs)] + scratch_loc = self.rm.get_scratch_reg(INT, [base_loc, ofs_loc]) + assert scratch_loc not in [base_loc, ofs_loc] + return [value_loc, base_loc, ofs_loc, + scratch_loc, imm(scale), imm(ofs)] prepare_setarrayitem_raw = prepare_setarrayitem_gc @@ -618,11 +638,14 @@ boxes.append(base_box) ofs_loc, ofs_box = self._ensure_value_is_boxed(a1, boxes) boxes.append(ofs_box) + scratch_loc = self.rm.get_scratch_reg(INT, [base_loc, ofs_loc]) + assert scratch_loc not in [base_loc, ofs_loc] self.possibly_free_vars(boxes) res = self.force_allocate_reg(op.result) self.possibly_free_var(op.result) assert _check_imm_arg(ofs) - return [res, base_loc, ofs_loc, imm(scale), imm(ofs)] + return [res, base_loc, ofs_loc, + scratch_loc, imm(scale), imm(ofs)] prepare_getarrayitem_raw = prepare_getarrayitem_gc prepare_getarrayitem_gc_pure = prepare_getarrayitem_gc _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit