[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