[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