[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