diff options
Diffstat (limited to 'vm/interp/Interp.c')
-rw-r--r-- | vm/interp/Interp.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/vm/interp/Interp.c b/vm/interp/Interp.c index de3d6760f..db86e7865 100644 --- a/vm/interp/Interp.c +++ b/vm/interp/Interp.c @@ -789,7 +789,6 @@ void dvmThrowVerificationError(const Method* method, int kind, int ref) free(msg); } - /* * Main interpreter loop entry point. Select "standard" or "debug" * interpreter and switch between them as required. @@ -805,6 +804,27 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult) { InterpState interpState; bool change; +#if defined(WITH_JIT) + /* Interpreter entry points from compiled code */ + extern void dvmJitToInterpNormal(); + extern void dvmJitToInterpNoChain(); + extern void dvmJitToInterpPunt(); + extern void dvmJitToInterpSingleStep(); + extern void dvmJitToTraceSelect(); + + /* + * Reserve a static entity here to quickly setup runtime contents as + * gcc will issue block copy instructions. + */ + static struct JitToInterpEntries jitToInterpEntries = { + dvmJitToInterpNormal, + dvmJitToInterpNoChain, + dvmJitToInterpPunt, + dvmJitToInterpSingleStep, + dvmJitToTraceSelect, + }; +#endif + #if defined(WITH_TRACKREF_CHECKS) interpState.debugTrackedRefStart = @@ -813,6 +833,12 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult) #if defined(WITH_PROFILER) || defined(WITH_DEBUGGER) interpState.debugIsMethodEntry = true; #endif +#if defined(WITH_JIT) + interpState.jitState = gDvmJit.pJitEntryTable ? kJitNormal : kJitOff; + + /* Setup the Jit-to-interpreter entry points */ + interpState.jitToInterpEntries = jitToInterpEntries; +#endif /* * Initialize working state. @@ -848,6 +874,14 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult) Interpreter stdInterp; if (gDvm.executionMode == kExecutionModeInterpFast) stdInterp = dvmMterpStd; +#if defined(WITH_JIT) + else if (gDvm.executionMode == kExecutionModeJit) +/* If profiling overhead can be kept low enough, we can use a profiling + * mterp fast for both Jit and "fast" modes. If overhead is too high, + * create a specialized profiling interpreter. + */ + stdInterp = dvmMterpStd; +#endif else stdInterp = dvmInterpretStd; @@ -858,7 +892,7 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult) LOGVV("threadid=%d: interp STD\n", self->threadId); change = (*stdInterp)(self, &interpState); break; -#if defined(WITH_PROFILER) || defined(WITH_DEBUGGER) +#if defined(WITH_PROFILER) || defined(WITH_DEBUGGER) || defined(WITH_JIT) case INTERP_DBG: LOGVV("threadid=%d: interp DBG\n", self->threadId); change = dvmInterpretDbg(self, &interpState); @@ -871,4 +905,3 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult) *pResult = interpState.retval; } - |