[pypy-svn] r36595 - in pypy/dist/pypy/jit/codegen: ppc ppc/test test

mwh at codespeak.net mwh at codespeak.net
Fri Jan 12 17:54:48 CET 2007


Author: mwh
Date: Fri Jan 12 17:54:47 2007
New Revision: 36595

Modified:
   pypy/dist/pypy/jit/codegen/ppc/instruction.py
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
   pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py
   pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
(niko, mwh)

So cmp2info_flipped was mostly wrong.  Fix that, and another bug that only
caused doing some work over and over again, and add a skipped test to do with
passing variables in the condition register across basic blocks which fails.


Modified: pypy/dist/pypy/jit/codegen/ppc/instruction.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/instruction.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/instruction.py	Fri Jan 12 17:54:47 2007
@@ -257,6 +257,7 @@
         self.arg_reg = allocator.loc_of(self.reg_args[0])
 
     def emit(self, asm):
+        #print "CMPWI", asm.mc.tell()
         asm.cmpwi(self.result_reg.number, self.arg_reg.number, self.imm.value)
 
 class CMPWLI(CMPW):

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 Jan 12 17:54:47 2007
@@ -454,12 +454,16 @@
         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.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
             return self
         else:
             self._open()
+            self.closed = False
             self.maybe_patch_start_here()
             return self
 
@@ -475,6 +479,7 @@
         self.initial_var2loc = self.allocate_and_emit(args_gv).var2loc
         self.insns = []
         self.final_jump_addr = self.asm.mc.tell()
+        self.closed = True
         self.asm.nop()
         self.asm.nop()
         self.asm.mtctr(rSCRATCH)
@@ -666,10 +671,10 @@
 
     cmp2info_flipped = {
         #      bit-in-crf  negated
-        'gt': (    1,         1   ),
-        'lt': (    0,         1   ),
-        'le': (    1,         0   ),
-        'ge': (    0,         0   ),
+        'gt': (    0,         0   ),
+        'lt': (    1,         0   ),
+        'le': (    0,         1   ),
+        'ge': (    1,         1   ),
         'eq': (    2,         0   ),
         'ne': (    2,         1   ),
         }

Modified: pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py	Fri Jan 12 17:54:47 2007
@@ -1,7 +1,7 @@
 import py
 from pypy.jit.codegen.ppc.rgenop import RPPCGenOp
 from pypy.rpython.lltypesystem import lltype
-from pypy.jit.codegen.test.rgenop_tests import AbstractRGenOpTests, FUNC2
+from pypy.jit.codegen.test.rgenop_tests import AbstractRGenOpTests, FUNC, FUNC2
 from ctypes import cast, c_int, c_void_p, CFUNCTYPE
 from pypy.jit.codegen.ppc import instruction as insn
 
@@ -58,6 +58,53 @@
         res = fnptr(2, 1)
         assert res == 100101
 
