[pypy-commit] pypy ppc-jit-backend: Import LR_BC_OFFSET and use it for MINIFRAME_SIZE LR offset.
edelsohn
noreply at buildbot.pypy.org
Thu Aug 23 02:54:57 CEST 2012
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)
More information about the pypy-commit
mailing list