diff options
author | Wei Wang <wangw@codeaurora.org> | 2013-10-14 11:46:27 -0700 |
---|---|---|
committer | Wei Wang <wangw@codeaurora.org> | 2013-11-19 16:13:59 -0800 |
commit | 5fd64e3a565ca1e08e1339f90760d339adfb1a3b (patch) | |
tree | cb7e3e858827d0ba2bd237f7c4ba97f7f5c83472 /vm | |
parent | e17852495a15ddad079305c725d067ac95e4d655 (diff) | |
download | android_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.cpp | 16 |
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) { |