Author: David Schneider <david.schnei...@picle.org> 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 pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit