Author: Maciej Fijalkowski <[email protected]>
Branch: separate-jit-compilation
Changeset: r71396:bc8d0c269519
Date: 2014-05-06 19:16 +0200
http://bitbucket.org/pypy/pypy/changeset/bc8d0c269519/

Log:    Make execute_token accept the same set of args for all the
        possibilities

diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -290,12 +290,12 @@
         compiled_loop_token._llgraph_loop = None
         model.AbstractCPU.free_loop_and_bridges(self, compiled_loop_token)
 
-    def make_execute_token(self, *argtypes):
+    def make_execute_token(self):
         return self._execute_token
 
-    def _execute_token(self, loop_token, *args):
+    def _execute_token(self, loop_token, args_i, args_r, args_f):
         lltrace = loop_token.compiled_loop_token._llgraph_loop
-        frame = LLFrame(self, lltrace.inputargs, args)
+        frame = LLFrame(self, lltrace.inputargs, args_i + args_r + args_f)
         try:
             frame.execute(lltrace)
             assert False
diff --git a/rpython/jit/backend/llsupport/llmodel.py 
b/rpython/jit/backend/llsupport/llmodel.py
--- a/rpython/jit/backend/llsupport/llmodel.py
+++ b/rpython/jit/backend/llsupport/llmodel.py
@@ -214,16 +214,12 @@
         frame.jf_descr = frame.jf_force_descr
         return lltype.cast_opaque_ptr(llmemory.GCREF, frame)
 
-    def make_execute_token(self, *ARGS):
+    def make_execute_token(self):
         FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF],
                                              llmemory.GCREF))
 
-        lst = [(i, history.getkind(ARG)[0]) for i, ARG in enumerate(ARGS)]
-        kinds = unrolling_iterable(lst)
-
-        def execute_token(executable_token, *args):
+        def execute_token(executable_token, args_i, args_r, args_f):
             clt = executable_token.compiled_loop_token
-            assert len(args) == clt._debug_nbargs
             #
             addr = executable_token._ll_function_addr
             func = rffi.cast(FUNCPTR, addr)
@@ -237,16 +233,16 @@
                 prev_interpreter = LLInterpreter.current_interpreter
                 LLInterpreter.current_interpreter = self.debug_ll_interpreter
             try:
-                for i, kind in kinds:
-                    arg = args[i]
-                    num = locs[i]
-                    if kind == history.INT:
-                        self.set_int_value(ll_frame, num, arg)
-                    elif kind == history.FLOAT:
-                        self.set_float_value(ll_frame, num, arg)
-                    else:
-                        assert kind == history.REF
-                        self.set_ref_value(ll_frame, num, arg)
+                num = 0
+                for arg_i in args_i:
+                    self.set_int_value(ll_frame, locs[num], arg_i)
+                    num += 1
+                for arg_r in args_r:
+                    self.set_ref_value(ll_frame, locs[num], arg_r)
+                    num += 1
+                for arg_f in args_f:
+                    self.set_float_value(ll_frame, locs[num], arg_f)
+                    num += 1
                 llop.gc_writebarrier(lltype.Void, ll_frame)
                 ll_frame = func(ll_frame)
             finally:
diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py
--- a/rpython/jit/backend/model.py
+++ b/rpython/jit/backend/model.py
@@ -73,17 +73,16 @@
         """Print a disassembled version of looptoken to stdout"""
         raise NotImplementedError
 
-    def execute_token(self, looptoken, *args):
+    def execute_token(self, looptoken, args_i, args_r, args_f):
         """NOT_RPYTHON (for tests only)
         Execute the generated code referenced by the looptoken.
         When done, this returns a 'dead JIT frame' object that can
         be inspected with the get_latest_xxx() methods.
         """
-        argtypes = [lltype.typeOf(x) for x in args]
-        execute = self.make_execute_token(*argtypes)
-        return execute(looptoken, *args)
+        execute = self.make_execute_token()
+        return execute(looptoken, args_i, args_r, args_f)
 
-    def make_execute_token(self, *argtypes):
+    def make_execute_token(self):
         """Must make and return an execute_token() function that will be
         called with the given argtypes.
         """
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2194,15 +2194,18 @@
 
     def _nontranslated_run_directly(self, live_arg_boxes, loop_token):
         "NOT_RPYTHON"
