[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