Author: edelsohn Branch: ppc-jit-backend Changeset: r56814:1a335bc6665e Date: 2012-08-22 20:54 -0400 http://bitbucket.org/pypy/pypy/changeset/1a335bc6665e/
Log: Import LR_BC_OFFSET and use it for MINIFRAME_SIZE LR offset. In _build_stack_check_slowpath, allocate MAX_REG_PARAMS area and allocate separate save area for PARAM_REGS. diff --git a/pypy/jit/backend/ppc/ppc_assembler.py b/pypy/jit/backend/ppc/ppc_assembler.py --- a/pypy/jit/backend/ppc/ppc_assembler.py +++ b/pypy/jit/backend/ppc/ppc_assembler.py @@ -9,7 +9,7 @@ FPR_SAVE_AREA, NONVOLATILES_FLOAT, FLOAT_INT_CONVERSION, FORCE_INDEX, SIZE_LOAD_IMM_PATCH_SP, - FORCE_INDEX_OFS) + FORCE_INDEX_OFS, LR_BC_OFFSET) from pypy.jit.backend.ppc.helper.assembler import Saved_Volatiles from pypy.jit.backend.ppc.helper.regalloc import _check_imm_arg import pypy.jit.backend.ppc.register as r @@ -417,9 +417,12 @@ mc = PPCBuilder() # make small frame to store data (parameter regs + LR + SCRATCH) in - # there - SAVE_AREA = len(r.PARAM_REGS) - frame_size = (BACKCHAIN_SIZE + SAVE_AREA) * WORD + # there. Allocate additional fixed save area for PPC64. + PARAM_AREA = len(r.PARAM_REGS) + FIXED_AREA = BACKCHAIN_SIZE + if IS_PPC_64: + FIXED_AREA += MAX_REG_PARAMS + frame_size = (FIXED_AREA + PARAM_AREA) * WORD # align the SP MINIFRAME_SIZE = BACKCHAIN_SIZE * WORD @@ -436,7 +439,7 @@ # save parameter registers for i, reg in enumerate(r.PARAM_REGS): - mc.store(reg.value, r.SP.value, (i + BACKCHAIN_SIZE) * WORD) + mc.store(reg.value, r.SP.value, (i + FIXED_AREA) * WORD) # use SP as single parameter for the call mc.mr(r.r3.value, r.SP.value) @@ -444,9 +447,6 @@ # stack still aligned mc.call(slowpathaddr) - XXX ^^^ the above call clobbers at least 48(r1), which - XXX contains the mc.store(r3.value) - with scratch_reg(mc): mc.load_imm(r.SCRATCH, self.cpu.pos_exception()) mc.loadx(r.SCRATCH.value, 0, r.SCRATCH.value) @@ -459,7 +459,7 @@ # restore parameter registers for i, reg in enumerate(r.PARAM_REGS): - mc.load(reg.value, r.SP.value, (i + BACKCHAIN_SIZE) * WORD) + mc.load(reg.value, r.SP.value, (i + FIXED_AREA) * WORD) # restore LR mc.restore_LR_from_caller_frame(frame_size) @@ -484,9 +484,7 @@ # are interrupting the function. # restore link register out of preprevious frame - offset_LR = frame_size + MINIFRAME_SIZE + WORD - if IS_PPC_64: - offset_LR += WORD + offset_LR = frame_size + MINIFRAME_SIZE + LR_BC_OFFSET with scratch_reg(mc): mc.load(r.SCRATCH.value, r.SP.value, offset_LR) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit