[pypy-svn] pypy arm-backend-2: filter registers to be pushed and popped based on the reg_bindings
bivab
commits-noreply at bitbucket.org
Thu Mar 31 10:55:45 CEST 2011
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r43031:5cf8d2cf7e80
Date: 2011-03-31 10:54 +0200
http://bitbucket.org/pypy/pypy/changeset/5cf8d2cf7e80/
Log: filter registers to be pushed and popped based on the reg_bindings
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
@@ -275,7 +275,7 @@
saved_regs = r.caller_resp[1:]
else:
saved_regs = r.caller_resp
- with saved_registers(self.mc, saved_regs):
+ with saved_registers(self.mc, saved_regs, regalloc=regalloc):
# all arguments past the 4th go on the stack
if n_args > 4:
stack_args = n_args - 4
@@ -681,7 +681,7 @@
jd = descr.outermost_jitdriver_sd
assert jd is not None
asm_helper_adr = self.cpu.cast_adr_to_int(jd.assembler_helper_adr)
- with saved_registers(self.mc, r.caller_resp[1:]):
+ with saved_registers(self.mc, r.caller_resp[1:], regalloc=regalloc):
# resbox is allready in r0
self.mov_loc_loc(arglocs[1], r.r1)
self.mc.BL(asm_helper_adr)
diff --git a/pypy/jit/backend/arm/helper/assembler.py b/pypy/jit/backend/arm/helper/assembler.py
--- a/pypy/jit/backend/arm/helper/assembler.py
+++ b/pypy/jit/backend/arm/helper/assembler.py
@@ -35,7 +35,7 @@
regs = r.caller_resp[1:]
else:
regs = r.caller_resp
- with saved_registers(self.mc, regs):
+ with saved_registers(self.mc, regs, regalloc=regalloc):
helper(self.mc, fcond)
return fcond
return f
@@ -55,12 +55,25 @@
return f
class saved_registers(object):
- def __init__(self, assembler, regs_to_save):
+ def __init__(self, assembler, regs_to_save, regalloc=None):
self.assembler = assembler
- self.regs = regs_to_save
+ self.regalloc = regalloc
+ if self.regalloc:
+ self._filter_regs(regs_to_save)
+ else:
+ self.regs = regs_to_save
def __enter__(self):
- self.assembler.PUSH([r.value for r in self.regs])
+ if len(self.regs) > 0:
+ self.assembler.PUSH([r.value for r in self.regs])
def __exit__(self, *args):
- self.assembler.POP([r.value for r in self.regs])
+ if len(self.regs) > 0:
+ self.assembler.POP([r.value for r in self.regs])
+
+ def _filter_regs(self, regs_to_save):
+ regs = []
+ for box, reg in self.regalloc.reg_bindings.iteritems():
+ if reg in regs_to_save or reg is r.ip:
+ regs.append(reg)
+ self.regs = regs
More information about the Pypy-commit
mailing list