[pypy-commit] pypy s390x-backend: pushed forward cond_call_gc_wb, two more tests now passing
plan_rich
pypy.commits at gmail.com
Thu Dec 17 05:27:02 EST 2015
Author: Richard Plangger <planrichi at gmail.com>
Branch: s390x-backend
Changeset: r81365:9dfc528a3994
Date: 2015-12-17 11:26 +0100
http://bitbucket.org/pypy/pypy/changeset/9dfc528a3994/
Log: pushed forward cond_call_gc_wb, two more tests now passing
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
@@ -42,6 +42,7 @@
self.loop_run_counters = []
self.gcrootmap_retaddr_forced = 0
self.failure_recovery_code = [0, 0, 0, 0]
+ self.wb_slowpath = [0,0,0,0,0]
def setup(self, looptoken):
BaseAssembler.setup(self, looptoken)
@@ -142,7 +143,6 @@
return startpos
def _build_wb_slowpath(self, withcards, withfloats=False, for_frame=False):
- return
descr = self.cpu.gc_ll_descr.write_barrier_descr
if descr is None:
return
@@ -164,10 +164,15 @@
else:
argument_loc = r.r0
- mc = PPCBuilder()
+ mc = InstrBuilder()
old_mc = self.mc
self.mc = mc
+
+ # save the information
+ mc.STG(r.r14, l.addr(14*WORD, r.SP))
+ # no need to store the back chain ? mc.STG(r.SP, l.addr(0, r.SP)) # store the backchain
+ LOCAL_VARS_OFFSET = 0
extra_stack_size = LOCAL_VARS_OFFSET + 4 * WORD + 8
extra_stack_size = (extra_stack_size + 15) & ~15
if for_frame:
@@ -179,28 +184,29 @@
# need to save many registers: the registers that are anyway
# destroyed by the call can be ignored (VOLATILES), and the
# non-volatile registers won't be changed here. It only needs
- # to save r.RCS1 (used below), r3 and f1 (possible results of
+ # to save r.RCS1 (used below), r1 and f0 (possible results of
# the call), and two more non-volatile registers (used to store
# the RPython exception that occurred in the CALL, if any).
#
# We need to increase our stack frame size a bit to store them.
#
- self.mc.load(r.SCRATCH.value, r.SP.value, 0) # SP back chain
- self.mc.store_update(r.SCRATCH.value, r.SP.value, -extra_stack_size)
- self.mc.std(r.RCS1.value, r.SP.value, LOCAL_VARS_OFFSET + 0 * WORD)
- self.mc.std(r.RCS2.value, r.SP.value, LOCAL_VARS_OFFSET + 1 * WORD)
- self.mc.std(r.RCS3.value, r.SP.value, LOCAL_VARS_OFFSET + 2 * WORD)
- self.mc.std(r.r3.value, r.SP.value, LOCAL_VARS_OFFSET + 3 * WORD)
- self.mc.stfd(r.f1.value, r.SP.value, LOCAL_VARS_OFFSET + 4 * WORD)
+ self.mc.TRAP2()
+ #self.mc.LGR(r.SCRATCH, l.addr(0,r.SP)) # SP back chain
+ #self.mc.STG(r.SCRATCH, l.addr(-extra_stack_size, r.SP.value))
+ #self.mc.STG(r.RCS1.value, r.SP.value, LOCAL_VARS_OFFSET + 0 * WORD)
+ #self.mc.STG(r.RCS2.value, r.SP.value, LOCAL_VARS_OFFSET + 1 * WORD)
+ #self.mc.STG(r.RCS3.value, r.SP.value, LOCAL_VARS_OFFSET + 2 * WORD)
+ #self.mc.STG(r.r2.value, r.SP.value, LOCAL_VARS_OFFSET + 3 * WORD)
+ #self.mc.STD(r.f1.value, r.SP.value, LOCAL_VARS_OFFSET + 4 * WORD)
saved_regs = None
saved_fp_regs = None
else:
# push all volatile registers, push RCS1, and sometimes push RCS2
if withcards:
- saved_regs = r.VOLATILES + [r.RCS1, r.RCS2]
+ saved_regs = r.VOLATILES # + [r.RCS1, r.RCS2]
else:
- saved_regs = r.VOLATILES + [r.RCS1]
+ saved_regs = r.VOLATILES # + [r.RCS1]
if withfloats:
saved_fp_regs = r.MANAGED_FP_REGS
else:
@@ -216,23 +222,29 @@
# of _reload_frame_if_necessary)
# This trashes r0 and r2, which is fine in this case
assert argument_loc is not r.r0
- self._store_and_reset_exception(mc, r.RCS2, r.RCS3)
+ # XXX TODO
+ #self._store_and_reset_exception(mc, r.RCS2, r.RCS3)
if withcards:
- mc.mr(r.RCS2.value, argument_loc.value)
+ # XXX TODO
+ pass
+ #kmc.mr(r.RCS2.value, argument_loc.value)
#
# Save the lr into r.RCS1
- mc.mflr(r.RCS1.value)
+ #mc.mflr(r.RCS1.value)
#
func = rffi.cast(lltype.Signed, func)
# Note: if not 'for_frame', argument_loc is r0, which must carefully
# not be overwritten above
- mc.mr(r.r3.value, argument_loc.value)
+ mc.STG(r.SP, l.addr(0, r.SP)) # store the backchain
+ mc.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
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))
#
# Restore lr
- mc.mtlr(r.RCS1.value)
+ # TODO mc.mtlr(r.RCS1.value)
if for_frame:
self._restore_exception(mc, r.RCS2, r.RCS3)
@@ -242,22 +254,26 @@
# not follow this instruction with another one that changes
# the status of cr0!
card_marking_mask = descr.jit_wb_cards_set_singlebyte
- mc.lbz(r.RCS2.value, r.RCS2.value, descr.jit_wb_if_flag_byteofs)
- mc.andix(r.RCS2.value, r.RCS2.value, card_marking_mask & 0xFF)
+ mc.trap()
+ #mc.lbz(r.RCS2.value, r.RCS2.value, descr.jit_wb_if_flag_byteofs)
+ #mc.andix(r.RCS2.value, r.RCS2.value, card_marking_mask & 0xFF)
if for_frame:
- self.mc.ld(r.RCS1.value, r.SP.value, LOCAL_VARS_OFFSET + 0 * WORD)
- self.mc.ld(r.RCS2.value, r.SP.value, LOCAL_VARS_OFFSET + 1 * WORD)
- self.mc.ld(r.RCS3.value, r.SP.value, LOCAL_VARS_OFFSET + 2 * WORD)
- self.mc.ld(r.r3.value, r.SP.value, LOCAL_VARS_OFFSET + 3 * WORD)
- self.mc.lfd(r.f1.value, r.SP.value, LOCAL_VARS_OFFSET + 4 * WORD)
- self.mc.addi(r.SP.value, r.SP.value, extra_stack_size)
+ self.mc.trap()
+ #self.mc.ld(r.RCS1.value, r.SP.value, LOCAL_VARS_OFFSET + 0 * WORD)
+ #self.mc.ld(r.RCS2.value, r.SP.value, LOCAL_VARS_OFFSET + 1 * WORD)
+ #self.mc.ld(r.RCS3.value, r.SP.value, LOCAL_VARS_OFFSET + 2 * WORD)
+ #self.mc.ld(r.r3.value, r.SP.value, LOCAL_VARS_OFFSET + 3 * WORD)
+ #self.mc.lfd(r.f1.value, r.SP.value, LOCAL_VARS_OFFSET + 4 * WORD)
+ #self.mc.addi(r.SP.value, r.SP.value, extra_stack_size)
else:
self._pop_core_regs_from_jitframe(mc, saved_regs)
self._pop_fp_regs_from_jitframe(mc, saved_fp_regs)
- mc.blr()
+ mc.LG(r.r14, l.addr(14*WORD, r.SP))
+ mc.BCR(c.ANY, r.RETURN)
+ #mc.blr()
self.mc = old_mc
rawstart = mc.materialize(self.cpu, [])
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
@@ -65,6 +65,8 @@
class InstrBuilder(BlockBuilderMixin, AbstractZARCHBuilder):
+ RAW_CALL_REG = r.r14
+
def __init__(self):
AbstractZARCHBuilder.__init__(self)
self.init_block_builder()
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
@@ -1,4 +1,6 @@
from rpython.jit.backend.llsupport.jump import remap_frame_layout
+from rpython.jit.backend.zarch.arch import (WORD,
+ STD_FRAME_SIZE_IN_BYTES)
from rpython.jit.backend.zarch.arch import THREADLOCAL_ADDR_OFFSET
from rpython.jit.backend.zarch.helper.assembler import (gen_emit_cmp_op,
gen_emit_rr_or_rpool, gen_emit_shift, gen_emit_pool_or_rr_evenodd,
@@ -410,12 +412,12 @@
if is_frame:
assert loc_base is r.SPP
assert check_imm_value(descr.jit_wb_if_flag_byteofs)
- mc.LGB(r.SCRATCH2, l.addr(descr.jit_wb_if_flag_byteofs, loc_base))
+ mc.LLGC(r.SCRATCH2, l.addr(descr.jit_wb_if_flag_byteofs, loc_base))
mc.LGR(r.SCRATCH, r.SCRATCH2)
mc.NILL(r.SCRATCH, l.imm(mask & 0xFF))
jz_location = mc.get_relative_pos()
- mc.trap() # patched later with 'beq'
+ mc.trap() # patched later with 'EQ'
mc.write('\x00' * 4)
# for cond_call_gc_wb_array, also add another fast path:
@@ -425,7 +427,7 @@
mc.LGR(r.SCRATCH, r.SCRATCH2)
mc.NILL(r.SCRATCH, l.imm(card_marking_mask & 0xFF))
js_location = mc.get_relative_pos()
- mc.trap() # patched later with 'bne'
+ mc.trap() # patched later with 'NE'
mc.write('\x00' * 4)
else:
js_location = 0
@@ -447,10 +449,14 @@
assert self.wb_slowpath[helper_num] != 0
#
if not is_frame:
- mc.mr(r.r0.value, loc_base.value) # unusual argument location
- mc.load_imm(r.SCRATCH2, self.wb_slowpath[helper_num])
- mc.mtctr(r.SCRATCH2.value)
- mc.bctrl()
+ mc.LGR(r.r0, loc_base) # unusual argument location
+
+ mc.load_imm(r.r14, self.wb_slowpath[helper_num])
+ # alloc a stack frame
+ mc.AGHI(r.SP, l.imm(-STD_FRAME_SIZE_IN_BYTES))
+ mc.BASR(r.r14, r.r14)
+ # destory the frame
+ mc.AGHI(r.SP, l.imm(STD_FRAME_SIZE_IN_BYTES))
if card_marking_mask:
# The helper ends again with a check of the flag in the object.
@@ -458,18 +464,19 @@
# taken if GCFLAG_CARDS_SET is still not set.
jns_location = mc.get_relative_pos()
mc.trap()
+ mc.write('\x00'*4)
#
- # patch the 'bne' above
+ # patch the 'NE' above
currpos = mc.currpos()
pmc = OverwritingBuilder(mc, js_location, 1)
- pmc.bne(currpos - js_location)
+ pmc.BRCL(c.NE, l.imm(currpos - js_location))
pmc.overwrite()
#
# case GCFLAG_CARDS_SET: emit a few instructions to do
# directly the card flag setting
loc_index = arglocs[1]
if loc_index.is_reg():
-
+ xxx
tmp_loc = arglocs[2]
n = descr.jit_wb_card_page_shift
@@ -505,13 +512,13 @@
# patch the beq just above
currpos = mc.currpos()
pmc = OverwritingBuilder(mc, jns_location, 1)
- pmc.beq(currpos - jns_location)
+ pmc.BRCL(c.EQ, l.imm(currpos - jns_location))
pmc.overwrite()
# patch the JZ above
currpos = mc.currpos()
pmc = OverwritingBuilder(mc, jz_location, 1)
- pmc.beq(currpos - jz_location)
+ pmc.BRCL(c.EQ, l.imm(currpos - jz_location))
pmc.overwrite()
def emit_cond_call_gc_wb(self, op, arglocs, regalloc):
More information about the pypy-commit
mailing list