Author: Armin Rigo <ar...@tunes.org> Branch: cleanup-llgraph-backend Changeset: r58163:55132b711d27 Date: 2012-10-17 14:13 +0200 http://bitbucket.org/pypy/pypy/changeset/55132b711d27/
Log: call_assembler support, initial version 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 @@ -3,9 +3,10 @@ from pypy.jit.backend import model from pypy.jit.backend.llgraph import support -from pypy.jit.metainterp.history import Const, getkind, AbstractDescr, VOID +from pypy.jit.metainterp.history import Const, getkind, AbstractDescr +from pypy.jit.metainterp.history import INT, REF, FLOAT, VOID from pypy.jit.metainterp.resoperation import rop -from pypy.jit.codewriter import heaptracker +from pypy.jit.codewriter import longlong, heaptracker from pypy.rpython.llinterp import LLInterpreter, LLException from pypy.rpython.lltypesystem import lltype, llmemory, rffi, rclass, rstr @@ -415,7 +416,16 @@ continue raise if op.result is not None: - assert resval is not None + # typecheck the result + if op.result.type == INT: + assert lltype.typeOf(resval) == lltype.Signed + elif op.result.type == REF: + assert lltype.typeOf(resval) == llmemory.GCREF + elif op.result.type == FLOAT: + assert lltype.typeOf(resval) == longlong.FLOATSTORAGE + else: + raise AssertionError(op.result.type) + # self.env[op.result] = resval else: assert resval is None @@ -565,6 +575,48 @@ func_to_call = rffi.cast(lltype.Ptr(FUNC), func) return self.cpu.call(func_to_call, call_args, descr.RESULT, descr) + def execute_call_assembler(self, descr, *args): + faildescr = self.cpu._execute_token(descr, *args) + jd = descr.outermost_jitdriver_sd + if jd.index_of_virtualizable != -1: + vable = args[jd.index_of_virtualizable] + else: + vable = lltype.nullptr(llmemory.GCREF.TO) + # + # Emulate the fast path + failindex = self.cpu.get_fail_descr_number(faildescr) + if failindex == self.cpu.done_with_this_frame_int_v: + self._reset_vable(jd, vable) + return self.cpu.get_latest_value_int(0) + if failindex == self.cpu.done_with_this_frame_ref_v: + self._reset_vable(jd, vable) + return self.cpu.get_latest_value_ref(0) + if failindex == self.cpu.done_with_this_frame_float_v: + self._reset_vable(jd, vable) + return self.cpu.get_latest_value_float(0) + if failindex == self.cpu.done_with_this_frame_void_v: + self._reset_vable(jd, vable) + return None + # + assembler_helper_ptr = jd.assembler_helper_adr.ptr # fish + try: + result = assembler_helper_ptr(failindex, vable) + except LLException, lle: + xxxxxxxxxx + assert _last_exception is None, "exception left behind" + _last_exception = lle + # fish op + op = self.loop.operations[self.opindex] + if op.result is not None: + yyyyyyyyyyyyy + return 0 + return support.cast_result(lltype.typeOf(result), result) + + def _reset_vable(self, jd, vable): + if jd.index_of_virtualizable != -1: + fielddescr = jd.vable_token_descr + self.cpu.bh_setfield_gc_i(vable, 0, fielddescr) + def execute_same_as(self, _, x): return x _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit