[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