Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r81506:25e9fedba6e8
Date: 2015-12-31 11:03 +0100
http://bitbucket.org/pypy/pypy/changeset/25e9fedba6e8/
Log: realloc frame is nearly working, it seems though the token is not
different from the frame?
diff --git a/rpython/jit/backend/zarch/assembler.py
b/rpython/jit/backend/zarch/assembler.py
--- a/rpython/jit/backend/zarch/assembler.py
+++ b/rpython/jit/backend/zarch/assembler.py
@@ -321,7 +321,6 @@
RCS2 = r.r10
RCS3 = r.r12
- # This trashes r0 and r2
self._store_and_reset_exception(mc, RCS2, RCS3)
# Do the call
@@ -344,7 +343,8 @@
mc.store(r.r3.value, r.r5.value, -WORD)
mc.restore_link()
- self._pop_core_regs_from_jitframe(mc)
+ # do not restore r2, thus [1:]
+ self._pop_core_regs_from_jitframe(mc, r.MANAGED_REGS[1:])
self._pop_fp_regs_from_jitframe(mc)
mc.BCR(c.ANY, r.RETURN)
@@ -409,13 +409,9 @@
self._push_fp_regs_to_jitframe(mc)
# allocate a stack frame!
- mc.STG(r.SP, l.addr(-STD_FRAME_SIZE_IN_BYTES, r.SP)) # store the
backchain
- mc.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
-
- # Do the call
+ mc.push_std_frame()
mc.raw_call(r.r12)
-
- mc.AGHI(r.SP, l.imm(STD_FRAME_SIZE_IN_BYTES))
+ mc.pop_std_frame()
# Finish
self._reload_frame_if_necessary(mc)
@@ -437,15 +433,14 @@
# registers).
mc = InstrBuilder()
#
- mc.STG(r.r14, l.addr(14*WORD, r.SP))
+ mc.trap()
+ # mc.STG(r.r14, l.addr(14*WORD, r.SP))
# Do the call
- # use SP as single parameter for the call
- mc.STG(r.SP, l.addr(0, r.SP)) # store the backchain
- mc.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
+ mc.push_std_frame()
mc.LGR(r.r2, r.SP)
mc.load_imm(mc.RAW_CALL_REG, slowpathaddr)
mc.raw_call()
- mc.AGHI(r.SP, l.imm(STD_FRAME_SIZE_IN_BYTES))
+ mc.pop_std_frame()
#
# Check if it raised StackOverflow
mc.load_imm(r.SCRATCH, self.cpu.pos_exception())
@@ -455,7 +450,7 @@
mc.cmp_op(r.SCRATCH, 0, imm=True)
#
# So we return to our caller, conditionally if "EQ"
- mc.LG(r.r14, l.addr(14*WORD, r.SP))
+ # mc.LG(r.r14, l.addr(14*WORD, r.SP))
mc.BCR(c.EQ, r.r14)
#
# Else, jump to propagate_exception_path
@@ -479,6 +474,7 @@
endaddr, lengthaddr, _ = self.cpu.insert_stack_check()
diff = lengthaddr - endaddr
assert check_imm_value(diff)
+ xxx
mc = self.mc
mc.load_imm(r.SCRATCH, self.stack_check_slowpath)
@@ -499,15 +495,15 @@
mc.LG(r.r2, l.addr(ofs, r.SPP))
patch_pos = mc.currpos()
# placeholder for the following instructions
- # CGRL r2, ... (6 bytes)
+ # CGFI r2, ... (6 bytes)
# BRC c, ... (4 bytes)
# LGHI r3, ... (4 bytes)
# sum -> (14 bytes)
mc.write('\x00'*14)
+ self.mc.push_std_frame()
mc.load_imm(r.RETURN, self._frame_realloc_slowpath)
self.load_gcmap(mc, r.r2, gcmap)
- self.mc.push_std_frame()
- mc.BCR(c.ANY, r.RETURN)
+ mc.raw_call()
self.mc.pop_std_frame()
self.frame_depth_to_patch.append((patch_pos, mc.currpos()))
@@ -852,9 +848,9 @@
for traps_pos, jmp_target in self.frame_depth_to_patch:
pmc = OverwritingBuilder(self.mc, traps_pos, 3)
# three traps, so exactly three instructions to patch here
- pmc.CGRL(r.r2, l.imm(frame_depth))
- pmc.BRC(c.EQ, jmp_target - (traps_pos + 6))
- pmc.LGHI(r.r3, frame_depth)
+ pmc.CGFI(r.r2, l.imm(frame_depth))
+ pmc.BRC(c.EQ, l.imm(jmp_target - (traps_pos + 6)))
+ pmc.LGHI(r.r3, l.imm(frame_depth))
pmc.overwrite()
def materialize_loop(self, looptoken):
@@ -910,11 +906,6 @@
relative_target))
def _call_header(self):
- # Reserve space for a function descriptor, 3 words
- #self.mc.write64(0)
- #self.mc.write64(0)
- #self.mc.write64(0)
-
# Build a new stackframe of size STD_FRAME_SIZE_IN_BYTES
self.mc.STMG(r.r6, r.r15, l.addr(6*WORD, r.SP))
# save the back chain
diff --git a/rpython/jit/backend/zarch/codebuilder.py
b/rpython/jit/backend/zarch/codebuilder.py
--- a/rpython/jit/backend/zarch/codebuilder.py
+++ b/rpython/jit/backend/zarch/codebuilder.py
@@ -206,10 +206,10 @@
def push_std_frame(self):
self.STG(r.SP, l.addr(-STD_FRAME_SIZE_IN_BYTES, r.SP))
- self.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
+ self.LAY(r.SP, l.addr(-STD_FRAME_SIZE_IN_BYTES, r.SP))
def pop_std_frame(self):
- self.AGHI(r.SP, l.imm(STD_FRAME_SIZE_IN_BYTES))
+ self.LAY(r.SP, l.addr(STD_FRAME_SIZE_IN_BYTES, r.SP))
class OverwritingBuilder(BlockBuilderMixin, AbstractZARCHBuilder):
def __init__(self, mc, start, num_insts=0):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit