[pypy-svn] pypy arm-backend-2: Move some redundant parts of guards to their own procedures

bivab commits-noreply at bitbucket.org
Mon Feb 21 14:20:19 CET 2011


Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r42198:c3de83bc0f2b
Date: 2011-02-21 14:15 +0100
http://bitbucket.org/pypy/pypy/changeset/c3de83bc0f2b/

Log:	Move some redundant parts of guards to their own procedures

diff --git a/pypy/jit/backend/arm/assembler.py b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -92,6 +92,7 @@
                                                       ll_new_unicode)
         self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
         self._exit_code_addr = self._gen_exit_path()
+        self._gen_leave_jitted_hook()
 
     def setup_failure_recovery(self):
 
@@ -199,12 +200,26 @@
         mem[i+2] = chr((n >> 16) & 0xFF)
         mem[i+3] = chr((n >> 24) & 0xFF)
 
+    def _gen_leave_jitted_hook(self):
+        def gen_code(save_exc=False):
+            mc = ARMv7Builder()
+            mc.PUSH([reg.value for reg in r.caller_resp] + [r.ip.value])
+            addr = self.cpu.get_on_leave_jitted_int(save_exception=save_exc)
+            mc.BL(addr)
+            mc.POP([reg.value for reg in r.caller_resp]+[r.ip.value])
+            assert self._exit_code_addr != 0
+            mc.B(self._exit_code_addr)
+            return mc.materialize(self.cpu.asmmemmgr, [],
+                                   self.cpu.gc_ll_descr.gcrootmap)
+        self._leave_jitted_jook_save_exc = gen_code(True)
+        self._leave_jitted_jook = gen_code(False)
+
     def _gen_exit_path(self):
         mc = ARMv7Builder()
         decode_registers_addr = llhelper(self.recovery_func_sign, self.failure_recovery_func)
 
         mc.PUSH([reg.value for reg in r.all_regs])     # registers r0 .. r10
-        mc.MOV_rr(r.r0.value, r.lr.value) # move mem block address, to r0 to pass as
+        mc.MOV_rr(r.r0.value, r.ip.value) # move mem block address, to r0 to pass as
         mc.MOV_rr(r.r1.value, r.fp.value) # pass the current frame pointer as second param
         mc.MOV_rr(r.r2.value, r.sp.value) # pass the current stack pointer as third param
 
@@ -216,12 +231,11 @@
         return mc.materialize(self.cpu.asmmemmgr, [],
                                    self.cpu.gc_ll_descr.gcrootmap)
 
-    def _gen_path_to_exit_path(self, op, args, arglocs, fcond=c.AL):
+    def _gen_path_to_exit_path(self, op, args, arglocs, fcond=c.AL, save_exc=False):
         descr = op.getdescr()
         if op.getopnum() != rop.FINISH:
             assert isinstance(descr, AbstractFailDescr)
             descr._arm_frame_depth = arglocs[0].getint()
-        reg = r.lr
         # The size of the allocated memory is based on the following sizes
         # first argloc is the frame depth and not considered for the memory
         # allocation
@@ -272,8 +286,12 @@
 
         n = self.cpu.get_fail_descr_number(descr)
         self.encode32(mem, j+1, n)
-        self.mc.LDR_ri(r.lr.value, r.pc.value, imm=WORD)
-        self.mc.B(self._exit_code_addr)
+        self.mc.LDR_ri(r.ip.value, r.pc.value, imm=WORD)
+        if save_exc:
+            path = self._leave_jitted_jook_save_exc
+        else:
+            path = self._leave_jitted_jook
+        self.mc.B(path)
         self.mc.write32(memaddr)
 
         return memaddr

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
@@ -129,7 +129,7 @@
 
     _mixin_ = True
 
-    guard_size = 10*WORD
+    guard_size = 5*WORD
     def _emit_guard(self, op, arglocs, fcond, save_exc=False):
         descr = op.getdescr()
         assert isinstance(descr, AbstractFailDescr)
@@ -139,12 +139,9 @@
 
         self.mc.ADD_ri(r.pc.value, r.pc.value, self.guard_size-PC_OFFSET, cond=fcond)
         descr._arm_guard_pos = self.mc.currpos()
-        self.mc.PUSH([reg.value for reg in r.caller_resp])
-        addr = self.cpu.get_on_leave_jitted_int(save_exception=save_exc)
-        self.mc.BL(addr)
-        self.mc.POP([reg.value for reg in r.caller_resp])
 
-        memaddr = self._gen_path_to_exit_path(op, op.getfailargs(), arglocs)
+        memaddr = self._gen_path_to_exit_path(op, op.getfailargs(),
+                                            arglocs, save_exc=save_exc)
         descr._failure_recovery_code = memaddr
         return c.AL
 


More information about the Pypy-commit mailing list