Author: hager <sven.ha...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit