[pypy-svn] r34549 - pypy/dist/pypy/jit/codegen/i386/test

mwh at codespeak.net mwh at codespeak.net
Mon Nov 13 12:13:25 CET 2006


Author: mwh
Date: Mon Nov 13 12:13:24 2006
New Revision: 34549

Modified:
   pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py
Log:
use the tests from rgenop_tests for the i386 test_rgenop too


Modified: pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py
==============================================================================
--- pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py	(original)
+++ pypy/dist/pypy/jit/codegen/i386/test/test_rgenop.py	Mon Nov 13 12:13:24 2006
@@ -1,479 +1,5 @@
-from pypy.rpython.lltypesystem import lltype
-from pypy.rpython.llinterp import LLInterpreter
-from pypy.rlib.objectmodel import keepalive_until_here
-from pypy.rpython.annlowlevel import MixLevelAnnotatorPolicy
-from pypy.translator.c.test import test_boehm
 from pypy.jit.codegen.i386.rgenop import RI386GenOp
+from pypy.jit.codegen.test.rgenop_tests import AbstractRGenOpTests
 
-from ctypes import c_void_p, cast, CFUNCTYPE, c_int
-
-# ____________________________________________________________
-
-FUNC = lltype.FuncType([lltype.Signed], lltype.Signed)
-
-def make_adder(rgenop, n):
-    # 'return x+n'
-    sigtoken = rgenop.sigToken(FUNC)
-    builder, entrypoint, [gv_x] = rgenop.newgraph(sigtoken)
-    gv_result = builder.genop2("int_add", gv_x, rgenop.genconst(n))
-    builder.finish_and_return(sigtoken, gv_result)
-    gv_add_one = rgenop.gencallableconst(sigtoken, "adder", entrypoint)
-    return gv_add_one
-
-def runner(x, y):
-    rgenop = RI386GenOp()
-    gv_add_x = make_adder(rgenop, x)
-    add_x = gv_add_x.revealconst(lltype.Ptr(FUNC))
-    res = add_x(y)
-    keepalive_until_here(rgenop)    # to keep the code blocks alive
-    return res
-
-def test_adder_interpret():
-    from pypy.jit.codegen.llgraph.rgenop import rgenop
-    gv_add_5 = make_adder(rgenop, 5)
-    add_5 = gv_add_5.revealconst(lltype.Ptr(FUNC))
-    llinterp = LLInterpreter(None)
-    res = llinterp.eval_graph(add_5._obj.graph, [12])
-    assert res == 17
-
-def test_adder_direct():
-    rgenop = RI386GenOp()
-    gv_add_5 = make_adder(rgenop, 5)
-    print gv_add_5.value
-    fnptr = cast(c_void_p(gv_add_5.value), CFUNCTYPE(c_int, c_int))
-    res = fnptr(37)    # <== the segfault is here
-    assert res == 42
-
-
-# ____________________________________________________________
-
-FUNC2 = lltype.FuncType([lltype.Signed, lltype.Signed], lltype.Signed)
-
-def make_dummy(rgenop):
-    # 'return x - (y - (x-1))'
-    signed_kind = rgenop.kindToken(lltype.Signed)
-    sigtoken = rgenop.sigToken(FUNC2)
-    builder, entrypoint, [gv_x, gv_y] = rgenop.newgraph(sigtoken)
-    gv_z = builder.genop2("int_sub", gv_x, rgenop.genconst(1))
-
-    args_gv = [gv_y, gv_z, gv_x]
-    builder.enter_next_block([signed_kind, signed_kind, signed_kind], args_gv)
-    [gv_y2, gv_z2, gv_x2] = args_gv
-
-    gv_s2 = builder.genop2("int_sub", gv_y2, gv_z2)
-    gv_t2 = builder.genop2("int_sub", gv_x2, gv_s2)
-    builder.finish_and_return(sigtoken, gv_t2)
-
-    gv_dummyfn = rgenop.gencallableconst(sigtoken, "dummy", entrypoint)
-    return gv_dummyfn
-
-def dummy_runner(x, y):
-    rgenop = RI386GenOp()
-    gv_dummyfn = make_dummy(rgenop)
-    dummyfn = gv_dummyfn.revealconst(lltype.Ptr(FUNC2))
-    res = dummyfn(x, y)
-    keepalive_until_here(rgenop)    # to keep the code blocks alive
-    return res
-
-def test_dummy_interpret():
-    from pypy.jit.codegen.llgraph.rgenop import rgenop
-    gv_dummyfn = make_dummy(rgenop)
-    dummyfn = gv_dummyfn.revealconst(lltype.Ptr(FUNC2))
-    llinterp = LLInterpreter(None)
-    res = llinterp.eval_graph(dummyfn._obj.graph, [30, 17])
-    assert res == 42
-
-def test_dummy_direct():
-    rgenop = RI386GenOp()
-    gv_dummyfn = make_dummy(rgenop)
-    print gv_dummyfn.value
-    fnptr = cast(c_void_p(gv_dummyfn.value), CFUNCTYPE(c_int, c_int, c_int))
-    res = fnptr(30, 17)    # <== the segfault is here
-    assert res == 42
-
-# ____________________________________________________________
-
-def make_branching(rgenop):
-    # 'if x > 5: return x-1
-    #  else:     return y'
-    signed_kind = rgenop.kindToken(lltype.Signed)
-    sigtoken = rgenop.sigToken(FUNC2)
-    builder, entrypoint, [gv_x, gv_y] = rgenop.newgraph(sigtoken)
-    gv_cond = builder.genop2("int_gt", gv_x, rgenop.genconst(5))
-    false_builder = builder.jump_if_false(gv_cond)
-
-    # true path
-    args_gv = [rgenop.genconst(1), gv_x, gv_y]
-    builder.enter_next_block([signed_kind, signed_kind, signed_kind], args_gv)
-    [gv_one, gv_x2, gv_y2] = args_gv
-
-    gv_s2 = builder.genop2("int_sub", gv_x2, gv_one)
-    builder.finish_and_return(sigtoken, gv_s2)
-
-    # false path
-    false_builder.finish_and_return(sigtoken, gv_y)
-
-    # done
-    gv_branchingfn = rgenop.gencallableconst(sigtoken,
-                                             "branching", entrypoint)
-    return gv_branchingfn
-
-def branching_runner(x, y):
-    rgenop = RI386GenOp()
-    gv_branchingfn = make_branching(rgenop)
-    branchingfn = gv_branchingfn.revealconst(lltype.Ptr(FUNC2))
-    res = branchingfn(x, y)
-    keepalive_until_here(rgenop)    # to keep the code blocks alive
-    return res
-
-def test_branching_interpret():
-    from pypy.jit.codegen.llgraph.rgenop import rgenop
-    gv_branchingfn = make_branching(rgenop)
-    branchingfn = gv_branchingfn.revealconst(lltype.Ptr(FUNC2))
-    llinterp = LLInterpreter(None)
-    res = llinterp.eval_graph(branchingfn._obj.graph, [30, 17])
-    assert res == 29
-    res = llinterp.eval_graph(branchingfn._obj.graph, [3, 17])
-    assert res == 17
-
-def test_branching_direct():
-    rgenop = RI386GenOp()
-    gv_branchingfn = make_branching(rgenop)
-    print gv_branchingfn.value
-    fnptr = cast(c_void_p(gv_branchingfn.value), CFUNCTYPE(c_int, c_int, c_int))
-    res = fnptr(30, 17)    # <== the segfault is here
-    assert res == 29
-    res = fnptr(3, 17)    # <== or here
-    assert res == 17
-
-# ____________________________________________________________
-
-def make_goto(rgenop):
-    # while x > 0:
-    #     y += x
-    #     x -= 1
-    # return y
-    signed_kind = rgenop.kindToken(lltype.Signed)
-    sigtoken = rgenop.sigToken(FUNC2)
-    builder, entrypoint, [gv_x, gv_y] = rgenop.newgraph(sigtoken)
-
-    # loop start block
-    args_gv = [gv_x, gv_y]
-    loopblock = builder.enter_next_block([signed_kind, signed_kind], args_gv)
-    [gv_x, gv_y] = args_gv
-
-    gv_cond = builder.genop2("int_gt", gv_x, rgenop.genconst(0))
-    bodybuilder = builder.jump_if_true(gv_cond)
-    builder.finish_and_return(sigtoken, gv_y)
-
-    # loop body
-    args_gv = [gv_y, gv_x]
-    bodybuilder.enter_next_block([signed_kind, signed_kind], args_gv)
-    [gv_y, gv_x] = args_gv
-
-    gv_y2 = bodybuilder.genop2("int_add", gv_x, gv_y)
-    gv_x2 = bodybuilder.genop2("int_sub", gv_x, rgenop.genconst(1))
-    bodybuilder.finish_and_goto([gv_x2, gv_y2], loopblock)
-
-    # done
-    gv_gotofn = rgenop.gencallableconst(sigtoken, "goto", entrypoint)
-    return gv_gotofn
-
-def goto_runner(x, y):
-    rgenop = RI386GenOp()
-    gv_gotofn = make_goto(rgenop)
-    gotofn = gv_gotofn.revealconst(lltype.Ptr(FUNC2))
-    res = gotofn(x, y)
-    keepalive_until_here(rgenop)    # to keep the code blocks alive
-    return res
-
-def test_goto_interpret():
-    from pypy.jit.codegen.llgraph.rgenop import rgenop
-    gv_gotofn = make_goto(rgenop)
-    gotofn = gv_gotofn.revealconst(lltype.Ptr(FUNC2))
-    llinterp = LLInterpreter(None)
-    res = llinterp.eval_graph(gotofn._obj.graph, [30, 17])
-    assert res == 31 * 15 + 17
-    res = llinterp.eval_graph(gotofn._obj.graph, [3, 17])
-    assert res == 23
-
-def test_goto_direct():
-    rgenop = RI386GenOp()
-    gv_gotofn = make_goto(rgenop)
-    print gv_gotofn.value
-    fnptr = cast(c_void_p(gv_gotofn.value), CFUNCTYPE(c_int, c_int, c_int))
-    res = fnptr(30, 17)    # <== the segfault is here
-    assert res == 31 * 15 + 17
-    res = fnptr(3, 17)    # <== or here
-    assert res == 23
-
-# ____________________________________________________________
-
-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 if_runner(x, y):
-    rgenop = RI386GenOp()
-    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
-
-def test_if_interpret():
-    from pypy.jit.codegen.llgraph.rgenop import rgenop
-    gv_iffn = make_if(rgenop)
-    iffn = gv_iffn.revealconst(lltype.Ptr(FUNC2))
-    llinterp = LLInterpreter(None)
-    res = llinterp.eval_graph(iffn._obj.graph, [30, 0])
-    assert res == 45
-    res = llinterp.eval_graph(iffn._obj.graph, [3, 0])
-    assert res == 6
-
-def test_if_direct():
-    rgenop = RI386GenOp()
-    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 build_switch(rgenop):
-    """
-    def f(v0, v1):
-        if v0 == 0: # switch
-            return 21*v1
-        elif v0 == 1:
-            return 21+v1
-        else:
-            return v1
-    """
-    signed_tok = rgenop.kindToken(lltype.Signed)
-    f2_token = rgenop.sigToken(FUNC2)
-    builder, graph, (gv0, gv1) = rgenop.newgraph(f2_token)
-
-    flexswitch = builder.flexswitch(gv0)
-    const21 = rgenop.genconst(21)
-
-    # case == 0
-    const0 = rgenop.genconst(0)
-    case_builder = flexswitch.add_case(const0)
-    case_args_gv = [gv1]
-    case_builder.enter_next_block([signed_tok], case_args_gv)
-    [gv1_case0] = case_args_gv
-    gv_res_case0 = case_builder.genop2('int_mul', const21, gv1_case0)
-    case_builder.finish_and_return(f2_token, gv_res_case0)
-    # default
-    default_builder = flexswitch.add_default()
-    default_args_gv = [gv1]
-    default_builder.enter_next_block([signed_tok], default_args_gv)
-    [gv1_default] = default_args_gv
-    default_builder.finish_and_return(f2_token, gv1_default)
-    # case == 1
-    const1 = rgenop.genconst(1)
-    case_builder = flexswitch.add_case(const1)
-    case_args_gv = [gv1]
-    case_builder.enter_next_block([signed_tok], case_args_gv)
-    [gv1_case1] = case_args_gv
-    gv_res_case1 = case_builder.genop2('int_add', const21, gv1_case1)
-    case_builder.finish_and_return(f2_token, gv_res_case1)
-
-    gv_switch = rgenop.gencallableconst(f2_token, "switch", graph)
-    return gv_switch
-
-def switch_runner(x, y):
-    rgenop = RI386GenOp()
-    gv_switchfn = build_switch(rgenop)
-    switchfn = gv_switchfn.revealconst(lltype.Ptr(FUNC2))
-    res = switchfn(x, y)
-    keepalive_until_here(rgenop)    # to keep the code blocks alive
-    return res
-
-def test_switch_direct():
-    rgenop = RI386GenOp()
-    gv_switchfn = build_switch(rgenop)
-    print gv_switchfn.value
-    fnptr = cast(c_void_p(gv_switchfn.value), CFUNCTYPE(c_int, c_int, c_int))
-    res = fnptr(0, 2)
-    assert res == 42
-    res = fnptr(1, 16)
-    assert res == 37
-    res = fnptr(42, 16)
-    assert res == 16
-
-def build_large_switch(rgenop):
-    """
-    def f(v0, v1):
-        if v0 == 0: # switch
-            return 21*v1
-        elif v0 == 1:
-            return 2+v1
-        elif v0 == 2:
-            return 4+v1
-        ...
-        elif v0 == 10:
-            return 2**10+v1
-        else:
-            return v1
-    """
-    signed_tok = rgenop.kindToken(lltype.Signed)
-    f2_token = rgenop.sigToken(FUNC2)
-    builder, graph, (gv0, gv1) = rgenop.newgraph(f2_token)
-
-    flexswitch = builder.flexswitch(gv0)
-    const21 = rgenop.genconst(21)
-
-    # case == 0
-    const0 = rgenop.genconst(0)
-    case_builder = flexswitch.add_case(const0)
-    case_args_gv = [gv1]
-    case_builder.enter_next_block([signed_tok], case_args_gv)
-    [gv1_case0] = case_args_gv
-    gv_res_case0 = case_builder.genop2('int_mul', const21, gv1_case0)
-    case_builder.finish_and_return(f2_token, gv_res_case0)
-    # default
-    default_builder = flexswitch.add_default()
-    default_args_gv = [gv1]
-    default_builder.enter_next_block([signed_tok], default_args_gv)
-    [gv1_default] = default_args_gv
-    default_builder.finish_and_return(f2_token, gv1_default)
-    # case == x
-    for x in range(1,11):
-         constx = rgenop.genconst(x)
-         case_builder = flexswitch.add_case(constx)
-         case_args_gv = [gv1]
-         case_builder.enter_next_block([signed_tok], case_args_gv)
-         [gv1_casex] = case_args_gv
-         const2px= rgenop.genconst(1<<x)
-         gv_res_casex = case_builder.genop2('int_add', const2px, gv1_casex)
-         case_builder.finish_and_return(f2_token, gv_res_casex)
-
-    gv_switch = rgenop.gencallableconst(f2_token, "large_switch", graph)
-    return gv_switch
-
-def large_switch_runner(x, y):
-    rgenop = RI386GenOp()
-    gv_switchfn = build_large_switch(rgenop)
-    switchfn = gv_switchfn.revealconst(lltype.Ptr(FUNC2))
-    res = switchfn(x, y)
-    keepalive_until_here(rgenop)    # to keep the code blocks alive
-    return res
-
-def test_large_switch_direct():
-    rgenop = RI386GenOp()
-    gv_switchfn = build_large_switch(rgenop)
-    print gv_switchfn.value
-    fnptr = cast(c_void_p(gv_switchfn.value), CFUNCTYPE(c_int, c_int, c_int))
-    res = fnptr(0, 2)
-    assert res == 42
-    for x in range(1,11):
-        res = fnptr(x, 5)
-        assert res == 2**x+5 
-    res = fnptr(42, 16)
-    assert res == 16
-
-# ____________________________________________________________
-
-# XXX clean up
-class PseudoAnnhelper(object):
-    rtyper = None
-GENOP_POLICY = MixLevelAnnotatorPolicy(PseudoAnnhelper())
-
-class TestCompile(test_boehm.AbstractGCTestClass):
-
-    def compile(self, runner, argtypes):
-        return self.getcompiled(runner, argtypes,
-                                annotatorpolicy = GENOP_POLICY)
-
-    def test_adder_compile(self):
-        fn = self.compile(runner, [int, int])
-        res = fn(9080983, -9080941)
-        assert res == 42
-
-
-    def test_dummy_compile(self):
-        fn = self.compile(dummy_runner, [int, int])
-        res = fn(40, 37)
-        assert res == 42
-
-    def test_branching_compile(self):
-        fn = self.compile(branching_runner, [int, int])
-        res = fn(30, 17)
-        assert res == 29
-        res = fn(3, 17)
-        assert res == 17
-
-    def test_goto_compile(self):
-        fn = self.compile(goto_runner, [int, int])
-        res = fn(30, 17)
-        assert res == 31 * 15 + 17
-        res = fn(3, 17)
-        assert res == 23
-
-    def test_if_compile(self):
-        fn = self.compile(if_runner, [int, int])
-        res = fn(30, 0)
-        assert res == 45
-        res = fn(3, 0)
-        assert res == 6
-
-    def test_switch_compile(self):
-        fn = self.compile(switch_runner, [int, int])
-        res = fn(0, 2)
-        assert res == 42
-        res = fn(1, 17)
-        assert res == 38
-        res = fn(42, 18)
-        assert res == 18
-
-    def test_large_switch_compile(self):
-        fn = self.compile(large_switch_runner, [int, int])
-        res = fn(0, 2)
-        assert res == 42
-        for x in range(1,11):
-            res = fn(x, 7)
-            assert res == 2**x+7 
-        res = fn(42, 18)
-        assert res == 18
-
+class TestRI386Genop(AbstractRGenOpTests):
+    RGenOp = RI386GenOp



More information about the Pypy-commit mailing list