summaryrefslogtreecommitdiff
path: root/compiler/utils/arm/assembler_arm.cc
diff options
context:
space:
mode:
author Vladimir Marko <vmarko@google.com> 2015-11-19 21:13:52 +0000
committer Vladimir Marko <vmarko@google.com> 2015-11-20 11:55:49 +0000
commit6fd0ffe8da212723a3ac0256ce350b5872cc61d4 (patch)
tree122c89d874460662d3feba523cb9f2553fb78bd3 /compiler/utils/arm/assembler_arm.cc
parentbeb709a2607a00b5df33f0235f22ccdd876cee22 (diff)
Optimizing/Thumb2: Improve load/store for large offsets.
This reduces the boot.oat size on Nexus 5 by 568KiB (0.8%). Also change 32-bit ADD/SUB immediate to use the recommended encoding T3 when both T3 and T4 are available. Change-Id: I174382bda2b22da70560b947f5536acf8c1814a9
Diffstat (limited to 'compiler/utils/arm/assembler_arm.cc')
-rw-r--r--compiler/utils/arm/assembler_arm.cc8
1 files changed, 4 insertions, 4 deletions
diff --git a/compiler/utils/arm/assembler_arm.cc b/compiler/utils/arm/assembler_arm.cc
index 68e39568bb..dead8fd9a8 100644
--- a/compiler/utils/arm/assembler_arm.cc
+++ b/compiler/utils/arm/assembler_arm.cc
@@ -342,9 +342,9 @@ bool Address::CanHoldLoadOffsetThumb(LoadOperandType type, int offset) {
return IsAbsoluteUint<12>(offset);
case kLoadSWord:
case kLoadDWord:
- return IsAbsoluteUint<10>(offset); // VFP addressing mode.
+ return IsAbsoluteUint<10>(offset) && (offset & 3) == 0; // VFP addressing mode.
case kLoadWordPair:
- return IsAbsoluteUint<10>(offset);
+ return IsAbsoluteUint<10>(offset) && (offset & 3) == 0;
default:
LOG(FATAL) << "UNREACHABLE";
UNREACHABLE();
@@ -360,9 +360,9 @@ bool Address::CanHoldStoreOffsetThumb(StoreOperandType type, int offset) {
return IsAbsoluteUint<12>(offset);
case kStoreSWord:
case kStoreDWord:
- return IsAbsoluteUint<10>(offset); // VFP addressing mode.
+ return IsAbsoluteUint<10>(offset) && (offset & 3) == 0; // VFP addressing mode.
case kStoreWordPair:
- return IsAbsoluteUint<10>(offset);
+ return IsAbsoluteUint<10>(offset) && (offset & 3) == 0;
default:
LOG(FATAL) << "UNREACHABLE";
UNREACHABLE();