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

Reply via email to