[prev in list] [next in list] [prev in thread] [next in thread]
List: pypy-svn
Subject: [pypy-svn] r53211 - pypy/branch/jit-hotpath/pypy/jit/codegen/test
From: fijal () codespeak ! net
Date: 2008-03-31 19:57:03
Message-ID: 20080331195703.326EC168422 () codespeak ! net
[Download RAW message or body]
Author: fijal
Date: Mon Mar 31 21:57:02 2008
New Revision: 53211
Modified:
pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py
Log:
add a simple float loop
Modified: pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py
==============================================================================
--- pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py (original)
+++ pypy/branch/jit-hotpath/pypy/jit/codegen/test/rgenop_tests.py Mon Mar 31 21:57:02 2008
@@ -16,6 +16,7 @@
FUNC3 = lltype.FuncType([lltype.Signed]*3, lltype.Signed)
FUNC5 = lltype.FuncType([lltype.Signed]*5, lltype.Signed)
FUNC27= lltype.FuncType([lltype.Signed]*27, lltype.Signed)
+FUNCMIX = lltype.FuncType([lltype.Signed, lltype.Float], lltype.Float)
def make_adder(rgenop, n):
# 'return x+n'
@@ -169,6 +170,49 @@
return res
return branching_runner
+def make_float_loop(rgenop):
+ """
+ def f(x, y):
+ i = 0
+ res = 0.0
+ while i < x:
+ res -= -y * float(i)
+ i += 1
+ return res
+ """
+ sigtoken = rgenop.sigToken(FUNCMIX)
+ builder, gv_loopfn, [gv_x, gv_y] = rgenop.newgraph(sigtoken,
+ "floatloop")
+ builder.start_writing()
+ args_gv = [gv_x, gv_y, rgenop.genconst(0), rgenop.genconst(0.0)]
+ loopblock = builder.enter_next_block(args_gv)
+ [gv_x, gv_y, gv_i, gv_res] = args_gv
+
+ gv_cond = builder.genop2("int_lt", gv_i, gv_x)
+ bodybuilder = builder.jump_if_true(gv_cond, args_gv)
+
+ builder.finish_and_return(sigtoken, gv_res)
+
+ bodybuilder.start_writing()
+ gv_y1 = bodybuilder.genop1("float_neg", gv_y)
+ gv_i1 = bodybuilder.genop1("cast_int_to_float", gv_i)
+ gv_v0 = bodybuilder.genop2("float_mul", gv_y1, gv_i1)
+ gv_res0 = bodybuilder.genop2("float_sub", gv_res, gv_v0)
+ gv_i2 = bodybuilder.genop2("int_add", gv_i, rgenop.genconst(1))
+ bodybuilder.finish_and_goto([gv_x, gv_y, gv_i2, gv_res0], loopblock)
+ builder.end()
+ return gv_loopfn
+
+def get_float_loop_runner(RGenOp):
+ def float_loop_runner(x, y):
+ rgenop = RGenOp()
+ gv_floatloopfn = make_float_loop(rgenop)
+ floatfn = gv_floatloopfn.revealconst(lltype.Ptr(FUNC2))
+ res = floatfn(x, y)
+ keepalive_until_here(rgenop) # to keep the code blocks alive
+ return res
+ return float_loop_runner
+
# loop start block
def loop_start(rgenop, builder, gv_x, gv_y):
args_gv = [gv_x, gv_y, rgenop.genconst(1)]
@@ -852,6 +896,10 @@
F1 = lltype.FuncType([lltype.Float] * nb_args, lltype.Float)
return self.RGenOp.get_python_callable(lltype.Ptr(F1), gv)
+ def cast_whatever(self, gv, ARGS, RESULT=lltype.Signed):
+ F1 = lltype.FuncType(ARGS, RESULT)
+ return self.RGenOp.get_python_callable(lltype.Ptr(F1), gv)
+
class AbstractRGenOpTestsCompile(AbstractTestBase):
def compile(self, runner, argtypes):
return self.getcompiled(runner, argtypes,
@@ -1066,6 +1114,22 @@
res = fnptr(1.2)
assert res == 4.4
+ def test_float_loop_direct(self):
+ def f(x, y):
+ i = 0
+ res = 0.0
+ while i < x:
+ res -= -y * float(i)
+ i += 1
+ return res
+
+ rgenop = self.RGenOp()
+ gv_float = make_float_loop(rgenop)
+ fnptr = self.cast_whatever(gv_float, [lltype.Signed, lltype.Float],
+ lltype.Float)
+ res = fnptr(5, 1.3)
+ assert res == f(5, 1.3)
+
def test_dummy_direct(self):
rgenop = self.RGenOp()
gv_dummyfn = make_dummy(rgenop)
_______________________________________________
pypy-svn mailing list
pypy-svn@codespeak.net
http://codespeak.net/mailman/listinfo/pypy-svn
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic