Author: Richard Plangger <planri...@gmail.com> 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 pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit