Author: hager <sven.ha...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit