[pypy-commit] pypy ppc-jit-backend: factor out implementation of calls

hager noreply at buildbot.pypy.org
Mon Jan 2 13:43:53 CET 2012


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50975:5f4684c8251c
Date: 2012-01-02 13:43 +0100
http://bitbucket.org/pypy/pypy/changeset/5f4684c8251c/

Log:	factor out implementation of calls

diff --git a/pypy/jit/backend/ppc/ppcgen/codebuilder.py b/pypy/jit/backend/ppc/ppcgen/codebuilder.py
--- a/pypy/jit/backend/ppc/ppcgen/codebuilder.py
+++ b/pypy/jit/backend/ppc/ppcgen/codebuilder.py
@@ -7,7 +7,7 @@
 from pypy.jit.backend.ppc.ppcgen.assembler import Assembler
 from pypy.jit.backend.ppc.ppcgen.symbol_lookup import lookup
 from pypy.jit.backend.ppc.ppcgen.arch import (IS_PPC_32, WORD, NONVOLATILES,
-                                              GPR_SAVE_AREA)
+                                              GPR_SAVE_AREA, IS_PPC_64)
 from pypy.jit.backend.ppc.ppcgen.helper.assembler import gen_emit_cmp_op
 import pypy.jit.backend.ppc.ppcgen.register as r
 import pypy.jit.backend.ppc.ppcgen.condition as c
@@ -1028,12 +1028,25 @@
             self.trap()
         self.bctr()
 
-    def bl_abs(self, address):
-        self.alloc_scratch_reg(address)
+    def call(self, address):
+        """ do a call to an absolute address
+        """
+        self.alloc_scratch_reg()
+        if IS_PPC_32:
+            self.load_imm(r.SCRATCH, address)
+        else:
+            self.store(r.TOC.value, r.SP.value, 5 * WORD)
+            self.load_imm(r.r11, address)
+            self.load(r.SCRATCH.value, r.r11.value, 0)
+            self.load(r.r2.value, r.r11.value, WORD)
+            self.load(r.r11.value, r.r11.value, 2 * WORD)
         self.mtctr(r.SCRATCH.value)
         self.free_scratch_reg()
         self.bctrl()
 
+        if IS_PPC_64:
+            self.load(t.TOC.value, r.SP.value, 5 * WORD)
+
     def load(self, target_reg, base_reg, offset):
         if IS_PPC_32:
             self.lwz(target_reg, base_reg, offset)
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
@@ -411,17 +411,7 @@
         remap_frame_layout(self, non_float_locs, non_float_regs, r.SCRATCH)
 
         # the actual call
-        if IS_PPC_32:
-            self.mc.bl_abs(adr)
-        else:
-            self.mc.std(r.TOC.value, r.SP.value, 5 * WORD)
-            self.mc.load_imm(r.r11, adr)
-            self.mc.load(r.SCRATCH.value, r.r11.value, 0)
-            self.mc.mtctr(r.SCRATCH.value)
-            self.mc.load(r.TOC.value, r.r11.value, WORD)
-            self.mc.load(r.r11.value, r.r11.value, 2 * WORD)
-            self.mc.bctrl()
-            self.mc.ld(r.TOC.value, r.SP.value, 5 * WORD)
+        self.mc.call(adr)
 
         self.mark_gc_roots(force_index)
         regalloc.possibly_free_vars(args)
@@ -879,15 +869,7 @@
             #
             # misaligned stack in the call, but it's ok because the write barrier
             # is not going to call anything more.  
-            if IS_PPC_32:
-                self.mc.bl_abs(func)
-            else:
-                self.mc.load_imm(r.r11, func)
-                self.mc.load(r.SCRATCH.value, r.r11.value, 0)
-                self.mc.mtctr(r.SCRATCH.value)
-                self.mc.load(r.TOC.value, r.r11.value, WORD)
-                self.mc.load(r.r11.value, r.r11.value, 2 * WORD)
-                self.mc.bctrl()
+            self.mc.call(func)
 
         # patch the JZ above
         offset = self.mc.currpos() - jz_location
@@ -952,15 +934,7 @@
 
         # do call to helper function
         self.mov_loc_loc(arglocs[1], r.r4)
-        if IS_PPC_32:
-            self.mc.bl_abs(asm_helper_adr)
-        else:
-            self.mc.load_imm(r.r11, asm_helper_adr)
-            self.mc.load(r.SCRATCH.value, r.r11.value, 0)
-            self.mc.mtctr(r.SCRATCH.value)
-            self.mc.load(r.TOC.value, r.r11.value, WORD)
-            self.mc.load(r.r11.value, r.r11.value, 2 * WORD)
-            self.mc.bctrl()
+        self.mc.call(asm_helper_adr)
 
         if op.result:
             resloc = regalloc.after_call(op.result)
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
@@ -277,15 +277,7 @@
         mc = PPCBuilder()
         with Saved_Volatiles(mc):
             addr = self.cpu.get_on_leave_jitted_int(save_exception=True)
-            if IS_PPC_32:
-                mc.bl_abs(addr)
-            else:
-                mc.load_imm(r.r11, addr)
-                mc.load(r.SCRATCH.value, r.r11.value, 0)
-                mc.mtctr(r.SCRATCH.value)
-                mc.load(r.r2.value, r.r11.value, WORD)
-                mc.load(r.r11.value, r.r11.value, 2 * WORD)
-                mc.bctrl()
+            mc.call(addr)
         #mc.alloc_scratch_reg(self.cpu.propagate_exception_v)
         #mc.mr(r.RES.value, r.SCRATCH.value)
         #mc.free_scratch_reg()
@@ -298,15 +290,7 @@
 
         with Saved_Volatiles(mc):
             addr = self.cpu.get_on_leave_jitted_int(save_exception=save_exc)
-            if IS_PPC_32:
-                mc.bl_abs(addr)
-            else:
-                mc.load_imm(r.r11, addr)
-                mc.load(r.SCRATCH.value, r.r11.value, 0)
-                mc.mtctr(r.SCRATCH.value)
-                mc.load(r.r2.value, r.r11.value, WORD)
-                mc.load(r.r11.value, r.r11.value, 2 * WORD)
-                mc.bctrl()
+            mc.call(addr)
 
         mc.b_abs(self.exit_code_adr)
         mc.prepare_insts_blocks()
@@ -333,23 +317,9 @@
         mc.load(r.r3.value, r.SPP.value, self.ENCODING_AREA)     # address of state encoding 
         mc.mr(r.r4.value, r.SPP.value)         # load spilling pointer
         #
-        # load address of decoding function into SCRATCH
-        if IS_PPC_32:
-            mc.alloc_scratch_reg(addr)
-            mc.mtctr(r.SCRATCH.value)
-            mc.free_scratch_reg()
-        # ... and branch there
-            mc.bctrl()
-        else:
-            mc.std(r.TOC.value, r.SP.value, 5 * WORD)
-            mc.load_imm(r.r11, addr)
-            mc.load(r.SCRATCH.value, r.r11.value, 0)
-            mc.mtctr(r.SCRATCH.value)
-            mc.load(r.TOC.value, r.r11.value, WORD)
-            mc.load(r.r11.value, r.r11.value, 2 * WORD)
-            mc.bctrl()
-            mc.ld(r.TOC.value, r.SP.value, 5 * WORD)
-        #
+        # call decoding function
+        mc.call(addr)
+
         # save SPP in r5
         # (assume that r5 has been written to failboxes)
         mc.mr(r.r5.value, r.SPP.value)


More information about the pypy-commit mailing list