[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