aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2011-08-04 23:18:05 +0000
committerOwen Anderson <resistor@mac.com>2011-08-04 23:18:05 +0000
commit14c903a76be7933cea746617d3f787fdf4de8203 (patch)
treeba2ad9a70ebacc2c5ea1ce0c1d26fab1428f4800 /lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
parent039c2e19c4237fb484315a62e95222ac28640bb7 (diff)
downloadexternal_llvm-14c903a76be7933cea746617d3f787fdf4de8203.tar.gz
external_llvm-14c903a76be7933cea746617d3f787fdf4de8203.tar.bz2
external_llvm-14c903a76be7933cea746617d3f787fdf4de8203.zip
Fix broken encodings for the Thumb2 LDRD/STRD instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@136942 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h')
-rw-r--r--lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h23
1 files changed, 14 insertions, 9 deletions
diff --git a/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h b/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
index 66a62ef5a5..a1b38f377a 100644
--- a/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
+++ b/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h
@@ -1318,13 +1318,6 @@ static bool DisassembleThumb2LdStDual(MCInst &MI, unsigned Opcode,
const MCOperandInfo *OpInfo = ARMInsts[Opcode].OpInfo;
if (!OpInfo) return false;
- assert(NumOps >= 4
- && OpInfo[0].RegClass > 0
- && OpInfo[0].RegClass == OpInfo[1].RegClass
- && OpInfo[2].RegClass > 0
- && OpInfo[3].RegClass < 0
- && "Expect >= 4 operands and first 3 as reg operands");
-
// Thumnb allows for specifying Rt and Rt2, unlike ARM (which has Rt2==Rt+1).
unsigned Rt = decodeRd(insn);
unsigned Rt2 = decodeRs(insn);
@@ -1357,20 +1350,32 @@ static bool DisassembleThumb2LdStDual(MCInst &MI, unsigned Opcode,
// Add the <Rt> <Rt2> operands.
unsigned RegClassPair = OpInfo[0].RegClass;
unsigned RegClassBase = OpInfo[2].RegClass;
-
+
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassPair,
decodeRd(insn))));
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassPair,
decodeRs(insn))));
MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassBase,
decodeRn(insn))));
+ unsigned Added = 4;
+ switch (MI.getOpcode()) {
+ case ARM::t2LDRD_PRE:
+ case ARM::t2LDRD_POST:
+ case ARM::t2STRD_PRE:
+ case ARM::t2STRD_POST:
+ MI.addOperand(MCOperand::CreateReg(getRegisterEnum(B, RegClassBase,
+ decodeRn(insn))));
+ Added = 5;
+ default:
+ break;
+ }
// Finally add (+/-)imm8*4, depending on the U bit.
int Offset = getImm8(insn) * 4;
if (getUBit(insn) == 0)
Offset = -Offset;
MI.addOperand(MCOperand::CreateImm(Offset));
- NumOpsAdded = 4;
+ NumOpsAdded = Added;
return true;
}