Author: David Schneider <[email protected]>
Branch: 
Changeset: r63798:a46161c73bae
Date: 2013-05-02 12:07 +0200
http://bitbucket.org/pypy/pypy/changeset/a46161c73bae/

Log:    revert change using stm/ldm for now

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
@@ -360,18 +360,22 @@
             regs = CoreRegisterManager.save_around_call_regs
         else:
             regs = CoreRegisterManager.all_regs
-        mc.ADD_ri(r.ip.value, r.fp.value, base_ofs)
-        mc.STM(r.ip.value, [reg.value for reg in regs
-                                    if reg not in ignored_regs])
+        # XXX use STMDB ops here
+        for i, gpr in enumerate(regs):
+            if gpr in ignored_regs:
+                continue
+            self.store_reg(mc, gpr, r.fp, base_ofs + i * WORD)
         if withfloats:
             if callee_only:
                 regs = VFPRegisterManager.save_around_call_regs
             else:
                 regs = VFPRegisterManager.all_regs
-            ofs = len(CoreRegisterManager.all_regs) * WORD
-            mc.ADD_ri(r.ip.value, r.ip.value, ofs)
-            mc.VSTM(r.ip.value, [vfpr.value for vfpr in regs
-                                    if vfpr not in ignored_regs])
+            for i, vfpr in enumerate(regs):
+                if vfpr in ignored_regs:
+                    continue
+                ofs = len(CoreRegisterManager.all_regs) * WORD
+                ofs += i * DOUBLE_WORD + base_ofs
+                self.store_reg(mc, vfpr, r.fp, ofs)
 
     def _pop_all_regs_from_jitframe(self, mc, ignored_regs, withfloats,
                                  callee_only=False):
@@ -381,19 +385,24 @@
             regs = CoreRegisterManager.save_around_call_regs
         else:
             regs = CoreRegisterManager.all_regs
-        mc.ADD_ri(r.ip.value, r.fp.value, base_ofs)
-        mc.LDM(r.ip.value, [reg.value for reg in regs
-                                    if reg not in ignored_regs])
+        # XXX use LDMDB ops here
+        for i, gpr in enumerate(regs):
+            if gpr in ignored_regs:
+                continue
+            ofs = i * WORD + base_ofs
+            self.load_reg(mc, gpr, r.fp, ofs)
         if withfloats:
             # Pop all XMM regs
             if callee_only:
                 regs = VFPRegisterManager.save_around_call_regs
             else:
                 regs = VFPRegisterManager.all_regs
-            ofs = len(CoreRegisterManager.all_regs) * WORD
-            mc.ADD_ri(r.ip.value, r.ip.value, ofs)
-            mc.VLDM(r.ip.value, [vfpr.value for vfpr in regs
-                                    if vfpr not in ignored_regs])
+            for i, vfpr in enumerate(regs):
+                if vfpr in ignored_regs:
+                    continue
+                ofs = len(CoreRegisterManager.all_regs) * WORD
+                ofs += i * DOUBLE_WORD + base_ofs
+                self.load_reg(mc, vfpr, r.fp, ofs)
 
     def _build_failure_recovery(self, exc, withfloats=False):
         mc = InstrBuilder(self.cpu.cpuinfo.arch_version)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to