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

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: Fix nit. 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..a23bcba6e6cfd24b43cbabf57a03b13860281c7f 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;
Jim Stichnoth 2016/01/22 22:47:15 I assume this is probably not possible, but it set
John 2016/01/22 23:33:25 arm32 immediates are small (usually 8-bits, someti
Karl 2016/01/25 19:03:26 Fixing with CL https://codereview.chromium.org/163
+ 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:
@@ -608,7 +610,6 @@ IValueT AssemblerARM32::encodeBranchOffset(IOffsetT Offset, IValueT Inst) {
bool IsGoodOffset = canEncodeBranchOffset(Offset);
assert(IsGoodOffset);
- // Note: Following cast is for MINIMAL build.
(void)IsGoodOffset;
// Properly preserve only the bits supported in the instruction.
@@ -2242,9 +2243,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;
+ assert(AddressEncoding == EncodedAsImmRegOffset);
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
IValueT Encoding = B27 | B26 | B24 | B20 | B11 | B9 | B8 |
(encodeCondition(Cond) << kConditionShift) |
@@ -2264,7 +2264,8 @@ 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);
+ EncodedOperand AddressEncoding =
+ encodeAddress(OpAddress, Address, TInfo, ImmRegOffsetDiv4);
(void)AddressEncoding;
assert(AddressEncoding == EncodedAsImmRegOffset);
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
@@ -2318,9 +2319,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;
+ assert(AddressEncoding == EncodedAsImmRegOffset);
AssemblerBuffer::EnsureCapacity ensured(&Buffer);
IValueT Encoding = B27 | B26 | B24 | B11 | B9 | B8 |
(encodeCondition(Cond) << kConditionShift) |
@@ -2340,8 +2340,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;
+ 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