[pypy-commit] pypy ppc-jit-backend: implemented GUARD_NOT_INVALIDATED
hager
noreply at buildbot.pypy.org
Tue Dec 20 19:06:47 CET 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50766:c28d89a90f9e
Date: 2011-12-20 19:06 +0100
http://bitbucket.org/pypy/pypy/changeset/c28d89a90f9e/
Log: implemented GUARD_NOT_INVALIDATED
diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -284,6 +284,8 @@
raise NotImplementedError
self._cmp_guard_class(op, arglocs, regalloc)
+ def emit_guard_not_invalidated(self, op, locs, regalloc):
+ return self._emit_guard(op, locs, c.EQ, is_guard_not_invalidated=True)
class MiscOpAssembler(object):
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -579,9 +579,6 @@
self._teardown()
def assemble_bridge(self, faildescr, inputargs, operations, looptoken, log):
-
- assert 0, "Bridges do not work yet because they need to dynamically adjust the SP"
-
self.setup(looptoken, operations)
assert isinstance(faildescr, AbstractFailDescr)
code = faildescr._failure_recovery_code
@@ -807,7 +804,8 @@
mc.prepare_insts_blocks(True)
mc.copy_to_raw_memory(block_start + tok.offset)
else:
- assert 0, "not implemented yet"
+ clt.invalidate_positions.append((block_start + tok.offset,
+ descr._ppc_guard_pos - tok.offset))
def patch_trace(self, faildescr, looptoken, bridge_addr, regalloc):
# The first instruction (word) is not overwritten, because it is the
diff --git a/pypy/jit/backend/ppc/ppcgen/regalloc.py b/pypy/jit/backend/ppc/ppcgen/regalloc.py
--- a/pypy/jit/backend/ppc/ppcgen/regalloc.py
+++ b/pypy/jit/backend/ppc/ppcgen/regalloc.py
@@ -336,6 +336,7 @@
return locs
prepare_guard_overflow = prepare_guard_no_overflow
+ prepare_guard_not_invalidated = prepare_guard_no_overflow
def prepare_guard_exception(self, op):
boxes = list(op.getarglist())
diff --git a/pypy/jit/backend/ppc/runner.py b/pypy/jit/backend/ppc/runner.py
--- a/pypy/jit/backend/ppc/runner.py
+++ b/pypy/jit/backend/ppc/runner.py
@@ -14,6 +14,7 @@
from pypy.jit.backend.ppc.ppcgen.ppc_assembler import AssemblerPPC
from pypy.jit.backend.ppc.ppcgen.arch import NONVOLATILES, GPR_SAVE_AREA, WORD
from pypy.jit.backend.ppc.ppcgen.regalloc import PPCRegisterManager, PPCFrameManager
+from pypy.jit.backend.ppc.ppcgen.codebuilder import PPCBuilder
from pypy.jit.backend.ppc.ppcgen import register as r
import sys
@@ -130,3 +131,20 @@
def teardown(self):
self.patch_list = None
self.reg_map = None
+
+ def invalidate_loop(self, looptoken):
+ """Activate all GUARD_NOT_INVALIDATED in the loop and its attached
+ bridges. Before this call, all GUARD_NOT_INVALIDATED do nothing;
+ after this call, they all fail. Note that afterwards, if one such
+ guard fails often enough, it has a bridge attached to it; it is
+ possible then to re-call invalidate_loop() on the same looptoken,
+ which must invalidate all newer GUARD_NOT_INVALIDATED, but not the
+ old one that already has a bridge attached to it."""
+
+ for jmp, tgt in looptoken.compiled_loop_token.invalidate_positions:
+ mc = PPCBuilder()
+ mc.b_offset(tgt)
+ mc.prepare_insts_blocks()
+ mc.copy_to_raw_memory(jmp)
+ # positions invalidated
+ looptoken.compiled_loop_token.invalidate_positions = []
More information about the pypy-commit
mailing list