Author: Richard Plangger <[email protected]>
Branch: s390x-backend
Changeset: r80894:c3188f41b276
Date: 2015-11-24 16:50 +0100
http://bitbucket.org/pypy/pypy/changeset/c3188f41b276/
Log: added impl for guard_not_invalidated, passing tests for it
diff --git a/rpython/jit/backend/zarch/assembler.py
b/rpython/jit/backend/zarch/assembler.py
--- a/rpython/jit/backend/zarch/assembler.py
+++ b/rpython/jit/backend/zarch/assembler.py
@@ -184,6 +184,10 @@
def _build_stack_check_slowpath(self):
pass # TODO
+ def new_stack_loc(self, i, tp):
+ base_ofs = self.cpu.get_baseofs_of_frame_field()
+ return l.StackLocation(i, l.get_fp_offset(base_ofs, i), tp)
+
def _call_header_with_stack_check(self):
self._call_header()
if self.stack_check_slowpath == 0:
diff --git a/rpython/jit/backend/zarch/codebuilder.py
b/rpython/jit/backend/zarch/codebuilder.py
--- a/rpython/jit/backend/zarch/codebuilder.py
+++ b/rpython/jit/backend/zarch/codebuilder.py
@@ -104,6 +104,11 @@
def load(self, treg, sreg, offset):
self.LG(treg, l.addr(offset, sreg))
+ def nop(self):
+ # if the mask is zero it act as a NOP
+ # there is no special 'no operation' instruction
+ self.BCR_rr(0x0, 0x0)
+
def currpos(self):
return self.get_relative_pos()
diff --git a/rpython/jit/backend/zarch/regalloc.py
b/rpython/jit/backend/zarch/regalloc.py
--- a/rpython/jit/backend/zarch/regalloc.py
+++ b/rpython/jit/backend/zarch/regalloc.py
@@ -108,6 +108,7 @@
save_around_call_regs = r.VOLATILES
frame_reg = r.SPP
assert set(save_around_call_regs).issubset(all_regs)
+ pool = None
def __init__(self, longevity, frame_manager=None, assembler=None):
RegisterManager.__init__(self, longevity, frame_manager, assembler)
@@ -123,8 +124,8 @@
return rffi.cast(lltype.Signed, c.value)
def convert_to_imm(self, c):
- #val = self.convert_to_int(c)
- return l.ImmLocation(val)
+ off = self.pool.get_offset(c)
+ return l.pool(off)
def ensure_reg(self, box, force_in_reg):
if isinstance(box, Const):
@@ -342,6 +343,7 @@
self.rm = ZARCHRegisterManager(self.longevity,
frame_manager = self.fm,
assembler = self.assembler)
+ self.rm.pool = self.assembler.pool
self.fprm = FPRegisterManager(self.longevity, frame_manager = self.fm,
assembler = self.assembler)
self.fprm.pool = self.assembler.pool
@@ -779,6 +781,12 @@
arglocs = self._prepare_guard(op, [l0, l1])
return arglocs
+ def prepare_guard_not_invalidated(self, op):
+ pos = self.assembler.mc.get_relative_pos()
+ self.ensure_next_label_is_at_least_at_position(pos + 4)
+ locs = self._prepare_guard(op)
+ return locs
+
def prepare_label(self, op):
descr = op.getdescr()
assert isinstance(descr, TargetToken)
diff --git a/rpython/jit/backend/zarch/runner.py
b/rpython/jit/backend/zarch/runner.py
--- a/rpython/jit/backend/zarch/runner.py
+++ b/rpython/jit/backend/zarch/runner.py
@@ -1,6 +1,7 @@
from rpython.jit.backend.llsupport.llmodel import AbstractLLCPU
from rpython.jit.backend.zarch import registers as r
from rpython.jit.backend.zarch.assembler import AssemblerZARCH
+from rpython.jit.backend.zarch.codebuilder import InstrBuilder
from rpython.rlib import rgc
from rpython.rtyper.lltypesystem import lltype, llmemory
@@ -48,3 +49,19 @@
return self.assembler.assemble_bridge(faildescr, inputargs, operations,
original_loop_token, log, logger)
+ 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 = InstrBuilder()
+ # needs 4 bytes, ensured by the previous process
+ mc.b_offset(tgt) # a single instruction
+ mc.copy_to_raw_memory(jmp)
+ # positions invalidated
+ looptoken.compiled_loop_token.invalidate_positions = []
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit