[pypy-svn] pypy arm-backend-2: Reset vable_token in call_assembler and some other fixes to it
bivab
commits-noreply at bitbucket.org
Wed Feb 16 11:26:56 CET 2011
Author: David Schneider <david.schneider at picle.org>
Branch: arm-backend-2
Changeset: r42030:a273d7c8af2b
Date: 2011-02-15 17:29 +0100
http://bitbucket.org/pypy/pypy/changeset/a273d7c8af2b/
Log: Reset vable_token in call_assembler and some other fixes to it
diff --git a/pypy/jit/backend/arm/opassembler.py b/pypy/jit/backend/arm/opassembler.py
--- a/pypy/jit/backend/arm/opassembler.py
+++ b/pypy/jit/backend/arm/opassembler.py
@@ -647,11 +647,16 @@
# from: ../x86/assembler.py:1668
# XXX Split into some helper methods
def emit_guard_call_assembler(self, op, guard_op, arglocs, regalloc, fcond):
+ faildescr = guard_op.getdescr()
+ fail_index = self.cpu.get_fail_descr_number(faildescr)
+ self._write_fail_index(fail_index)
+
descr = op.getdescr()
assert isinstance(descr, LoopToken)
+ assert op.numargs() == len(descr._arm_arglocs)
resbox = TempBox()
self._emit_call(descr._arm_direct_bootstrap_code, op.getarglist(),
- regalloc, fcond, result=resbox, spill_all_regs=True)
+ regalloc, fcond, result=resbox)
if op.result is None:
value = self.cpu.done_with_this_frame_void_v
else:
@@ -664,30 +669,35 @@
value = self.cpu.done_with_this_frame_float_v
else:
raise AssertionError(kind)
- assert value <= 0xff
-
# check value
resloc = regalloc.force_allocate_reg(resbox)
+ assert resloc is r.r0
self.mc.gen_load_int(r.ip.value, value)
self.mc.CMP_rr(resloc.value, r.ip.value)
+
fast_jmp_pos = self.mc.currpos()
- #fast_jmp_location = self.mc.curraddr()
self.mc.NOP()
- #if values are equal we take the fast pat
+ # Path A: use assembler helper
+ #if values are equal we take the fast path
# Slow path, calling helper
# jump to merge point
jd = descr.outermost_jitdriver_sd
assert jd is not None
asm_helper_adr = self.cpu.cast_adr_to_int(jd.assembler_helper_adr)
- self._emit_call(asm_helper_adr, [resbox, op.getarg(0)], regalloc, fcond, op.result)
- regalloc.possibly_free_var(resbox)
+ self.mc.PUSH([reg.value for reg in r.caller_resp][1:])
+ # resbox is allready in r0
+ self.mov_loc_loc(arglocs[1], r.r1)
+ self.mc.BL(asm_helper_adr)
+ self.mc.POP([reg.value for reg in r.caller_resp][1:])
+ regalloc.after_call(op.result)
# jump to merge point
jmp_pos = self.mc.currpos()
#jmp_location = self.mc.curraddr()
self.mc.NOP()
+ # Path B: load return value and reset token
# Fast Path using result boxes
# patch the jump to the fast path
offset = self.mc.currpos() - fast_jmp_pos
@@ -696,20 +706,15 @@
pmc.ADD_ri(r.pc.value, r.pc.value, offset - PC_OFFSET, cond=c.EQ)
# Reset the vable token --- XXX really too much special logic here:-(
- # XXX Enable and fix this once the stange errors procuded by its
- # presence are fixed
- #if jd.index_of_virtualizable >= 0:
- # from pypy.jit.backend.llsupport.descr import BaseFieldDescr
- # size = jd.portal_calldescr.get_result_size(self.cpu.translate_support_code)
- # vable_index = jd.index_of_virtualizable
- # regalloc._sync_var(op.getarg(vable_index))
- # vable = regalloc.frame_manager.loc(op.getarg(vable_index))
- # fielddescr = jd.vable_token_descr
- # assert isinstance(fielddescr, BaseFieldDescr)
- # ofs = fielddescr.offset
- # self.mc.MOV(eax, arglocs[1])
- # self.mc.MOV_mi((eax.value, ofs), 0)
- # # in the line above, TOKEN_NONE = 0
+ if jd.index_of_virtualizable >= 0:
+ from pypy.jit.backend.llsupport.descr import BaseFieldDescr
+ fielddescr = jd.vable_token_descr
+ assert isinstance(fielddescr, BaseFieldDescr)
+ ofs = fielddescr.offset
+ self.mov_loc_loc(arglocs[1], r.ip, cond=c.MI)
+ self.mc.MOV_ri(resloc.value, 0, cond=c.MI)
+ self.mc.STR_ri(resloc.value, r.ip.value, ofs*WORD, cond=c.MI)
+ regalloc.possibly_free_var(resbox)
if op.result is not None:
# load the return value from fail_boxes_xxx[0]
@@ -737,6 +742,7 @@
regalloc.possibly_free_var(op.result)
return fcond
+
# ../x86/assembler.py:668
def redirect_call_assembler(self, oldlooptoken, newlooptoken):
# we overwrite the instructions at the old _x86_direct_bootstrap_code
diff --git a/pypy/jit/backend/arm/test/test_runner.py b/pypy/jit/backend/arm/test/test_runner.py
--- a/pypy/jit/backend/arm/test/test_runner.py
+++ b/pypy/jit/backend/arm/test/test_runner.py
@@ -71,7 +71,8 @@
_assembler_helper_ptr = llhelper(FUNCPTR, assembler_helper)
assembler_helper_adr = llmemory.cast_ptr_to_adr(
_assembler_helper_ptr)
-
+ FakeJitDriverSD.portal_calldescr = self.cpu.calldescrof(
+ lltype.Ptr(lltype.FuncType([lltype.Signed], lltype.Signed)), [lltype.Signed], lltype.Signed)
lt1, lt2, lt3 = [LoopToken() for x in range(3)]
lt2.outermost_jitdriver_sd = FakeJitDriverSD()
loop1 = parse('''
diff --git a/pypy/jit/backend/arm/regalloc.py b/pypy/jit/backend/arm/regalloc.py
--- a/pypy/jit/backend/arm/regalloc.py
+++ b/pypy/jit/backend/arm/regalloc.py
@@ -675,10 +675,18 @@
return self._prepare_guard(guard_op)
def prepare_guard_call_assembler(self, op, guard_op, fcond):
- faildescr = guard_op.getdescr()
- fail_index = self.cpu.get_fail_descr_number(faildescr)
- self.assembler._write_fail_index(fail_index)
- return []
+ descr = op.getdescr()
+ assert isinstance(descr, LoopToken)
+ jd = descr.outermost_jitdriver_sd
+ assert jd is not None
+ size = jd.portal_calldescr.get_result_size(self.cpu.translate_support_code)
+ vable_index = jd.index_of_virtualizable
+ if vable_index >= 0:
+ self._sync_var(op.getarg(vable_index))
+ vable = self.frame_manager.loc(op.getarg(vable_index))
+ else:
+ vable = imm(0)
+ return [imm(size), vable]
def _prepare_args_for_new_op(self, new_args):
gc_ll_descr = self.cpu.gc_ll_descr
More information about the Pypy-commit
mailing list