[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