summaryrefslogtreecommitdiffstats
path: root/vm
diff options
context:
space:
mode:
authorWei Wang <wangw@codeaurora.org>2013-10-14 11:46:27 -0700
committerWei Wang <wangw@codeaurora.org>2013-11-19 16:13:59 -0800
commit5fd64e3a565ca1e08e1339f90760d339adfb1a3b (patch)
treecb7e3e858827d0ba2bd237f7c4ba97f7f5c83472 /vm
parente17852495a15ddad079305c725d067ac95e4d655 (diff)
downloadandroid_dalvik-5fd64e3a565ca1e08e1339f90760d339adfb1a3b.tar.gz
android_dalvik-5fd64e3a565ca1e08e1339f90760d339adfb1a3b.tar.bz2
android_dalvik-5fd64e3a565ca1e08e1339f90760d339adfb1a3b.zip
dalvik: use T3 branch when target offset is too large
T1 branch has offset limit of [-256, 254]. T3 branch has offset limit of [-1048576, 1048574]. Use T3 branch when target offset falls outside T1 range to avoid compiliation abort. Change-Id: I86809e08236b1f5f5102e3fce4df4b1e72e4b96c
Diffstat (limited to 'vm')
-rw-r--r--vm/compiler/codegen/arm/Assemble.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/vm/compiler/codegen/arm/Assemble.cpp b/vm/compiler/codegen/arm/Assemble.cpp
index 236d35fed..debe39b38 100644
--- a/vm/compiler/codegen/arm/Assemble.cpp
+++ b/vm/compiler/codegen/arm/Assemble.cpp
@@ -1045,12 +1045,18 @@ static AssemblerStatus assembleInstructions(CompilationUnit *cUnit,
intptr_t target = targetLIR->generic.offset;
int delta = target - pc;
if ((lir->opcode == kThumbBCond) && (delta > 254 || delta < -256)) {
- if (cUnit->printMe) {
- ALOGD("kThumbBCond@%x: delta=%d", lir->generic.offset,
- delta);
- dvmCompilerCodegenDump(cUnit);
+ if (delta <= 1048574 && delta >= -1048576) {
+ /* convert T1 branch to T3 */
+ lir->opcode = kThumb2BCond;
+ return kRetryAll;
+ } else {
+ if (cUnit->printMe) {
+ ALOGD("kThumbBCond@%x: delta=%d", lir->generic.offset,
+ delta);
+ dvmCompilerCodegenDump(cUnit);
+ }
+ return kRetryHalve;
}
- return kRetryHalve;
}
lir->operands[0] = delta >> 1;
} else if (lir->opcode == kThumbBUncond) {