[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