Author: Armin Rigo <[email protected]>
Branch: jit-simplify-backendintf
Changeset: r50400:2bc80fdea1c1
Date: 2011-12-11 22:37 +0100
http://bitbucket.org/pypy/pypy/changeset/2bc80fdea1c1/

Log:    In-progress

diff --git a/pypy/jit/backend/llgraph/runner.py 
b/pypy/jit/backend/llgraph/runner.py
--- a/pypy/jit/backend/llgraph/runner.py
+++ b/pypy/jit/backend/llgraph/runner.py
@@ -260,23 +260,20 @@
         self.latest_frame = frame
         return fail_index
 
-    def make_execute_token(self, *argkinds):
-        nb_args = len(argkinds)
-        unroll_argkinds = unrolling_iterable(list(enumerate(argkinds)))
+    def make_execute_token(self, *argtypes):
+        nb_args = len(argtypes)
+        unroll_argtypes = unrolling_iterable(list(enumerate(argtypes)))
         #
         def execute_token(loop_token, *args):
             assert len(args) == nb_args
-            for index, kind in unroll_argkinds:
+            for index, TYPE in unroll_argtypes:
                 x = args[index]
-                TYPE = lltype.typeOf(x)
-                if kind == INT:
-                    assert TYPE == lltype.Signed
+                assert TYPE == lltype.typeOf(x)
+                if TYPE == lltype.Signed:
                     llimpl.set_future_value_int(index, x)
-                elif kind == REF:
-                    assert TYPE == llmemory.GCREF
+                elif TYPE == llmemory.GCREF:
                     llimpl.set_future_value_ref(index, x)
-                elif kind == FLOAT:
-                    assert TYPE == longlong.FLOATSTORAGE
+                elif TYPE == longlong.FLOATSTORAGE:
                     llimpl.set_future_value_float(index, x)
                 else:
                     assert 0
diff --git a/pypy/jit/backend/model.py b/pypy/jit/backend/model.py
--- a/pypy/jit/backend/model.py
+++ b/pypy/jit/backend/model.py
@@ -92,11 +92,11 @@
         attached to the failing guard, or the one attached to the FINISH.
         Use get_latest_value_xxx() afterwards to read the result(s).
         """
-        argkinds = [history.getkind(lltype.typeOf(x))[0] for x in args]
-        execute = self.make_execute_token(*argkinds)
+        argtypes = [lltype.typeOf(x) for x in args]
+        execute = self.make_execute_token(*argtypes)
         return execute(looptoken, *args)
 
-    def make_execute_token(self, *argkinds):
+    def make_execute_token(self, *argtypes):
         """Must make and return an execute_token() function that will be
         called with the given argtypes.
         """
diff --git a/pypy/jit/backend/x86/runner.py b/pypy/jit/backend/x86/runner.py
--- a/pypy/jit/backend/x86/runner.py
+++ b/pypy/jit/backend/x86/runner.py
@@ -3,6 +3,7 @@
 from pypy.rpython.lltypesystem.lloperation import llop
 from pypy.rpython.llinterp import LLInterpreter
 from pypy.rlib.objectmodel import we_are_translated
+from pypy.jit.codewriter import longlong
 from pypy.jit.metainterp import history, compile
 from pypy.jit.backend.x86.assembler import Assembler386
 from pypy.jit.backend.x86.arch import FORCE_INDEX_OFS
@@ -21,7 +22,6 @@
     supports_floats = True
     supports_singlefloats = True
 
-    BOOTSTRAP_TP = lltype.FuncType([], lltype.Signed)
     dont_keepalive_stuff = False # for tests
     with_threads = False
 
@@ -122,27 +122,35 @@
         # the FORCE_TOKEN operation and this helper both return 'ebp'.
         return self.assembler.fail_ebp
 
-    def execute_token(self, executable_token):
-        addr = executable_token._x86_bootstrap_code
-        #llop.debug_print(lltype.Void, ">>>> Entering", addr)
-        func = rffi.cast(lltype.Ptr(self.BOOTSTRAP_TP), addr)
-        fail_index = self._execute_call(func)
-        #llop.debug_print(lltype.Void, "<<<< Back")
-        return self.get_fail_descr_from_number(fail_index)
-
-    def _execute_call(self, func):
-        # help flow objspace
-        prev_interpreter = None
-        if not self.translate_support_code:
-            prev_interpreter = LLInterpreter.current_interpreter
-            LLInterpreter.current_interpreter = self.debug_ll_interpreter
-        res = 0
-        try:
-            res = func()
-        finally:
+    def make_execute_token(self, *argkinds):
+        ARGS = []
+        for kind in argkinds:
+            if kind == history.INT:
+                ARGS.append(lltype.Signed)
+            elif kind == history.REF:
+                ARGS.append(llmemory.GCREF)
+            elif kind == history.FLOAT:
+                ARGS.append(longlong.FLOATSTORAGE)
+            else:
+                assert 0
+        FUNCPTR = lltype.Ptr(lltype.FuncType(ARGS, lltype.Signed))
+        #
+        def execute_token(executable_token, *args):
+            addr = executable_token._x86_direct_bootstrap_code
+            func = rffi.cast(FUNCPTR, addr)
+            #llop.debug_print(lltype.Void, ">>>> Entering", addr)
+            prev_interpreter = None   # help flow space
             if not self.translate_support_code:
-                LLInterpreter.current_interpreter = prev_interpreter
-        return res
+                prev_interpreter = LLInterpreter.current_interpreter
+                LLInterpreter.current_interpreter = self.debug_ll_interpreter
+            try:
+                fail_index = func(*args)
+            finally:
+                if not self.translate_support_code:
+                    LLInterpreter.current_interpreter = prev_interpreter
+            #llop.debug_print(lltype.Void, "<<<< Back")
+            return self.get_fail_descr_from_number(fail_index)
+        return execute_token
 
     def cast_ptr_to_int(x):
         adr = llmemory.cast_ptr_to_adr(x)
diff --git a/pypy/jit/metainterp/warmstate.py b/pypy/jit/metainterp/warmstate.py
--- a/pypy/jit/metainterp/warmstate.py
+++ b/pypy/jit/metainterp/warmstate.py
@@ -283,8 +283,17 @@
         range_red_args = unrolling_iterable(
             range(num_green_args, num_green_args + jitdriver_sd.num_red_args))
         # get a new specialized copy of the method
-        func_execute_token = self.cpu.make_execute_token(
-            *[kind[0] for kind in jitdriver_sd.red_args_types])
+        ARGS = []
+        for kind in jitdriver_sd.red_args_types:
+            if kind == 'int':
+                ARGS.append(lltype.Signed)
+            elif kind == 'ref':
+                ARGS.append(llmemory.GCREF)
+            elif kind == 'float':
+                ARGS.append(longlong.FLOATSTORAGE)
+            else:
+                assert 0, kind
+        func_execute_token = self.cpu.make_execute_token(*ARGS)
 
         def execute_assembler(loop_token, *args):
             # Call the backend to run the 'looptoken' with the given
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to