[pypy-svn] r69712 - in pypy/branch/virtual-forcing/pypy/jit/backend: . llgraph test x86
arigo at codespeak.net
arigo at codespeak.net
Fri Nov 27 21:50:32 CET 2009
Author: arigo
Date: Fri Nov 27 21:50:30 2009
New Revision: 69712
Modified:
pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py
pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
pypy/branch/virtual-forcing/pypy/jit/backend/model.py
pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py
pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py
pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py
pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py
Log:
(pedronis, arigo)
Two fixes for cpu.force():
- ignores the result of the call in the failargs (the call did
not return yet!).
- returns the faildescr.
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/llimpl.py Fri Nov 27 21:50:30 2009
@@ -397,15 +397,16 @@
else:
return self.env[v]
- def _populate_fail_args(self, op):
+ def _populate_fail_args(self, op, skip=None):
fail_args = []
if op.fail_args:
for fail_arg in op.fail_args:
- if fail_arg is None:
+ if fail_arg is None or fail_arg is skip:
fail_args.append(None)
else:
fail_args.append(self.getenv(fail_arg))
- self.fail_args = fail_args
+ self.fail_args = fail_args
+ self.fail_index = op.fail_index
def execute(self):
"""Execute all operations in a loop,
@@ -793,7 +794,7 @@
def op_call_may_force(self, calldescr, func, *args):
assert not self._forced
self._may_force = self.opindex
- self.op_call(calldescr, func, *args)
+ return self.op_call(calldescr, func, *args)
def op_guard_not_forced(self, descr):
forced = self._forced
@@ -1071,12 +1072,19 @@
opaque_frame = llmemory.cast_adr_to_ptr(force_token,
lltype.Ptr(_TO_OPAQUE[Frame]))
frame = _from_opaque(opaque_frame)
+ assert not frame._forced
frame._forced = True
assert frame._may_force >= 0
+ call_op = frame.loop.operations[frame._may_force]
guard_op = frame.loop.operations[frame._may_force+1]
- frame._populate_fail_args(guard_op)
+ frame._populate_fail_args(guard_op, skip=call_op.result)
return opaque_frame
+def get_forced_fail_index(opaque_frame):
+ frame = _from_opaque(opaque_frame)
+ assert frame._forced
+ return frame.fail_index
+
class MemoCast(object):
def __init__(self):
self.addresses = [llmemory.NULL]
@@ -1447,6 +1455,7 @@
setannotation(get_zero_division_error, annmodel.SomeAddress())
setannotation(get_zero_division_error_value, annmodel.SomePtr(llmemory.GCREF))
setannotation(force, s_Frame)
+setannotation(get_forced_fail_index, annmodel.SomeInteger())
setannotation(new_memo_cast, s_MemoCast)
setannotation(cast_adr_to_int, annmodel.SomeInteger())
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/llgraph/runner.py Fri Nov 27 21:50:30 2009
@@ -497,9 +497,13 @@
def do_cast_ptr_to_int(self, ptrbox):
return history.BoxInt(llimpl.cast_to_int(ptrbox.getref_base(),
self.memo_cast))
+
def force(self, force_token):
frame = llimpl.force(self.cast_int_to_adr(force_token))
self.latest_frame = frame
+ fail_index = llimpl.get_forced_fail_index(frame)
+ return self.get_fail_descr_from_number(fail_index)
+
class OOtypeCPU(BaseCPU):
is_oo = True
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/model.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/model.py Fri Nov 27 21:50:30 2009
@@ -209,9 +209,9 @@
raise NotImplementedError
def do_call_may_force(self, args, calldescr):
- raise NotImplementedError
+ return self.do_call(args, calldescr)
- def force(self, force_token, descr, args):
+ def force(self, force_token):
raise NotImplementedError
# ootype specific operations
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/test/runner_test.py Fri Nov 27 21:50:30 2009
@@ -1221,7 +1221,7 @@
else:
assert record == []
- def test_force_operations(self):
+ def test_force_operations_returning_void(self):
values = []
def maybe_force(token, flag):
if flag:
@@ -1263,6 +1263,51 @@
assert self.cpu.get_latest_value_int(1) == 10
assert values == [1, 10]
+ def test_force_operations_returning_int(self):
+ values = []
+ def maybe_force(token, flag):
+ if flag:
+ self.cpu.force(token)
+ values.append(self.cpu.get_latest_value_int(0))
+ values.append(self.cpu.get_latest_value_int(2))
+ return 42
+
+ FUNC = self.FuncType([lltype.Signed, lltype.Signed], lltype.Signed)
+ func_ptr = llhelper(lltype.Ptr(FUNC), maybe_force)
+ funcbox = self.get_funcbox(self.cpu, func_ptr).constbox()
+ calldescr = self.cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT)
+ cpu = self.cpu
+ i0 = BoxInt()
+ i1 = BoxInt()
+ i2 = BoxInt()
+ tok = BoxInt()
+ faildescr = BasicFailDescr(1)
+ ops = [
+ ResOperation(rop.FORCE_TOKEN, [], tok),
+ ResOperation(rop.CALL_MAY_FORCE, [funcbox, tok, i1], i2,
+ descr=calldescr),
+ ResOperation(rop.GUARD_NOT_FORCED, [], None, descr=faildescr),
+ ResOperation(rop.FINISH, [i2], None, descr=BasicFailDescr(0))
+ ]
+ ops[2].fail_args = [i1, i2, i0]
+ looptoken = LoopToken()
+ self.cpu.compile_loop([i0, i1], ops, looptoken)
+ self.cpu.set_future_value_int(0, 20)
+ self.cpu.set_future_value_int(1, 0)
+ fail = self.cpu.execute_token(looptoken)
+ assert fail.identifier == 0
+ assert self.cpu.get_latest_value_int(0) == 42
+ assert values == []
+
+ self.cpu.set_future_value_int(0, 10)
+ self.cpu.set_future_value_int(1, 1)
+ fail = self.cpu.execute_token(looptoken)
+ assert fail.identifier == 1
+ assert self.cpu.get_latest_value_int(0) == 1
+ assert self.cpu.get_latest_value_int(1) == 42
+ assert self.cpu.get_latest_value_int(2) == 10
+ assert values == [1, 10]
+
# pure do_ / descr features
def test_do_operations(self):
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/x86/assembler.py Fri Nov 27 21:50:30 2009
@@ -879,8 +879,7 @@
arglocs.append(loc)
return arglocs[:]
- def grab_frame_values(self, bytecode, frame_addr,
- registers=lltype.nullptr(rffi.LONGP.TO)):
+ def grab_frame_values(self, bytecode, frame_addr, registers):
num = 0
value_hi = 0
while 1:
@@ -915,7 +914,6 @@
continue
assert code == self.DESCR_STOP
break
- assert registers # it's NULL when called from cpu.force()
code >>= 2
if kind == self.DESCR_FLOAT:
xmmregisters = rffi.ptradd(registers, -16)
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/x86/regalloc.py Fri Nov 27 21:50:30 2009
@@ -615,6 +615,8 @@
self.rm.before_call(force_store, save_all_regs=save_all_regs)
self.xrm.before_call(force_store, save_all_regs=save_all_regs)
if guard_not_forced_op is not None:
+ if op.result is not None:
+ self.force_allocate_reg(op.result, selected_reg=eax) # XXX!!!
self.perform_with_guard(op, guard_not_forced_op, arglocs, eax)
else:
self.Perform(op, arglocs, eax)
Modified: pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/backend/x86/runner.py Fri Nov 27 21:50:30 2009
@@ -87,6 +87,9 @@
adr = llmemory.cast_ptr_to_adr(x)
return CPU386.cast_adr_to_int(adr)
+ all_null_registers = lltype.malloc(rffi.LONGP.TO, 24,
+ flavor='raw', zero=True)
+
def force(self, addr_of_force_index):
TP = rffi.CArrayPtr(lltype.Signed)
fail_index = rffi.cast(TP, addr_of_force_index)[0]
@@ -98,7 +101,8 @@
# start of "no gc operation!" block
fail_index_2 = self.assembler.grab_frame_values(
bytecode,
- addr_of_force_index - FORCE_INDEX_OFS)
+ addr_of_force_index - FORCE_INDEX_OFS,
+ rffi.ptradd(self.all_null_registers, 16))
self.assembler.leave_jitted_hook()
# end of "no gc operation!" block
assert fail_index == fail_index_2
More information about the Pypy-commit
mailing list