[pypy-svn] r36731 - in pypy/dist/pypy/jit/codegen: ppc test
mwh at codespeak.net
mwh at codespeak.net
Sun Jan 14 13:50:26 CET 2007
Author: mwh
Date: Sun Jan 14 13:50:23 2007
New Revision: 36731
Modified:
pypy/dist/pypy/jit/codegen/ppc/codebuf.py
pypy/dist/pypy/jit/codegen/ppc/rgenop.py
pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
for the PPC generator, generate better code when start_writing can emit code
where pause_writing left off.
beef up the tests of same.
Modified: pypy/dist/pypy/jit/codegen/ppc/codebuf.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/codebuf.py (original)
+++ pypy/dist/pypy/jit/codegen/ppc/codebuf.py Sun Jan 14 13:50:23 2007
@@ -65,6 +65,7 @@
return self._pos
def setpos(self, _pos):
+ assert _pos >=0
self._pos = _pos
def tell(self):
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 Sun Jan 14 13:50:23 2007
@@ -127,15 +127,11 @@
emit(srcloc.move_to_gpr(self.allocator, tarloc.number))
elif tarloc.is_register and not srcloc.is_register:
emit(insn.Unspill(None, tarloc, srcloc))
- #self.asm.lwz(tarloc.number, rFP, srcloc.offset)
elif not tarloc.is_register and srcloc.is_register:
emit(insn.Spill(None, srcloc, tarloc))
- #self.asm.stw(srcloc.number, rFP, tarloc.offset)
elif not tarloc.is_register and not srcloc.is_register:
emit(insn.Unspill(None, insn.gprs[0], srcloc))
emit(insn.Spill(None, insn.gprs[0], tarloc))
- #self.asm.lwz(rSCRATCH, rFP, srcloc.offset)
- #self.asm.stw(rSCRATCH, rFP, tarloc.offset)
def create_fresh_location(self):
r = self.min_offset
@@ -485,9 +481,12 @@
if self.final_jump_addr != 0:
mc = self.rgenop.open_mc()
target = mc.tell()
- self.asm.mc = self.rgenop.ExistingCodeBlock(
- self.final_jump_addr, self.final_jump_addr+8)
- self.asm.load_word(rSCRATCH, target)
+ if target == self.final_jump_addr + 16:
+ mc.setpos(mc.getpos()-4)
+ else:
+ self.asm.mc = self.rgenop.ExistingCodeBlock(
+ self.final_jump_addr, self.final_jump_addr+8)
+ self.asm.load_word(rSCRATCH, target)
self.asm.mc = mc
self.final_jump_addr = 0
self.closed = False
Modified: pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/test/rgenop_tests.py (original)
+++ pypy/dist/pypy/jit/codegen/test/rgenop_tests.py Sun Jan 14 13:50:23 2007
@@ -430,6 +430,43 @@
builder.end()
return gv_f
+def make_pause_and_resume(rgenop):
+ # def f(x):
+ # y = x + 1
+ # # pause/resume here
+ # z = x - 1
+ # w = y*z
+ # return w
+ signed_kind = rgenop.kindToken(lltype.Signed)
+ sigtoken = rgenop.sigToken(FUNC)
+ builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken, "f")
+
+ gv_one = rgenop.genconst(1)
+
+ gv_y = builder.genop2("int_add", gv_x, gv_one)
+
+ builder = builder.pause_writing([gv_x, gv_y])
+ builder.start_writing()
+
+ gv_z = builder.genop2("int_sub", gv_x, gv_one)
+ gv_w = builder.genop2("int_mul", gv_y, gv_z)
+
+ builder.finish_and_return(sigtoken, gv_w)
+
+ builder.end()
+
+ return gv_callable
+
+def get_pause_and_resume_runner(RGenOp):
+ def runner(x):
+ rgenop = RGenOp()
+ gv_f = make_pause_and_resume(rgenop)
+ f = gv_f.revealconst(lltype.Ptr(FUNC))
+ res = f(x)
+ keepalive_until_here(rgenop) # to keep the code blocks alive
+ return res
+ return runner
+
class AbstractRGenOpTests(test_boehm.AbstractGCTestClass):
RGenOp = None
@@ -851,34 +888,28 @@
res = fnptr(17)
assert res == 19
- def test_pause_and_resume(self):
- # def f(x):
- # y = x + 1
- # # pause/resume here
- # z = x - 1
- # w = y*z
- # return w
+ def test_pause_and_resume_direct(self):
rgenop = self.RGenOp()
+ gv_callable = make_pause_and_resume(rgenop)
+ fnptr = self.cast(gv_callable, 1)
- signed_kind = rgenop.kindToken(lltype.Signed)
- sigtoken = rgenop.sigToken(FUNC)
- builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken, "f")
-
- gv_one = rgenop.genconst(1)
-
- gv_y = builder.genop2("int_add", gv_x, gv_one)
+ res = fnptr(1)
+ assert res == 0
- builder = builder.pause_writing([gv_x, gv_y])
- builder.start_writing()
+ res = fnptr(2)
+ assert res == 3
- gv_z = builder.genop2("int_sub", gv_x, gv_one)
- gv_w = builder.genop2("int_mul", gv_y, gv_z)
+ res = fnptr(3)
+ assert res == 8
- builder.finish_and_return(sigtoken, gv_w)
+ def test_pause_and_resume_compile(self):
+ fn = self.compile(get_pause_and_resume_runner(self.RGenOp), [int])
- builder.end()
+ res = fn(1)
+ assert res == 0
- fnptr = self.cast(gv_callable, 1)
+ res = fn(2)
+ assert res == 3
- res = fnptr(1)
- assert res == 0
+ res = fn(3)
+ assert res == 8
More information about the Pypy-commit
mailing list