[pypy-svn] r67527 - in pypy/trunk/pypy/jit: backend backend/llgraph metainterp
arigo at codespeak.net
arigo at codespeak.net
Sat Sep 5 17:42:33 CEST 2009
Author: arigo
Date: Sat Sep 5 17:42:32 2009
New Revision: 67527
Modified:
pypy/trunk/pypy/jit/backend/llgraph/runner.py
pypy/trunk/pypy/jit/backend/model.py
pypy/trunk/pypy/jit/metainterp/codewriter.py
pypy/trunk/pypy/jit/metainterp/history.py
pypy/trunk/pypy/jit/metainterp/policy.py
pypy/trunk/pypy/jit/metainterp/warmspot.py
Log:
Add the flag 'supports_floats' to the CPU classes, defaulting to False.
Modified: pypy/trunk/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/llgraph/runner.py (original)
+++ pypy/trunk/pypy/jit/backend/llgraph/runner.py Sat Sep 5 17:42:32 2009
@@ -74,6 +74,7 @@
class BaseCPU(model.AbstractCPU):
+ supports_floats = True
def __init__(self, rtyper, stats=None, translate_support_code=False,
annmixlevel=None, gcdescr=None):
Modified: pypy/trunk/pypy/jit/backend/model.py
==============================================================================
--- pypy/trunk/pypy/jit/backend/model.py (original)
+++ pypy/trunk/pypy/jit/backend/model.py Sat Sep 5 17:42:32 2009
@@ -1,4 +1,5 @@
class AbstractCPU(object):
+ supports_floats = False
def set_class_sizes(self, class_sizes):
self.class_sizes = class_sizes
Modified: pypy/trunk/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/trunk/pypy/jit/metainterp/codewriter.py Sat Sep 5 17:42:32 2009
@@ -251,7 +251,8 @@
graph, oosend_methdescr = graph_key
self.bytecode = self.codewriter.get_jitcode(graph,
oosend_methdescr=oosend_methdescr)
- if not codewriter.policy.look_inside_graph(graph):
+ if not codewriter.policy.look_inside_graph(graph,
+ self.cpu.supports_floats):
assert not portal, "portal has been hidden!"
graph = make_calling_stub(codewriter.rtyper, graph)
self.graph = graph
@@ -1003,20 +1004,24 @@
self.emit('can_enter_jit')
def serialize_op_direct_call(self, op):
- kind = self.codewriter.policy.guess_call_kind(op)
+ kind = self.codewriter.policy.guess_call_kind(op,
+ self.codewriter.cpu.supports_floats)
return getattr(self, 'handle_%s_call' % kind)(op)
def serialize_op_indirect_call(self, op):
- kind = self.codewriter.policy.guess_call_kind(op)
+ kind = self.codewriter.policy.guess_call_kind(op,
+ self.codewriter.cpu.supports_floats)
return getattr(self, 'handle_%s_indirect_call' % kind)(op)
def serialize_op_oosend(self, op):
- kind = self.codewriter.policy.guess_call_kind(op)
+ kind = self.codewriter.policy.guess_call_kind(op,
+ self.codewriter.cpu.supports_floats)
return getattr(self, 'handle_%s_oosend' % kind)(op)
def handle_regular_call(self, op, oosend_methdescr=None):
self.minimize_variables()
- [targetgraph] = self.codewriter.policy.graphs_from(op)
+ [targetgraph] = self.codewriter.policy.graphs_from(op,
+ self.codewriter.cpu.supports_floats)
jitbox = self.codewriter.get_jitcode(targetgraph, self.graph,
oosend_methdescr=oosend_methdescr)
if oosend_methdescr:
@@ -1071,7 +1076,8 @@
handle_residual_indirect_call = handle_residual_call
def handle_regular_indirect_call(self, op):
- targets = self.codewriter.policy.graphs_from(op)
+ targets = self.codewriter.policy.graphs_from(op,
+ self.codewriter.cpu.supports_floats)
assert targets is not None
self.minimize_variables()
indirectcallset = self.codewriter.get_indirectcallset(targets)
Modified: pypy/trunk/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/history.py (original)
+++ pypy/trunk/pypy/jit/metainterp/history.py Sat Sep 5 17:42:32 2009
@@ -20,7 +20,7 @@
REF = 'r'
FLOAT = 'f'
-def getkind(TYPE, supports_floats=False):
+def getkind(TYPE, supports_floats=True):
if TYPE is lltype.Void:
return "void"
elif isinstance(TYPE, lltype.Primitive):
Modified: pypy/trunk/pypy/jit/metainterp/policy.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/policy.py (original)
+++ pypy/trunk/pypy/jit/metainterp/policy.py Sat Sep 5 17:42:32 2009
@@ -3,7 +3,6 @@
from pypy.rpython.lltypesystem import lltype
class JitPolicy(object):
- supports_floats = False # patched to True if supported by the backend
def look_inside_function(self, func):
if hasattr(func, '_look_inside_me_'):
@@ -17,7 +16,7 @@
return False
return True
- def look_inside_graph(self, graph):
+ def look_inside_graph(self, graph, supports_floats):
try:
func = graph.func
except AttributeError:
@@ -26,13 +25,13 @@
see_function = self.look_inside_function(func)
return (see_function and
not contains_unsupported_variable_type(graph,
- self.supports_floats))
+ supports_floats))
- def graphs_from(self, op):
+ def graphs_from(self, op, supports_floats):
if op.opname == 'direct_call':
funcobj = get_funcobj(op.args[0].value)
graph = funcobj.graph
- if self.look_inside_graph(graph):
+ if self.look_inside_graph(graph, supports_floats):
return [graph] # common case: look inside this graph
else:
assert op.opname in ('indirect_call', 'oosend')
@@ -43,13 +42,13 @@
graphs = v_obj._lookup_graphs(op.args[0].value)
if graphs is not None:
for graph in graphs:
- if self.look_inside_graph(graph):
+ if self.look_inside_graph(graph, supports_floats):
return graphs # common case: look inside at
# least one of the graphs
# residual call case: we don't need to look into any graph
return None
- def guess_call_kind(self, op):
+ def guess_call_kind(self, op, supports_floats):
if op.opname == 'direct_call':
funcobj = get_funcobj(op.args[0].value)
if isinstance(lltype.typeOf(funcobj), lltype.Ptr):
@@ -72,7 +71,7 @@
return 'builtin'
# TODO: return 'recursive' if the oosend ends with calling the
# portal
- if self.graphs_from(op) is None:
+ if self.graphs_from(op, supports_floats) is None:
return 'residual'
return 'regular'
Modified: pypy/trunk/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/trunk/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/trunk/pypy/jit/metainterp/warmspot.py Sat Sep 5 17:42:32 2009
@@ -127,18 +127,20 @@
class WarmRunnerDesc:
- def __init__(self, translator, policy=None, backendopt=True, **kwds):
+ def __init__(self, translator, policy=None, backendopt=True, CPUClass=None,
+ **kwds):
pyjitpl._warmrunnerdesc = self # this is a global for debugging only!
if policy is None:
policy = JitPolicy()
self.set_translator(translator)
self.find_portal()
- graphs = find_all_graphs(self.portal_graph, policy, self.translator)
+ graphs = find_all_graphs(self.portal_graph, policy, self.translator,
+ CPUClass)
self.check_access_directly_sanity(graphs)
if backendopt:
self.prejit_optimizations(policy, graphs)
- self.build_meta_interp(**kwds)
+ self.build_meta_interp(CPUClass, **kwds)
self.make_args_specification()
self.rewrite_jit_merge_point()
self.make_driverhook_graph()
@@ -206,7 +208,7 @@
remove_asserts=True,
really_remove_asserts=True)
- def build_meta_interp(self, CPUClass=None, translate_support_code=False,
+ def build_meta_interp(self, CPUClass, translate_support_code=False,
view="auto", optimizer=None, profile=None, **kwds):
assert CPUClass is not None
opt = history.Options(**kwds)
@@ -510,8 +512,9 @@
op.args[:3] = [closures[funcname]]
-def find_all_graphs(portal, policy, translator):
+def find_all_graphs(portal, policy, translator, CPUClass):
from pypy.translator.simplify import get_graph
+ supports_floats = CPUClass.supports_floats
all_graphs = [portal]
seen = set([portal])
todo = [portal]
@@ -520,13 +523,13 @@
for _, op in top_graph.iterblockops():
if op.opname not in ("direct_call", "indirect_call", "oosend"):
continue
- kind = policy.guess_call_kind(op)
+ kind = policy.guess_call_kind(op, supports_floats)
if kind != "regular":
continue
- for graph in policy.graphs_from(op):
+ for graph in policy.graphs_from(op, supports_floats):
if graph in seen:
continue
- if policy.look_inside_graph(graph):
+ if policy.look_inside_graph(graph, supports_floats):
todo.append(graph)
all_graphs.append(graph)
seen.add(graph)
More information about the Pypy-commit
mailing list