[pypy-commit] pypy ppc-jit-backend: Moved code for assembler prolog to the end of the generated code.

hager noreply at buildbot.pypy.org
Thu Sep 22 19:21:08 CEST 2011


Author: hager <sven.hager at uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r47400:95f203d329b1
Date: 2011-09-22 19:20 +0200
http://bitbucket.org/pypy/pypy/changeset/95f203d329b1/

Log:	Moved code for assembler prolog to the end of the generated code.

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
@@ -23,6 +23,8 @@
 from pypy.jit.metainterp.history import (BoxInt, ConstInt, ConstPtr,
                                          ConstFloat, Box, INT, REF, FLOAT)
 from pypy.jit.backend.x86.support import values_array
+from pypy.tool.udir import udir
+from pypy.rlib.objectmodel import we_are_translated
 
 A = Form("frD", "frA", "frB", "XO3", "Rc")
 A1 = Form("frD", "frB", "XO3", "Rc")
@@ -968,12 +970,26 @@
         for inst in insts:
             self.write32(inst.assemble())
 
+    def _dump_trace(self, addr, name, formatter=-1):
+        if not we_are_translated():
+            if formatter != -1:
+                name = name % formatter
+            dir = udir.ensure('asm', dir=True)
+            f = dir.join(name).open('wb')
+            data = rffi.cast(rffi.CCHARP, addr)
+            for i in range(self.currpos()):
+                f.write(data[i])
+            f.close()
+
     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))
 
+    def currpos(self):
+        return self.get_rel_pos()
+
 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
@@ -1833,6 +1833,8 @@
 #        self.copy_to_raw_memory(addr)
 #        
 #    def assemble(self, dump=os.environ.has_key('PYPY_DEBUG')):
+
+
 #        insns = self.assemble0(dump)
 #        for i in insns:
 #            self.emit(i)
@@ -2004,16 +2006,19 @@
             clt.asmmemmgr = []
         return clt.asmmemmgr_blocks
 
-    def _make_prologue(self):
+    def _make_prologue(self, target_pos):
         if IS_PPC_32:
             self.mc.stwu(1, 1, -self.framesize)
-            self.mc.mflr(0)
-            self.mc.stw(0, 1, self.framesize + 4)
+            self.mc.mflr(0)  # move old link register
+            self.mc.stw(0, 1, self.framesize + 4) # save it in previous frame
         else:
             self.mc.stdu(1, 1, -self.framesize)
             self.mc.mflr(0)
             self.mc.std(0, 1, self.framesize + 4)
         self._save_nonvolatiles()
+        curpos = self.mc.currpos()
+        offset = target_pos - curpos
+        self.mc.b(offset)
 
     def _make_epilogue(self):
         for op_index, fail_index, guard, reglist in self.patch_list:
@@ -2084,35 +2089,36 @@
         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 = []
-        self.pending_guards = []
-        self.mc = PPCBuilder()
-        self.startpos = self.mc.get_rel_pos()
 
         clt = CompiledLoopToken(self.cpu, looptoken.number)
         looptoken.compiled_loop_token = clt
 
         self.setup(looptoken, operations)
+        self.framesize = 256 + GPR_SAVE_AREA
+        self.patch_list = []
+        self.pending_guards = []
+        self.startpos = self.mc.get_rel_pos()
 
         longevity = compute_vars_longevity(inputargs, operations)
         regalloc = Regalloc(longevity, assembler=self,
                             frame_manager=PPCFrameManager())
 
-        self._make_prologue()
         nonfloatlocs = regalloc.prepare_loop(inputargs, operations, looptoken)
+        regalloc_head = self.mc.currpos()
         self.gen_bootstrap_code(nonfloatlocs, inputargs)
 
-        looptoken._ppc_loop_code = self.mc.get_rel_pos()
+        loophead = self.mc.currpos()
+        looptoken._ppc_loop_code = loophead
         looptoken._ppc_arglocs = [nonfloatlocs]
         looptoken._ppc_bootstrap_code = 0
 
         self._walk_operations(operations, regalloc)
+        start_pos = self.mc.currpos()
+        self._make_prologue(regalloc_head)
         self._make_epilogue()
         
-        #loop_start = self.mc.assemble()
         loop_start = self.materialize_loop(looptoken)
-        looptoken.ppc_code = loop_start
+        looptoken.ppc_code = loop_start + start_pos
         self._teardown()
 
     def _teardown(self):


More information about the pypy-commit mailing list