[pypy-svn] pypy arm-backend-2: Save an instruction in array get and set operations

bivab commits-noreply at bitbucket.org
Fri Jan 14 10:25:00 CET 2011


Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r40661:a5471cd0bb04
Date: 2011-01-12 11:45 +0100
http://bitbucket.org/pypy/pypy/changeset/a5471cd0bb04/

Log:	Save an instruction in array get and set operations

diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -395,19 +395,21 @@
         value_loc, base_loc, ofs_loc, scale, ofs = arglocs
 
         if scale.value > 0:
+            scale_loc = r.ip
             self.mc.LSL_ri(r.ip.value, ofs_loc.value, scale.value)
         else:
-            self.mc.MOV_rr(r.ip.value, ofs_loc.value)
+            scale_loc = ofs_loc
 
         if ofs.value > 0:
-            self.mc.ADD_ri(r.ip.value, r.ip.value, ofs.value)
+            self.mc.ADD_ri(r.ip.value, scale_loc.value, ofs.value)
+            scale_loc = r.ip
 
         if scale.value == 2:
-            self.mc.STR_rr(value_loc.value, base_loc.value, r.ip.value, cond=fcond)
+            self.mc.STR_rr(value_loc.value, base_loc.value, scale_loc.value, cond=fcond)
         elif scale.value == 1:
-            self.mc.STRH_rr(value_loc.value, base_loc.value, r.ip.value, cond=fcond)
+            self.mc.STRH_rr(value_loc.value, base_loc.value, scale_loc.value, cond=fcond)
         elif scale.value == 0:
-            self.mc.STRB_rr(value_loc.value, base_loc.value, r.ip.value, cond=fcond)
+            self.mc.STRB_rr(value_loc.value, base_loc.value, scale_loc.value, cond=fcond)
         else:
             assert 0
         return fcond
@@ -417,18 +419,20 @@
     def emit_op_getarrayitem_gc(self, op, arglocs, regalloc, fcond):
         res, base_loc, ofs_loc, scale, ofs = arglocs
         if scale.value > 0:
+            scale_loc = r.ip
             self.mc.LSL_ri(r.ip.value, ofs_loc.value, scale.value)
         else:
-            self.mc.MOV_rr(r.ip.value, ofs_loc.value)
+            scale_loc = ofs_loc
         if ofs.value > 0:
-            self.mc.ADD_ri(r.ip.value, r.ip.value, imm=ofs.value)
+            self.mc.ADD_ri(r.ip.value, scale_loc.value, imm=ofs.value)
+            scale_loc = r.ip
 
         if scale.value == 2:
-            self.mc.LDR_rr(res.value, base_loc.value, r.ip.value, cond=fcond)
+            self.mc.LDR_rr(res.value, base_loc.value, scale_loc.value, cond=fcond)
         elif scale.value == 1:
-            self.mc.LDRH_rr(res.value, base_loc.value, r.ip.value, cond=fcond)
+            self.mc.LDRH_rr(res.value, base_loc.value, scale_loc.value, cond=fcond)
         elif scale.value == 0:
-            self.mc.LDRB_rr(res.value, base_loc.value, r.ip.value, cond=fcond)
+            self.mc.LDRB_rr(res.value, base_loc.value, scale_loc.value, cond=fcond)
         else:
             assert 0
 


More information about the Pypy-commit mailing list