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