Author: David Schneider <[email protected]>
Branch: remove-globals-in-jit
Changeset: r59679:655e6658b685
Date: 2013-01-02 14:55 +0100
http://bitbucket.org/pypy/pypy/changeset/655e6658b685/
Log: WIP: port forcing support
diff --git a/pypy/jit/backend/arm/assembler.py
b/pypy/jit/backend/arm/assembler.py
--- a/pypy/jit/backend/arm/assembler.py
+++ b/pypy/jit/backend/arm/assembler.py
@@ -338,7 +338,7 @@
def grab_frame_values(cpu, mem_loc, frame_pointer,
registers, vfp_registers):
# no malloc allowed here!! xxx apart from one, hacking a lot
- #self.fail_ebp = allregisters[16 + ebp.value]
+ force_index = rffi.cast(lltype.Signed, frame_pointer)
num = 0
deadframe = lltype.nullptr(jitframe.DEADFRAME)
bytecode = rffi.cast(rffi.UCHARP, mem_loc)
@@ -361,8 +361,7 @@
continue
if code == AssemblerARM.CODE_FORCED:
# resuming from a GUARD_NOT_FORCED
- xxx
- token = allregisters[16 + ebp.value]
+ token = force_index
deadframe = (
cpu.assembler.force_token_to_dead_frame.pop(token))
deadframe = lltype.cast_opaque_ptr(
diff --git a/pypy/jit/backend/arm/runner.py b/pypy/jit/backend/arm/runner.py
--- a/pypy/jit/backend/arm/runner.py
+++ b/pypy/jit/backend/arm/runner.py
@@ -99,23 +99,27 @@
flavor='raw', zero=True, immortal=True)
def force(self, addr_of_force_index):
- assert 0, 'refactor ME'
TP = rffi.CArrayPtr(lltype.Signed)
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
- bytecode = self.assembler._find_failure_recovery_bytecode(faildescr)
+ frb = self.assembler._find_failure_recovery_bytecode(faildescr)
+ bytecode = rffi.cast(rffi.UCHARP, frb)
addr_all_null_regsiters = rffi.cast(rffi.LONG, self.all_null_registers)
- # start of "no gc operation!" block
- fail_index_2 = self.assembler.failure_recovery_func(
- bytecode,
- addr_of_force_index,
- addr_all_null_regsiters)
- self.assembler.leave_jitted_hook()
- # end of "no gc operation!" block
- assert fail_index == fail_index_2
- return faildescr
+ #
+ assert (rffi.cast(lltype.Signed, bytecode[0]) ==
+ self.assembler.CODE_FORCED)
+ bytecode = rffi.ptradd(bytecode, 1)
+ deadframe = self.assembler.failure_recovery_func(bytecode,
+ addr_of_force_index,
+ self.all_null_registers)
+
+ #
+ assert self.get_latest_descr(deadframe) is faildescr
+ self.assembler.force_token_to_dead_frame[addr_of_force_index] = (
+ deadframe)
+ return deadframe
def redirect_call_assembler(self, oldlooptoken, newlooptoken):
self.assembler.redirect_call_assembler(oldlooptoken, newlooptoken)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit