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

mwh at codespeak.net mwh at codespeak.net
Thu Oct 19 17:19:08 CEST 2006


Author: mwh
Date: Thu Oct 19 17:19:06 2006
New Revision: 33464

Modified:
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
   pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
two more tests, one more llop


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	Thu Oct 19 17:19:06 2006
@@ -253,6 +253,11 @@
         self.asm.sub(gv_result.reg(), r_x, r_y)
         return gv_result
 
+    def op_int_floordiv(self, gv_x, gv_y):
+        gv_result, r_x, r_y = self.new_and_load_2(gv_x, gv_y)
+        self.asm.divw(gv_result.reg(), r_x, r_y)
+        return gv_result
+
     def _compare(self, gv_x, gv_y):
         if isinstance(gv_y, IntConst) and abs(gv_y.value) < 2*16:
             r_x = gv_x.load(self)

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	Thu Oct 19 17:19:06 2006
@@ -136,6 +136,56 @@
         return res
     return goto_runner
 
+def make_if(rgenop):
+    # a = x
+    # if x > 5:
+    #     x //= 2
+    # return x + a
+    signed_kind = rgenop.kindToken(lltype.Signed)
+    sigtoken = rgenop.sigToken(FUNC2)
+    builder, entrypoint, [gv_x1, gv_unused] = rgenop.newgraph(sigtoken)
+
+    # check
+    args_gv = [gv_x1, gv_unused]
+    builder.enter_next_block([signed_kind, signed_kind], args_gv)
+    [gv_x1, gv_unused] = args_gv
+
+    gv_cond = builder.genop2("int_gt", gv_x1, rgenop.genconst(5))
+    elsebuilder = builder.jump_if_false(gv_cond)
+    elseargs_gv = [gv_x1]
+
+    # 'then' block
+    args_gv = [gv_x1]
+    builder.enter_next_block([signed_kind], args_gv)
+    [gv_x1] = args_gv
+    gv_x2 = builder.genop2("int_floordiv", gv_x1, rgenop.genconst(2))
+
+    # end block
+    args_gv = [gv_x2, gv_x1]
+    label = builder.enter_next_block([signed_kind, signed_kind], args_gv)
+    [gv_x2, gv_a] = args_gv
+    gv_res = builder.genop2("int_add", gv_x2, gv_a)
+    builder.finish_and_return(sigtoken, gv_res)
+
+    # now the else branch
+    elsebuilder.enter_next_block([signed_kind], elseargs_gv)
+    [gv_x3] = elseargs_gv
+    elsebuilder.finish_and_goto([gv_x3, gv_x3], label)
+
+    # done
+    gv_gotofn = rgenop.gencallableconst(sigtoken, "goto", entrypoint)
+    return gv_gotofn
+
+def get_if_runner(RGenOp):
+    def if_runner(x, y):
+        rgenop = RGenOp()
+        gv_iffn = make_if(rgenop)
+        iffn = gv_iffn.revealconst(lltype.Ptr(FUNC2))
+        res = iffn(x, y)
+        keepalive_until_here(rgenop)    # to keep the code blocks alive
+        return res
+    return if_runner
+
 class AbstractRGenOpTests(test_boehm.AbstractGCTestClass):
     RGenOp = None
 
@@ -202,3 +252,19 @@
         res = fn(3, 17)
         assert res == 23
 
+    def test_if_direct(self):
+        rgenop = self.RGenOp()
+        gv_iffn = make_if(rgenop)
+        print gv_iffn.value
+        fnptr = cast(c_void_p(gv_iffn.value), CFUNCTYPE(c_int, c_int, c_int))
+        res = fnptr(30, 0)
+        assert res == 45
+        res = fnptr(3, 0)
+        assert res == 6
+
+    def test_goto_compile(self):
+        fn = self.compile(get_if_runner(self.RGenOp), [int, int])
+        res = fn(30, 0)
+        assert res == 45
+        res = fn(3, 0)
+        assert res == 6



More information about the Pypy-commit mailing list