[pypy-commit] pypy ppc-jit-backend: made first tests run again on ppc32
hager
noreply at buildbot.pypy.org
Fri Dec 2 20:51:28 CET 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50077:ecbfbef353c7
Date: 2011-12-02 20:50 +0100
http://bitbucket.org/pypy/pypy/changeset/ecbfbef353c7/
Log: made first tests run again on ppc32
diff --git a/pypy/jit/backend/ppc/ppcgen/arch.py b/pypy/jit/backend/ppc/ppcgen/arch.py
--- a/pypy/jit/backend/ppc/ppcgen/arch.py
+++ b/pypy/jit/backend/ppc/ppcgen/arch.py
@@ -7,12 +7,13 @@
if sys.maxint == (2**31 - 1):
WORD = 4
IS_PPC_32 = True
+ BACKCHAIN_SIZE = 2
else:
WORD = 8
IS_PPC_32 = False
+ BACKCHAIN_SIZE = 6
DWORD = 2 * WORD
-BACKCHAIN_SIZE = 6 * WORD
IS_PPC_64 = not IS_PPC_32
MY_COPY_OF_REGS = 0
diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -366,6 +366,8 @@
self.mc.std(r.r0.value, r.SP.value, stack_space + 2 * WORD)
# then we push everything on the stack
+ self.max_stack_params = max(self.max_stack_params, len(stack_args))\
+ + MAX_REG_PARAMS
for i, arg in enumerate(stack_args):
if IS_PPC_32:
abi = 2
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
@@ -111,9 +111,14 @@
have been generated.
'''
- GPR_SAVE_AREA_AND_FORCE_INDEX = GPR_SAVE_AREA + WORD
+ #GPR_SAVE_AREA_AND_FORCE_INDEX = GPR_SAVE_AREA + WORD
# ^^^^^^^^^^^^^ ^^^^
# save GRP regs force index
+ ENCODING_AREA = len(r.MANAGED_REGS) * WORD
+ OFFSET_SPP_TO_GPR_SAVE_AREA = (FORCE_INDEX + FLOAT_INT_CONVERSION
+ + ENCODING_AREA)
+ OFFSET_SPP_TO_OLD_BACKCHAIN = (OFFSET_SPP_TO_GPR_SAVE_AREA
+ + GPR_SAVE_AREA + FPR_SAVE_AREA)
def __init__(self, cpu, failargs_limit=1000):
self.cpu = cpu
@@ -132,21 +137,33 @@
self.max_stack_params = 0
def _save_nonvolatiles(self):
+ """ save nonvolatile GPRs in GPR SAVE AREA
+ """
for i, reg in enumerate(NONVOLATILES):
# save r31 later on
if reg.value == r.SPP.value:
continue
if IS_PPC_32:
- self.mc.stw(reg.value, r.SPP.value, WORD + WORD * i)
+ #self.mc.stw(reg.value, r.SPP.value, WORD + WORD * i)
+ self.mc.stw(reg.value, r.SPP.value,
+ self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
else:
- self.mc.std(reg.value, r.SPP.value, WORD + WORD * i)
+ #self.mc.std(reg.value, r.SPP.value, WORD + WORD * i)
+ self.mc.std(reg.value, r.SPP.value,
+ self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
def _restore_nonvolatiles(self, mc, spp_reg):
+ """ restore nonvolatile GPRs from GPR SAVE AREA
+ """
for i, reg in enumerate(NONVOLATILES):
if IS_PPC_32:
- mc.lwz(reg.value, spp_reg.value, WORD + WORD * i)
+ #mc.lwz(reg.value, spp_reg.value, WORD + WORD * i)
+ mc.lwz(reg.value, spp_reg.value,
+ self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
else:
- mc.ld(reg.value, spp_reg.value, WORD + WORD * i)
+ #mc.ld(reg.value, spp_reg.value, WORD + WORD * i)
+ mc.ld(reg.value, spp_reg.value,
+ self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
# Fetches the identifier from a descr object.
# If it has no identifier, then an unused identifier
@@ -194,8 +211,10 @@
self.mc.std(r.SPP.value, r.SP.value, WORD)
# compute spilling pointer (SPP)
- self.mc.addi(r.SPP.value, r.SP.value, frame_depth
- - self.GPR_SAVE_AREA_AND_FORCE_INDEX)
+ #self.mc.addi(r.SPP.value, r.SP.value, frame_depth
+ # - self.GPR_SAVE_AREA_AND_FORCE_INDEX)
+ self.mc.addi(r.SPP.value, r.SP.value,
+ frame_depth - self.OFFSET_SPP_TO_OLD_BACKCHAIN)
self._save_nonvolatiles()
# save r31, use r30 as scratch register
# this is safe because r30 has been saved already
@@ -275,18 +294,17 @@
else:
value = decode32(spilling_area, spilling_depth - stack_location * WORD)
else: # REG_LOC
+ #import pdb; pdb.set_trace()
reg = ord(enc[i])
if group == self.FLOAT_TYPE:
- value = decode64(vfp_regs, reg*2*WORD)
- self.fail_boxes_float.setitem(fail_index, value)
- continue
+ assert 0, "not implemented yet"
else:
# XXX dirty, fix
- sub = r.managed_regs_sub(reg)
+ #sub = r.managed_regs_sub(reg)
if IS_PPC_32:
- value = decode32(regs, (reg - sub) * WORD)
+ value = decode32(regs, (reg - 3) * WORD)
else:
- value = decode64(regs, (reg - sub) * WORD)
+ value = decode64(regs, (reg - 3) * WORD)
if group == self.INT_TYPE:
self.fail_boxes_int.setitem(fail_index, value)
@@ -360,12 +378,12 @@
def _gen_exit_path(self):
mc = PPCBuilder()
# compute offset to new SP
- size = WORD * (len(r.MANAGED_REGS)) + BACKCHAIN_SIZE
+ ##size = WORD * (len(r.MANAGED_REGS)) + BACKCHAIN_SIZE
# set SP
- if IS_PPC_32:
- mc.stwu(r.SP.value, r.SP.value, -size)
- else:
- mc.stdu(r.SP.value, r.SP.value, -size)
+ ##if IS_PPC_32:
+ ## mc.stwu(r.SP.value, r.SP.value, -size)
+ ##else:
+ ## mc.stdu(r.SP.value, r.SP.value, -size)
self._save_managed_regs(mc)
# adjust SP (r1)
# XXX do quadword alignment
@@ -385,14 +403,15 @@
# load parameters into parameter registers
if IS_PPC_32:
- mc.lwz(r.r3.value, r.SPP.value, 0) # address of state encoding
+ #mc.lwz(r.r3.value, r.SPP.value, 0) # address of state encoding
+ mc.lwz(r.r3.value, r.SPP.value, self.ENCODING_AREA) # address of state encoding
else:
mc.ld(r.r3.value, r.SPP.value, 0)
mc.mr(r.r4.value, r.SP.value) # load stack pointer
mc.mr(r.r5.value, r.SPP.value) # load spilling pointer
#
# load address of decoding function into r0
- mc.load_imm(r.r0, addr)
+ mc.alloc_scratch_reg(addr)
if IS_PPC_64:
mc.std(r.r2.value, r.SP.value, 3 * WORD)
# load TOC pointer and environment pointer
@@ -400,42 +419,52 @@
mc.load_imm(r.r11, r11_value)
# ... and branch there
mc.mtctr(r.r0.value)
+ mc.free_scratch_reg()
mc.bctrl()
if IS_PPC_64:
mc.ld(r.r2.value, r.SP.value, 3 * WORD)
#
- mc.addi(r.SP.value, r.SP.value, size)
+ ##mc.addi(r.SP.value, r.SP.value, size)
# save SPP in r5
# (assume that r5 has been written to failboxes)
mc.mr(r.r5.value, r.SPP.value)
self._restore_nonvolatiles(mc, r.r5)
# load old backchain into r4
- offset_to_old_backchain = self.GPR_SAVE_AREA_AND_FORCE_INDEX + WORD
+ #offset_to_old_backchain = ( FPR_SAVE_AREA
+ # + GPR_SAVE_AREA
+ # + FLOAT_INT_CONVERSION
+ # + FORCE_INDEX
+ # + self.ENCODING_AREA)
if IS_PPC_32:
- mc.lwz(r.r4.value, r.r5.value, offset_to_old_backchain)
+ #mc.lwz(r.r4.value, r.r5.value, offset_to_old_backchain)
+ mc.lwz(r.r4.value, r.r5.value, self.OFFSET_SPP_TO_OLD_BACKCHAIN + WORD)
else:
- mc.ld(r.r4.value, r.r5.value, offset_to_old_backchain + WORD)
+ ##mc.ld(r.r4.value, r.r5.value, offset_to_old_backchain + WORD)
+ #mc.ld(r.r4.value, r.r5.value, offset_to_old_backchain)
+ mc.ld(r.r4.value, r.r5.value, self.OFFSET_SPP_TO_OLD_BACKCHAIN + 2 * WORD)
mc.mtlr(r.r4.value) # restore LR
-
- # From SPP, we have a constant offset of GPR_SAVE_AREA_AND_FORCE_INDEX
- # to the old backchain. We use the SPP to re-establish the old backchain
- # because this exit stub is generated before we know how much space
- # the entire frame will need.
- mc.addi(r.SP.value, r.r5.value, self.GPR_SAVE_AREA_AND_FORCE_INDEX) # restore old SP
+ # From SPP, we have a constant offset to the old backchain. We use the
+ # SPP to re-establish the old backchain because this exit stub is
+ # generated before we know how much space the entire frame will need.
+ ##mc.addi(r.SP.value, r.r5.value, self.GPR_SAVE_AREA_AND_FORCE_INDEX) # restore old SP
+ #mc.addi(r.SP.value, r.r5.value, offset_to_old_backchain) # restore old SP
+ mc.addi(r.SP.value, r.r5.value, self.OFFSET_SPP_TO_OLD_BACKCHAIN) # restore old SP
mc.blr()
mc.prepare_insts_blocks()
return mc.materialize(self.cpu.asmmemmgr, [],
self.cpu.gc_ll_descr.gcrootmap)
- # Save all registers which are managed by the register
- # allocator on top of the stack before decoding.
def _save_managed_regs(self, mc):
+ """ store managed registers in ENCODING AREA
+ """
for i in range(len(r.MANAGED_REGS)):
reg = r.MANAGED_REGS[i]
if IS_PPC_32:
- mc.stw(reg.value, r.SP.value, i * WORD + BACKCHAIN_SIZE)
+ #mc.stw(reg.value, r.SP.value, i * WORD + BACKCHAIN_SIZE)
+ mc.stw(reg.value, r.SPP.value, i * WORD)
else:
- mc.std(reg.value, r.SP.value, i * WORD + BACKCHAIN_SIZE)
+ #mc.std(reg.value, r.SP.value, i * WORD + BACKCHAIN_SIZE)
+ mc.std(reg.value, r.SPP.value, i * WORD)
# Load parameters from fail args into locations (stack or registers)
def gen_bootstrap_code(self, nonfloatlocs, inputargs):
@@ -494,7 +523,9 @@
self.mc.free_scratch_reg()
# load values passed on the stack to the corresponding locations
- stack_position = self.GPR_SAVE_AREA_AND_FORCE_INDEX\
+ #stack_position = self.GPR_SAVE_AREA_AND_FORCE_INDEX\
+ # + BACKCHAIN_SIZE
+ stack_position = self.OFFSET_SPP_TO_OLD_BACKCHAIN\
+ BACKCHAIN_SIZE
count = 0
@@ -630,6 +661,9 @@
self._teardown()
def assemble_bridge(self, faildescr, inputargs, operations, looptoken, log):
+
+ assert 0, "Bridges do not work yet because they need to dynamically adjust the SP"
+
self.setup(looptoken, operations)
assert isinstance(faildescr, AbstractFailDescr)
code = faildescr._failure_recovery_code
@@ -785,8 +819,8 @@
+ FPR_SAVE_AREA
+ FLOAT_INT_CONVERSION
+ FORCE_INDEX
+ + self.ENCODING_AREA
+ regalloc.frame_manager.frame_depth * WORD
- + len(r.MANAGED_REGS) * WORD
+ self.max_stack_params * WORD
+ BACKCHAIN_SIZE)
@@ -819,12 +853,11 @@
memaddr = self.gen_descr_encoding(descr, args, arglocs)
# store addr in force index field
- self.mc.alloc_scratch_reg()
- self.mc.load_imm(r.r0, memaddr)
+ self.mc.alloc_scratch_reg(memaddr)
if IS_PPC_32:
- self.mc.stw(r.r0.value, r.SPP.value, 0)
+ self.mc.stw(r.r0.value, r.SPP.value, self.ENCODING_AREA)
else:
- self.mc.std(r.r0.value, r.SPP.value, 0)
+ self.mc.std(r.r0.value, r.SPP.value, self.ENCODING_AREA)
self.mc.free_scratch_reg()
if save_exc:
diff --git a/pypy/jit/backend/ppc/ppcgen/test/test_stackframe.py b/pypy/jit/backend/ppc/ppcgen/test/test_stackframe.py
--- a/pypy/jit/backend/ppc/ppcgen/test/test_stackframe.py
+++ b/pypy/jit/backend/ppc/ppcgen/test/test_stackframe.py
@@ -14,7 +14,7 @@
| | |
--------------------------- --
| | |
- | FLOAT/INT CONVERSION | |>> 4 (?) * WORD
+ | FLOAT/INT CONVERSION | |>> 1 * WORD
| | |
--------------------------- --
| FORCE INDEX | WORD | 1 WORD
@@ -26,7 +26,11 @@
| | |
| SPILLING AREA | |>> regalloc.frame_manager.frame_depth * WORD
| (LOCAL VARIABLE SPACE) | |
- --------------------------- --
+ --------------------------- --
+ | | |
+ | PARAMETER SAVE AREA | |>> max_stack_params * WORD
+ | | |
+ ---------------------------a --
| TOC POINTER | WORD |
--------------------------- |
| < RESERVED > | WORD |
More information about the pypy-commit
mailing list