summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders O Nilsson <anders.o.nilsson@stericsson.com>2013-02-08 11:24:35 +0100
committerEvan McClain <aeroevan@gmail.com>2013-05-26 09:33:37 -0400
commitd46b37eac79319da2c8bbdad1b6915aaba3e9cf5 (patch)
treef0f616423718c00bf785c0ad79e49edc3a2cbc91
parent0723288f790e18669621b4f75803bbc4ff8e6bd5 (diff)
downloadandroid_dalvik-d46b37eac79319da2c8bbdad1b6915aaba3e9cf5.tar.gz
android_dalvik-d46b37eac79319da2c8bbdad1b6915aaba3e9cf5.tar.bz2
android_dalvik-d46b37eac79319da2c8bbdad1b6915aaba3e9cf5.zip
JIT: Allow use of cbz/cbnz for conditional branch gen.
Optimize conditional branch generation when comparing with zero for ARM JIT. When possible use cbz/cbnz instead of cmp+beq/cmp+bne. This improves performance for usecases involving code execution in Dalvik. Change-Id: I8f7c44c87eb73d4da00a48fd86220a62cb0515f5 Signed-off-by: Patrik Ryd <patrik.ryd@stericsson.com>
-rw-r--r--vm/compiler/codegen/arm/CodegenDriver.cpp6
1 files changed, 2 insertions, 4 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.cpp b/vm/compiler/codegen/arm/CodegenDriver.cpp
index 5123b3c94..d146b41e7 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.cpp
+++ b/vm/compiler/codegen/arm/CodegenDriver.cpp
@@ -2113,9 +2113,6 @@ static bool handleFmt21t(CompilationUnit *cUnit, MIR *mir, BasicBlock *bb,
RegLocation rlSrc = dvmCompilerGetSrc(cUnit, mir, 0);
rlSrc = loadValue(cUnit, rlSrc, kCoreReg);
- opRegImm(cUnit, kOpCmp, rlSrc.lowReg, 0);
-
-//TUNING: break this out to allow use of Thumb2 CB[N]Z
switch (dalvikOpcode) {
case OP_IF_EQZ:
cond = kArmCondEq;
@@ -2140,7 +2137,8 @@ static bool handleFmt21t(CompilationUnit *cUnit, MIR *mir, BasicBlock *bb,
ALOGE("Unexpected opcode (%d) for Fmt21t", dalvikOpcode);
dvmCompilerAbort(cUnit);
}
- genConditionalBranch(cUnit, cond, &labelList[bb->taken->id]);
+ ArmLIR* branch = genCmpImmBranch(cUnit, cond, rlSrc.lowReg, 0);
+ branch->generic.target = (LIR*)&labelList[bb->taken->id];
/* This mostly likely will be optimized away in a later phase */
genUnconditionalBranch(cUnit, &labelList[bb->fallThrough->id]);
return false;