diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2013-11-23 00:29:23 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2013-11-23 00:29:23 -0800 |
commit | d3260cbe21ac8502dedf1bf360466acc6df79615 (patch) | |
tree | d321e81c23435c9f93d79b524cb855833047ca90 /vm | |
parent | fd87723884d75a06fbcdf5f9a6b36c7ae1dea014 (diff) | |
parent | 5fd64e3a565ca1e08e1339f90760d339adfb1a3b (diff) | |
download | android_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.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) { |