[pypy-commit] pypy ppc-jit-backend: Use BlockBuilderMixin to write machine code instead of the old PPC backend approach
hager
noreply at buildbot.pypy.org
Tue Sep 20 14:30:47 CEST 2011
Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r47362:7969bcf8a92a
Date: 2011-09-20 14:30 +0200
http://bitbucket.org/pypy/pypy/changeset/7969bcf8a92a/
Log: Use BlockBuilderMixin to write machine code instead of the old PPC
backend approach to more similar to the other backends.
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
@@ -929,6 +929,7 @@
class PPCBuilder(BlockBuilderMixin, PPCAssembler):
def __init__(self, failargs_limit=1000):
PPCAssembler.__init__(self)
+ self.init_block_builder()
self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
def load_imm(self, rD, word):
@@ -961,6 +962,18 @@
else:
self.std(source_reg.value, 0, 0)
+ def prepare_insts_blocks(self):
+ self.assemble(True)
+ insts = self.insts
+ for inst in insts:
+ self.write32(inst.assemble())
+
+ def write32(self, word):
+ self.writechar(chr((word >> 24) & 0xFF))
+ self.writechar(chr((word >> 16) & 0xFF))
+ self.writechar(chr((word >> 8) & 0xFF))
+ self.writechar(chr(word & 0xFF))
+
class BranchUpdater(PPCAssembler):
def __init__(self):
PPCAssembler.__init__(self)
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
@@ -20,7 +20,7 @@
compute_vars_longevity)
from pypy.jit.backend.llsupport import symbolic
from pypy.jit.backend.model import CompiledLoopToken
-from pypy.rpython.lltypesystem import lltype, rffi, rstr
+from pypy.rpython.lltypesystem import lltype, rffi, rstr, llmemory
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.history import (BoxInt, ConstInt, ConstPtr,
ConstFloat, Box, INT, REF, FLOAT)
@@ -1899,6 +1899,9 @@
#if __name__ == '__main__':
# main()
+memcpy_fn = rffi.llexternal('memcpy', [llmemory.Address, llmemory.Address,
+ rffi.SIZE_T], lltype.Void,
+ sandboxsafe=True, _nowrapper=True)
def hi(w):
return w >> 16
@@ -1932,6 +1935,8 @@
self.cpu = cpu
self.fail_boxes_int = values_array(lltype.Signed, failargs_limit)
self.mc = None
+ self.datablockwrapper = None
+ self.memcpy_addr = 0
def load_imm(self, rD, word):
rD = rD.as_key()
@@ -1993,6 +1998,12 @@
return 1
return max(keys) + 1
+ def get_asmmemmgr_blocks(self, looptoken):
+ clt = looptoken.compiled_loop_token
+ if clt.asmmemmgr_blocks is None:
+ clt.asmmemmgr = []
+ return clt.asmmemmgr_blocks
+
def _make_prologue(self):
if IS_PPC_32:
self.mc.stwu(1, 1, -self.framesize)
@@ -2057,6 +2068,21 @@
assert 0, "FIX LATER"
self.load_from_addr(reg.value, addr)
+ def setup(self, looptoken, operations):
+ operations = self.cpu.gc_ll_descr.rewrite_assembler(self.cpu,
+ operations)
+ assert self.memcpy_addr != 0
+ self.current_clt = looptoken.compiled_loop_token
+ self.mc = PPCBuilder()
+ self.pending_guards = []
+ assert self.datablockwrapper is None
+ allblocks = self.get_asmmemmgr_blocks(looptoken)
+ self.datablockwrapper = MachineDataBlockWrapper(self.cpu.asmmemmgr,
+ allblocks)
+
+ def setup_once(self):
+ self.memcpy_addr = self.cpu.cast_ptr_to_int(memcpy_fn)
+
def assemble_loop(self, inputargs, operations, looptoken, log):
self.framesize = 256 + GPR_SAVE_AREA
self.patch_list = []
@@ -2067,7 +2093,7 @@
clt = CompiledLoopToken(self.cpu, looptoken.number)
looptoken.compiled_loop_token = clt
- self.current_clt = clt
+ self.setup(looptoken, operations)
longevity = compute_vars_longevity(inputargs, operations)
regalloc = Regalloc(longevity, assembler=self,
@@ -2084,7 +2110,8 @@
self._walk_operations(operations, regalloc)
self._make_epilogue()
- loop_start = self.mc.assemble()
+ #loop_start = self.mc.assemble()
+ loop_start = self.materialize_loop(looptoken)
looptoken.ppc_code = loop_start
self._teardown()
@@ -2111,6 +2138,20 @@
regalloc.possibly_free_vars_for_op(op)
regalloc._check_invariants()
+ def materialize_loop(self, looptoken):
+ self.mc.prepare_insts_blocks()
+ self.datablockwrapper.done()
+ self.datablockwrapper = None
+ allblocks = self.get_asmmemmgr_blocks(looptoken)
+ return self.mc.materialize(self.cpu.asmmemmgr, allblocks,
+ self.cpu.gc_ll_descr.gcrootmap)
+
+ def get_asmmemmgr_blocks(self, looptoken):
+ clt = looptoken.compiled_loop_token
+ if clt.asmmemmgr_blocks is None:
+ clt.asmmemmgr_blocks = []
+ return clt.asmmemmgr_blocks
+
def make_operations():
def not_implemented(builder, trace_op, cpu, *rest_args):
raise NotImplementedError, trace_op
diff --git a/pypy/jit/backend/ppc/runner.py b/pypy/jit/backend/ppc/runner.py
--- a/pypy/jit/backend/ppc/runner.py
+++ b/pypy/jit/backend/ppc/runner.py
@@ -22,6 +22,8 @@
class PPC_64_CPU(AbstractLLCPU):
+ BOOTSTRAP_TP = lltype.FuncType([], lltype.Signed)
+
def __init__(self, rtyper, stats, opts=None, translate_support_code=False,
gcdescr=None):
if gcdescr is not None:
@@ -35,6 +37,9 @@
self.total_compiled_bridges = 0
self.asm = AssemblerPPC(self)
+ def setup_once(self):
+ self.asm.setup_once()
+
def compile_loop(self, inputargs, operations, looptoken, log=False):
self.saved_descr = {}
self.asm.assemble_loop(inputargs, operations, looptoken, log)
@@ -95,9 +100,28 @@
# executes the stored machine code in the token
def execute_token(self, looptoken):
addr = looptoken.ppc_code
- fail_index = addr()
+ func = rffi.cast(lltype.Ptr(self.BOOTSTRAP_TP), addr)
+ fail_index = self._execute_call(func)
return self.saved_descr[fail_index]
+ def _execute_call(self, func):
+ prev_interpreter = None
+ if not self.translate_support_code:
+ prev_interpreter = LLInterpreter.current_interpreter
+ LLInterpreter.current_interpreter = self.debug_ll_interpreter
+ res = 0
+ try:
+ res = func()
+ finally:
+ if not self.translate_support_code:
+ LLInterpreter.current_interpreter = prev_interpreter
+ return res
+
+ @staticmethod
+ def cast_ptr_to_int(x):
+ adr = llmemory.cast_ptr_to_adr(x)
+ return PPC_64_CPU.cast_adr_to_int(adr)
+
# return the number of values that can be returned
def get_latest_value_count(self):
return self.fail_box_count
More information about the pypy-commit
mailing list