OSDN Git Service

Tweak the interpreter entries and 2nd level trace filter to capture more traces.
authorBen Cheng <bccheng@android.com>
Thu, 25 Feb 2010 04:58:44 +0000 (20:58 -0800)
committerBen Cheng <bccheng@android.com>
Fri, 26 Feb 2010 07:48:38 +0000 (23:48 -0800)
Real changes:
1) Add a new entry point from JIT to the interpreter to request hot traces w/o
   doing chaining.
2) Increase the granularity of the secondary profile filter to match 64-byte
   chunks using 64 entries.

The remaining are just cosmetic changes.

18 files changed:
vm/compiler/Compiler.h
vm/compiler/codegen/arm/Assemble.c
vm/compiler/codegen/arm/CodegenDriver.c
vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NATIVE.S
vm/compiler/template/armv5te/TEMPLATE_INVOKE_METHOD_NO_OPT.S
vm/compiler/template/armv5te/footer.S
vm/compiler/template/out/CompilerTemplateAsm-armv5te-vfp.S
vm/compiler/template/out/CompilerTemplateAsm-armv5te.S
vm/compiler/template/out/CompilerTemplateAsm-armv7-a.S
vm/interp/Interp.c
vm/interp/InterpDefs.h
vm/interp/Jit.c
vm/mterp/armv5te/footer.S
vm/mterp/common/asm-constants.h
vm/mterp/out/InterpAsm-armv4t.S
vm/mterp/out/InterpAsm-armv5te-vfp.S
vm/mterp/out/InterpAsm-armv5te.S
vm/mterp/out/InterpAsm-armv7-a.S

index 3f60a5e..932f41d 100644 (file)
@@ -76,12 +76,13 @@ typedef enum JitState {
     kJitOff = 0,
     kJitNormal = 1,            // Profiling in mterp or running native
     kJitTSelectRequest = 2,    // Transition state - start trace selection
-    kJitTSelect = 3,           // Actively selecting trace in dbg interp
-    kJitTSelectAbort = 4,      // Something threw during selection - abort
-    kJitTSelectEnd = 5,        // Done with the trace - wrap it up
-    kJitSingleStep = 6,        // Single step interpretation
-    kJitSingleStepEnd = 7,     // Done with single step, return to mterp
-    kJitSelfVerification = 8,  // Self Verification Mode
+    kJitTSelectRequestHot = 3, // Transition state - start hot trace selection
+    kJitTSelect = 4,           // Actively selecting trace in dbg interp
+    kJitTSelectAbort = 5,      // Something threw during selection - abort
+    kJitTSelectEnd = 6,        // Done with the trace - wrap it up
+    kJitSingleStep = 7,        // Single step interpretation
+    kJitSingleStepEnd = 8,     // Done with single step, return to mterp
+    kJitSelfVerification = 9,  // Self Verification Mode
 } JitState;
 
 #if defined(WITH_SELF_VERIFICATION)
@@ -90,11 +91,12 @@ typedef enum SelfVerificationState {
     kSVSStart = 1,          // Shadow space set up, running compiled code
     kSVSPunt = 2,           // Exiting compiled code by punting
     kSVSSingleStep = 3,     // Exiting compiled code by single stepping
-    kSVSTraceSelect = 4,    // Exiting compiled code by trace select
-    kSVSNormal = 5,         // Exiting compiled code normally
-    kSVSNoChain = 6,        // Exiting compiled code by no chain
-    kSVSBackwardBranch = 7, // Exiting compiled code with backward branch trace
-    kSVSDebugInterp = 8,    // Normal state restored, running debug interpreter
+    kSVSTraceSelectNoChain = 4,// Exiting compiled code by trace select no chain
+    kSVSTraceSelect = 5,    // Exiting compiled code by trace select
+    kSVSNormal = 6,         // Exiting compiled code normally
+    kSVSNoChain = 7,        // Exiting compiled code by no chain
+    kSVSBackwardBranch = 8, // Exiting compiled code with backward branch trace
+    kSVSDebugInterp = 9,    // Normal state restored, running debug interpreter
 } SelfVerificationState;
 #endif
 
index 7f8ad9e..2ad0842 100644 (file)
@@ -1597,7 +1597,7 @@ u4* dvmJitUnchain(void* codeAddr)
                 case kChainingCellHot:
                 case kChainingCellInvokeSingleton:
                     targetOffset = offsetof(InterpState,
-                          jitToInterpEntries.dvmJitToTraceSelect);
+                          jitToInterpEntries.dvmJitToInterpTraceSelect);
                     break;
                 case kChainingCellInvokePredicted:
                     targetOffset = 0;
@@ -1614,7 +1614,7 @@ u4* dvmJitUnchain(void* codeAddr)
 #if defined(WITH_SELF_VERIFICATION)
                 case kChainingCellBackwardBranch:
                     targetOffset = offsetof(InterpState,
-                          jitToInterpEntries.dvmJitToBackwardBranch);
+                          jitToInterpEntries.dvmJitToInterpBackwardBranch);
                     break;
 #elif defined(WITH_JIT_TUNING)
                 case kChainingCellBackwardBranch:
index d3b10a4..a6aafd1 100644 (file)
@@ -3094,7 +3094,7 @@ static void handleHotChainingCell(CompilationUnit *cUnit,
                                   unsigned int offset)
 {
     loadWordDisp(cUnit, rGLUE, offsetof(InterpState,
-                 jitToInterpEntries.dvmJitToTraceSelect), r0);
+                 jitToInterpEntries.dvmJitToInterpTraceSelect), r0);
     opReg(cUnit, kOpBlx, r0);
     addWordData(cUnit, (int) (cUnit->method->insns + offset), true);
 }
@@ -3106,7 +3106,8 @@ static void handleBackwardBranchChainingCell(CompilationUnit *cUnit,
 {
 #if defined(WITH_SELF_VERIFICATION)
     newLIR3(cUnit, kThumbLdrRRI5, r0, rGLUE,
-        offsetof(InterpState, jitToInterpEntries.dvmJitToBackwardBranch) >> 2);
+        offsetof(InterpState,
+                 jitToInterpEntries.dvmJitToInterpBackwardBranch) >> 2);
 #else
     newLIR3(cUnit, kThumbLdrRRI5, r0, rGLUE,
         offsetof(InterpState, jitToInterpEntries.dvmJitToInterpNormal) >> 2);
@@ -3121,7 +3122,7 @@ static void handleInvokeSingletonChainingCell(CompilationUnit *cUnit,
                                               const Method *callee)
 {
     loadWordDisp(cUnit, rGLUE, offsetof(InterpState,
-                 jitToInterpEntries.dvmJitToTraceSelect), r0);
+                 jitToInterpEntries.dvmJitToInterpTraceSelect), r0);
     opReg(cUnit, kOpBlx, r0);
     addWordData(cUnit, (int) (callee->insns), true);
 }
index 945203e..be14a5c 100644 (file)
@@ -62,7 +62,7 @@
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
index c4f766a..c08e556 100644 (file)
@@ -37,7 +37,7 @@
     bxne    lr                          @ bail to the interpreter
 #endif
 
-    ldr     r10, .LdvmJitToInterpNoChain
+    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
     ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
     ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
 
@@ -51,4 +51,4 @@
 #if defined(EXIT_STATS)
     mov     r0, #kInlineCacheMiss
 #endif
-    mov     pc, r10                         @ dvmJitToInterpNoChain
+    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
index 1709bf3..8937495 100644 (file)
@@ -48,7 +48,7 @@
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
@@ -71,6 +71,8 @@
     .align  2
 .LdvmAsmInstructionStart:
     .word   dvmAsmInstructionStart
+.LdvmJitToInterpTraceSelectNoChain:
+    .word   dvmJitToInterpTraceSelectNoChain
 .LdvmJitToInterpNoChain:
     .word   dvmJitToInterpNoChain
 .LdvmMterpStdBail:
index 71cb120..ac3455a 100644 (file)
@@ -267,7 +267,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
     bxne    lr                          @ bail to the interpreter
 #endif
 
-    ldr     r10, .LdvmJitToInterpNoChain
+    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
     ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
     ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
 
@@ -281,7 +281,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
 #if defined(EXIT_STATS)
     mov     r0, #kInlineCacheMiss
 #endif
-    mov     pc, r10                         @ dvmJitToInterpNoChain
+    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
 
 /* ------------------------------ */
     .balign 4
@@ -453,7 +453,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE:
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
@@ -1489,7 +1489,7 @@ dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
@@ -1512,6 +1512,8 @@ dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
     .align  2
 .LdvmAsmInstructionStart:
     .word   dvmAsmInstructionStart
+.LdvmJitToInterpTraceSelectNoChain:
+    .word   dvmJitToInterpTraceSelectNoChain
 .LdvmJitToInterpNoChain:
     .word   dvmJitToInterpNoChain
 .LdvmMterpStdBail:
index 1da4cb8..4863141 100644 (file)
@@ -267,7 +267,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
     bxne    lr                          @ bail to the interpreter
 #endif
 
-    ldr     r10, .LdvmJitToInterpNoChain
+    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
     ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
     ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
 
@@ -281,7 +281,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
 #if defined(EXIT_STATS)
     mov     r0, #kInlineCacheMiss
 #endif
-    mov     pc, r10                         @ dvmJitToInterpNoChain
+    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
 
 /* ------------------------------ */
     .balign 4
@@ -453,7 +453,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE:
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
@@ -1217,7 +1217,7 @@ dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
@@ -1240,6 +1240,8 @@ dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
     .align  2
 .LdvmAsmInstructionStart:
     .word   dvmAsmInstructionStart
+.LdvmJitToInterpTraceSelectNoChain:
+    .word   dvmJitToInterpTraceSelectNoChain
 .LdvmJitToInterpNoChain:
     .word   dvmJitToInterpNoChain
 .LdvmMterpStdBail:
index e83e773..0b06826 100644 (file)
@@ -267,7 +267,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
     bxne    lr                          @ bail to the interpreter
 #endif
 
-    ldr     r10, .LdvmJitToInterpNoChain
+    ldr     r10, .LdvmJitToInterpTraceSelectNoChain
     ldr     r3, [r9, #offClassObject_pDvmDex] @ r3<- method->clazz->pDvmDex
     ldr     r2, [rGLUE, #offGlue_self]      @ r2<- glue->self
 
@@ -281,7 +281,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NO_OPT:
 #if defined(EXIT_STATS)
     mov     r0, #kInlineCacheMiss
 #endif
-    mov     pc, r10                         @ dvmJitToInterpNoChain
+    mov     pc, r10                         @ dvmJitToInterpTraceSelectNoChain
 
 /* ------------------------------ */
     .balign 4
@@ -453,7 +453,7 @@ dvmCompiler_TEMPLATE_INVOKE_METHOD_NATIVE:
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
@@ -1489,7 +1489,7 @@ dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
     bxne    r2                          @ yes - go ahead
 
     @ continue executing the next instruction through the interpreter
-    ldr     r1, .LdvmJitToInterpNoChain @ defined in footer.S
+    ldr     r1, .LdvmJitToInterpTraceSelectNoChain @ defined in footer.S
     add     rPC, r0, #6                 @ reconstruct new rPC (advance 6 bytes)
 #if defined(EXIT_STATS)
     mov     r0, #kCallsiteInterpreted
@@ -1512,6 +1512,8 @@ dvmCompiler_TEMPLATE_MONITOR_ENTER_DEBUG:
     .align  2
 .LdvmAsmInstructionStart:
     .word   dvmAsmInstructionStart
+.LdvmJitToInterpTraceSelectNoChain:
+    .word   dvmJitToInterpTraceSelectNoChain
 .LdvmJitToInterpNoChain:
     .word   dvmJitToInterpNoChain
 .LdvmMterpStdBail:
index 6c6abce..4e7a7e3 100644 (file)
@@ -1227,10 +1227,11 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult)
     extern void dvmJitToInterpNoChain();
     extern void dvmJitToInterpPunt();
     extern void dvmJitToInterpSingleStep();
-    extern void dvmJitToTraceSelect();
+    extern void dvmJitToInterpTraceSelectNoChain();
+    extern void dvmJitToInterpTraceSelect();
     extern void dvmJitToPatchPredictedChain();
 #if defined(WITH_SELF_VERIFICATION)
-    extern void dvmJitToBackwardBranch();
+    extern void dvmJitToInterpBackwardBranch();
 #endif
 
     /*
@@ -1242,10 +1243,11 @@ void dvmInterpret(Thread* self, const Method* method, JValue* pResult)
         dvmJitToInterpNoChain,
         dvmJitToInterpPunt,
         dvmJitToInterpSingleStep,
-        dvmJitToTraceSelect,
+        dvmJitToInterpTraceSelectNoChain,
+        dvmJitToInterpTraceSelect,
         dvmJitToPatchPredictedChain,
 #if defined(WITH_SELF_VERIFICATION)
-        dvmJitToBackwardBranch,
+        dvmJitToInterpBackwardBranch,
 #endif
     };
 
index fc9c3fe..31856df 100644 (file)
@@ -73,10 +73,11 @@ struct JitToInterpEntries {
     void *dvmJitToInterpNoChain;
     void *dvmJitToInterpPunt;
     void *dvmJitToInterpSingleStep;
-    void *dvmJitToTraceSelect;
+    void *dvmJitToInterpTraceSelectNoChain;
+    void *dvmJitToInterpTraceSelect;
     void *dvmJitToPatchPredictedChain;
 #if defined(WITH_SELF_VERIFICATION)
-    void *dvmJitToBackwardBranch;
+    void *dvmJitToInterpBackwardBranch;
 #endif
 };
 
@@ -88,7 +89,10 @@ struct JitToInterpEntries {
  */
 #define JIT_CALLEE_SAVE_DOUBLE_COUNT 8
 
-#define JIT_TRACE_THRESH_FILTER_SIZE  16
+/* Number of entries in the 2nd level JIT profiler filter cache */
+#define JIT_TRACE_THRESH_FILTER_SIZE 32
+/* Granularity of coverage (power of 2) by each cached entry */
+#define JIT_TRACE_THRESH_FILTER_GRAN_LOG2 6
 #endif
 
 /*
@@ -173,7 +177,7 @@ typedef struct InterpState {
     int currRunLen;           // Length of run in 16-bit words
     int lastThreshFilter;
     const u2* lastPC;         // Stage the PC first for the threaded interpreter
-    const u2* threshFilter[JIT_TRACE_THRESH_FILTER_SIZE];
+    intptr_t threshFilter[JIT_TRACE_THRESH_FILTER_SIZE];
     JitTraceRun trace[MAX_JIT_RUN_LEN];
     double calleeSave[JIT_CALLEE_SAVE_DOUBLE_COUNT];
 #endif
index 198e1a2..3c0082b 100644 (file)
@@ -753,6 +753,7 @@ int dvmCheckJit(const u2* pc, Thread* self, InterpState* interpState)
             switchInterp = !debugOrProfile;
             break;
         case kJitTSelectRequest:
+        case kJitTSelectRequestHot:
         case kJitTSelectAbort:
 #if defined(SHOW_TRACE)
             LOGD("TraceGen:  trace abort");
@@ -875,29 +876,36 @@ bool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState)
 {
     bool res = false;         /* Assume success */
     int i;
+    intptr_t filterKey = ((intptr_t) interpState->pc) >>
+                         JIT_TRACE_THRESH_FILTER_GRAN_LOG2;
+
     /*
      * If previous trace-building attempt failed, force it's head to be
      * interpret-only.
      */
     if (gDvmJit.pJitEntryTable != NULL) {
-        /* Two-level filtering scheme */
-        for (i=0; i< JIT_TRACE_THRESH_FILTER_SIZE; i++) {
-            if (interpState->pc == interpState->threshFilter[i]) {
-                break;
+        /* Bypass the filter for hot trace requests */
+        if (interpState->jitState != kJitTSelectRequestHot) {
+            /* Two-level filtering scheme */
+            for (i=0; i< JIT_TRACE_THRESH_FILTER_SIZE; i++) {
+                if (filterKey == interpState->threshFilter[i]) {
+                    break;
+                }
+            }
+            if (i == JIT_TRACE_THRESH_FILTER_SIZE) {
+                /*
+                 * Use random replacement policy - otherwise we could miss a
+                 * large loop that contains more traces than the size of our
+                 * filter array.
+                 */
+                i = rand() % JIT_TRACE_THRESH_FILTER_SIZE;
+                interpState->threshFilter[i] = filterKey;
+                res = true;
             }
-        }
-        if (i == JIT_TRACE_THRESH_FILTER_SIZE) {
-            /*
-             * Use random replacement policy - otherwise we could miss a large
-             * loop that contains more traces than the size of our filter array.
-             */
-            i = rand() % JIT_TRACE_THRESH_FILTER_SIZE;
-            interpState->threshFilter[i] = interpState->pc;
-            res = true;
-        }
 
-        /* If stress mode (threshold <= 6), always translate */
-        res &= (gDvmJit.threshold > 6);
+            /* If stress mode (threshold <= 6), always translate */
+            res &= (gDvmJit.threshold > 6);
+        }
 
         /*
          * If the compiler is backlogged, or if a debugger or profiler is
@@ -912,7 +920,8 @@ bool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState)
             if (interpState->jitState != kJitOff) {
                 interpState->jitState = kJitNormal;
             }
-        } else if (interpState->jitState == kJitTSelectRequest) {
+        } else if (interpState->jitState == kJitTSelectRequest ||
+                   interpState->jitState == kJitTSelectRequestHot) {
             JitEntry *slot = lookupAndAdd(interpState->pc, false);
             if (slot == NULL) {
                 /*
@@ -954,6 +963,7 @@ bool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState)
         }
         switch (interpState->jitState) {
             case kJitTSelectRequest:
+            case kJitTSelectRequestHot:
                  interpState->jitState = kJitTSelect;
                  interpState->currTraceHead = interpState->pc;
                  interpState->currTraceRun = 0;
index 27129fd..ed77978 100644 (file)
@@ -22,14 +22,20 @@ dvmJitToInterpSingleStep:
     mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+    mov    r0,rPC                       @ pass our target PC
+    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
+    b      dvmJitSelfVerificationEnd    @ doesn't return
+
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToBackwardBranch
-dvmJitToBackwardBranch:
+    .global dvmJitToInterpBackwardBranch
+dvmJitToInterpBackwardBranch:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
@@ -92,14 +98,32 @@ dvmJitToInterpSingleStep:
     mov    r1,#1                  @ set changeInterp to bail to debug interp
     b      common_gotoBail
 
+/*
+ * Return from the translation cache and immediately request
+ * a translation for the exit target.  Commonly used for callees.
+ */
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+#ifdef EXIT_STATS
+    bl     dvmBumpNoChain
+#endif
+    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
+    mov    r0,rPC
+    bl     dvmJitGetCodeAddr        @ Is there a translation?
+    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
+    mov    r1, rPC                  @ arg1 of translation may need this
+    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
+    cmp    r0,#0
+    bxne   r0                       @ continue native execution if so
+    b      2f
 
 /*
  * Return from the translation cache and immediately request
  * a translation for the exit target.  Commonly used following
  * invokes.
  */
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    rPC,[lr, #-1]           @ get our target PC
     ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
     add    rINST,lr,#-5            @ save start of chain branch
@@ -122,6 +146,7 @@ dvmJitToTraceSelect:
     GET_JIT_PROF_TABLE(r0)
     FETCH_INST()
     cmp    r0, #0
+    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
     bne    common_selectTrace
     GET_INST_OPCODE(ip)
     GOTO_OPCODE(ip)
@@ -231,7 +256,10 @@ common_updateProfile:
     cmp     r0,#0
 #if !defined(WITH_SELF_VERIFICATION)
     bxne    r0                          @ jump to the translation
+    mov     r2,#kJitTSelectRequest      @ ask for trace selection
+    @ fall-through to common_selectTrace
 #else
+    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
     beq     common_selectTrace
     /*
      * At this point, we have a target translation.  However, if
@@ -247,8 +275,11 @@ common_updateProfile:
     /* no return */
 #endif
 
+/*
+ * On entry:
+ *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
+ */
 common_selectTrace:
-    mov     r2,#kJitTSelectRequest      @ ask for trace selection
     str     r2,[rGLUE,#offGlue_jitState]
     mov     r2,#kInterpEntryInstr       @ normal entry reason
     str     r2,[rGLUE,#offGlue_entryPoint]
index f64aeee..b9e21ec 100644 (file)
@@ -293,26 +293,28 @@ MTERP_CONSTANT(kInterpEntryResume,  3)
 #endif
 
 #if defined(WITH_JIT)
-MTERP_CONSTANT(kJitOff,             0)
-MTERP_CONSTANT(kJitNormal,          1)
-MTERP_CONSTANT(kJitTSelectRequest,  2)
-MTERP_CONSTANT(kJitTSelect,         3)
-MTERP_CONSTANT(kJitTSelectAbort,    4)
-MTERP_CONSTANT(kJitTSelectEnd,      5)
-MTERP_CONSTANT(kJitSingleStep,      6)
-MTERP_CONSTANT(kJitSingleStepEnd,   7)
-MTERP_CONSTANT(kJitSelfVerification, 8)
+MTERP_CONSTANT(kJitOff,                 0)
+MTERP_CONSTANT(kJitNormal,              1)
+MTERP_CONSTANT(kJitTSelectRequest,      2)
+MTERP_CONSTANT(kJitTSelectRequestHot,   3)
+MTERP_CONSTANT(kJitTSelect,             4)
+MTERP_CONSTANT(kJitTSelectAbort,        5)
+MTERP_CONSTANT(kJitTSelectEnd,          6)
+MTERP_CONSTANT(kJitSingleStep,          7)
+MTERP_CONSTANT(kJitSingleStepEnd,       8)
+MTERP_CONSTANT(kJitSelfVerification,    9)
 
 #if defined(WITH_SELF_VERIFICATION)
 MTERP_CONSTANT(kSVSIdle, 0)
 MTERP_CONSTANT(kSVSStart, 1)
 MTERP_CONSTANT(kSVSPunt, 2)
 MTERP_CONSTANT(kSVSSingleStep, 3)
-MTERP_CONSTANT(kSVSTraceSelect, 4)
-MTERP_CONSTANT(kSVSNormal, 5)
-MTERP_CONSTANT(kSVSNoChain, 6)
-MTERP_CONSTANT(kSVSBackwardBranch, 7)
-MTERP_CONSTANT(kSVSDebugInterp, 8)
+MTERP_CONSTANT(kSVSTraceSelectNoChain, 4)
+MTERP_CONSTANT(kSVSTraceSelect, 5)
+MTERP_CONSTANT(kSVSNormal, 6)
+MTERP_CONSTANT(kSVSNoChain, 7)
+MTERP_CONSTANT(kSVSBackwardBranch, 8)
+MTERP_CONSTANT(kSVSDebugInterp, 9)
 #endif
 #endif
 
index c3cebb7..c9f69cb 100644 (file)
@@ -9555,14 +9555,20 @@ dvmJitToInterpSingleStep:
     mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+    mov    r0,rPC                       @ pass our target PC
+    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
+    b      dvmJitSelfVerificationEnd    @ doesn't return
+
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToBackwardBranch
-dvmJitToBackwardBranch:
+    .global dvmJitToInterpBackwardBranch
+dvmJitToInterpBackwardBranch:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
@@ -9625,14 +9631,32 @@ dvmJitToInterpSingleStep:
     mov    r1,#1                  @ set changeInterp to bail to debug interp
     b      common_gotoBail
 
+/*
+ * Return from the translation cache and immediately request
+ * a translation for the exit target.  Commonly used for callees.
+ */
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+#ifdef EXIT_STATS
+    bl     dvmBumpNoChain
+#endif
+    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
+    mov    r0,rPC
+    bl     dvmJitGetCodeAddr        @ Is there a translation?
+    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
+    mov    r1, rPC                  @ arg1 of translation may need this
+    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
+    cmp    r0,#0
+    bxne   r0                       @ continue native execution if so
+    b      2f
 
 /*
  * Return from the translation cache and immediately request
  * a translation for the exit target.  Commonly used following
  * invokes.
  */
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    rPC,[lr, #-1]           @ get our target PC
     ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
     add    rINST,lr,#-5            @ save start of chain branch
@@ -9655,6 +9679,7 @@ dvmJitToTraceSelect:
     GET_JIT_PROF_TABLE(r0)
     FETCH_INST()
     cmp    r0, #0
+    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
     bne    common_selectTrace
     GET_INST_OPCODE(ip)
     GOTO_OPCODE(ip)
@@ -9764,7 +9789,10 @@ common_updateProfile:
     cmp     r0,#0
 #if !defined(WITH_SELF_VERIFICATION)
     bxne    r0                          @ jump to the translation
+    mov     r2,#kJitTSelectRequest      @ ask for trace selection
+    @ fall-through to common_selectTrace
 #else
+    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
     beq     common_selectTrace
     /*
      * At this point, we have a target translation.  However, if
@@ -9780,8 +9808,11 @@ common_updateProfile:
     /* no return */
 #endif
 
+/*
+ * On entry:
+ *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
+ */
 common_selectTrace:
-    mov     r2,#kJitTSelectRequest      @ ask for trace selection
     str     r2,[rGLUE,#offGlue_jitState]
     mov     r2,#kInterpEntryInstr       @ normal entry reason
     str     r2,[rGLUE,#offGlue_entryPoint]
index 2064668..d2f3a79 100644 (file)
@@ -9073,14 +9073,20 @@ dvmJitToInterpSingleStep:
     mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+    mov    r0,rPC                       @ pass our target PC
+    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
+    b      dvmJitSelfVerificationEnd    @ doesn't return
+
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToBackwardBranch
-dvmJitToBackwardBranch:
+    .global dvmJitToInterpBackwardBranch
+dvmJitToInterpBackwardBranch:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
@@ -9143,14 +9149,32 @@ dvmJitToInterpSingleStep:
     mov    r1,#1                  @ set changeInterp to bail to debug interp
     b      common_gotoBail
 
+/*
+ * Return from the translation cache and immediately request
+ * a translation for the exit target.  Commonly used for callees.
+ */
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+#ifdef EXIT_STATS
+    bl     dvmBumpNoChain
+#endif
+    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
+    mov    r0,rPC
+    bl     dvmJitGetCodeAddr        @ Is there a translation?
+    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
+    mov    r1, rPC                  @ arg1 of translation may need this
+    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
+    cmp    r0,#0
+    bxne   r0                       @ continue native execution if so
+    b      2f
 
 /*
  * Return from the translation cache and immediately request
  * a translation for the exit target.  Commonly used following
  * invokes.
  */
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    rPC,[lr, #-1]           @ get our target PC
     ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
     add    rINST,lr,#-5            @ save start of chain branch
@@ -9173,6 +9197,7 @@ dvmJitToTraceSelect:
     GET_JIT_PROF_TABLE(r0)
     FETCH_INST()
     cmp    r0, #0
+    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
     bne    common_selectTrace
     GET_INST_OPCODE(ip)
     GOTO_OPCODE(ip)
@@ -9282,7 +9307,10 @@ common_updateProfile:
     cmp     r0,#0
 #if !defined(WITH_SELF_VERIFICATION)
     bxne    r0                          @ jump to the translation
+    mov     r2,#kJitTSelectRequest      @ ask for trace selection
+    @ fall-through to common_selectTrace
 #else
+    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
     beq     common_selectTrace
     /*
      * At this point, we have a target translation.  However, if
@@ -9298,8 +9326,11 @@ common_updateProfile:
     /* no return */
 #endif
 
+/*
+ * On entry:
+ *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
+ */
 common_selectTrace:
-    mov     r2,#kJitTSelectRequest      @ ask for trace selection
     str     r2,[rGLUE,#offGlue_jitState]
     mov     r2,#kInterpEntryInstr       @ normal entry reason
     str     r2,[rGLUE,#offGlue_entryPoint]
index 3a41054..919c79d 100644 (file)
@@ -9549,14 +9549,20 @@ dvmJitToInterpSingleStep:
     mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+    mov    r0,rPC                       @ pass our target PC
+    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
+    b      dvmJitSelfVerificationEnd    @ doesn't return
+
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToBackwardBranch
-dvmJitToBackwardBranch:
+    .global dvmJitToInterpBackwardBranch
+dvmJitToInterpBackwardBranch:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
@@ -9619,14 +9625,32 @@ dvmJitToInterpSingleStep:
     mov    r1,#1                  @ set changeInterp to bail to debug interp
     b      common_gotoBail
 
+/*
+ * Return from the translation cache and immediately request
+ * a translation for the exit target.  Commonly used for callees.
+ */
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+#ifdef EXIT_STATS
+    bl     dvmBumpNoChain
+#endif
+    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
+    mov    r0,rPC
+    bl     dvmJitGetCodeAddr        @ Is there a translation?
+    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
+    mov    r1, rPC                  @ arg1 of translation may need this
+    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
+    cmp    r0,#0
+    bxne   r0                       @ continue native execution if so
+    b      2f
 
 /*
  * Return from the translation cache and immediately request
  * a translation for the exit target.  Commonly used following
  * invokes.
  */
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    rPC,[lr, #-1]           @ get our target PC
     ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
     add    rINST,lr,#-5            @ save start of chain branch
@@ -9649,6 +9673,7 @@ dvmJitToTraceSelect:
     GET_JIT_PROF_TABLE(r0)
     FETCH_INST()
     cmp    r0, #0
+    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
     bne    common_selectTrace
     GET_INST_OPCODE(ip)
     GOTO_OPCODE(ip)
@@ -9758,7 +9783,10 @@ common_updateProfile:
     cmp     r0,#0
 #if !defined(WITH_SELF_VERIFICATION)
     bxne    r0                          @ jump to the translation
+    mov     r2,#kJitTSelectRequest      @ ask for trace selection
+    @ fall-through to common_selectTrace
 #else
+    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
     beq     common_selectTrace
     /*
      * At this point, we have a target translation.  However, if
@@ -9774,8 +9802,11 @@ common_updateProfile:
     /* no return */
 #endif
 
+/*
+ * On entry:
+ *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
+ */
 common_selectTrace:
-    mov     r2,#kJitTSelectRequest      @ ask for trace selection
     str     r2,[rGLUE,#offGlue_jitState]
     mov     r2,#kInterpEntryInstr       @ normal entry reason
     str     r2,[rGLUE,#offGlue_entryPoint]
index bc3b7eb..62beb43 100644 (file)
@@ -9009,14 +9009,20 @@ dvmJitToInterpSingleStep:
     mov    r2,#kSVSSingleStep           @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+    mov    r0,rPC                       @ pass our target PC
+    mov    r2,#kSVSTraceSelectNoChain   @ r2<- interpreter entry point
+    b      dvmJitSelfVerificationEnd    @ doesn't return
+
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSTraceSelect          @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
 
-    .global dvmJitToBackwardBranch
-dvmJitToBackwardBranch:
+    .global dvmJitToInterpBackwardBranch
+dvmJitToInterpBackwardBranch:
     ldr    r0,[lr, #-1]                 @ pass our target PC
     mov    r2,#kSVSBackwardBranch       @ r2<- interpreter entry point
     b      dvmJitSelfVerificationEnd    @ doesn't return
@@ -9079,14 +9085,32 @@ dvmJitToInterpSingleStep:
     mov    r1,#1                  @ set changeInterp to bail to debug interp
     b      common_gotoBail
 
+/*
+ * Return from the translation cache and immediately request
+ * a translation for the exit target.  Commonly used for callees.
+ */
+    .global dvmJitToInterpTraceSelectNoChain
+dvmJitToInterpTraceSelectNoChain:
+#ifdef EXIT_STATS
+    bl     dvmBumpNoChain
+#endif
+    ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
+    mov    r0,rPC
+    bl     dvmJitGetCodeAddr        @ Is there a translation?
+    str    r0, [r10, #offThread_inJitCodeCache] @ set the inJitCodeCache flag
+    mov    r1, rPC                  @ arg1 of translation may need this
+    mov    lr, #0                   @  in case target is HANDLER_INTERPRET
+    cmp    r0,#0
+    bxne   r0                       @ continue native execution if so
+    b      2f
 
 /*
  * Return from the translation cache and immediately request
  * a translation for the exit target.  Commonly used following
  * invokes.
  */
-    .global dvmJitToTraceSelect
-dvmJitToTraceSelect:
+    .global dvmJitToInterpTraceSelect
+dvmJitToInterpTraceSelect:
     ldr    rPC,[lr, #-1]           @ get our target PC
     ldr    r10, [rGLUE, #offGlue_self]  @ callee saved r10 <- glue->self
     add    rINST,lr,#-5            @ save start of chain branch
@@ -9109,6 +9133,7 @@ dvmJitToTraceSelect:
     GET_JIT_PROF_TABLE(r0)
     FETCH_INST()
     cmp    r0, #0
+    movne  r2,#kJitTSelectRequestHot   @ ask for trace selection
     bne    common_selectTrace
     GET_INST_OPCODE(ip)
     GOTO_OPCODE(ip)
@@ -9218,7 +9243,10 @@ common_updateProfile:
     cmp     r0,#0
 #if !defined(WITH_SELF_VERIFICATION)
     bxne    r0                          @ jump to the translation
+    mov     r2,#kJitTSelectRequest      @ ask for trace selection
+    @ fall-through to common_selectTrace
 #else
+    moveq   r2,#kJitTSelectRequest      @ ask for trace selection
     beq     common_selectTrace
     /*
      * At this point, we have a target translation.  However, if
@@ -9234,8 +9262,11 @@ common_updateProfile:
     /* no return */
 #endif
 
+/*
+ * On entry:
+ *  r2 is jit state, e.g. kJitTSelectRequest or kJitTSelectRequestHot
+ */
 common_selectTrace:
-    mov     r2,#kJitTSelectRequest      @ ask for trace selection
     str     r2,[rGLUE,#offGlue_jitState]
     mov     r2,#kInterpEntryInstr       @ normal entry reason
     str     r2,[rGLUE,#offGlue_entryPoint]