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

mwh at codespeak.net mwh at codespeak.net
Mon Jan 29 18:08:10 CET 2007


Author: mwh
Date: Mon Jan 29 18:08:09 2007
New Revision: 37552

Modified:
   pypy/dist/pypy/jit/codegen/ppc/rgenop.py
   pypy/dist/pypy/jit/codegen/test/rgenop_tests.py
Log:
don't load any constants passed as arguments to finish_and_goto into their
final positions *before* moving the other values around!


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	Mon Jan 29 18:08:09 2007
@@ -165,12 +165,15 @@
         if isinstance(src, Var):
             tar2loc[tloc] = tloc
             tar2src[tloc] = src
-        else:
-            insns.append(insn.Load(tloc, src))
 
     gen = JumpPatchupGenerator(insns, allocator)
     emit_moves(gen, tar2src, tar2loc, src2loc)
 
+    for i in range(len(targetlocs)):
+        tloc = targetlocs[i]
+        src = sourcevars[i]
+        if not isinstance(src, Var):
+            insns.append(insn.Load(tloc, src))
 
 class Label(GenLabel):
 

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	Mon Jan 29 18:08:09 2007
@@ -9,7 +9,9 @@
     rtyper = None
 GENOP_POLICY = MixLevelAnnotatorPolicy(PseudoAnnhelper())
 
-FUNC = lltype.FuncType([lltype.Signed], lltype.Signed)
+FUNC  = lltype.FuncType([lltype.Signed], lltype.Signed)
+FUNC2 = lltype.FuncType([lltype.Signed]*2, lltype.Signed)
+FUNC3 = lltype.FuncType([lltype.Signed]*3, lltype.Signed)
 
 def make_adder(rgenop, n):
     # 'return x+n'
@@ -31,8 +33,6 @@
         return res
     return runner
 
-FUNC2 = lltype.FuncType([lltype.Signed, lltype.Signed], lltype.Signed)
-
 def make_dummy(rgenop):
     # 'return x - (y - (x-1))'
     signed_kind = rgenop.kindToken(lltype.Signed)
@@ -1319,3 +1319,68 @@
         res = fnptr(0, 2)
         assert res == 3
 
+
+    def test_from_random_direct(self):
+        #def dummyfn(counter, a, b):
+        #  goto = 0
+        #  while True:
+        #    if goto == 0:
+        #      b = not a
+        #      if a:
+        #        counter -= 1
+        #        if not counter: break
+        #        goto = 0
+        #      else:
+        #        counter -= 1
+        #        if not counter: break
+        #        goto = 0
+        #  return intmask(a*-468864544+b*-340864157)
+        rgenop = self.RGenOp()
+        signed_kind = rgenop.kindToken(lltype.Signed)
+        bool_kind = rgenop.kindToken(lltype.Bool)
+
+        builder0, gv_callable, [v0, v1, v2] = rgenop.newgraph(rgenop.sigToken(FUNC3), 'compiled_dummyfn')
+
+        builder0.start_writing()
+        args_gv = [v0, v1]
+        label0 = builder0.enter_next_block([signed_kind, signed_kind], args_gv)
+        [v3, v4] = args_gv
+        v5 = builder0.genop1('int_is_true', v4)
+        builder1 = builder0.jump_if_true(v5, [v3, v4])
+        args_gv = [v3, v4, rgenop.genconst(1)]
+        label1 = builder0.enter_next_block([signed_kind, signed_kind, bool_kind], args_gv)
+        [v6, v7, v8] = args_gv
+        v9 = builder0.genop1('int_is_true', v7)
+        builder2 = builder0.jump_if_true(v9, [v7, v8, v6])
+        v10 = builder0.genop2('int_sub', v6, rgenop.genconst(1))
+        v11 = builder0.genop1('int_is_true', v10)
+        builder3 = builder0.jump_if_false(v11, [v8, v7])
+        builder0.finish_and_goto([v10, v7], label0)
+
+        builder2.start_writing()
+        v12 = builder2.genop2('int_sub', v6, rgenop.genconst(1))
+        v13 = builder2.genop1('int_is_true', v12)
+        builder4 = builder2.jump_if_false(v13, [v8, v7])
+        builder2.finish_and_goto([v12, v7], label0)
+
+        builder3.start_writing()
+        args_gv = [v8, v7]
+        label2 = builder3.enter_next_block([bool_kind, signed_kind], args_gv)
+        [v14, v15] = args_gv
+        v16 = builder3.genop2('int_mul', v15, rgenop.genconst(-468864544))
+        v17 = builder3.genop1('cast_bool_to_int', v14)
+        v18 = builder3.genop2('int_mul', v17, rgenop.genconst(-340864157))
+        v19 = builder3.genop2('int_add', v16, v18)
+        builder3.finish_and_return(rgenop.sigToken(FUNC3), v19)
+
+        builder1.start_writing()
+        builder1.finish_and_goto([v3, v4, rgenop.genconst(0)], label1)
+
+        builder4.start_writing()
+        builder4.finish_and_goto([v8, v7], label2)
+        builder4.end()
+
+        fnptr = self.cast(gv_callable, 3)
+
+        res = fnptr(1, -58, -50)
+        assert res == 1424339776



More information about the Pypy-commit mailing list