[pypy-svn] r22579 - in pypy/dist/pypy: doc/discussion rpython rpython/test

cfbolz at codespeak.net cfbolz at codespeak.net
Tue Jan 24 12:01:28 CET 2006


Author: cfbolz
Date: Tue Jan 24 12:01:24 2006
New Revision: 22579

Added:
   pypy/dist/pypy/rpython/rgenop.py
   pypy/dist/pypy/rpython/test/test_rgenop.py
Modified:
   pypy/dist/pypy/doc/discussion/draft-jit-ideas.txt
Log:
(arigo, cfbolz):

updated discussion, implemented the operation-generating functions with low
level graphs + test



Modified: pypy/dist/pypy/doc/discussion/draft-jit-ideas.txt
==============================================================================
--- pypy/dist/pypy/doc/discussion/draft-jit-ideas.txt	(original)
+++ pypy/dist/pypy/doc/discussion/draft-jit-ideas.txt	Tue Jan 24 12:01:24 2006
@@ -92,21 +92,27 @@
 
 Functions:
 
-* gengraph() -> (opaque start link object)
+* newgraph(name) -> (opaque start link object)
 
-* genblock([list-of-CONCRETE_TYPES-of-inputargs]) -> (opaque block object)
+* newblock() -> (opaque block object)
+
+* geninputarg(block, CONCRETE_TYPE) -> (input var)
 
 * genop(block, opname, [list-of-vars], RESULT_CONCRETE_TYPE) -> (result var)
 
 * genconst(block, llvalue) -> (result var)
 
-* genlink(block, exitcase-or-None, [list-of-vars]) -> (opaque link object)
+* newlink(block, [list-of-vars]) -> (opaque link object)
+
+* newreturnlink(block, return-var) -> (opaque link object)
+
+* closeblock1(block, link)
 
-* genreturnlink(block, return-var) -> (opaque link object)
+* closeblock2(block, exitswitch-var, false_link, true_link)
 
-* closeblock(block, exitswitch-var-or-None)
+* closelink(link, targetblock)
 
-* closelink(link, block)
+* runlink(link, [list-of-llvalues])
 
 
 L3 interpreter

Added: pypy/dist/pypy/rpython/rgenop.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/rgenop.py	Tue Jan 24 12:01:24 2006
@@ -0,0 +1,96 @@
+"""
+Functions that generate flow graphs and operations.
+The functions below produce L2 graphs, but they define an interface
+that can be used to produce any other kind of graph.
+"""
+
+from pypy.rpython.lltypesystem import lltype
+from pypy.objspace.flow import model as flowmodel
+
+
+def newgraph(name):
+    startblock_to_throw_away = flowmodel.Block([])   # grumble
+    return flowmodel.FunctionGraph(name, startblock_to_throw_away)
+
+def newblock():
+    return flowmodel.Block([])
+
+def geninputarg(block, CONCRETE_TYPE):
+    v = flowmodel.Variable()
+    v.concretetype = CONCRETE_TYPE
+    block.inputargs.append(v)
+    return v
+
+def genop(block, opname, vars, RESULT_TYPE):
+    v = flowmodel.Variable()
+    v.concretetype = RESULT_TYPE
+    op = flowmodel.SpaceOperation(opname, vars, v)
+    block.operations.append(op)
+    return v
+
+def genconst(block, llvalue):
+    v = flowmodel.Constant(llvalue)
+    v.concretetype = lltype.typeOf(llvalue)
+    return v
+
+def newlink(block, vars):
+    return flowmodel.Link(vars, None)
+
+def newreturnlink(block, var):
+    v = flowmodel.Variable()
+    v.concretetype = var.concretetype
+    pseudoreturnblock = flowmodel.Block([v])
+    pseudoreturnblock.operations = ()
+    return flowmodel.Link([var], pseudoreturnblock)
+
+def closeblock1(block, link):
+    block.closeblock(link)
+
+def closeblock2(block, exitswitch, false_link, true_link):
+    block.exitswitch = exitswitch
+    false_link.exitcase = False
+    false_link.llexitcase = False
+    true_link.exitcase = True
+    true_link.llexitcase = True
+    block.closeblock(false_link, true_link)
+
+def closelink(link, targetblock):
+    if isinstance(link, flowmodel.Link):
+        assert link.target is None, "%r already closed" % (link,)
+        assert ([v.concretetype for v in link.args] ==
+                [v.concretetype for v in targetblock.inputargs])
+        link.target = targetblock
+    elif isinstance(link, flowmodel.FunctionGraph):
+        graph = link
+        graph.startblock = targetblock
+        targetblock.isstartblock = True
+    else:
+        raise TypeError
+
+def _patchgraph(graph):
+    returntype = None
+    for link in graph.iterlinks():
+        if link.target.operations == ():
+            assert len(link.args) == 1    # for now
+            if returntype is None:
+                returntype = link.target.inputargs[0].concretetype
+            else:
+                assert returntype == link.target.inputargs[0].concretetype
+            link.target = graph.returnblock
+    if returntype is None:
+        returntype = lltype.Void
+    graph.returnblock.inputargs[0].concretetype = returntype
+
+class PseudoRTyper(object):
+    def __init__(self):
+        from pypy.rpython.typesystem import LowLevelTypeSystem
+        self.type_system = LowLevelTypeSystem.instance
+
+def runlink(startlink, args):
+    from pypy.rpython.llinterp import LLInterpreter
+    assert isinstance(startlink, flowmodel.FunctionGraph), "XXX"
+    graph = startlink  # for now
+    _patchgraph(graph)
+    flowmodel.checkgraph(graph)
+    llinterp = LLInterpreter(PseudoRTyper())
+    return llinterp.eval_graph(graph, args)

Added: pypy/dist/pypy/rpython/test/test_rgenop.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/rpython/test/test_rgenop.py	Tue Jan 24 12:01:24 2006
@@ -0,0 +1,15 @@
+from pypy.rpython.rgenop import *
+from pypy.rpython.lltypesystem.lltype import *
+
+
+def test_square():
+    startlink = newgraph("square")
+    block = newblock()
+    v0 = geninputarg(block, Signed)
+    v1 = genop(block, 'int_mul', [v0, v0], Signed)
+    link = newreturnlink(block, v1)
+    closeblock1(block, link)
+    closelink(startlink, block)
+
+    res = runlink(startlink, [17])
+    assert res == 289



More information about the Pypy-commit mailing list