[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