summaryrefslogtreecommitdiffstats
path: root/vm
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2013-11-23 00:29:23 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2013-11-23 00:29:23 -0800
commitd3260cbe21ac8502dedf1bf360466acc6df79615 (patch)
treed321e81c23435c9f93d79b524cb855833047ca90 /vm
parentfd87723884d75a06fbcdf5f9a6b36c7ae1dea014 (diff)
parent5fd64e3a565ca1e08e1339f90760d339adfb1a3b (diff)
downloadandroid_dalvik-d3260cbe21ac8502dedf1bf360466acc6df79615.tar.gz
android_dalvik-d3260cbe21ac8502dedf1bf360466acc6df79615.tar.bz2
android_dalvik-d3260cbe21ac8502dedf1bf360466acc6df79615.zip
Merge "dalvik: use T3 branch when target offset is too large"
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) {