[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