Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r81927:3430d1f200fa
Date: 2016-01-25 11:02 +0100
http://bitbucket.org/pypy/pypy/changeset/3430d1f200fa/
Log: removed lldebug properties from test translation (left them for
debugging), fixed a bug when Const arg is provided to
force_allocate_reg, it could have consumed on of the forbidden_vars
diff --git a/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py
b/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py
--- a/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py
+++ b/rpython/jit/backend/llsupport/test/test_zrpy_gc_direct.py
@@ -26,7 +26,6 @@
t = TranslationContext()
t.config.translation.gc = "minimark"
t.config.translation.gcremovetypeptr = gcremovetypeptr
- t.config.translation.lldebug = True
ann = t.buildannotator()
ann.build_types(main, [s_list_of_strings], main_entry_point=True)
rtyper = t.buildrtyper()
diff --git a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
--- a/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
+++ b/rpython/jit/backend/llsupport/test/zrpy_gc_test.py
@@ -84,7 +84,6 @@
#
t = TranslationContext()
t.config.translation.gc = gc
- t.config.translation.lldebug = True # pretty useful when debugging assembly
if gc != 'boehm':
t.config.translation.gcremovetypeptr = True
for name, value in kwds.items():
diff --git a/rpython/jit/backend/zarch/arch.py
b/rpython/jit/backend/zarch/arch.py
--- a/rpython/jit/backend/zarch/arch.py
+++ b/rpython/jit/backend/zarch/arch.py
@@ -29,12 +29,12 @@
#
#
-THREADLOCAL_BYTES = 8
+# THREADLOCAL_BYTES = 8
# in reverse order to SP
STD_FRAME_SIZE_IN_BYTES = 160
-THREADLOCAL_ADDR_OFFSET = 8
+THREADLOCAL_ADDR_OFFSET = 16 # at position of r2, but r2 is never saved!!
assert STD_FRAME_SIZE_IN_BYTES % 2 == 0
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
@@ -199,7 +199,7 @@
#
mc.STMG(r.r10, r.r12, l.addr(10*WORD, r.SP))
mc.STG(r.r2, l.addr(2*WORD, r.SP))
- mc.STD(r.f0, l.addr(3*WORD, r.SP)) # slot of r3 is not used here
+ mc.STD(r.f0, l.addr(16*WORD, r.SP))
saved_regs = None
saved_fp_regs = None
else:
@@ -231,11 +231,11 @@
# Note: if not 'for_frame', argument_loc is r0, which must carefully
# not be overwritten above
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.load_imm(mc.RAW_CALL_REG, func)
mc.LGR(r.r2, argument_loc)
mc.raw_call()
- mc.AGHI(r.SP, l.imm(STD_FRAME_SIZE_IN_BYTES))
+ mc.pop_std_frame()
if for_frame:
self._restore_exception(mc, RCS2, RCS3)
@@ -251,7 +251,7 @@
if for_frame:
mc.LMG(r.r10, r.r12, l.addr(10*WORD, r.SP))
mc.LG(r.r2, l.addr(2*WORD, r.SP))
- mc.LD(r.f0, l.addr(3*WORD, r.SP)) # slot of r3 is not used here
+ mc.LD(r.f0, l.addr(16*WORD, r.SP))
else:
self._pop_core_regs_from_jitframe(mc, saved_regs)
self._pop_fp_regs_from_jitframe(mc, saved_fp_regs)
@@ -516,13 +516,13 @@
# registers).
mc = InstrBuilder()
#
- self._push_core_regs_to_jitframe(mc, [r.r14]) # store the link on the
jit frame
- # Do the call
+ # store the link backwards
+ self.mc.STMG(r.r14, r.r15, l.addr(14*WORD, r.SP))
mc.push_std_frame()
+
mc.LGR(r.r2, r.SP)
mc.load_imm(mc.RAW_CALL_REG, slowpathaddr)
mc.raw_call()
- mc.pop_std_frame()
#
# Check if it raised StackOverflow
mc.load_imm(r.SCRATCH, self.cpu.pos_exception())
@@ -531,9 +531,11 @@
# else we have an exception
mc.cmp_op(r.SCRATCH, l.imm(0), imm=True)
#
- self._pop_core_regs_from_jitframe(mc, [r.r14]) # restore the link on
the jit frame
+ size = STD_FRAME_SIZE_IN_BYTES
+ self.mc.LMG(r.r14, r.r15, l.addr(size+14*WORD, r.SP)) # restore the
link
# So we return to our caller, conditionally if "EQ"
mc.BCR(c.EQ, r.r14)
+ mc.trap() # debug if this is EVER executed!
#
# Else, jump to propagate_exception_path
assert self.propagate_exception_path
@@ -565,6 +567,7 @@
jmp_pos = self.mc.currpos()
self.mc.reserve_cond_jump()
+ mc.push_std_frame()
mc.load_imm(r.r14, self.stack_check_slowpath)
mc.BASR(r.r14, r.r14)
@@ -1006,6 +1009,9 @@
# save r3, the second argument, to THREADLOCAL_ADDR_OFFSET
self.mc.STG(r.r3, l.addr(THREADLOCAL_ADDR_OFFSET, r.SP))
+ # push a standard frame for any call
+ self.mc.push_std_frame()
+
# move the first argument to SPP: the jitframe object
self.mc.LGR(r.SPP, r.r2)
@@ -1049,30 +1055,10 @@
self._call_footer_shadowstack(gcrootmap)
# restore registers r6-r15
- self.mc.LMG(r.r6, r.r15, l.addr(6*WORD, r.SP))
+ size = STD_FRAME_SIZE_IN_BYTES
+ self.mc.LMG(r.r6, r.r15, l.addr(size+6*WORD, r.SP))
self.jmpto(r.r14)
- def _push_all_regs_to_frame(self, mc, ignored_regs, withfloats,
callee_only=False):
- # Push all general purpose registers
- base_ofs = self.cpu.get_baseofs_of_frame_field()
- if callee_only:
- regs = gpr_reg_mgr_cls.save_around_call_regs
- else:
- regs = gpr_reg_mgr_cls.all_regs
- for gpr in regs:
- if gpr not in ignored_regs:
- v = gpr_reg_mgr_cls.all_reg_indexes[gpr.value]
- mc.MOV_br(v * WORD + base_ofs, gpr.value)
- if withfloats:
- if IS_X86_64:
- coeff = 1
- else:
- coeff = 2
- # Push all XMM regs
- ofs = len(gpr_reg_mgr_cls.all_regs)
- for i in range(len(xmm_reg_mgr_cls.all_regs)):
- mc.MOVSD_bx((ofs + i * coeff) * WORD + base_ofs, i)
-
def _push_core_regs_to_jitframe(self, mc, includes=r.registers):
self._multiple_to_or_from_jitframe(mc, includes, store=True)
diff --git a/rpython/jit/backend/zarch/callbuilder.py
b/rpython/jit/backend/zarch/callbuilder.py
--- a/rpython/jit/backend/zarch/callbuilder.py
+++ b/rpython/jit/backend/zarch/callbuilder.py
@@ -62,7 +62,6 @@
# called function will in turn call further functions (which must be
passed the
# address of the new frame). This stack grows downwards from high
addresses
# """
- self.subtracted_to_sp = STD_FRAME_SIZE_IN_BYTES
gpr_regs = 0
fpr_regs = 0
@@ -151,7 +150,8 @@
# save the SP back chain
self.mc.STG(r.SP, l.addr(-self.subtracted_to_sp, r.SP))
# move the frame pointer
- self.mc.LAY(r.SP, l.addr(-self.subtracted_to_sp, r.SP))
+ if self.subtracted_to_sp != 0:
+ self.mc.LAY(r.SP, l.addr(-self.subtracted_to_sp, r.SP))
self.mc.raw_call()
#
self.ensure_correct_signzero_extension()
@@ -180,7 +180,8 @@
def restore_stack_pointer(self):
# it must at LEAST be 160 bytes
- self.mc.LAY(r.SP, l.addr(self.subtracted_to_sp, r.SP))
+ if self.subtracted_to_sp != 0:
+ self.mc.LAY(r.SP, l.addr(self.subtracted_to_sp, r.SP))
def load_result(self):
assert (self.resloc is None or
diff --git a/rpython/jit/backend/zarch/regalloc.py
b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -138,9 +138,9 @@
poolloc = l.pool(offset)
if force_in_reg:
if selected_reg is None:
- tmp = TempVar()
+ tmp = TempInt()
+ selected_reg = self.force_allocate_reg(tmp,
forbidden_vars=self.temp_boxes)
self.temp_boxes.append(tmp)
- selected_reg = self.force_allocate_reg(tmp)
self.assembler.mc.LG(selected_reg, poolloc)
return selected_reg
return poolloc
@@ -152,7 +152,7 @@
return loc
def get_scratch_reg(self):
- box = TempVar()
+ box = TempInt()
reg = self.force_allocate_reg(box, forbidden_vars=self.temp_boxes)
self.temp_boxes.append(box)
return reg
@@ -465,7 +465,8 @@
# else, return a regular register (not SPP).
if self.rm.reg_bindings.get(var, None) is not None:
return self.rm.loc(var, must_exist=True)
- return self.rm.force_allocate_reg(var)
+ forbidden_vars = self.rm.temp_boxes
+ return self.rm.force_allocate_reg(var, forbidden_vars)
def walk_operations(self, inputargs, operations):
from rpython.jit.backend.zarch.assembler import (
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit