Author: David Schneider <[email protected]>
Branch: arm-backend-2
Changeset: r50302:e70ac50eb3a3
Date: 2011-12-07 15:52 +0100
http://bitbucket.org/pypy/pypy/changeset/e70ac50eb3a3/
Log: refactor FINISH to directly store all values to the failboxes.
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
@@ -318,7 +318,48 @@
return fcond
def emit_op_finish(self, op, arglocs, regalloc, fcond):
- self._gen_path_to_exit_path(op.getdescr(), op.getarglist(), arglocs,
c.AL)
+ for i in range(len(arglocs) -1):
+ loc = arglocs[i]
+ box = op.getarg(i)
+ if loc is None:
+ continue
+ if loc.is_reg():
+ if box.type == REF:
+ adr = self.fail_boxes_ptr.get_addr_for_num(i)
+ elif box.type == INT:
+ adr = self.fail_boxes_int.get_addr_for_num(i)
+ else:
+ assert 0
+ self.mc.gen_load_int(r.ip.value, adr)
+ self.mc.STR_ri(loc.value, r.ip.value)
+ elif loc.is_vfp_reg():
+ assert box.type == FLOAT
+ adr = self.fail_boxes_float.get_addr_for_num(i)
+ self.mc.gen_load_int(r.ip.value, adr)
+ self.mc.VSTR(loc.value, r.ip.value)
+ elif loc.is_stack() or loc.is_imm() or loc.is_imm_float():
+ if box.type == FLOAT:
+ adr = self.fail_boxes_float.get_addr_for_num(i)
+ self.mov_loc_loc(loc, r.vfp_ip)
+ self.mc.gen_load_int(r.ip.value, adr)
+ self.mc.VSTR(r.vfp_ip.value, r.ip.value)
+ elif box.type == REF or box.type == INT:
+ if box.type == REF:
+ adr = self.fail_boxes_ptr.get_addr_for_num(i)
+ elif box.type == INT:
+ adr = self.fail_boxes_int.get_addr_for_num(i)
+ self.mov_loc_loc(loc, r.ip)
+ self.mc.gen_load_int(r.lr.value, adr)
+ self.mc.STR_ri(r.ip.value, r.lr.value)
+ else:
+ assert 0
+ # note: no exception should currently be set in llop.get_exception_addr
+ # even if this finish may be an exit_frame_with_exception (in this case
+ # the exception instance is in arglocs[0]).
+ addr = self.cpu.get_on_leave_jitted_int(save_exception=False)
+ self.mc.BL(addr)
+ self.mc.gen_load_int(r.r0.value, arglocs[-1].value)
+ self.gen_func_epilog()
return fcond
def emit_op_call(self, op, args, regalloc, fcond, force_index=-1):
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
@@ -503,14 +503,14 @@
return args
def prepare_op_finish(self, op, fcond):
- args = [imm(self.frame_manager.frame_depth)]
+ args = [None] * (op.numargs() + 1)
for i in range(op.numargs()):
arg = op.getarg(i)
if arg:
- args.append(self.loc(arg))
+ args[i] = self.loc(arg)
self.possibly_free_var(arg)
- else:
- args.append(None)
+ n = self.cpu.get_fail_descr_number(op.getdescr())
+ args[-1] = imm(n)
return args
def prepare_op_guard_true(self, op, fcond):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit