diff options
| author | Sjoerd Meijer <sjoerd.meijer@arm.com> | 2018-02-13 10:29:03 +0000 |
|---|---|---|
| committer | Sjoerd Meijer <sjoerd.meijer@arm.com> | 2018-02-13 10:29:03 +0000 |
| commit | 101ee43072700ad5b4465583a442ba0d967005fd (patch) | |
| tree | effd951cb091884d95f803956982de514d2a30ef /llvm/lib/Target/ARM | |
| parent | 4e290648ae2a2b7703fc69d037f356ecfe36f238 (diff) | |
| download | bcm5719-llvm-101ee43072700ad5b4465583a442ba0d967005fd.tar.gz bcm5719-llvm-101ee43072700ad5b4465583a442ba0d967005fd.zip | |
[Thumb] Handle addressing mode AddrMode5FP16
This addressing mode wasn't checked, so we were running in an assert.
Differential Revision: https://reviews.llvm.org/D43179
llvm-svn: 324996
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/Thumb2InstrInfo.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp b/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp index c5eb14f3e60..e8259f7edc0 100644 --- a/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp +++ b/llvm/lib/Target/ARM/Thumb2InstrInfo.cpp @@ -600,6 +600,20 @@ bool llvm::rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, Offset = -Offset; isSub = true; } + } else if (AddrMode == ARMII::AddrMode5FP16) { + // VFP address mode. + const MachineOperand &OffOp = MI.getOperand(FrameRegIdx+1); + int InstrOffs = ARM_AM::getAM5FP16Offset(OffOp.getImm()); + if (ARM_AM::getAM5FP16Op(OffOp.getImm()) == ARM_AM::sub) + InstrOffs *= -1; + NumBits = 8; + Scale = 2; + Offset += InstrOffs * 2; + assert((Offset & (Scale-1)) == 0 && "Can't encode this offset!"); + if (Offset < 0) { + Offset = -Offset; + isSub = true; + } } else if (AddrMode == ARMII::AddrModeT2_i8s4) { Offset += MI.getOperand(FrameRegIdx + 1).getImm() * 4; NumBits = 10; // 8 bits scaled by 4 |

