[pypy-commit] pypy ppc-jit-backend: factor out common code
hager
noreply at buildbot.pypy.org
Fri Mar 23 15:39:07 CET 2012
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r53940:86b9bb6c612b
Date: 2012-03-23 07:37 -0700
http://bitbucket.org/pypy/pypy/changeset/86b9bb6c612b/
Log: factor out common code
diff --git a/pypy/jit/backend/ppc/arch.py b/pypy/jit/backend/ppc/arch.py
--- a/pypy/jit/backend/ppc/arch.py
+++ b/pypy/jit/backend/ppc/arch.py
@@ -30,3 +30,9 @@
SIZE_LOAD_IMM_PATCH_SP = 6
FORCE_INDEX_OFS = len(MANAGED_REGS) * WORD
+
+# offset to LR in BACKCHAIN
+if IS_PPC_32:
+ LR_BC_OFFSET = WORD
+else:
+ LR_BC_OFFSET = 2 * WORD
diff --git a/pypy/jit/backend/ppc/codebuilder.py b/pypy/jit/backend/ppc/codebuilder.py
--- a/pypy/jit/backend/ppc/codebuilder.py
+++ b/pypy/jit/backend/ppc/codebuilder.py
@@ -3,7 +3,8 @@
from pypy.jit.backend.ppc.locations import RegisterLocation
from pypy.jit.backend.ppc.ppc_field import ppc_fields
from pypy.jit.backend.ppc.assembler import Assembler
-from pypy.jit.backend.ppc.arch import (IS_PPC_32, WORD, IS_PPC_64)
+from pypy.jit.backend.ppc.arch import (IS_PPC_32, WORD, IS_PPC_64,
+ LR_BC_OFFSET)
import pypy.jit.backend.ppc.register as r
from pypy.jit.backend.llsupport.asmmemmgr import BlockBuilderMixin
from pypy.rpython.lltypesystem import lltype, rffi
@@ -1066,6 +1067,24 @@
if IS_PPC_64:
self.load(r.TOC.value, r.SP.value, 5 * WORD)
+ def make_function_prologue(self, frame_size):
+ """ Build a new stackframe of size frame_size
+ and store the LR in the previous frame.
+ """
+ with scratch_reg(self):
+ self.store_update(r.SP.value, r.SP.value, -frame_size)
+ self.mflr(r.SCRATCH.value)
+ self.store(r.SCRATCH.value, r.SP.value, frame_size + LR_BC_OFFSET)
+
+ def restore_LR_from_caller_frame(self, frame_size):
+ """ Restore the LR from the calling frame.
+ frame_size is the size of the current frame.
+ """
+ with scratch_reg(self):
+ lr_offset = frame_size + LR_BC_OFFSET
+ self.load(r.SCRATCH.value, r.SP.value, lr_offset)
+ self.mtlr(r.SCRATCH.value)
+
def load(self, target_reg, base_reg, offset):
if IS_PPC_32:
self.lwz(target_reg, base_reg, offset)
@@ -1090,6 +1109,12 @@
else:
self.stdx(from_reg, base_reg, offset_reg)
+ def store_update(self, target_reg, from_reg, offset):
+ if IS_PPC_32:
+ self.stwu(target_reg, from_reg, offset)
+ else:
+ self.stdu(target_reg, from_reg, offset)
+
def srli_op(self, target_reg, from_reg, numbits):
if IS_PPC_32:
self.srwi(target_reg, from_reg, numbits)
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
@@ -121,16 +121,8 @@
# The code generated here allocates a new stackframe
# and is the first machine code to be executed.
def _make_frame(self, frame_depth):
- if IS_PPC_32:
- # save it in previous frame (Backchain)
- self.mc.stwu(r.SP.value, r.SP.value, -frame_depth)
- self.mc.mflr(r.SCRATCH.value) # move old link register
- # save old link register in previous frame
- self.mc.stw(r.SCRATCH.value, r.SP.value, frame_depth + WORD)
- else:
- self.mc.stdu(r.SP.value, r.SP.value, -frame_depth)
- self.mc.mflr(r.SCRATCH.value)
- self.mc.std(r.SCRATCH.value, r.SP.value, frame_depth + 2 * WORD)
+ self.mc.make_function_prologue(frame_depth)
+
# save SPP at the bottom of the stack frame
self.mc.store(r.SPP.value, r.SP.value, WORD)
@@ -353,7 +345,7 @@
ofs = WORD
else:
ofs = WORD * 2
-
+
with scratch_reg(mc):
mc.load(r.SCRATCH.value, r.SP.value, frame_size + ofs)
mc.mtlr(r.SCRATCH.value)
@@ -421,15 +413,7 @@
mc.write32(0)
# build frame
- with scratch_reg(mc):
- if IS_PPC_32:
- mc.stwu(r.SP.value, r.SP.value, -frame_size)
- mc.mflr(r.SCRATCH.value)
- mc.stw(r.SCRATCH.value, r.SP.value, frame_size + WORD)
- else:
- mc.stdu(r.SP.value, r.SP.value, -frame_size)
- mc.mflr(r.SCRATCH.value)
- mc.std(r.SCRATCH.value, r.SP.value, frame_size + 2 * WORD)
+ mc.make_function_prologue(frame_size)
# save parameter registers
for i, reg in enumerate(r.PARAM_REGS):
@@ -456,14 +440,7 @@
mc.load(reg.value, r.SP.value, (i + BACKCHAIN_SIZE) * WORD)
# restore LR
- with scratch_reg(mc):
- lr_offset = frame_size + WORD
- if IS_PPC_64:
- lr_offset += WORD
-
- mc.load(r.SCRATCH.value, r.SP.value,
- lr_offset)
- mc.mtlr(r.SCRATCH.value)
+ mc.restore_LR_from_caller_frame(frame_size)
# reset SP
mc.addi(r.SP.value, r.SP.value, frame_size)
@@ -629,27 +606,13 @@
# | |
# ============================== <- SP
- if IS_PPC_32:
- self.mc.stwu(r.SP.value, r.SP.value, -frame_size)
- self.mc.mflr(r.SCRATCH.value)
- self.mc.stw(r.SCRATCH.value, r.SP.value, frame_size + WORD)
- else:
- self.mc.stdu(r.SP.value, r.SP.value, -frame_size)
- self.mc.mflr(r.SCRATCH.value)
- self.mc.std(r.SCRATCH.value, r.SP.value, frame_size + 2 * WORD)
+ self.mc.make_function_prologue(frame_size)
# make check
self.mc.call(self.stack_check_slowpath)
# restore LR
- with scratch_reg(self.mc):
- lr_offset = frame_size + WORD
- if IS_PPC_64:
- lr_offset += WORD
-
- self.mc.load(r.SCRATCH.value, r.SP.value,
- lr_offset)
- self.mc.mtlr(r.SCRATCH.value)
+ self.mc.restore_LR_from_caller_frame(frame_size)
# remove minimal frame
self.mc.addi(r.SP.value, r.SP.value, frame_size)
More information about the pypy-commit
mailing list