[pypy-commit] pypy ppc-jit-backend: Adjust frame layout and store TOC pointer.

edelsohn noreply at buildbot.pypy.org
Fri Nov 11 15:57:34 CET 2011


Author: edelsohn
Branch: ppc-jit-backend
Changeset: r49310:4cf958dae77e
Date: 2011-11-11 09:57 -0500
http://bitbucket.org/pypy/pypy/changeset/4cf958dae77e/

Log:	Adjust frame layout and store TOC pointer.

diff --git a/pypy/jit/backend/ppc/ppcgen/arch.py b/pypy/jit/backend/ppc/ppcgen/arch.py
--- a/pypy/jit/backend/ppc/ppcgen/arch.py
+++ b/pypy/jit/backend/ppc/ppcgen/arch.py
@@ -10,7 +10,7 @@
 else:
     WORD = 8
     IS_PPC_32 = False
-    BACKCHAIN_SIZE = 3 * WORD
+    BACKCHAIN_SIZE = 4 * WORD
 
 IS_PPC_64 = not IS_PPC_32
 MY_COPY_OF_REGS = 0
diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -527,7 +527,7 @@
         else:
             self.mc.stdu(r.SP.value, r.SP.value, -stack_space)
             self.mc.mflr(r.r0.value)
-            self.mc.std(r.r0.value, r.SP.value, stack_space + WORD)
+            self.mc.std(r.r0.value, r.SP.value, stack_space + 2 * WORD)
 
         # then we push everything on the stack
         for i, arg in enumerate(stack_args):
@@ -574,14 +574,14 @@
             self.mc.bl_abs(adr)
             self.mc.lwz(r.r0.value, r.SP.value, stack_space + WORD)
         else:
-            self.mc.std(r.r2.value, r.SP.value, 40)
+            self.mc.std(r.r2.value, r.SP.value, 3 * WORD)
             self.mc.load_from_addr(r.r0, adr)
-            self.mc.load_from_addr(r.r2, adr+WORD)
-            self.mc.load_from_addr(r.r11, adr+2*WORD)
+            self.mc.load_from_addr(r.r2, adr + WORD)
+            self.mc.load_from_addr(r.r11, adr + 2 * WORD)
             self.mc.mtctr(r.r0.value)
             self.mc.bctrl()
-            self.mc.ld(r.r2.value, r.SP.value, 40)
-            self.mc.ld(r.r0.value, r.SP.value, stack_space + WORD)
+            self.mc.ld(r.r2.value, r.SP.value, 3 * WORD)
+            self.mc.ld(r.r0.value, r.SP.value, stack_space + 2 * WORD)
         self.mc.mtlr(r.r0.value)
         self.mc.addi(r.SP.value, r.SP.value, stack_space)
 
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -174,7 +174,7 @@
         else:
             self.mc.stdu(r.SP.value, r.SP.value, -frame_depth)
             self.mc.mflr(r.r0.value)
-            self.mc.std(r.r0.value, r.SP.value, frame_depth + WORD)
+            self.mc.std(r.r0.value, r.SP.value, frame_depth + 2 * WORD)
 
         # compute spilling pointer (SPP)
         self.mc.addi(r.SPP.value, r.SP.value, frame_depth
@@ -381,12 +381,15 @@
         # load address of decoding function into r0
         mc.load_imm(r.r0, addr)
         if IS_PPC_64:
+            mc.std(r.r2.value, r.SP.value, 3 * WORD)
             # load TOC pointer and environment pointer
             mc.load_imm(r.r2, r2_value)
             mc.load_imm(r.r11, r11_value)
         # ... and branch there
         mc.mtctr(r.r0.value)
         mc.bctrl()
+        if IS_PPC_64:
+            mc.ld(r.r2.value, r.SP.value, 3 * WORD)
         #
         mc.addi(r.SP.value, r.SP.value, size)
         # save SPP in r5
@@ -398,7 +401,7 @@
         if IS_PPC_32:
             mc.lwz(r.r4.value, r.r5.value, offset_to_old_backchain) 
         else:
-            mc.ld(r.r4.value, r.r5.value, offset_to_old_backchain)
+            mc.ld(r.r4.value, r.r5.value, offset_to_old_backchain + WORD)
         mc.mtlr(r.r4.value)     # restore LR
 
         # From SPP, we have a constant offset of GPR_SAVE_AREA_AND_FORCE_INDEX 


More information about the pypy-commit mailing list