[pypy-svn] r70705 - in pypy/branch/direct-assembler-call/pypy/jit: backend backend/llgraph metainterp metainterp/test

fijal at codespeak.net fijal at codespeak.net
Tue Jan 19 15:23:58 CET 2010


Author: fijal
Date: Tue Jan 19 15:23:57 2010
New Revision: 70705

Modified:
   pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py
   pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/runner.py
   pypy/branch/direct-assembler-call/pypy/jit/backend/model.py
   pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
   pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_warmstate.py
   pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py
Log:
(pedronis, fijal) Pass the next. We grow helper in warmspot.py that is used
in case direct assembler call fails.


Modified: pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/llimpl.py	Tue Jan 19 15:23:57 2010
@@ -125,6 +125,7 @@
     'getarrayitem_gc_pure' : (('ref', 'int'), 'intorptr'),
     'arraylen_gc'     : (('ref',), 'int'),
     'call'            : (('ref', 'varargs'), 'intorptr'),
+    'call_assembler'  : (('ref', 'varargs'), 'intorptr'),
     'call_pure'       : (('ref', 'varargs'), 'intorptr'),
     'cond_call_gc_wb' : (('int', 'int', 'ptr', 'varargs'), None),
     'oosend'          : (('varargs',), 'intorptr'),
@@ -316,6 +317,11 @@
     assert isinstance(type, str) and len(type) == 1
     op.descr = Descr(ofs, type)
 
+def compile_add_loop_token(loop, descr):
+    loop = _from_opaque(loop)
+    op = loop.operations[-1]
+    op.descr = descr
+
 def compile_add_var(loop, intvar):
     loop = _from_opaque(loop)
     op = loop.operations[-1]
@@ -391,8 +397,9 @@
 class Frame(object):
     OPHANDLERS = [None] * (rop._LAST+1)
 
-    def __init__(self, memocast):
+    def __init__(self, memocast, cpu):
         self.verbose = False
+        self.cpu = cpu
         self.memocast = memocast
         self.opindex = 1
         self._forced = False
@@ -809,6 +816,24 @@
         finally:
             self._may_force = -1
 
+    def op_call_assembler(self, loop_token, *args):
+        assert not self._forced
+        self._may_force = self.opindex
+        inpargs = _from_opaque(loop_token._llgraph_compiled_version).inputargs
+        for i, inparg in enumerate(inpargs):
+            TYPE = inparg.concretetype
+            if TYPE is lltype.Signed:
+                set_future_value_int(i, args[i])
+            elif isinstance(TYPE, lltype.Ptr):
+                set_future_value_ref(i, args[i])
+            elif TYPE is lltype.Float:
+                set_future_value_float(i, args[i])
+            else:
+                raise Exception("Nonsense type %s" % TYPE)
+        
+        failindex = self.cpu._execute_token(loop_token)
+        return self.cpu.assembler_helper_ptr(failindex)
+
     def op_guard_not_forced(self, descr):
         forced = self._forced
         self._forced = False
@@ -969,11 +994,11 @@
     return x
 
 
-def new_frame(memocast, is_oo):
+def new_frame(memocast, is_oo, cpu):
     if is_oo:
-        frame = OOFrame(memocast)
+        frame = OOFrame(memocast, cpu)
     else:
-        frame = Frame(memocast)
+        frame = Frame(memocast, cpu)
     return _to_opaque(frame)
 
 _future_values = []

Modified: pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/runner.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/runner.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/backend/llgraph/runner.py	Tue Jan 19 15:23:57 2010
@@ -74,7 +74,8 @@
 class BaseCPU(model.AbstractCPU):
     supports_floats = True
 
