[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