+    def test_flipped_cmpwi(self):
+        # return
+        # 1>x + 10*(1<x) + 100*(1>=x) + 1000*(1<=x) + 10000*(1==x) + 100000*(1!=x)
+        rgenop = self.RGenOp()
+        signed_kind = rgenop.kindToken(lltype.Signed)
+        sigtoken = rgenop.sigToken(FUNC)
+        builder, gv_callable, [gv_x] = rgenop.newgraph(sigtoken,
+                                                       "multicmp")
+        gv_one = rgenop.genconst(1)
+
+        gv_gt = builder.genop2("int_gt", gv_one, gv_x)
+        gv_lt = builder.genop2("int_lt", gv_one, gv_x)
+        gv_ge = builder.genop2("int_ge", gv_one, gv_x)
+        gv_le = builder.genop2("int_le", gv_one, gv_x)
+        gv_eq = builder.genop2("int_eq", gv_one, gv_x)
+        gv_ne = builder.genop2("int_ne", gv_one, gv_x)
+
+        gv_gt2 = gv_gt
+        gv_lt2 = builder.genop2("int_mul", rgenop.genconst(10), gv_lt)
+        gv_ge2 = builder.genop2("int_mul", rgenop.genconst(100), gv_ge)
+        gv_le2 = builder.genop2("int_mul", rgenop.genconst(1000), gv_le)
+        gv_eq2 = builder.genop2("int_mul", rgenop.genconst(10000), gv_eq)
+        gv_ne2 = builder.genop2("int_mul", rgenop.genconst(100000), gv_ne)
+
+        gv_r0 = gv_gt
+        gv_r1 = builder.genop2("int_add", gv_r0, gv_lt2)
+        gv_r2 = builder.genop2("int_add", gv_r1, gv_ge2)
+        gv_r3 = builder.genop2("int_add", gv_r2, gv_le2)
+        gv_r4 = builder.genop2("int_add", gv_r3, gv_eq2)
+        gv_r5 = builder.genop2("int_add", gv_r4, gv_ne2)
+
+        builder.finish_and_return(sigtoken, gv_r5)
+        builder.end()
+        fnptr = cast(c_void_p(gv_callable.value), CFUNCTYPE(c_int))
+
+        res = fnptr(0)
+        assert res == 100101
+
+        res = fnptr(1)
+        assert res ==  11100
+
+        res = fnptr(2)
+        assert res == 101010
+
+    def test_longwinded_and_direct(self):
+        py.test.skip("failing right now")
+
 class TestRPPCGenopNoRegs(TestRPPCGenop):
     RGenOp = FewRegisters
 

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	Fri Jan 12 17:54:47 2007
@@ -366,7 +366,44 @@
         keepalive_until_here(rgenop)    # to keep the code blocks alive
         return res
     return runner
-    
+
+def make_longwinded_and(rgenop):
+    # def f(y): return 2 <= y <= 4
+    # but more like this:
+    # def f(y)
+    #     x = 2 <= y
+    #     if x:
+    #         x = y <= 4
+    #     if x:
+    #        return 1
+    #     else:
+    #        return 0
+
+    signed_kind = rgenop.kindToken(lltype.Signed)
+    sigtoken = rgenop.sigToken(FUNC)
+    builder, gv_f, [gv_y] = rgenop.newgraph(sigtoken, "abs")
+
+    gv_x = builder.genop2("int_le", rgenop.genconst(2), gv_y)
+
+    false_builder = builder.jump_if_false(gv_x, [gv_x])
+
+    gv_x2 = builder.genop2("int_le", gv_y, rgenop.genconst(4))
+
+    args_gv = [gv_x2]
+    label = builder.enter_next_block([signed_kind], args_gv)
+    [gv_x2] = args_gv
+
+    return_false_builder = builder.jump_if_false(gv_x2, [])
+
+    builder.finish_and_return(sigtoken, rgenop.genconst(1))
+
+    false_builder.start_writing()
+    false_builder.finish_and_goto([gv_x], label)
+
+    return_false_builder.start_writing()
+    return_false_builder.finish_and_return(sigtoken, rgenop.genconst(0))
+
+    return gv_f
 
 class AbstractRGenOpTests(test_boehm.AbstractGCTestClass):
     RGenOp = None
@@ -566,3 +603,23 @@
         assert res == 2
         res = fn(-72)
         assert res == 72
+
+    def test_longwinded_and_direct(self):
+        rgenop = self.RGenOp()
+        gv_fn = make_longwinded_and(rgenop)
+        fnptr = self.cast(gv_fn, 1)
+
+        res = fnptr(1)
+        assert res == 0
+
+        res = fnptr(2)
+        assert res == 1
+
+        res = fnptr(3)
+        assert res == 1
+
+        res = fnptr(4)
+        assert res == 1
+
+        res = fnptr(5)
+        assert res == 0



More information about the Pypy-commit mailing list