[pypy-svn] pypy out-of-line-guards-2: progress on x86 backend. Segfault so far :)
fijal
commits-noreply at bitbucket.org
Thu Apr 14 21:56:49 CEST 2011
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: out-of-line-guards-2
Changeset: r43365:630787073d32
Date: 2011-04-14 21:56 +0200
http://bitbucket.org/pypy/pypy/changeset/630787073d32/
Log: progress on x86 backend. Segfault so far :)
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -48,11 +48,12 @@
class GuardToken(object):
- def __init__(self, faildescr, failargs, fail_locs, exc):
+ def __init__(self, faildescr, failargs, fail_locs, exc, has_jump):
self.faildescr = faildescr
self.failargs = failargs
self.fail_locs = fail_locs
self.exc = exc
+ self.has_jump = has_jump
DEBUG_COUNTER = lltype.Struct('DEBUG_COUNTER', ('i', lltype.Signed))
@@ -435,15 +436,22 @@
# tok.faildescr._x86_adr_jump_offset to contain the raw address of
# the 4-byte target field in the JMP/Jcond instruction, and patch
# the field in question to point (initially) to the recovery stub
+ inv_counter = 0
+ clt = self.current_clt
for tok in self.pending_guard_tokens:
addr = rawstart + tok.pos_jump_offset
tok.faildescr._x86_adr_jump_offset = addr
relative_target = tok.pos_recovery_stub - (tok.pos_jump_offset + 4)
assert rx86.fits_in_32bits(relative_target)
#
- mc = codebuf.MachineCodeBlockWrapper()
- mc.writeimm32(relative_target)
- mc.copy_to_raw_memory(addr)
+ if tok.has_jump:
+ mc = codebuf.MachineCodeBlockWrapper()
+ mc.writeimm32(relative_target)
+ mc.copy_to_raw_memory(addr)
+ else:
+ # guard not invalidate, patch where it jumps
+ pos, _ = clt.invalidate_positions[inv_counter]
+ clt.invalidate_positions[inv_counter] = pos, relative_target
def get_asmmemmgr_blocks(self, looptoken):
clt = looptoken.compiled_loop_token
@@ -1447,6 +1455,13 @@
self.mc.CMP(heap(self.cpu.pos_exception()), imm0)
self.implement_guard(guard_token, 'NZ')
+ def genop_guard_guard_not_invalidated(self, ign_1, guard_op, guard_token,
+ locs, ign_2):
+ pos = self.mc.get_relative_pos()
+ guard_token.pos_jump_offset = pos
+ self.current_clt.invalidate_positions.append((pos, 0))
+ self.pending_guard_tokens.append(guard_token)
+
def genop_guard_guard_exception(self, ign_1, guard_op, guard_token,
locs, resloc):
loc = locs[0]
@@ -1545,7 +1560,8 @@
exc = (guard_opnum == rop.GUARD_EXCEPTION or
guard_opnum == rop.GUARD_NO_EXCEPTION or
guard_opnum == rop.GUARD_NOT_FORCED)
- return GuardToken(faildescr, failargs, fail_locs, exc)
+ return GuardToken(faildescr, failargs, fail_locs, exc, has_jump=
+ guard_opnum != rop.GUARD_NOT_INVALIDATED)
def generate_quick_failure(self, guardtok):
"""Generate the initial code for handling a failure. We try to
diff --git a/pypy/jit/backend/model.py b/pypy/jit/backend/model.py
--- a/pypy/jit/backend/model.py
+++ b/pypy/jit/backend/model.py
@@ -291,6 +291,7 @@
# that belong to this loop or to a bridge attached to it.
# Filled by the frontend calling record_faildescr_index().
self.faildescr_indices = []
+ self.invalidate_positions = []
debug_start("jit-mem-looptoken-alloc")
debug_print("allocating Loop #", self.number)
debug_stop("jit-mem-looptoken-alloc")
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -145,6 +145,13 @@
def redirect_call_assembler(self, oldlooptoken, newlooptoken):
self.assembler.redirect_call_assembler(oldlooptoken, newlooptoken)
+ def invalidate_loop(self, looptoken):
+ from pypy.jit.backend.x86 import codebuf
+ for addr, tgt in looptoken.compiled_loop_token.invalidate_positions:
+ mc = codebuf.MachineCodeBlockWrapper()
+ mc.writeimm32(tgt)
+ mc.copy_to_raw_memory(addr)
+
class CPU386(AbstractX86CPU):
WORD = 4
NUM_REGS = 8
diff --git a/pypy/jit/backend/x86/regalloc.py b/pypy/jit/backend/x86/regalloc.py
--- a/pypy/jit/backend/x86/regalloc.py
+++ b/pypy/jit/backend/x86/regalloc.py
@@ -492,6 +492,8 @@
def consider_guard_no_exception(self, op):
self.perform_guard(op, [], None)
+ consider_guard_not_invalidated = consider_guard_no_exception
+
def consider_guard_exception(self, op):
loc = self.rm.make_sure_var_in_reg(op.getarg(0))
box = TempBox()
More information about the Pypy-commit
mailing list