[pypy-commit] pypy ppc-jit-backend: (arigo, hager): guard_not_forced

hager noreply at buildbot.pypy.org
Tue Dec 20 17:33:48 CET 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50765:9fd7e0e76cbb
Date: 2011-12-20 17:33 +0100
http://bitbucket.org/pypy/pypy/changeset/9fd7e0e76cbb/

Log:	(arigo, hager): guard_not_forced

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
@@ -1082,12 +1082,16 @@
         self._emit_guard(guard_op, regalloc._prepare_guard(guard_op), c.EQ)
 
     def emit_guard_call_may_force(self, op, guard_op, arglocs, regalloc):
-        self.mc.mr(r.r0.value, r.SP.value)
+        ENCODING_AREA = len(r.MANAGED_REGS) * WORD
+        self.mc.alloc_scratch_reg()
         if IS_PPC_32:
-            self.mc.cmpwi(r.r0.value, 0)
+            self.mc.lwz(r.SCRATCH.value, r.SPP.value, ENCODING_AREA)
+            self.mc.cmpwi(0, r.SCRATCH.value, 0)
         else:
-            self.mc.cmpdi(r.r0.value, 0)
-        self._emit_guard(guard_op, arglocs, c.EQ)
+            self.mc.ld(r.SCRATCH.value, r.SPP.value, ENCODING_AREA)
+            self.mc.cmpdi(0, r.SCRATCH.value, 0)
+        self.mc.free_scratch_reg()
+        self._emit_guard(guard_op, arglocs, c.LT)
 
     emit_guard_call_release_gil = emit_guard_call_may_force
 
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
@@ -38,6 +38,7 @@
 from pypy.rlib import rgc
 from pypy.rpython.annlowlevel import llhelper
 from pypy.rlib.objectmodel import we_are_translated
+from pypy.rpython.lltypesystem.lloperation import llop
 
 memcpy_fn = rffi.llexternal('memcpy', [llmemory.Address, llmemory.Address,
                                        rffi.SIZE_T], lltype.Void,
@@ -932,6 +933,11 @@
         else:
             raise AssertionError('Trying to pop to an invalid location')
 
+    def leave_jitted_hook(self):
+        ptrs = self.fail_boxes_ptr.ar
+        llop.gc_assume_young_pointers(lltype.Void,
+                                      llmemory.cast_ptr_to_adr(ptrs))
+
     def _ensure_result_bit_extension(self, resloc, size, signed):
         if size == 1:
             if not signed: #unsigned char
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 import register as r
 import sys
 
 from pypy.tool.ansi_print import ansi_log
@@ -88,6 +89,24 @@
         adr = llmemory.cast_ptr_to_adr(x)
         return PPC_64_CPU.cast_adr_to_int(adr)
 
+    def force(self, spilling_pointer):
+        TP = rffi.CArrayPtr(lltype.Signed)
+
+        addr_of_force_index = spilling_pointer + len(r.MANAGED_REGS) * WORD
+
+        fail_index = rffi.cast(TP, addr_of_force_index)[0]
+        assert fail_index >= 0, "already forced!"
+        faildescr = self.get_fail_descr_from_number(fail_index)
+        rffi.cast(TP, addr_of_force_index)[0] = ~fail_index
+
+        # start of "no gc operation!" block
+        fail_index_2 = self.asm.failure_recovery_func(
+                faildescr._failure_recovery_code, spilling_pointer)
+        self.asm.leave_jitted_hook()
+        # end of "no gc operation!" block
+        assert fail_index == fail_index_2
+        return faildescr
+
     # return the number of values that can be returned
     def get_latest_value_count(self):
         return self.asm.fail_boxes_count


More information about the pypy-commit mailing list