[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