Author: edelsohn
Branch: ppc-backend-2
Changeset: r55424:8798c20914f8
Date: 2012-06-05 21:23 -0400
http://bitbucket.org/pypy/pypy/changeset/8798c20914f8/

Log:    Save and restore non-volatile floats.

diff --git a/pypy/jit/backend/ppc/ppc_assembler.py 
b/pypy/jit/backend/ppc/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppc_assembler.py
@@ -6,7 +6,7 @@
 from pypy.jit.backend.ppc.arch import (IS_PPC_32, IS_PPC_64, WORD,
                                               NONVOLATILES, MAX_REG_PARAMS,
                                               GPR_SAVE_AREA, BACKCHAIN_SIZE,
-                                              FPR_SAVE_AREA,
+                                              FPR_SAVE_AREA, 
NONVOLATILES_FLOAT,
                                               FLOAT_INT_CONVERSION, 
FORCE_INDEX,
                                               SIZE_LOAD_IMM_PATCH_SP,
                                               FORCE_INDEX_OFS)
@@ -73,6 +73,8 @@
     ENCODING_AREA               = FORCE_INDEX_OFS
     OFFSET_SPP_TO_GPR_SAVE_AREA = (FORCE_INDEX + FLOAT_INT_CONVERSION
                                    + ENCODING_AREA)
+    OFFSET_SPP_TO_FPR_SAVE_AREA = (OFFSET_SPP_TO_GPR_SAVE_AREA
+                                   + GPR_SAVE_AREA)
     OFFSET_SPP_TO_OLD_BACKCHAIN = (OFFSET_SPP_TO_GPR_SAVE_AREA
                                    + GPR_SAVE_AREA + FPR_SAVE_AREA)
 
@@ -104,21 +106,27 @@
         self._debug = v
 
     def _save_nonvolatiles(self):
-        """ save nonvolatile GPRs in GPR SAVE AREA 
+        """ save nonvolatile GPRs and FPRs in SAVE AREA 
         """
         for i, reg in enumerate(NONVOLATILES):
             # save r31 later on
             if reg.value == r.SPP.value:
                 continue
             self.mc.store(reg.value, r.SPP.value, 
-                    self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
+                          self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
+        for i, reg in enumerate(NONVOLATILES_FLOAT):
+            self.mc.stfd(reg.value, r.SPP.value, 
+                         self.OFFSET_SPP_TO_FPR_SAVE_AREA + WORD * i)
 
     def _restore_nonvolatiles(self, mc, spp_reg):
-        """ restore nonvolatile GPRs from GPR SAVE AREA
+        """ restore nonvolatile GPRs and FPRs from SAVE AREA
         """
         for i, reg in enumerate(NONVOLATILES):
             mc.load(reg.value, spp_reg.value, 
-                self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
+                         self.OFFSET_SPP_TO_GPR_SAVE_AREA + WORD * i)
+        for i, reg in enumerate(NONVOLATILES_FLOAT):
+            mc.lfd(reg.value, spp_reg.value,
+                        self.OFFSET_SPP_TO_FPR_SAVE_AREA + WORD * i)
 
     # The code generated here allocates a new stackframe 
     # and is the first machine code to be executed.
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to