Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r83658:911126fe2131 Date: 2016-04-13 22:28 +0200 http://bitbucket.org/pypy/pypy/changeset/911126fe2131/
Log: fix ppc for jit-constptr-2 diff --git a/rpython/jit/backend/arm/assembler.py b/rpython/jit/backend/arm/assembler.py --- a/rpython/jit/backend/arm/assembler.py +++ b/rpython/jit/backend/arm/assembler.py @@ -994,18 +994,6 @@ else: clt.invalidate_positions.append((guard_pos, relative_offset)) - def get_asmmemmgr_blocks(self, looptoken): - clt = looptoken.compiled_loop_token - if clt.asmmemmgr_blocks is None: - clt.asmmemmgr_blocks = [] - return clt.asmmemmgr_blocks - - def get_asmmemmgr_gcreftracers(self, looptoken): - clt = looptoken.compiled_loop_token - if clt.asmmemmgr_gcreftracers is None: - clt.asmmemmgr_gcreftracers = [] - return clt.asmmemmgr_gcreftracers - def _walk_operations(self, inputargs, operations, regalloc): fcond = c.AL self._regalloc = regalloc diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py --- a/rpython/jit/backend/llsupport/assembler.py +++ b/rpython/jit/backend/llsupport/assembler.py @@ -161,6 +161,18 @@ assert self._allgcrefs_faildescr_next < len(self._allgcrefs) return self._allgcrefs_faildescr_next + def get_asmmemmgr_blocks(self, looptoken): + clt = looptoken.compiled_loop_token + if clt.asmmemmgr_blocks is None: + clt.asmmemmgr_blocks = [] + return clt.asmmemmgr_blocks + + def get_asmmemmgr_gcreftracers(self, looptoken): + clt = looptoken.compiled_loop_token + if clt.asmmemmgr_gcreftracers is None: + clt.asmmemmgr_gcreftracers = [] + return clt.asmmemmgr_gcreftracers + def set_debug(self, v): r = self._debug self._debug = v diff --git a/rpython/jit/backend/ppc/codebuilder.py b/rpython/jit/backend/ppc/codebuilder.py --- a/rpython/jit/backend/ppc/codebuilder.py +++ b/rpython/jit/backend/ppc/codebuilder.py @@ -936,9 +936,9 @@ class PPCGuardToken(GuardToken): def __init__(self, cpu, gcmap, descr, failargs, faillocs, - guard_opnum, frame_depth, fcond=c.cond_none): + guard_opnum, frame_depth, faildescrindex, fcond=c.cond_none): GuardToken.__init__(self, cpu, gcmap, descr, failargs, faillocs, - guard_opnum, frame_depth) + guard_opnum, frame_depth, faildescrindex) self.fcond = fcond @@ -1012,13 +1012,15 @@ self.load_imm(dest_reg, word) return diff - def load_from_addr(self, rD, addr): - assert rD is not r.r0 - diff = self.load_imm_plus(rD, addr) + def load_from_addr(self, rD, rT, addr): + # load [addr] into rD. rT is a temporary register which can be + # equal to rD, but can't be r0. + assert rT is not r.r0 + diff = self.load_imm_plus(rT, addr) if IS_PPC_32: - self.lwz(rD.value, rD.value, diff) + self.lwz(rD.value, rT.value, diff) else: - self.ld(rD.value, rD.value, diff) + self.ld(rD.value, rT.value, diff) def b_offset(self, target): curpos = self.currpos() @@ -1279,7 +1281,7 @@ oplist = [None] * (rop._LAST + 1) for key, val in rop.__dict__.items(): - if key.startswith("_"): + if key.startswith("_") or not isinstance(val, int): continue opname = key.lower() methname = "emit_%s" % opname diff --git a/rpython/jit/backend/ppc/opassembler.py b/rpython/jit/backend/ppc/opassembler.py --- a/rpython/jit/backend/ppc/opassembler.py +++ b/rpython/jit/backend/ppc/opassembler.py @@ -291,8 +291,10 @@ def build_guard_token(self, op, frame_depth, arglocs, fcond): descr = op.getdescr() gcmap = allocate_gcmap(self, frame_depth, r.JITFRAME_FIXED_SIZE) + faildescrindex = self.get_gcref_from_faildescr(descr) token = PPCGuardToken(self.cpu, gcmap, descr, op.getfailargs(), arglocs, op.getopnum(), frame_depth, + faildescrindex, fcond) return token @@ -474,19 +476,19 @@ def emit_finish(self, op, arglocs, regalloc): base_ofs = self.cpu.get_baseofs_of_frame_field() - if len(arglocs) > 1: - [return_val, fail_descr_loc] = arglocs + if len(arglocs) > 0: + [return_val] = arglocs if op.getarg(0).type == FLOAT: self.mc.stfd(return_val.value, r.SPP.value, base_ofs) else: self.mc.std(return_val.value, r.SPP.value, base_ofs) - else: - [fail_descr_loc] = arglocs ofs = self.cpu.get_ofs_of_frame_field('jf_descr') ofs2 = self.cpu.get_ofs_of_frame_field('jf_gcmap') - self.mc.load_imm(r.r5, fail_descr_loc.getint()) + descr = op.getdescr() + faildescrindex = self.get_gcref_from_faildescr(descr) + self._load_from_gc_table(r.r5, r.r5, faildescrindex) # gcmap logic here: arglist = op.getarglist() @@ -541,7 +543,7 @@ emit_cast_int_to_ptr = _genop_same_as def emit_guard_no_exception(self, op, arglocs, regalloc): - self.mc.load_from_addr(r.SCRATCH2, self.cpu.pos_exception()) + self.mc.load_from_addr(r.SCRATCH2, r.SCRATCH2, self.cpu.pos_exception()) self.mc.cmp_op(0, r.SCRATCH2.value, 0, imm=True) self.guard_success_cc = c.EQ self._emit_guard(op, arglocs) @@ -586,6 +588,17 @@ mc.store(r.SCRATCH.value, r.SCRATCH2.value, 0) mc.store(r.SCRATCH.value, r.SCRATCH2.value, diff) + def _load_from_gc_table(self, rD, rT, index): + # rT is a temporary, may be equal to rD, must be != r0 + addr = self.gc_table_addr + index * WORD + self.mc.load_from_addr(rD, rT, addr) + + def emit_load_from_gc_table(self, op, arglocs, regalloc): + index = op.getarg(0).getint() + [resloc] = arglocs + assert resloc.is_reg() + self._load_from_gc_table(resloc, resloc, index) + class CallOpAssembler(object): @@ -646,9 +659,9 @@ guard_op.getopnum() == rop.GUARD_NOT_FORCED_2) faildescr = guard_op.getdescr() ofs = self.cpu.get_ofs_of_frame_field('jf_force_descr') - self.mc.load_imm(r.SCRATCH, rffi.cast(lltype.Signed, - cast_instance_to_gcref(faildescr))) - self.mc.store(r.SCRATCH.value, r.SPP.value, ofs) + faildescrindex = self.get_gcref_from_faildescr(faildescr) + self._load_from_gc_table(r.r2, r.r2, faildescrindex) + self.mc.store(r.r2.value, r.SPP.value, ofs) def _find_nearby_operation(self, regalloc, delta): return regalloc.operations[regalloc.rm.position + delta] diff --git a/rpython/jit/backend/ppc/ppc_assembler.py b/rpython/jit/backend/ppc/ppc_assembler.py --- a/rpython/jit/backend/ppc/ppc_assembler.py +++ b/rpython/jit/backend/ppc/ppc_assembler.py @@ -752,7 +752,6 @@ frame_info = self.datablockwrapper.malloc_aligned( jitframe.JITFRAMEINFO_SIZE, alignment=WORD) clt.frame_info = rffi.cast(jitframe.JITFRAMEINFOPTR, frame_info) - clt.allgcrefs = [] clt.frame_info.clear() # for now if log: @@ -762,8 +761,10 @@ regalloc = Regalloc(assembler=self) # self._call_header_with_stack_check() + allgcrefs = [] operations = regalloc.prepare_loop(inputargs, operations, - looptoken, clt.allgcrefs) + looptoken, allgcrefs) + self.reserve_gcref_table(allgcrefs) looppos = self.mc.get_relative_pos() frame_depth_no_fixed_size = self._assemble(regalloc, inputargs, operations) @@ -786,6 +787,7 @@ r_uint(rawstart + size_excluding_failure_stuff), r_uint(rawstart))) debug_stop("jit-backend-addr") + self.patch_gcref_table(looptoken, rawstart) self.patch_pending_failure_recoveries(rawstart) # ops_offset = self.mc.ops_offset @@ -840,11 +842,14 @@ arglocs = self.rebuild_faillocs_from_descr(faildescr, inputargs) regalloc = Regalloc(assembler=self) - startpos = self.mc.get_relative_pos() + allgcrefs = [] operations = regalloc.prepare_bridge(inputargs, arglocs, operations, - self.current_clt.allgcrefs, + allgcrefs, self.current_clt.frame_info) + self.reserve_gcref_table(allgcrefs) + startpos = self.mc.get_relative_pos() + self._check_frame_depth(self.mc, regalloc.get_gcmap()) frame_depth_no_fixed_size = self._assemble(regalloc, inputargs, operations) codeendpos = self.mc.get_relative_pos() @@ -854,6 +859,7 @@ self.patch_stack_checks(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE) rawstart = self.materialize_loop(original_loop_token) debug_bridge(descr_number, rawstart, codeendpos) + self.patch_gcref_table(original_loop_token, rawstart) self.patch_pending_failure_recoveries(rawstart) # patch the jump from original guard self.patch_jump_for_descr(faildescr, rawstart) @@ -868,6 +874,22 @@ self.teardown() return AsmInfo(ops_offset, startpos + rawstart, codeendpos - startpos) + def reserve_gcref_table(self, allgcrefs): + # allocate the gc table right now. We write absolute loads in + # each load_from_gc_table instruction for now. XXX improve, + # but it's messy. + self.gc_table_addr = self.datablockwrapper.malloc_aligned( + len(allgcrefs) * WORD, alignment=WORD) + self.setup_gcrefs_list(allgcrefs) + + def patch_gcref_table(self, looptoken, rawstart): + rawstart = self.gc_table_addr + tracer = self.cpu.gc_ll_descr.make_gcref_tracer(rawstart, + self._allgcrefs) + gcreftracers = self.get_asmmemmgr_gcreftracers(looptoken) + gcreftracers.append(tracer) # keepalive + self.teardown_gcrefs_list() + def teardown(self): self.pending_guard_tokens = None self.mc = None @@ -921,12 +943,12 @@ def generate_quick_failure(self, guardtok): startpos = self.mc.currpos() - fail_descr, target = self.store_info_on_descr(startpos, guardtok) + faildescrindex, target = self.store_info_on_descr(startpos, guardtok) assert target != 0 - self.load_gcmap(self.mc, r.r2, gcmap=guardtok.gcmap) - self.mc.load_imm(r.r0, target) - self.mc.mtctr(r.r0.value) - self.mc.load_imm(r.r0, fail_descr) + self.mc.load_imm(r.r2, target) + self.mc.mtctr(r.r2.value) + self._load_from_gc_table(r.r0, r.r2, faildescrindex) + self.load_gcmap(self.mc, r.r2, gcmap=guardtok.gcmap) # preserves r0 self.mc.bctr() # we need to write at least 6 insns here, for patch_jump_for_descr() while self.mc.currpos() < startpos + 6 * 4: diff --git a/rpython/jit/backend/ppc/regalloc.py b/rpython/jit/backend/ppc/regalloc.py --- a/rpython/jit/backend/ppc/regalloc.py +++ b/rpython/jit/backend/ppc/regalloc.py @@ -523,18 +523,17 @@ return [loc1, res] def prepare_finish(self, op): - descr = op.getdescr() - fail_descr = cast_instance_to_gcref(descr) - # we know it does not move, but well - rgc._make_sure_does_not_move(fail_descr) - fail_descr = rffi.cast(lltype.Signed, fail_descr) if op.numargs() > 0: loc = self.ensure_reg(op.getarg(0)) - locs = [loc, imm(fail_descr)] + locs = [loc] else: - locs = [imm(fail_descr)] + locs = [] return locs + def prepare_load_from_gc_table(self, op): + res = self.rm.force_allocate_reg(op) + return [res] + def prepare_call_malloc_gc(self, op): return self._prepare_call(op) diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -838,18 +838,6 @@ mc.writeimm32(allocated_depth) mc.copy_to_raw_memory(adr) - def get_asmmemmgr_blocks(self, looptoken): - clt = looptoken.compiled_loop_token - if clt.asmmemmgr_blocks is None: - clt.asmmemmgr_blocks = [] - return clt.asmmemmgr_blocks - - def get_asmmemmgr_gcreftracers(self, looptoken): - clt = looptoken.compiled_loop_token - if clt.asmmemmgr_gcreftracers is None: - clt.asmmemmgr_gcreftracers = [] - return clt.asmmemmgr_gcreftracers - def materialize_loop(self, looptoken): self.datablockwrapper.done() # finish using cpu.asmmemmgr self.datablockwrapper = None _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit