[pypy-svn] r34593 - in pypy/dist/pypy/jit/codegen: ppc/test test
mwh at codespeak.net
mwh at codespeak.net
Tue Nov 14 13:30:46 CET 2006
Author: mwh
Date: Tue Nov 14 13:30:44 2006
New Revision: 34593
Modified:
pypy/dist/pypy/jit/codegen/ppc/test/test_rgenop.py
pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
a direct test for genop_call(), passing on i386 and skipped on ppc
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 Tue Nov 14 13:30:44 2006
@@ -57,6 +57,8 @@
res = fnptr(2, 1)
assert res == 100101
+ def test_fact_direct(self):
+ py.test.skip("wip")
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 Tue Nov 14 13:30:44 2006
@@ -325,6 +325,39 @@
return res
return large_switch_runner
+def make_fact(rgenop):
+ # def fact(x):
+ # if x:
+ # y = x-1
+ # z = fact(y)
+ # w = x*z
+ # return w
+ # return 1
+ signed_kind = rgenop.kindToken(lltype.Signed)
+ sigtoken = rgenop.sigToken(FUNC)
+ builder, entrypoint, [gv_x] = rgenop.newgraph(sigtoken)
+
+ gv_fact = rgenop.gencallableconst(sigtoken, "fact", entrypoint)
+
+ gv_cond = builder.genop1("int_is_true", gv_x)
+
+ true_builder = builder.jump_if_true(gv_cond)
+
+ args_gv = [gv_x]
+ true_builder.enter_next_block([signed_kind], args_gv)
+ [gv_x2] = args_gv
+
+ gv_y = true_builder.genop2("int_sub", gv_x, rgenop.genconst(1))
+ gv_z = true_builder.genop_call(sigtoken, gv_fact, [gv_y])
+ gv_w = true_builder.genop2("int_mul", gv_x, gv_z)
+
+ true_builder.finish_and_return(sigtoken, gv_w)
+
+ builder.enter_next_block([], [])
+
+ builder.finish_and_return(sigtoken, rgenop.genconst(1))
+ return gv_fact
+
class AbstractRGenOpTests(test_boehm.AbstractGCTestClass):
RGenOp = None
@@ -452,3 +485,13 @@
assert res == 2**x+7
res = fn(42, 18)
assert res == 18
+
+ def test_fact_direct(self):
+ rgenop = self.RGenOp()
+ gv_fact = make_fact(rgenop)
+ print gv_fact.value
+ fnptr = cast(c_void_p(gv_fact.value), CFUNCTYPE(c_int))
+ res = fnptr(2)
+ assert res == 2
+ res = fnptr(10)
+ assert res == 3628800
More information about the Pypy-commit
mailing list