[pypy-commit] pypy ppc-jit-backend: allocate and use a scratch register for get/set arrayitem in case the scale > 0
bivab
noreply at buildbot.pypy.org
Tue Nov 15 10:35:53 CET 2011
Author: David Schneider <david.schneider at picle.org>
Branch: ppc-jit-backend
Changeset: r49433:7a670ce597e7
Date: 2011-11-15 10:35 +0100
http://bitbucket.org/pypy/pypy/changeset/7a670ce597e7/
Log: allocate and use a scratch register for get/set arrayitem in case
the scale > 0
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
@@ -364,20 +364,20 @@
self.mc.ld(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, scale, ofs, scratch_reg = arglocs
if scale.value > 0:
- scale_loc = r.r0
+ scale_loc = scratch_reg
if IS_PPC_32:
- self.mc.slwi(r.r0.value, ofs_loc.value, scale.value)
+ self.mc.slwi(scale_loc.value, ofs_loc.value, scale.value)
else:
- self.mc.sldi(r.r0.value, ofs_loc.value, scale.value)
+ self.mc.sldi(scale_loc.value, ofs_loc.value, scale.value)
else:
scale_loc = ofs_loc
# add the base offset
if ofs.value > 0:
- #XXX cannot use addi because scale_loc may be r0
- self.mc.addic(r.r0.value, scale_loc.value, ofs.value)
+ assert scale_loc is not r.r0
+ self.mc.addi(r.r0.value, scale_loc.value, ofs.value)
scale_loc = r.r0
if scale.value == 3:
@@ -394,20 +394,20 @@
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, scale, ofs, scratch_reg = arglocs
if scale.value > 0:
- scale_loc = r.r0
+ scale_loc = scratch_reg
if IS_PPC_32:
- self.mc.slwi(r.r0.value, ofs_loc.value, scale.value)
+ self.mc.slwi(scale_loc.value, ofs_loc.value, scale.value)
else:
- self.mc.sldi(r.r0.value, ofs_loc.value, scale.value)
+ self.mc.sldi(scale_loc.value, ofs_loc.value, scale.value)
else:
scale_loc = ofs_loc
# add the base offset
if ofs.value > 0:
- #XXX cannot use addi because scale_loc may be r0
- self.mc.addic(r.r0.value, scale_loc.value, ofs.value)
+ assert scale_loc is not r.r0
+ self.mc.addi(r.r0.value, scale_loc.value, ofs.value)
scale_loc = r.r0
if scale.value == 3:
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
@@ -466,8 +466,13 @@
#XXX check if imm would be fine here
value_loc, value_box = self._ensure_value_is_boxed(b2, boxes)
boxes.append(value_box)
+ if scale > 0:
+ tmp, box = self.allocate_scratch_reg(forbidden_vars=boxes)
+ boxes.append(box)
+ else:
+ tmp = None
self.possibly_free_vars(boxes)
- return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs)]
+ return [value_loc, base_loc, ofs_loc, imm(scale), imm(ofs), tmp]
prepare_setarrayitem_raw = prepare_setarrayitem_gc
@@ -478,10 +483,15 @@
boxes.append(base_box)
ofs_loc, ofs_box = self._ensure_value_is_boxed(a1, boxes)
boxes.append(ofs_box)
+ if scale > 0:
+ tmp, box = self.allocate_scratch_reg(forbidden_vars=boxes)
+ boxes.append(box)
+ else:
+ tmp = None
self.possibly_free_vars(boxes)
res = self.force_allocate_reg(op.result)
self.possibly_free_var(op.result)
- return [res, base_loc, ofs_loc, imm(scale), imm(ofs)]
+ return [res, base_loc, ofs_loc, imm(scale), imm(ofs), tmp]
prepare_getarrayitem_raw = prepare_getarrayitem_gc
prepare_getarrayitem_gc_pure = prepare_getarrayitem_gc
More information about the pypy-commit
mailing list