-    def __init__(self, rtyper, stats=None, opts=None, translate_support_code=False,
+    def __init__(self, rtyper, stats=None, opts=None,
+                 translate_support_code=False,
                  annmixlevel=None, gcdescr=None):
         assert type(opts) is not bool
         model.AbstractCPU.__init__(self)
@@ -147,6 +148,8 @@
             descr = op.descr
             if isinstance(descr, Descr):
                 llimpl.compile_add_descr(c, descr.ofs, descr.typeinfo)
+            if isinstance(descr, history.LoopToken):
+                llimpl.compile_add_loop_token(c, descr)
             if self.is_oo and isinstance(descr, (OODescr, MethDescr)):
                 # hack hack, not rpython
                 c._obj.externalobj.operations[-1].descr = descr
@@ -207,18 +210,22 @@
         else:
             assert False, "unknown operation"
 
-    def execute_token(self, loop_token):
-        """Calls the assembler generated for the given loop.
-        Returns the ResOperation that failed, of type rop.FAIL.
-        """
+    def _execute_token(self, loop_token):
         compiled_version = loop_token._llgraph_compiled_version
-        frame = llimpl.new_frame(self.memo_cast, self.is_oo)
+        frame = llimpl.new_frame(self.memo_cast, self.is_oo, self)
         # setup the frame
         llimpl.frame_clear(frame, compiled_version)
         # run the loop
         fail_index = llimpl.frame_execute(frame)
         # we hit a FAIL operation.
         self.latest_frame = frame
+        return fail_index
+
+    def execute_token(self, loop_token):
+        """Calls the assembler generated for the given loop.
+        Returns the ResOperation that failed, of type rop.FAIL.
+        """
+        fail_index = self._execute_token(loop_token)
         return self.get_fail_descr_from_number(fail_index)
 
     def set_future_value_int(self, index, intvalue):

Modified: pypy/branch/direct-assembler-call/pypy/jit/backend/model.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/backend/model.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/backend/model.py	Tue Jan 19 15:23:57 2010
@@ -3,6 +3,8 @@
 
 class AbstractCPU(object):
     supports_floats = False
+    # assembler_helper_ptr - a pointer to helper to call after a direct
+    #                        assembler call
 
     def __init__(self):
         self.fail_descr_list = []
@@ -209,6 +211,9 @@
     def do_call(self, args, calldescr):
         raise NotImplementedError
 
+    def do_call_assembler(self, args, token):
+        raise NotImplementedError
+
     def do_call_loopinvariant(self, args, calldescr):
         return self.do_call(args, calldescr)
 

Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/pyjitpl.py	Tue Jan 19 15:23:57 2010
@@ -671,7 +671,9 @@
             if warmrunnerstate.can_inline_callable(greenkey):
                 return self.perform_call(portal_code, varargs[1:], greenkey)
             token = warmrunnerstate.get_assembler_token(greenkey)
-        call_position = len(self.metainterp.history.operations)
+        call_position = 0
+        if token is not None:
+            call_position = len(self.metainterp.history.operations)
         res = self.do_residual_call(varargs, descr=calldescr, exc=True)
         if token is not None:
             # this will substitute the residual call with assembler call

Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_recursive.py	Tue Jan 19 15:23:57 2010
@@ -646,7 +646,7 @@
                 result += f('-c-----------l-', i+100)
         self.meta_interp(g, [10], backendopt=True)
         self.check_aborted_count(1)
-        self.check_history(call_may_force=1, call=0)
+        self.check_history(call_assembler=1, call=0)
         self.check_tree_loop_count(3)
 
     def test_directly_call_assembler(self):
@@ -664,6 +664,32 @@
                 i += 1
 
         self.meta_interp(portal, [2], inline=True)
+        self.check_history(call_assembler=1)
+
+    def test_directly_call_assembler_return(self):
+        driver = JitDriver(greens = ['codeno'], reds = ['i', 'k'],
+                           get_printable_location = lambda codeno : str(codeno),
+                           can_inline = lambda codeno : False)
+
+        def portal(codeno):
+            i = 0
+            k = codeno
+            while i < 10:
+                driver.can_enter_jit(codeno = codeno, i = i, k = k)
+                driver.jit_merge_point(codeno = codeno, i = i, k = k)
+                if codeno == 2:
+                    k = portal(1)
+                i += 1
+            return k
+
+        self.meta_interp(portal, [2], inline=True)
+        self.check_history(call_assembler=1)
+
+    def test_directly_call_assembler_raise(self):
+        pass
+
+    def test_directly_call_assembler_fail_guard(self):
+        pass
 
 class TestLLtype(RecursiveTests, LLJitMixin):
     pass

Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_warmstate.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_warmstate.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/test/test_warmstate.py	Tue Jan 19 15:23:57 2010
@@ -215,6 +215,7 @@
         can_inline_ptr = None
         get_printable_location_ptr = llhelper(GET_LOCATION, get_location)
         confirm_enter_jit_ptr = None
+        get_jitcell_at_ptr = None
     state = WarmEnterState(FakeWarmRunnerDesc())
     state.make_jitdriver_callbacks()
     res = state.get_location_str([BoxInt(5), BoxFloat(42.5)])
@@ -234,6 +235,8 @@
         can_inline_ptr = None
         get_printable_location_ptr = None
         confirm_enter_jit_ptr = llhelper(ENTER_JIT, confirm_enter_jit)
+        get_jitcell_at_ptr = None
+
     state = WarmEnterState(FakeWarmRunnerDesc())
     state.make_jitdriver_callbacks()
     res = state.confirm_enter_jit(5, 42.5, 3)

Modified: pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/direct-assembler-call/pypy/jit/metainterp/warmspot.py	Tue Jan 19 15:23:57 2010
@@ -443,7 +443,8 @@
          self.PTR_JIT_ENTER_FUNCTYPE) = self.cpu.ts.get_FuncType(ALLARGS, lltype.Void)
         (self.PORTAL_FUNCTYPE,
          self.PTR_PORTAL_FUNCTYPE) = self.cpu.ts.get_FuncType(ALLARGS, RESTYPE)
