Author: David Schneider <david.schnei...@picle.org> Branch: Changeset: r66082:b1f3ded4536f Date: 2013-08-12 02:49 -0500 http://bitbucket.org/pypy/pypy/changeset/b1f3ded4536f/
Log: implemente changes to the ARM backend from kill-gen-store-back-in 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 @@ -69,6 +69,7 @@ self.mc.datablockwrapper = self.datablockwrapper self.target_tokens_currently_compiling = {} self.frame_depth_to_patch = [] + self._finish_gcmap = lltype.nullptr(jitframe.GCMAP) def teardown(self): self.current_clt = None @@ -889,7 +890,7 @@ relative_offset = tok.pos_recovery_stub - tok.offset guard_pos = block_start + tok.offset if not tok.is_guard_not_invalidated: - # patch the guard jumpt to the stub + # patch the guard jump to the stub # overwrite the generate NOP with a B_offs to the pos of the # stub mc = InstrBuilder(self.cpu.cpuinfo.arch_version) diff --git a/rpython/jit/backend/arm/opassembler.py b/rpython/jit/backend/arm/opassembler.py --- a/rpython/jit/backend/arm/opassembler.py +++ b/rpython/jit/backend/arm/opassembler.py @@ -33,6 +33,7 @@ from rpython.rtyper.lltypesystem import rstr, rffi, lltype from rpython.rtyper.annlowlevel import cast_instance_to_gcref from rpython.jit.backend.arm import callbuilder +from rpython.rlib.rarithmetic import r_uint class ArmGuardToken(GuardToken): @@ -190,7 +191,7 @@ self.mc.RSB_ri(resloc.value, l0.value, imm=0) return fcond - def _emit_guard(self, op, arglocs, fcond, save_exc, + def build_guard_token(self, op, frame_depth, arglocs, offset, fcond, save_exc, is_guard_not_invalidated=False, is_guard_not_forced=False): assert isinstance(save_exc, bool) @@ -198,7 +199,27 @@ descr = op.getdescr() assert isinstance(descr, AbstractFailDescr) + gcmap = allocate_gcmap(self, frame_depth, JITFRAME_FIXED_SIZE) + token = ArmGuardToken(self.cpu, gcmap, + descr, + failargs=op.getfailargs(), + fail_locs=arglocs, + offset=offset, + exc=save_exc, + frame_depth=frame_depth, + is_guard_not_invalidated=is_guard_not_invalidated, + is_guard_not_forced=is_guard_not_forced, + fcond=fcond) + return token + + def _emit_guard(self, op, arglocs, fcond, save_exc, + is_guard_not_invalidated=False, + is_guard_not_forced=False): pos = self.mc.currpos() + token = self.build_guard_token(op, arglocs[0].value, arglocs[1:], pos, fcond, save_exc, + is_guard_not_invalidated, + is_guard_not_forced) + self.pending_guards.append(token) # For all guards that are not GUARD_NOT_INVALIDATED we emit a # breakpoint to ensure the location is patched correctly. In the case # of GUARD_NOT_INVALIDATED we use just a NOP, because it is only @@ -207,17 +228,6 @@ self.mc.NOP() else: self.mc.BKPT() - gcmap = allocate_gcmap(self, arglocs[0].value, JITFRAME_FIXED_SIZE) - self.pending_guards.append(ArmGuardToken(self.cpu, gcmap, - descr, - failargs=op.getfailargs(), - fail_locs=arglocs[1:], - offset=pos, - exc=save_exc, - frame_depth=arglocs[0].value, - is_guard_not_invalidated=is_guard_not_invalidated, - is_guard_not_forced=is_guard_not_forced, - fcond=fcond)) return c.AL def _emit_guard_overflow(self, guard, failargs, fcond): @@ -351,7 +361,11 @@ # XXX self.mov(fail_descr_loc, RawStackLoc(ofs)) self.store_reg(self.mc, r.ip, r.fp, ofs, helper=r.lr) if op.numargs() > 0 and op.getarg(0).type == REF: - gcmap = self.gcmap_for_finish + if self._finish_gcmap: + self._finish_gcmap[0] |= r_uint(0) # r0 + gcmap = self._finish_gcmap + else: + gcmap = self.gcmap_for_finish self.push_gcmap(self.mc, gcmap, store=True) else: # note that the 0 here is redundant, but I would rather @@ -912,6 +926,14 @@ return fcond + def store_force_descr(self, op, fail_locs, frame_depth): + pos = self.mc.currpos() + guard_token = self.build_guard_token(op, frame_depth, fail_locs, pos, c.AL, True, False, True) + #self.pending_guards.append(guard_token) + self._finish_gcmap = guard_token.gcmap + self._store_force_index(op) + self.store_info_on_descr(pos, guard_token) + def emit_op_force_token(self, op, arglocs, regalloc, fcond): # XXX kill me res_loc = arglocs[0] diff --git a/rpython/jit/backend/arm/regalloc.py b/rpython/jit/backend/arm/regalloc.py --- a/rpython/jit/backend/arm/regalloc.py +++ b/rpython/jit/backend/arm/regalloc.py @@ -1194,6 +1194,13 @@ # self._compute_hint_frame_locations_from_descr(descr) return [] + def prepare_op_guard_not_forced_2(self, op, fcond): + self.rm.before_call(op.getfailargs(), save_all_regs=True) + fail_locs = [self.loc(v) for v in op.getfailargs()] + self.assembler.store_force_descr(op, fail_locs, + self.fm.get_frame_depth()) + self.possibly_free_vars(op.getfailargs()) + def prepare_guard_call_may_force(self, op, guard_op, fcond): args = self._prepare_call(op, save_all_regs=True) return self._prepare_guard(guard_op, args) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit