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