Author: Richard Plangger <planri...@gmail.com> Branch: s390x-backend Changeset: r82059:822ac80ddd23 Date: 2016-02-03 17:43 +0100 http://bitbucket.org/pypy/pypy/changeset/822ac80ddd23/
Log: critical bugfix in gc writebarrier fastpath, simplifications and a test 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 @@ -205,7 +205,7 @@ saved_regs = None saved_fp_regs = None else: - # push all volatile registers, push RCS1, and sometimes push RCS2 + # push all volatile registers, sometimes push RCS2 if withcards: saved_regs = r.VOLATILES + [RCS2] else: @@ -223,8 +223,9 @@ # since the call to write barrier can't collect # (and this is assumed a bit left and right here, like lack # of _reload_frame_if_necessary) - # This trashes r0 and r2, which is fine in this case + # This trashes r0 and r1, which is fine in this case assert argument_loc is not r.r0 + assert argument_loc is not r.r1 self._store_and_reset_exception(mc, RCS2, RCS3) if withcards: diff --git a/rpython/jit/backend/zarch/instructions.py b/rpython/jit/backend/zarch/instructions.py --- a/rpython/jit/backend/zarch/instructions.py +++ b/rpython/jit/backend/zarch/instructions.py @@ -100,6 +100,7 @@ # OR operations 'OGR': ('rre', ['\xB9','\x81']), + 'OGRK': ('rrf_a', ['\xB9','\xE6']), 'OG': ('rxy', ['\xE3','\x81']), # or one byte and store it back at the op2 position 'OI': ('si', ['\x96']), diff --git a/rpython/jit/backend/zarch/opassembler.py b/rpython/jit/backend/zarch/opassembler.py --- a/rpython/jit/backend/zarch/opassembler.py +++ b/rpython/jit/backend/zarch/opassembler.py @@ -535,8 +535,7 @@ # So here, we can simply write again a beq, which will be # taken if GCFLAG_CARDS_SET is still not set. jns_location = mc.get_relative_pos() - mc.trap() - mc.write('\x00'*4) + mc.reserve_cond_jump() # # patch the 'NE' above currpos = mc.currpos() @@ -560,25 +559,23 @@ # compute in SCRATCH the index of the bit inside the byte: # (index >> card_page_shift) & 7 - # not supported on the development s390x :(, extension is not installed - # 0x80 sets zero flag. will store 0 into all selected bits - # mc.RISBGN(r.SCRATCH, loc_index, l.imm(3), l.imm(0x80 | 63), l.imm(61)) - mc.SRAG(r.SCRATCH, loc_index, l.addr(n)) - mc.NILL(r.SCRATCH, l.imm(0x7)) + # 0x80 sets zero flag. will store 0 into all not selected bits + mc.RISBGN(r.SCRATCH, loc_index, l.imm(61), l.imm(0x80 | 63), l.imm(64-n)) # invert the bits of tmp_loc - mc.XIHF(tmp_loc, l.imm(0xffffFFFF)) - mc.XILF(tmp_loc, l.imm(0xffffFFFF)) + mc.LCGR(tmp_loc, tmp_loc) + #mc.XIHF(tmp_loc, l.imm(0xffffFFFF)) + #mc.XILF(tmp_loc, l.imm(0xffffFFFF)) - # set SCRATCH to 1 << r2 + # set SCRATCH to 1 << r1 mc.LGHI(r.SCRATCH2, l.imm(1)) - mc.SLAG(r.SCRATCH2, r.SCRATCH2, l.addr(0,r.SCRATCH)) + mc.SLAG(r.SCRATCH, r.SCRATCH2, l.addr(0,r.SCRATCH)) # set this bit inside the byte of interest addr = l.addr(0, loc_base, tmp_loc) mc.LLGC(r.SCRATCH, addr) - mc.OGR(r.SCRATCH, r.SCRATCH2) - mc.STCY(r.SCRATCH, addr) + mc.OGRK(r.SCRATCH, r.SCRATCH, r.SCRATCH2) + mc.STC(r.SCRATCH, addr) # done else: byte_index = loc_index.value >> descr.jit_wb_card_page_shift @@ -589,7 +586,7 @@ addr = l.addr(byte_ofs, loc_base) mc.LLGC(r.SCRATCH, addr) mc.OILL(r.SCRATCH, l.imm(byte_val)) - mc.STCY(r.SCRATCH, addr) + mc.STC(r.SCRATCH, addr) # # patch the beq just above currpos = mc.currpos() diff --git a/rpython/jit/backend/zarch/test/test_assembler.py b/rpython/jit/backend/zarch/test/test_assembler.py --- a/rpython/jit/backend/zarch/test/test_assembler.py +++ b/rpython/jit/backend/zarch/test/test_assembler.py @@ -193,6 +193,16 @@ self.a.mc.BCR(con.ANY, r.r14) assert run_asm(self.a) == rffi.cast(rffi.ULONG,p) & ~(7) + def test_nill(self): + self.a.mc.load_imm(r.r2, 1) + self.a.mc.load_imm(r.r3, 0x010001) + self.a.mc.NILL(r.r3, loc.imm(0xFFFF)) + self.a.mc.BCR(con.EQ, r.r14) # should not branch + self.a.mc.load_imm(r.r2, 0) # should return here + self.a.mc.BCR(con.ANY, r.r14) + assert run_asm(self.a) == 0 + + def test_load_small_int_to_reg(self): self.a.mc.LGHI(r.r2, loc.imm(123)) self.a.jmpto(r.r14) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit