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)