Author: David Schneider <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit