Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(908)

Unified Diff: src/IceAssemblerARM32.cpp

Issue 1617993005: Fix vldrs/vstrs handling of immediate offsets in ARM. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | tests_lit/assembler/arm32/vldr.vstr.imm.ll » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/IceAssemblerARM32.cpp
diff --git a/src/IceAssemblerARM32.cpp b/src/IceAssemblerARM32.cpp
index 6090e1d2dbfade9ea569d85c79dae7f6f7798d4d..73db1476d7b472c234fb6ae9bdb9e9ef4dc4164f 100644
--- a/src/IceAssemblerARM32.cpp
+++ b/src/IceAssemblerARM32.cpp
@@ -356,14 +356,14 @@ EncodedOperand encodeOperand(const Operand *Opnd, IValueT &Value,
}
IValueT encodeImmRegOffset(IValueT Reg, IOffsetT Offset,
- OperandARM32Mem::AddrMode Mode) {
+ OperandARM32Mem::AddrMode Mode,
+ IValueT OffsetShift = 0) {
IValueT Value = Mode | (Reg << kRnShift);
if (Offset < 0) {
- Value = (Value ^ U) | -Offset; // Flip U to adjust sign.
- } else {
- Value |= Offset;
+ Offset = -Offset;
+ Value ^= U; // Flip U to adjust sign.
}
- return Value;
+ return Value | (Offset >> OffsetShift);
}
// Encodes immediate register offset using encoding 3.
@@ -384,9 +384,11 @@ IValueT encodeImmRegOffset(OpEncoding AddressEncoding, IValueT Reg,
switch (AddressEncoding) {
case DefaultOpEncoding:
return encodeImmRegOffset(Reg, Offset, Mode);
- case ImmRegOffsetDiv4:
+ case ImmRegOffsetDiv4: {
assert((Offset & 0x3) == 0);
- return encodeImmRegOffset(Reg, Offset >> 2, Mode);
+ constexpr IValueT RightShift2 = 2;
+ return encodeImmRegOffset(Reg, Offset, Mode, RightShift2);
+ }
case OpEncoding3:
return encodeImmRegOffsetEnc3(Reg, Offset, Mode);
case OpEncodingMemEx:
@@ -2242,9 +2244,8 @@ void AssemblerARM32::vldrd(const Operand *OpDd, const Operand *OpAddress,
IValueT Address;
EncodedOperand AddressEncoding =
encodeAddress(OpAddress, Address, TInfo, ImmRegOffsetDiv4);
- if (AddressEncoding != EncodedAsImmRegOffset)
- // TODO(kschimpf) Fix this.
- return setNeedsTextFixup();
+ (void)AddressEncoding; // Make MINIMAL build happy.
John 2016/01/22 18:47:40 no need for this comment. This is a pretty common
Karl 2016/01/22 20:42:19 Done.
+ assert(AddressEncoding == EncodedAsImmRegOffset);
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
IValueT Encoding = B27 | B26 | B24 | B20 | B11 | B9 | B8 |
(encodeCondition(Cond) << kConditionShift) |
@@ -2264,8 +2265,9 @@ void AssemblerARM32::vldrs(const Operand *OpSd, const Operand *OpAddress,
IValueT Sd = encodeSRegister(OpSd, "Sd", Vldrs);
assert(CondARM32::isDefined(Cond));
IValueT Address;
- EncodedOperand AddressEncoding = encodeAddress(OpAddress, Address, TInfo);
- (void)AddressEncoding;
+ EncodedOperand AddressEncoding =
+ encodeAddress(OpAddress, Address, TInfo, ImmRegOffsetDiv4);
+ (void)AddressEncoding; // Make MINIMAL build happy.
assert(AddressEncoding == EncodedAsImmRegOffset);
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
IValueT Encoding = B27 | B26 | B24 | B20 | B11 | B9 |
@@ -2318,9 +2320,8 @@ void AssemblerARM32::vstrd(const Operand *OpDd, const Operand *OpAddress,
IValueT Address;
IValueT AddressEncoding =
encodeAddress(OpAddress, Address, TInfo, ImmRegOffsetDiv4);
- if (AddressEncoding != EncodedAsImmRegOffset)
- // TODO(kschimpf) Fix this.
- return setNeedsTextFixup();
+ (void)AddressEncoding; // Make MINIMAL build happy.
+ assert(AddressEncoding == EncodedAsImmRegOffset);
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
IValueT Encoding = B27 | B26 | B24 | B11 | B9 | B8 |
(encodeCondition(Cond) << kConditionShift) |
@@ -2340,8 +2341,10 @@ void AssemblerARM32::vstrs(const Operand *OpSd, const Operand *OpAddress,
IValueT Sd = encodeSRegister(OpSd, "Sd", Vstrs);
assert(CondARM32::isDefined(Cond));
IValueT Address;
- if (encodeAddress(OpAddress, Address, TInfo) != EncodedAsImmRegOffset)
- assert(false);
+ IValueT AddressEncoding =
+ encodeAddress(OpAddress, Address, TInfo, ImmRegOffsetDiv4);
+ (void)AddressEncoding; // Make MINIMAL build happy.
+ assert(AddressEncoding == EncodedAsImmRegOffset);
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
IValueT Encoding =
B27 | B26 | B24 | B11 | B9 | (encodeCondition(Cond) << kConditionShift) |
« no previous file with comments | « no previous file | tests_lit/assembler/arm32/vldr.vstr.imm.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698