Author: David Schneider <[email protected]>
Branch: jitframe-on-heap
Changeset: r60730:e71902fae352
Date: 2013-01-30 15:49 +0100
http://bitbucket.org/pypy/pypy/changeset/e71902fae352/

Log:    support for floats in failargs

diff --git a/rpython/jit/backend/arm/assembler.py 
b/rpython/jit/backend/arm/assembler.py
--- a/rpython/jit/backend/arm/assembler.py
+++ b/rpython/jit/backend/arm/assembler.py
@@ -8,9 +8,10 @@
                                     N_REGISTERS_SAVED_BY_MALLOC, \
                                     JITFRAME_FIXED_SIZE, FRAME_FIXED_SIZE
 from rpython.jit.backend.arm.codebuilder import ARMv7Builder, 
OverwritingBuilder
-from rpython.jit.backend.arm.locations import get_fp_offset, imm
+from rpython.jit.backend.arm.locations import get_fp_offset, imm, StackLocation
 from rpython.jit.backend.arm.regalloc import (Regalloc, ARMFrameManager,
                     CoreRegisterManager, check_imm_arg,
+                    VFPRegisterManager,
                     operations as regalloc_operations,
                     operations_with_guard as regalloc_operations_with_guard)
 from rpython.jit.backend.llsupport.asmmemmgr import MachineDataBlockWrapper
@@ -373,7 +374,7 @@
         # see ../x86/assembler.py:propagate_memoryerror_if_eax_is_null
         self.mc.CMP_ri(r.r0.value, 0)
         self.mc.B(self.propagate_exception_path, c=c.EQ)
-    
+
     def _push_all_regs_to_jitframe(self, mc, ignored_regs, withfloats,
                                 callee_only=False):
         if callee_only:
@@ -386,7 +387,15 @@
                 continue
             mc.STR_ri(gpr.value, r.fp.value, i * WORD)
         if withfloats:
-            assert 0, 'implement me'
+            if callee_only:
+                regs = VFPRegisterManager.save_around_call_regs
+            else:
+                regs = VFPRegisterManager.all_regs
+            for i, vfpr in enumerate(regs):
+                if vfpr in ignored_regs:
+                    continue
+                # add the offset of the gpr_regs
+                mc.VSTR(vfpr.value, r.fp.value, imm=i * DOUBLE_WORD)
 
     def _build_failure_recovery(self, exc, withfloats=False):
         mc = ARMv7Builder()
@@ -497,9 +506,8 @@
                     assert loc is not r.fp # for now
                     v = loc.value
                 else:
-                    assert 0, 'fix for floats'
                     assert loc.is_vfp_reg()
-                    #v = len(VFPRegisterManager.all_regs) + loc.value
+                    v = len(CoreRegisterManager.all_regs) + loc.value * 2
                 positions[i] = v * WORD
         # write down the positions of locs
         guardtok.faildescr.rd_locs = positions
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to