[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