[pypy-svn] r41155 - pypy/dist/pypy/jit/codegen/ppc
mwh at codespeak.net
mwh at codespeak.net
Fri Mar 23 11:56:00 CET 2007
Author: mwh
Date: Fri Mar 23 11:55:59 2007
New Revision: 41155
Modified:
pypy/dist/pypy/jit/codegen/ppc/rgenop.py
Log:
be about 300% more careful about flushing the icache when needed.
Modified: pypy/dist/pypy/jit/codegen/ppc/rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/rgenop.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/rgenop.py Fri Mar 23 11:55:59 2007
@@ -539,6 +539,8 @@
self.asm.mc = self.rgenop.ExistingCodeBlock(
self.final_jump_addr, self.final_jump_addr+8)
self.asm.load_word(rSCRATCH, target)
+ _flush_icache(self.final_jump_addr, 8)
+ self._code_start = mc.tell()
self.asm.mc = mc
self.final_jump_addr = 0
self.closed = False
@@ -554,6 +556,7 @@
self.asm.mc = self.rgenop.ExistingCodeBlock(
self.patch_start_here, self.patch_start_here+8)
self.asm.load_word(rSCRATCH, mc.tell())
+ _flush_icache(self.patch_start_here, 8)
self.asm.mc = mc
self.patch_start_here = 0
@@ -1344,6 +1347,7 @@
self._add_case(gv_case, target_addr)
except codebuf.CodeBlockOverflow:
self.asm.mc.setpos(p)
+ base = self.asm.mc.tell()
mc = self.rgenop.open_mc()
newmc = mc.reserve(7 * 5 + 4)
self.rgenop.close_mc(mc)
@@ -1351,12 +1355,15 @@
self.asm.load_word(rSCRATCH, new_addr)
self.asm.mtctr(rSCRATCH)
self.asm.bctr()
+ size = self.asm.mc.tell() - base
+ flush_icache(base, size)
self.asm.mc = newmc
self._add_case(gv_case, target_addr)
return targetbuilder
def _add_case(self, gv_case, target_addr):
asm = self.asm
+ base = self.asm.mc.tell()
assert isinstance(gv_case, GenConst)
gv_case.load_now(asm, insn.gprs[0])
asm.cmpw(self.crf.number, rSCRATCH, self.switch_reg.number)
@@ -1365,14 +1372,19 @@
asm.bcctr(12, self.crf.number*4 + 2)
if self.default_target_addr:
self._write_default()
+ size = self.asm.mc.tell() - base
+ flush_icache(base, size)
def add_default(self):
targetbuilder = self.rgenop.newbuilder()
targetbuilder._open()
targetbuilder.initial_var2loc = self.var2loc
targetbuilder.initial_spill_offset = self.initial_spill_offset
+ base = self.asm.mc.tell()
self.default_target_addr = targetbuilder.asm.mc.tell()
self._write_default()
+ size = self.asm.mc.tell() - base
+ flush_icache(base, size)
return targetbuilder
def _write_default(self):
More information about the Pypy-commit
mailing list