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

Reply via email to