Author: edelsohn
Branch: ppc-jit-backend
Changeset: r50968:16225a003d71
Date: 2011-12-30 12:21 -0500
http://bitbucket.org/pypy/pypy/changeset/16225a003d71/

Log:    Materialize function address once. Load function descriptor values
        via offsets.

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
@@ -280,10 +280,11 @@
             if IS_PPC_32:
                 mc.bl_abs(addr)
             else:
-                mc.load_from_addr(r.SCRATCH, addr)
-                mc.load_from_addr(r.r2, addr + WORD)
-                mc.load_from_addr(r.r11, addr + 2 * WORD)
+                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.alloc_scratch_reg(self.cpu.propagate_exception_v)
         #mc.mr(r.RES.value, r.SCRATCH.value)
@@ -300,10 +301,11 @@
             if IS_PPC_32:
                 mc.bl_abs(addr)
             else:
-                mc.load_from_addr(r.SCRATCH, addr)
-                mc.load_from_addr(r.r2, addr + WORD)
-                mc.load_from_addr(r.r11, addr + 2 * WORD)
+                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.b_abs(self.exit_code_adr)
@@ -325,32 +327,28 @@
         self._save_managed_regs(mc)
         decode_func_addr = llhelper(self.recovery_func_sign,
                 self.failure_recovery_func)
-        if IS_PPC_32:
-            addr = rffi.cast(lltype.Signed, decode_func_addr)
-        else:
-            intp = lltype.Ptr(lltype.Array(lltype.Signed, hints={'nolength': 
True}))
-            descr = rffi.cast(intp, decode_func_addr)
-            addr = descr[0]
-            r2_value = descr[1]
-            r11_value = descr[2]
+        addr = rffi.cast(lltype.Signed, decode_func_addr)
 
         # load parameters into parameter registers
         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
-        mc.alloc_scratch_reg(addr)
-        if IS_PPC_64:
-            mc.std(r.r2.value, r.SP.value, 5 * WORD)
-            # load TOC pointer and environment pointer
-            mc.load_imm(r.r2, r2_value)
-            mc.load_imm(r.r11, r11_value)
+        if IS_PPC_32:
+            mc.alloc_scratch_reg(addr)
+            mc.mtctr(r.SCRATCH.value)
+            mc.free_scratch_reg()
         # ... and branch there
-        mc.mtctr(r.SCRATCH.value)
-        mc.free_scratch_reg()
-        mc.bctrl()
-        if IS_PPC_64:
-            mc.ld(r.r2.value, r.SP.value, 5 * WORD)
+            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)
         #
         # save SPP in r5
         # (assume that r5 has been written to failboxes)
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to