-        args = []
         num_green_args = self.jitdriver_sd.num_green_args
         num_red_args = self.jitdriver_sd.num_red_args
+        args_i = []
+        args_r = []
+        args_f = []
         for box in live_arg_boxes[num_green_args:num_green_args+num_red_args]:
-            if   box.type == history.INT: args.append(box.getint())
-            elif box.type == history.REF: args.append(box.getref_base())
-            elif box.type == history.FLOAT: args.append(box.getfloatstorage())
+            if   box.type == history.INT: args_i.append(box.getint())
+            elif box.type == history.REF: args_r.append(box.getref_base())
+            elif box.type == history.FLOAT: 
args_f.append(box.getfloatstorage())
             else: assert 0
-        self.jitdriver_sd.warmstate.execute_assembler(loop_token, *args)
+        self.jitdriver_sd.warmstate.execute_assembler(loop_token, args_i,
+                                                      args_r, args_f)
 
     def prepare_resume_from_failure(self, opnum, dont_change_position,
                                     deadframe):
diff --git a/rpython/jit/metainterp/warmstate.py 
b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -267,7 +267,6 @@
         metainterp_sd = warmrunnerdesc.metainterp_sd
         jitdriver_sd = self.jitdriver_sd
         vinfo = jitdriver_sd.virtualizable_info
-        index_of_virtualizable = jitdriver_sd.index_of_virtualizable
         num_green_args = jitdriver_sd.num_green_args
         num_green_ints = 0
         num_green_refs = 0
@@ -288,23 +287,21 @@
         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
-        ARGS = []
         num_red_ints = 0
         num_red_refs = 0
         num_red_floats = 0
         for kind in jitdriver_sd.red_args_types:
             if kind == 'int':
                 num_red_ints += 1
-                ARGS.append(lltype.Signed)
             elif kind == 'ref':
                 num_red_refs += 1
-                ARGS.append(llmemory.GCREF)
             elif kind == 'float':
                 num_red_floats += 1
-                ARGS.append(longlong.FLOATSTORAGE)
             else:
                 assert 0, kind
-        func_execute_token = self.cpu.make_execute_token(*ARGS)
+        index_of_virtualizable = (jitdriver_sd.index_of_virtualizable -
+                                  num_red_ints)
+        func_execute_token = self.cpu.make_execute_token()
         cpu = self.cpu
         jitcounter = self.warmrunnerdesc.jitcounter
 
@@ -317,7 +314,7 @@
             range(num_green_args + num_red_ints + num_red_refs,
                   jitdriver_sd.num_red_args)))
 
-        def execute_assembler(loop_token, *args):
+        def execute_assembler(loop_token, args_i, args_r, args_f):
             # Call the backend to run the 'looptoken' with the given
             # input args.
 
@@ -325,10 +322,10 @@
             # state, to make sure we enter with vable_token being NONE
             #
             if vinfo is not None:
-                virtualizable = args[index_of_virtualizable]
+                virtualizable = args_r[index_of_virtualizable]
                 vinfo.clear_vable_token(virtualizable)
             
-            deadframe = func_execute_token(loop_token, *args)
+            deadframe = func_execute_token(loop_token, args_i, args_r, args_f)
             #
             # Record in the memmgr that we just ran this loop,
             # so that it will keep it alive for a longer time
@@ -420,11 +417,17 @@
                 return
             # extract and unspecialize the red arguments to pass to
             # the assembler
-            execute_args = ()
-            for i in range_red_args:
-                execute_args += (unspecialize_value(args[i]), )
+            args_i = [0] * num_red_ints
+            args_r = [lltype.nullptr(llmemory.GCREF.TO)] * num_red_refs
+            args_f = [longlong.getfloatstorage(0.0)] * num_red_floats
+            for i, num in range_red_ints:
+                args_i[i] = unspecialize_value(args[num])
+            for i, num in range_red_refs:
+                args_r[i] = unspecialize_value(args[num])
+            for i, num in range_red_floats:
+                args_f[i] = unspecialize_value(args[num])
             # run it!  this executes until interrupted by an exception
-            execute_assembler(procedure_token, *execute_args)
+            execute_assembler(procedure_token, args_i, args_r, args_f)
             assert 0, "should not reach this point"
 
         maybe_compile_and_run._dont_inline_ = True
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to