Author: hager <sven.ha...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit