Performance tweak for Jit lookup & adjust table sizes for better performance

Also, move setting of Jit table parameters to architecture-specific init
funciton.
diff --git a/vm/Init.c b/vm/Init.c
index 316b12f..86d385b 100644
--- a/vm/Init.c
+++ b/vm/Init.c
@@ -1015,14 +1015,6 @@
      */
 #if defined(WITH_JIT)
     gDvm.executionMode = kExecutionModeJit;
-    /* 
-     * TODO - check system property and insert command-line options in 
-     *        frameworks/base/core/jni/AndroidRuntime.cpp
-     */
-    gDvmJit.blockingMode = false;
-    gDvmJit.jitTableSize = 512;
-    gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
-    gDvmJit.threshold = 200;
 #else
     gDvm.executionMode = kExecutionModeInterpFast;
 #endif
diff --git a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c
index a763720..2a8bde1 100644
--- a/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c
+++ b/vm/compiler/codegen/arm/armv5te-vfp/ArchVariant.c
@@ -48,6 +48,18 @@
 #include "../../../template/armv5te-vfp/TemplateOpList.h"
 #undef JIT_TEMPLATE
 
+    /* Target-specific configuration */
+    gDvmJit.blockingMode = false;
+    gDvmJit.jitTableSize = 1 << 9; // 512
+    gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
+    gDvmJit.threshold = 200;
+
+#if defined(WITH_SELF_VERIFICATION)
+    /* Force into blocking, translate everything mode */
+    gDvmJit.blockingMode = true;
+    gDvmJit.threshold = 1;
+#endif
+
     /* Codegen-specific assumptions */
     assert(offsetof(ClassObject, vtable) < 128 &&
            (offsetof(ClassObject, vtable) & 0x3) == 0);
diff --git a/vm/compiler/codegen/arm/armv5te/ArchVariant.c b/vm/compiler/codegen/arm/armv5te/ArchVariant.c
index 1067037..6dff45a 100644
--- a/vm/compiler/codegen/arm/armv5te/ArchVariant.c
+++ b/vm/compiler/codegen/arm/armv5te/ArchVariant.c
@@ -48,6 +48,18 @@
 #include "../../../template/armv5te/TemplateOpList.h"
 #undef JIT_TEMPLATE
 
+    /* Target-specific configuration */
+    gDvmJit.blockingMode = false;
+    gDvmJit.jitTableSize = 1 << 9; // 512
+    gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
+    gDvmJit.threshold = 200;
+
+#if defined(WITH_SELF_VERIFICATION)
+    /* Force into blocking, translate everything mode */
+    gDvmJit.blockingMode = true;
+    gDvmJit.threshold = 1;
+#endif
+
     /* Codegen-specific assumptions */
     assert(offsetof(ClassObject, vtable) < 128 &&
            (offsetof(ClassObject, vtable) & 0x3) == 0);
diff --git a/vm/compiler/codegen/arm/armv7-a/ArchVariant.c b/vm/compiler/codegen/arm/armv7-a/ArchVariant.c
index 645af56..0e4cc2b 100644
--- a/vm/compiler/codegen/arm/armv7-a/ArchVariant.c
+++ b/vm/compiler/codegen/arm/armv7-a/ArchVariant.c
@@ -44,6 +44,18 @@
 #include "../../../template/armv5te-vfp/TemplateOpList.h"
 #undef JIT_TEMPLATE
 
+    /* Target-specific configuration */
+    gDvmJit.blockingMode = false;
+    gDvmJit.jitTableSize = 1 << 12; // 4096
+    gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1;
+    gDvmJit.threshold = 40;
+
+#if defined(WITH_SELF_VERIFICATION)
+    /* Force into blocking, translate everything mode */
+    gDvmJit.blockingMode = true;
+    gDvmJit.threshold = 1;
+#endif
+
     /* Codegen-specific assumptions */
     assert(offsetof(ClassObject, vtable) < 128 &&
            (offsetof(ClassObject, vtable) & 0x3) == 0);
diff --git a/vm/interp/Jit.c b/vm/interp/Jit.c
index d31826a..e327511 100644
--- a/vm/interp/Jit.c
+++ b/vm/interp/Jit.c
@@ -348,12 +348,6 @@
     unsigned int i;
     bool res = true;  /* Assume success */
 
-#if defined(WITH_SELF_VERIFICATION)
-    // Force JIT into blocking, translate everything mode
-    gDvmJit.threshold = 1;
-    gDvmJit.blockingMode = true;
-#endif
-
     // Create the compiler thread and setup miscellaneous chores */
     res &= dvmCompilerStartup();
 
@@ -787,27 +781,26 @@
 void* dvmJitGetCodeAddr(const u2* dPC)
 {
     int idx = dvmJitHash(dPC);
+    u2* npc = gDvmJit.pJitEntryTable[idx].dPC;
 
-    /* If anything is suspended, don't re-enter the code cache */
-    if (gDvm.sumThreadSuspendCount > 0) {
-        return NULL;
-    }
-
-    /* Expect a high hit rate on 1st shot */
-    if (gDvmJit.pJitEntryTable[idx].dPC == dPC) {
+    if (npc != NULL) {
+        if (npc == dPC) {
 #if defined(EXIT_STATS)
-        gDvmJit.addrLookupsFound++;
+            gDvmJit.addrLookupsFound++;
 #endif
-        return gDvmJit.pJitEntryTable[idx].codeAddress;
-    } else {
-        int chainEndMarker = gDvmJit.jitTableSize;
-        while (gDvmJit.pJitEntryTable[idx].u.info.chain != chainEndMarker) {
-            idx = gDvmJit.pJitEntryTable[idx].u.info.chain;
-            if (gDvmJit.pJitEntryTable[idx].dPC == dPC) {
+            return gDvm.sumThreadSuspendCount ? NULL :
+                gDvmJit.pJitEntryTable[idx].codeAddress;
+        } else {
+            int chainEndMarker = gDvmJit.jitTableSize;
+            while (gDvmJit.pJitEntryTable[idx].u.info.chain != chainEndMarker) {
+                idx = gDvmJit.pJitEntryTable[idx].u.info.chain;
+                if (gDvmJit.pJitEntryTable[idx].dPC == dPC) {
 #if defined(EXIT_STATS)
-                gDvmJit.addrLookupsFound++;
+                    gDvmJit.addrLookupsFound++;
 #endif
-                return gDvmJit.pJitEntryTable[idx].codeAddress;
+                    return gDvm.sumThreadSuspendCount ? NULL :
+                        gDvmJit.pJitEntryTable[idx].codeAddress;
+                }
             }
         }
     }
diff --git a/vm/interp/Jit.h b/vm/interp/Jit.h
index a8d82eb..177a734 100644
--- a/vm/interp/Jit.h
+++ b/vm/interp/Jit.h
@@ -21,7 +21,7 @@
 
 #include "InterpDefs.h"
 
-#define JIT_PROF_SIZE 512
+#define JIT_PROF_SIZE 2048
 
 #define JIT_MAX_TRACE_LEN 100
 
diff --git a/vm/mterp/armv5te/footer.S b/vm/mterp/armv5te/footer.S
index 317f151..a58527d 100644
--- a/vm/mterp/armv5te/footer.S
+++ b/vm/mterp/armv5te/footer.S
@@ -196,11 +196,11 @@
 
 common_updateProfile:
     eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
-    lsl     r3,r3,#23          @ shift out excess 511
-    ldrb    r1,[r0,r3,lsr #23] @ get counter
+    lsl     r3,r3,#21          @ shift out excess 2047
+    ldrb    r1,[r0,r3,lsr #21] @ get counter
     GET_INST_OPCODE(ip)
     subs    r1,r1,#1           @ decrement counter
-    strb    r1,[r0,r3,lsr #23] @ and store it
+    strb    r1,[r0,r3,lsr #21] @ and store it
     GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
 
 /*
@@ -210,7 +210,7 @@
  * jump to it now).
  */
     GET_JIT_THRESHOLD(r1)
-    strb    r1,[r0,r3,lsr #23] @ reset counter
+    strb    r1,[r0,r3,lsr #21] @ reset counter
     EXPORT_PC()
     mov     r0,rPC
     bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
diff --git a/vm/mterp/out/InterpAsm-armv4t.S b/vm/mterp/out/InterpAsm-armv4t.S
index f45007f..759956f 100644
--- a/vm/mterp/out/InterpAsm-armv4t.S
+++ b/vm/mterp/out/InterpAsm-armv4t.S
@@ -9720,11 +9720,11 @@
 
 common_updateProfile:
     eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
-    lsl     r3,r3,#23          @ shift out excess 511
-    ldrb    r1,[r0,r3,lsr #23] @ get counter
+    lsl     r3,r3,#21          @ shift out excess 2047
+    ldrb    r1,[r0,r3,lsr #21] @ get counter
     GET_INST_OPCODE(ip)
     subs    r1,r1,#1           @ decrement counter
-    strb    r1,[r0,r3,lsr #23] @ and store it
+    strb    r1,[r0,r3,lsr #21] @ and store it
     GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
 
 /*
@@ -9734,7 +9734,7 @@
  * jump to it now).
  */
     GET_JIT_THRESHOLD(r1)
-    strb    r1,[r0,r3,lsr #23] @ reset counter
+    strb    r1,[r0,r3,lsr #21] @ reset counter
     EXPORT_PC()
     mov     r0,rPC
     bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index 40861f2..d9e7cdb 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -9238,11 +9238,11 @@
 
 common_updateProfile:
     eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
-    lsl     r3,r3,#23          @ shift out excess 511
-    ldrb    r1,[r0,r3,lsr #23] @ get counter
+    lsl     r3,r3,#21          @ shift out excess 2047
+    ldrb    r1,[r0,r3,lsr #21] @ get counter
     GET_INST_OPCODE(ip)
     subs    r1,r1,#1           @ decrement counter
-    strb    r1,[r0,r3,lsr #23] @ and store it
+    strb    r1,[r0,r3,lsr #21] @ and store it
     GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
 
 /*
@@ -9252,7 +9252,7 @@
  * jump to it now).
  */
     GET_JIT_THRESHOLD(r1)
-    strb    r1,[r0,r3,lsr #23] @ reset counter
+    strb    r1,[r0,r3,lsr #21] @ reset counter
     EXPORT_PC()
     mov     r0,rPC
     bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index 9aa736f..eb95134 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -9714,11 +9714,11 @@
 
 common_updateProfile:
     eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
-    lsl     r3,r3,#23          @ shift out excess 511
-    ldrb    r1,[r0,r3,lsr #23] @ get counter
+    lsl     r3,r3,#21          @ shift out excess 2047
+    ldrb    r1,[r0,r3,lsr #21] @ get counter
     GET_INST_OPCODE(ip)
     subs    r1,r1,#1           @ decrement counter
-    strb    r1,[r0,r3,lsr #23] @ and store it
+    strb    r1,[r0,r3,lsr #21] @ and store it
     GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
 
 /*
@@ -9728,7 +9728,7 @@
  * jump to it now).
  */
     GET_JIT_THRESHOLD(r1)
-    strb    r1,[r0,r3,lsr #23] @ reset counter
+    strb    r1,[r0,r3,lsr #21] @ reset counter
     EXPORT_PC()
     mov     r0,rPC
     bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index abb8ea1..28b3537 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -9174,11 +9174,11 @@
 
 common_updateProfile:
     eor     r3,rPC,rPC,lsr #12 @ cheap, but fast hash function
-    lsl     r3,r3,#23          @ shift out excess 511
-    ldrb    r1,[r0,r3,lsr #23] @ get counter
+    lsl     r3,r3,#21          @ shift out excess 2047
+    ldrb    r1,[r0,r3,lsr #21] @ get counter
     GET_INST_OPCODE(ip)
     subs    r1,r1,#1           @ decrement counter
-    strb    r1,[r0,r3,lsr #23] @ and store it
+    strb    r1,[r0,r3,lsr #21] @ and store it
     GOTO_OPCODE_IFNE(ip)       @ if not threshold, fallthrough otherwise */
 
 /*
@@ -9188,7 +9188,7 @@
  * jump to it now).
  */
     GET_JIT_THRESHOLD(r1)
-    strb    r1,[r0,r3,lsr #23] @ reset counter
+    strb    r1,[r0,r3,lsr #21] @ reset counter
     EXPORT_PC()
     mov     r0,rPC
     bl      dvmJitGetCodeAddr           @ r0<- dvmJitGetCodeAddr(rPC)