[pypy-commit] pypy ppc-jit-backend: make call to function before leave jitted code and save volatile regs
hager
noreply at buildbot.pypy.org
Wed Dec 14 11:28:23 CET 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50491:cc34d3b179e4
Date: 2011-12-14 11:27 +0100
http://bitbucket.org/pypy/pypy/changeset/cc34d3b179e4/
Log: make call to function before leave jitted code and save volatile
regs
diff --git a/pypy/jit/backend/ppc/ppcgen/helper/assembler.py b/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/helper/assembler.py
@@ -122,3 +122,28 @@
space = (6 + MAX_REG_PARAMS + len(self.regs)) * WORD
self.mc.addi(r.SP.value, r.SP.value, space)
+class Saved_Volatiles(object):
+ """ used in _gen_leave_jitted_hook_code to save volatile registers
+ in ENCODING AREA around calls
+ """
+
+ def __init__(self, codebuilder):
+ self.mc = codebuilder
+
+ def __enter__(self):
+ """ before a call, volatile registers are saved in ENCODING AREA
+ """
+ for i, reg in enumerate(r.VOLATILES):
+ if IS_PPC_32:
+ self.mc.stw(reg.value, r.SPP.value, i * WORD)
+ else:
+ self.mc.std(reg.value, r.SPP.value, i * WORD)
+
+ def __exit__(self, *args):
+ """ after call, volatile registers have to be restored
+ """
+ for i, reg in enumerate(r.VOLATILES):
+ if IS_PPC_32:
+ self.mc.lwz(reg.value, r.SPP.value, i * WORD)
+ else:
+ self.mc.ld(reg.value, r.SPP.value, i * WORD)
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
@@ -17,7 +17,8 @@
from pypy.jit.backend.ppc.ppcgen.helper.assembler import (gen_emit_cmp_op,
encode32, decode32,
decode64,
- count_reg_args)
+ count_reg_args,
+ Saved_Volatiles)
import pypy.jit.backend.ppc.ppcgen.register as r
import pypy.jit.backend.ppc.ppcgen.condition as c
from pypy.jit.metainterp.history import (Const, ConstPtr, LoopToken,
@@ -292,6 +293,11 @@
def _gen_leave_jitted_hook_code(self, save_exc=False):
mc = PPCBuilder()
+
+ with Saved_Volatiles(mc):
+ addr = self.cpu.get_on_leave_jitted_int(save_exception=save_exc)
+ mc.bl_abs(addr)
+
mc.b_abs(self.exit_code_adr)
mc.prepare_insts_blocks()
return mc.materialize(self.cpu.asmmemmgr, [],
@@ -505,7 +511,7 @@
self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
self.setup_failure_recovery()
self.exit_code_adr = self._gen_exit_path()
- #self._leave_jitted_hook_save_exc = self._gen_leave_jitted_hook_code(True)
+ self._leave_jitted_hook_save_exc = self._gen_leave_jitted_hook_code(True)
self._leave_jitted_hook = self._gen_leave_jitted_hook_code(False)
def assemble_loop(self, inputargs, operations, looptoken, log):
More information about the pypy-commit
mailing list