[pypy-svn] r80028 - pypy/branch/arm-backend/pypy/jit/backend/arm

david at codespeak.net david at codespeak.net
Mon Dec 13 11:56:23 CET 2010


Author: david
Date: Mon Dec 13 11:56:20 2010
New Revision: 80028

Modified:
   pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
   pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py
Log:
Fix calls with parameters on the stack and guard_exception

Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py	(original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/opassembler.py	Mon Dec 13 11:56:20 2010
@@ -243,7 +243,6 @@
         adr = args[0]
         cond =  self._emit_call(adr, op.getarglist()[1:], regalloc, fcond,
                                 op.result, spill_all_regs=spill_all_regs)
-
         descr = op.getdescr()
         #XXX Hack, Hack, Hack
         if op.result and not we_are_translated() and not isinstance(descr, LoopToken):
@@ -282,9 +281,8 @@
             n = stack_args*WORD
             self._adjust_sp(n, fcond=fcond)
             for i in range(4, n_args):
-                reg, box = regalloc._ensure_value_is_boxed(args[i], regalloc)
-                self.mc.STR_ri(reg.value, r.sp.value, (i-4)*WORD)
-                regalloc.possibly_free_var(box)
+                self.regalloc_mov(regalloc.loc(args[i]), r.ip)
+                self.mc.STR_ri(r.ip.value, r.sp.value, (i-4)*WORD)
 
         #the actual call
         self.mc.BL(adr)
@@ -329,14 +327,14 @@
     def emit_op_guard_exception(self, op, arglocs, regalloc, fcond):
         loc, loc1, resloc, pos_exc_value, pos_exception = arglocs[:5]
         failargs = arglocs[5:]
-        self.mc.LDR_ri(loc1.value, loc1.value)
+        self.mc.gen_load_int(loc1.value, pos_exception.value)
+        self.mc.LDR_ri(r.ip.value, loc1.value)
 
-        self.mc.CMP_rr(loc1.value, loc.value)
+        self.mc.CMP_rr(r.ip.value, loc.value)
         self._emit_guard(op, failargs, c.EQ, save_exc=True)
-        self.mc.gen_load_int(loc1.value, pos_exc_value.value, fcond)
+        self.mc.gen_load_int(loc.value, pos_exc_value.value, fcond)
         if resloc:
-            self.mc.LDR_ri(resloc.value, loc1.value)
-        self.mc.gen_load_int(loc.value, pos_exception.value, fcond)
+            self.mc.LDR_ri(resloc.value, loc.value)
         self.mc.MOV_ri(r.ip.value, 0)
         self.mc.STR_ri(r.ip.value, loc.value)
         self.mc.STR_ri(r.ip.value, loc1.value)

Modified: pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py
==============================================================================
--- pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py	(original)
+++ pypy/branch/arm-backend/pypy/jit/backend/arm/regalloc.py	Mon Dec 13 11:56:20 2010
@@ -304,15 +304,14 @@
         arg0 = ConstInt(rffi.cast(lltype.Signed, op.getarg(0).getint()))
         loc, box = self._ensure_value_is_boxed(arg0)
         boxes.append(box)
-        loc1, box = self._ensure_value_is_boxed(
-                    ConstInt(self.assembler.cpu.pos_exception()), boxes)
+        box = TempBox()
+        loc1 = self.force_allocate_reg(box, boxes)
         boxes.append(box)
         if op.result in self.longevity:
             resloc = self.force_allocate_reg(op.result, boxes)
             boxes.append(resloc)
         else:
             resloc = None
-        # There is some redundancy here ?!
         pos_exc_value = imm(self.assembler.cpu.pos_exc_value())
         pos_exception = imm(self.assembler.cpu.pos_exception())
         arglocs = self._prepare_guard(op, [loc, loc1, resloc, pos_exc_value, pos_exception])



More information about the Pypy-commit mailing list