[pypy-commit] pypy ppc-jit-backend: More PPC64 paths

edelsohn noreply at buildbot.pypy.org
Mon Oct 31 23:58:07 CET 2011


Author: edelsohn
Branch: ppc-jit-backend
Changeset: r48637:11cd624afd49
Date: 2011-10-31 18:57 -0400
http://bitbucket.org/pypy/pypy/changeset/11cd624afd49/

Log:	More PPC64 paths

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
@@ -8,7 +8,8 @@
 from pypy.jit.backend.ppc.ppcgen.opassembler import OpAssembler
 from pypy.jit.backend.ppc.ppcgen.symbol_lookup import lookup
 from pypy.jit.backend.ppc.ppcgen.codebuilder import PPCBuilder
-from pypy.jit.backend.ppc.ppcgen.arch import (IS_PPC_32, WORD, NONVOLATILES,
+from pypy.jit.backend.ppc.ppcgen.arch import (IS_PPC_32, IS_PPC_64,
+                                              WORD, NONVOLATILES,
                                               GPR_SAVE_AREA)
 from pypy.jit.backend.ppc.ppcgen.helper.assembler import (gen_emit_cmp_op, 
                                                           encode32, decode32)
@@ -136,6 +137,7 @@
             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 + 2 * WORD)
+            self.mc.std(r.SPP.value, r.SP.value, WORD)
         offset = GPR_SAVE_AREA + WORD
         # compute spilling pointer (SPP)
         self.mc.addi(r.SPP.value, r.SP.value, frame_depth - offset)
@@ -294,6 +296,7 @@
         self._save_managed_regs(mc)
         # adjust SP (r1)
         size = WORD * len(r.MANAGED_REGS)
+        # XXX PPC64 needs to push larger stack frame
         mc.addi(r.SP.value, r.SP.value, -size)
         #
         decode_func_addr = llhelper(self.recovery_func_sign,
@@ -301,17 +304,29 @@
         addr = rffi.cast(lltype.Signed, decode_func_addr)
         #
         # load parameters into parameter registers
-        mc.lwz(r.r3.value, r.SPP.value, 0)
+        if IS_PPC_32:
+            mc.lwz(r.r3.value, r.SPP.value, 0)
+        else:
+            mc.ld(r.r3.value, r.SPP.value, 0)
         #mc.mr(r.r3.value, r.r0.value)          # address of state encoding 
         mc.mr(r.r4.value, r.SP.value)          # load stack pointer
         mc.mr(r.r5.value, r.SPP.value)         # load spilling pointer
         #
         # load address of decoding function into r0
-        mc.load_imm(r.r0, addr)
+        if IS_PPC_32:
+            mc.load_imm(r.r0, addr)
+        else:
+            mc.std(r.r2.value, r.SP.value, 40)
+            mc.load_from_addr(r.r0, addr)
+            mc.load_from_addr(r.r2, addr+WORD)
+            mc.load_from_addr(r.r11, addr+2*WORD)
         # ... and branch there
         mc.mtctr(r.r0.value)
         mc.bctrl()
         #
+        if IS_PPC_64:
+            mc.ld(r.r2.value, r.SP.value, 40)
+        #
         mc.addi(r.SP.value, r.SP.value, size)
         # save SPP in r5
         # (assume that r5 has been written to failboxes)
@@ -338,7 +353,7 @@
             if IS_PPC_32:
                 mc.stw(reg.value, r.SP.value, -(len(r.MANAGED_REGS) - i) * WORD)
             else:
-                assert 0, "not implemented yet"
+                mc.std(reg.value, r.SP.value, -(len(r.MANAGED_REGS) - i) * WORD)
 
     def gen_bootstrap_code(self, nonfloatlocs, inputargs):
         for i in range(len(nonfloatlocs)):
@@ -550,7 +565,10 @@
 
         # store addr in force index field
         self.mc.load_imm(r.r0, memaddr)
-        self.mc.stw(r.r0.value, r.SPP.value, 0)
+        if IS_PPC_32:
+            self.mc.stw(r.r0.value, r.SPP.value, 0)
+        else:
+            self.mc.std(r.r0.value, r.SPP.value, 0)
 
         if save_exc:
             path = self._leave_jitted_hook_save_exc
@@ -602,7 +620,10 @@
             elif loc.is_stack():
                 offset = loc.as_key() * WORD - WORD
                 self.mc.load_imm(r.r0.value, value)
-                self.mc.stw(r.r0.value, r.SPP.value, offset)
+                if IS_PPC_32:
+                    self.mc.stw(r.r0.value, r.SPP.value, offset)
+                else:
+                    self.mc.std(r.r0.value, r.SPP.value, offset)
                 return
             assert 0, "not supported location"
         elif prev_loc.is_stack():
@@ -610,13 +631,20 @@
             # move from memory to register
             if loc.is_reg():
                 reg = loc.as_key()
-                self.mc.lwz(reg, r.SPP.value, offset)
+                if IS_PPC_32:
+                    self.mc.lwz(reg, r.SPP.value, offset)
+                else:
+                    self.mc.ld(reg, r.SPP.value, offset)
                 return
             # move in memory
             elif loc.is_stack():
                 target_offset = loc.as_key() * WORD - WORD
-                self.mc.lwz(r.r0.value, r.SPP.value, offset)
-                self.mc.stw(r.r0.value, r.SPP.value, target_offset)
+                if IS_PPC_32:
+                    self.mc.lwz(r.r0.value, r.SPP.value, offset)
+                    self.mc.stw(r.r0.value, r.SPP.value, target_offset)
+                else:
+                    self.mc.ld(r.r0.value, r.SPP.value, offset)
+                    self.mc.std(r.r0.value, r.SPP.value, target_offset)
                 return
             assert 0, "not supported location"
         elif prev_loc.is_reg():
@@ -629,7 +657,10 @@
             # move to memory
             elif loc.is_stack():
                 offset = loc.as_key() * WORD - WORD
-                self.mc.stw(reg, r.SPP.value, offset)
+                if IS_PPC_32:
+                    self.mc.stw(reg, r.SPP.value, offset)
+                else:
+                    self.mc.std(reg, r.SPP.value, offset)
                 return
             assert 0, "not supported location"
         assert 0, "not supported location"


More information about the pypy-commit mailing list