[pypy-commit] pypy ppc-jit-backend: (edelsohn, bivab) fix calls to leave_jitted_hook on PPC64 as well as restoring the LR to return from the compiled code

hager noreply at buildbot.pypy.org
Wed Dec 28 19:25:07 CET 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50928:44255e0c9ffe
Date: 2011-12-28 10:24 -0800
http://bitbucket.org/pypy/pypy/changeset/44255e0c9ffe/

Log:	(edelsohn, bivab) fix calls to leave_jitted_hook on PPC64 as well as
	restoring the LR to return from the compiled code

diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -872,7 +872,14 @@
             #
             # misaligned stack in the call, but it's ok because the write barrier
             # is not going to call anything more.  
-            self.mc.bl_abs(func)
+            if IS_PPC_32:
+                self.mc.bl_abs(func)
+            else:
+                self.mc.load_from_addr(r.SCRATCH, adr)
+                self.mc.load_from_addr(r.TOC, adr + WORD)
+                self.mc.load_from_addr(r.r11, adr + 2 * WORD)
+                self.mc.mtctr(r.SCRATCH.value)
+                self.mc.bctrl()
 
         # patch the JZ above
         offset = self.mc.currpos() - jz_location
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -279,7 +279,14 @@
         mc = PPCBuilder()
         with Saved_Volatiles(mc):
             addr = self.cpu.get_on_leave_jitted_int(save_exception=True)
-            mc.bl_abs(addr)
+            if IS_PPC_32:
+                mc.bl_abs(addr)
+            else:
+                mc.load_from_addr(r.SCRATCH, addr)
+                mc.load_from_addr(r.r2, addr + WORD)
+                mc.load_from_addr(r.r11, addr + 2 * WORD)
+                mc.mtctr(r.SCRATCH.value)
+                mc.bctrl()
         #mc.alloc_scratch_reg(self.cpu.propagate_exception_v)
         #mc.mr(r.RES.value, r.SCRATCH.value)
         #mc.free_scratch_reg()
@@ -292,7 +299,14 @@
 
         with Saved_Volatiles(mc):
             addr = self.cpu.get_on_leave_jitted_int(save_exception=save_exc)
-            mc.bl_abs(addr)
+            if IS_PPC_32:
+                mc.bl_abs(addr)
+            else:
+                mc.load_from_addr(r.SCRATCH, addr)
+                mc.load_from_addr(r.r2, addr + WORD)
+                mc.load_from_addr(r.r11, addr + 2 * WORD)
+                mc.mtctr(r.SCRATCH.value)
+                mc.bctrl()
 
         mc.b_abs(self.exit_code_adr)
         mc.prepare_insts_blocks()
@@ -345,7 +359,11 @@
         mc.mr(r.r5.value, r.SPP.value)
         self._restore_nonvolatiles(mc, r.r5)
         # load old backchain into r4
-        mc.load(r.r4.value, r.r5.value, self.OFFSET_SPP_TO_OLD_BACKCHAIN + WORD) 
+	if IS_PPC_32:
+	    ofs = WORD
+	else:
+	    ofs = WORD * 2
+        mc.load(r.r4.value, r.r5.value, self.OFFSET_SPP_TO_OLD_BACKCHAIN + ofs) 
         mc.mtlr(r.r4.value)     # restore LR
         # From SPP, we have a constant offset to the old backchain. We use the
         # SPP to re-establish the old backchain because this exit stub is


More information about the pypy-commit mailing list