-        
+        (_, self.PTR_ASSEMBLER_HELPER_FUNCTYPE) = self.cpu.ts.get_FuncType(
+            [lltype.Signed], RESTYPE)
 
     def rewrite_can_enter_jit(self):
         FUNC = self.JIT_ENTER_FUNCTYPE
@@ -560,6 +561,37 @@
         self.portal_runner_ptr = self.helper_func(self.PTR_PORTAL_FUNCTYPE,
                                                   ll_portal_runner)
 
+        def assembler_call_helper(failindex):
+            fail_descr = self.cpu.get_fail_descr_from_number(failindex)
+            try:
+                while True:
+                    loop_token = fail_descr.handle_fail(self.metainterp_sd)
+                    xxx
+            except self.DoneWithThisFrameVoid:
+                assert result_kind == 'void'
+                return
+            except self.DoneWithThisFrameInt, e:
+                assert result_kind == 'int'
+                return lltype.cast_primitive(RESULT, e.result)
+            except self.DoneWithThisFrameRef, e:
+                assert result_kind == 'ref'
+                return ts.cast_from_ref(RESULT, e.result)
+            except self.DoneWithThisFrameFloat, e:
+                assert result_kind == 'float'
+                return e.result
+            except self.ExitFrameWithExceptionRef, e:
+                xxx
+                value = ts.cast_to_baseclass(e.value)
+                if not we_are_translated():
+                    raise LLException(ts.get_typeptr(value), value)
+                else:
+                    value = cast_base_ptr_to_instance(Exception, value)
+                    raise Exception, value
+
+        self.cpu.assembler_helper_ptr = self.helper_func(
+            self.PTR_ASSEMBLER_HELPER_FUNCTYPE,
+            assembler_call_helper)
+
         # ____________________________________________________________
         # Now mutate origportalgraph to end with a call to portal_runner_ptr
         #



More information about the Pypy-commit mailing list