1 //===- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #define DEBUG_TYPE "arm-disassembler"
13 #include "ARMRegisterInfo.h"
14 #include "ARMSubtarget.h"
15 #include "MCTargetDesc/ARMAddressingModes.h"
16 #include "MCTargetDesc/ARMBaseInfo.h"
17 #include "llvm/MC/EDInstInfo.h"
18 #include "llvm/MC/MCInst.h"
19 #include "llvm/MC/MCExpr.h"
20 #include "llvm/MC/MCContext.h"
21 #include "llvm/MC/MCDisassembler.h"
22 #include "llvm/Support/Debug.h"
23 #include "llvm/Support/MemoryObject.h"
24 #include "llvm/Support/ErrorHandling.h"
25 #include "llvm/Support/TargetRegistry.h"
26 #include "llvm/Support/raw_ostream.h"
30 typedef MCDisassembler::DecodeStatus DecodeStatus;
33 /// ARMDisassembler - ARM disassembler for all ARM platforms.
34 class ARMDisassembler : public MCDisassembler {
36 /// Constructor - Initializes the disassembler.
38 ARMDisassembler(const MCSubtargetInfo &STI) :
45 /// getInstruction - See MCDisassembler.
46 DecodeStatus getInstruction(MCInst &instr,
48 const MemoryObject ®ion,
50 raw_ostream &vStream) const;
52 /// getEDInfo - See MCDisassembler.
53 EDInstInfo *getEDInfo() const;
57 /// ThumbDisassembler - Thumb disassembler for all Thumb platforms.
58 class ThumbDisassembler : public MCDisassembler {
60 /// Constructor - Initializes the disassembler.
62 ThumbDisassembler(const MCSubtargetInfo &STI) :
66 ~ThumbDisassembler() {
69 /// getInstruction - See MCDisassembler.
70 DecodeStatus getInstruction(MCInst &instr,
72 const MemoryObject ®ion,
74 raw_ostream &vStream) const;
76 /// getEDInfo - See MCDisassembler.
77 EDInstInfo *getEDInfo() const;
79 mutable std::vector<unsigned> ITBlock;
80 void AddThumbPredicate(MCInst&) const;
81 void UpdateThumbVFPPredicate(MCInst&) const;
85 static bool Check(DecodeStatus &Out, DecodeStatus In) {
87 case MCDisassembler::Success:
88 // Out stays the same.
90 case MCDisassembler::SoftFail:
93 case MCDisassembler::Fail:
101 // Forward declare these because the autogenerated code will reference them.
102 // Definitions are further down.
103 static DecodeStatus DecodeGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
104 uint64_t Address, const void *Decoder);
105 static DecodeStatus DecodeGPRnopcRegisterClass(llvm::MCInst &Inst,
106 unsigned RegNo, uint64_t Address,
107 const void *Decoder);
108 static DecodeStatus DecodetGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
109 uint64_t Address, const void *Decoder);
110 static DecodeStatus DecodetcGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
111 uint64_t Address, const void *Decoder);
112 static DecodeStatus DecoderGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
113 uint64_t Address, const void *Decoder);
114 static DecodeStatus DecodeSPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
115 uint64_t Address, const void *Decoder);
116 static DecodeStatus DecodeDPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
117 uint64_t Address, const void *Decoder);
118 static DecodeStatus DecodeDPR_8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
119 uint64_t Address, const void *Decoder);
120 static DecodeStatus DecodeDPR_VFP2RegisterClass(llvm::MCInst &Inst,
123 const void *Decoder);
124 static DecodeStatus DecodeQPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
125 uint64_t Address, const void *Decoder);
127 static DecodeStatus DecodePredicateOperand(llvm::MCInst &Inst, unsigned Val,
128 uint64_t Address, const void *Decoder);
129 static DecodeStatus DecodeCCOutOperand(llvm::MCInst &Inst, unsigned Val,
130 uint64_t Address, const void *Decoder);
131 static DecodeStatus DecodeSOImmOperand(llvm::MCInst &Inst, unsigned Val,
132 uint64_t Address, const void *Decoder);
133 static DecodeStatus DecodeRegListOperand(llvm::MCInst &Inst, unsigned Val,
134 uint64_t Address, const void *Decoder);
135 static DecodeStatus DecodeSPRRegListOperand(llvm::MCInst &Inst, unsigned Val,
136 uint64_t Address, const void *Decoder);
137 static DecodeStatus DecodeDPRRegListOperand(llvm::MCInst &Inst, unsigned Val,
138 uint64_t Address, const void *Decoder);
140 static DecodeStatus DecodeBitfieldMaskOperand(llvm::MCInst &Inst, unsigned Insn,
141 uint64_t Address, const void *Decoder);
142 static DecodeStatus DecodeCopMemInstruction(llvm::MCInst &Inst, unsigned Insn,
143 uint64_t Address, const void *Decoder);
144 static DecodeStatus DecodeAddrMode2IdxInstruction(llvm::MCInst &Inst,
147 const void *Decoder);
148 static DecodeStatus DecodeSORegMemOperand(llvm::MCInst &Inst, unsigned Insn,
149 uint64_t Address, const void *Decoder);
150 static DecodeStatus DecodeAddrMode3Instruction(llvm::MCInst &Inst,unsigned Insn,
151 uint64_t Address, const void *Decoder);
152 static DecodeStatus DecodeSORegImmOperand(llvm::MCInst &Inst, unsigned Insn,
153 uint64_t Address, const void *Decoder);
154 static DecodeStatus DecodeSORegRegOperand(llvm::MCInst &Inst, unsigned Insn,
155 uint64_t Address, const void *Decoder);
157 static DecodeStatus DecodeMemMultipleWritebackInstruction(llvm::MCInst & Inst,
160 const void *Decoder);
161 static DecodeStatus DecodeSMLAInstruction(llvm::MCInst &Inst, unsigned Insn,
162 uint64_t Address, const void *Decoder);
163 static DecodeStatus DecodeCPSInstruction(llvm::MCInst &Inst, unsigned Insn,
164 uint64_t Address, const void *Decoder);
165 static DecodeStatus DecodeT2CPSInstruction(llvm::MCInst &Inst, unsigned Insn,
166 uint64_t Address, const void *Decoder);
167 static DecodeStatus DecodeAddrModeImm12Operand(llvm::MCInst &Inst, unsigned Val,
168 uint64_t Address, const void *Decoder);
169 static DecodeStatus DecodeAddrMode5Operand(llvm::MCInst &Inst, unsigned Val,
170 uint64_t Address, const void *Decoder);
171 static DecodeStatus DecodeAddrMode7Operand(llvm::MCInst &Inst, unsigned Val,
172 uint64_t Address, const void *Decoder);
173 static DecodeStatus DecodeBranchImmInstruction(llvm::MCInst &Inst,unsigned Insn,
174 uint64_t Address, const void *Decoder);
175 static DecodeStatus DecodeVCVTImmOperand(llvm::MCInst &Inst, unsigned Val,
176 uint64_t Address, const void *Decoder);
177 static DecodeStatus DecodeAddrMode6Operand(llvm::MCInst &Inst, unsigned Val,
178 uint64_t Address, const void *Decoder);
179 static DecodeStatus DecodeVLDInstruction(llvm::MCInst &Inst, unsigned Val,
180 uint64_t Address, const void *Decoder);
181 static DecodeStatus DecodeVSTInstruction(llvm::MCInst &Inst, unsigned Val,
182 uint64_t Address, const void *Decoder);
183 static DecodeStatus DecodeVLD1DupInstruction(llvm::MCInst &Inst, unsigned Val,
184 uint64_t Address, const void *Decoder);
185 static DecodeStatus DecodeVLD2DupInstruction(llvm::MCInst &Inst, unsigned Val,
186 uint64_t Address, const void *Decoder);
187 static DecodeStatus DecodeVLD3DupInstruction(llvm::MCInst &Inst, unsigned Val,
188 uint64_t Address, const void *Decoder);
189 static DecodeStatus DecodeVLD4DupInstruction(llvm::MCInst &Inst, unsigned Val,
190 uint64_t Address, const void *Decoder);
191 static DecodeStatus DecodeNEONModImmInstruction(llvm::MCInst &Inst,unsigned Val,
192 uint64_t Address, const void *Decoder);
193 static DecodeStatus DecodeVSHLMaxInstruction(llvm::MCInst &Inst, unsigned Val,
194 uint64_t Address, const void *Decoder);
195 static DecodeStatus DecodeShiftRight8Imm(llvm::MCInst &Inst, unsigned Val,
196 uint64_t Address, const void *Decoder);
197 static DecodeStatus DecodeShiftRight16Imm(llvm::MCInst &Inst, unsigned Val,
198 uint64_t Address, const void *Decoder);
199 static DecodeStatus DecodeShiftRight32Imm(llvm::MCInst &Inst, unsigned Val,
200 uint64_t Address, const void *Decoder);
201 static DecodeStatus DecodeShiftRight64Imm(llvm::MCInst &Inst, unsigned Val,
202 uint64_t Address, const void *Decoder);
203 static DecodeStatus DecodeTBLInstruction(llvm::MCInst &Inst, unsigned Insn,
204 uint64_t Address, const void *Decoder);
205 static DecodeStatus DecodeVFPfpImm(llvm::MCInst &Inst, unsigned Val,
206 uint64_t Address, const void *Decoder);
207 static DecodeStatus DecodePostIdxReg(llvm::MCInst &Inst, unsigned Insn,
208 uint64_t Address, const void *Decoder);
209 static DecodeStatus DecodeCoprocessor(llvm::MCInst &Inst, unsigned Insn,
210 uint64_t Address, const void *Decoder);
211 static DecodeStatus DecodeMemBarrierOption(llvm::MCInst &Inst, unsigned Insn,
212 uint64_t Address, const void *Decoder);
213 static DecodeStatus DecodeMSRMask(llvm::MCInst &Inst, unsigned Insn,
214 uint64_t Address, const void *Decoder);
215 static DecodeStatus DecodeDoubleRegLoad(llvm::MCInst &Inst, unsigned Insn,
216 uint64_t Address, const void *Decoder);
217 static DecodeStatus DecodeDoubleRegStore(llvm::MCInst &Inst, unsigned Insn,
218 uint64_t Address, const void *Decoder);
219 static DecodeStatus DecodeLDRPreImm(llvm::MCInst &Inst, unsigned Insn,
220 uint64_t Address, const void *Decoder);
221 static DecodeStatus DecodeLDRPreReg(llvm::MCInst &Inst, unsigned Insn,
222 uint64_t Address, const void *Decoder);
223 static DecodeStatus DecodeSTRPreImm(llvm::MCInst &Inst, unsigned Insn,
224 uint64_t Address, const void *Decoder);
225 static DecodeStatus DecodeSTRPreReg(llvm::MCInst &Inst, unsigned Insn,
226 uint64_t Address, const void *Decoder);
227 static DecodeStatus DecodeVLD1LN(llvm::MCInst &Inst, unsigned Insn,
228 uint64_t Address, const void *Decoder);
229 static DecodeStatus DecodeVLD2LN(llvm::MCInst &Inst, unsigned Insn,
230 uint64_t Address, const void *Decoder);
231 static DecodeStatus DecodeVLD3LN(llvm::MCInst &Inst, unsigned Insn,
232 uint64_t Address, const void *Decoder);
233 static DecodeStatus DecodeVLD4LN(llvm::MCInst &Inst, unsigned Insn,
234 uint64_t Address, const void *Decoder);
235 static DecodeStatus DecodeVST1LN(llvm::MCInst &Inst, unsigned Insn,
236 uint64_t Address, const void *Decoder);
237 static DecodeStatus DecodeVST2LN(llvm::MCInst &Inst, unsigned Insn,
238 uint64_t Address, const void *Decoder);
239 static DecodeStatus DecodeVST3LN(llvm::MCInst &Inst, unsigned Insn,
240 uint64_t Address, const void *Decoder);
241 static DecodeStatus DecodeVST4LN(llvm::MCInst &Inst, unsigned Insn,
242 uint64_t Address, const void *Decoder);
243 static DecodeStatus DecodeVMOVSRR(llvm::MCInst &Inst, unsigned Insn,
244 uint64_t Address, const void *Decoder);
245 static DecodeStatus DecodeVMOVRRS(llvm::MCInst &Inst, unsigned Insn,
246 uint64_t Address, const void *Decoder);
248 static DecodeStatus DecodeThumbAddSpecialReg(llvm::MCInst &Inst, uint16_t Insn,
249 uint64_t Address, const void *Decoder);
250 static DecodeStatus DecodeThumbBROperand(llvm::MCInst &Inst, unsigned Val,
251 uint64_t Address, const void *Decoder);
252 static DecodeStatus DecodeT2BROperand(llvm::MCInst &Inst, unsigned Val,
253 uint64_t Address, const void *Decoder);
254 static DecodeStatus DecodeThumbCmpBROperand(llvm::MCInst &Inst, unsigned Val,
255 uint64_t Address, const void *Decoder);
256 static DecodeStatus DecodeThumbAddrModeRR(llvm::MCInst &Inst, unsigned Val,
257 uint64_t Address, const void *Decoder);
258 static DecodeStatus DecodeThumbAddrModeIS(llvm::MCInst &Inst, unsigned Val,
259 uint64_t Address, const void *Decoder);
260 static DecodeStatus DecodeThumbAddrModePC(llvm::MCInst &Inst, unsigned Val,
261 uint64_t Address, const void *Decoder);
262 static DecodeStatus DecodeThumbAddrModeSP(llvm::MCInst &Inst, unsigned Val,
263 uint64_t Address, const void *Decoder);
264 static DecodeStatus DecodeT2AddrModeSOReg(llvm::MCInst &Inst, unsigned Val,
265 uint64_t Address, const void *Decoder);
266 static DecodeStatus DecodeT2LoadShift(llvm::MCInst &Inst, unsigned Val,
267 uint64_t Address, const void *Decoder);
268 static DecodeStatus DecodeT2Imm8S4(llvm::MCInst &Inst, unsigned Val,
269 uint64_t Address, const void *Decoder);
270 static DecodeStatus DecodeT2AddrModeImm8s4(llvm::MCInst &Inst, unsigned Val,
271 uint64_t Address, const void *Decoder);
272 static DecodeStatus DecodeT2Imm8(llvm::MCInst &Inst, unsigned Val,
273 uint64_t Address, const void *Decoder);
274 static DecodeStatus DecodeT2AddrModeImm8(llvm::MCInst &Inst, unsigned Val,
275 uint64_t Address, const void *Decoder);
276 static DecodeStatus DecodeThumbAddSPImm(llvm::MCInst &Inst, uint16_t Val,
277 uint64_t Address, const void *Decoder);
278 static DecodeStatus DecodeThumbAddSPReg(llvm::MCInst &Inst, uint16_t Insn,
279 uint64_t Address, const void *Decoder);
280 static DecodeStatus DecodeThumbCPS(llvm::MCInst &Inst, uint16_t Insn,
281 uint64_t Address, const void *Decoder);
282 static DecodeStatus DecodeThumbBLXOffset(llvm::MCInst &Inst, unsigned Insn,
283 uint64_t Address, const void *Decoder);
284 static DecodeStatus DecodeT2AddrModeImm12(llvm::MCInst &Inst, unsigned Val,
285 uint64_t Address, const void *Decoder);
286 static DecodeStatus DecodeThumb2BCCInstruction(llvm::MCInst &Inst, unsigned Val,
287 uint64_t Address, const void *Decoder);
288 static DecodeStatus DecodeT2SOImm(llvm::MCInst &Inst, unsigned Val,
289 uint64_t Address, const void *Decoder);
290 static DecodeStatus DecodeThumbBCCTargetOperand(llvm::MCInst &Inst,unsigned Val,
291 uint64_t Address, const void *Decoder);
292 static DecodeStatus DecodeThumbBLTargetOperand(llvm::MCInst &Inst, unsigned Val,
293 uint64_t Address, const void *Decoder);
294 static DecodeStatus DecodeIT(llvm::MCInst &Inst, unsigned Val,
295 uint64_t Address, const void *Decoder);
297 #include "ARMGenDisassemblerTables.inc"
298 #include "ARMGenInstrInfo.inc"
299 #include "ARMGenEDInfo.inc"
301 static MCDisassembler *createARMDisassembler(const Target &T, const MCSubtargetInfo &STI) {
302 return new ARMDisassembler(STI);
305 static MCDisassembler *createThumbDisassembler(const Target &T, const MCSubtargetInfo &STI) {
306 return new ThumbDisassembler(STI);
309 EDInstInfo *ARMDisassembler::getEDInfo() const {
313 EDInstInfo *ThumbDisassembler::getEDInfo() const {
317 DecodeStatus ARMDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
318 const MemoryObject &Region,
320 raw_ostream &os) const {
323 assert(!(STI.getFeatureBits() & ARM::ModeThumb) &&
324 "Asked to disassemble an ARM instruction but Subtarget is in Thumb mode!");
326 // We want to read exactly 4 bytes of data.
327 if (Region.readBytes(Address, 4, (uint8_t*)bytes, NULL) == -1) {
329 return MCDisassembler::Fail;
332 // Encoded as a small-endian 32-bit word in the stream.
333 uint32_t insn = (bytes[3] << 24) |
338 // Calling the auto-generated decoder function.
339 DecodeStatus result = decodeARMInstruction32(MI, insn, Address, this, STI);
340 if (result != MCDisassembler::Fail) {
345 // Instructions that are shared between ARM and Thumb modes.
346 // FIXME: This shouldn't really exist. It's an artifact of the
347 // fact that we fail to encode a few instructions properly for Thumb.
349 result = decodeCommonInstruction32(MI, insn, Address, this, STI);
350 if (result != MCDisassembler::Fail) {
355 // VFP and NEON instructions, similarly, are shared between ARM
358 result = decodeVFPInstruction32(MI, insn, Address, this, STI);
359 if (result != MCDisassembler::Fail) {
365 result = decodeNEONDataInstruction32(MI, insn, Address, this, STI);
366 if (result != MCDisassembler::Fail) {
368 // Add a fake predicate operand, because we share these instruction
369 // definitions with Thumb2 where these instructions are predicable.
370 if (!DecodePredicateOperand(MI, 0xE, Address, this))
371 return MCDisassembler::Fail;
376 result = decodeNEONLoadStoreInstruction32(MI, insn, Address, this, STI);
377 if (result != MCDisassembler::Fail) {
379 // Add a fake predicate operand, because we share these instruction
380 // definitions with Thumb2 where these instructions are predicable.
381 if (!DecodePredicateOperand(MI, 0xE, Address, this))
382 return MCDisassembler::Fail;
387 result = decodeNEONDupInstruction32(MI, insn, Address, this, STI);
388 if (result != MCDisassembler::Fail) {
390 // Add a fake predicate operand, because we share these instruction
391 // definitions with Thumb2 where these instructions are predicable.
392 if (!DecodePredicateOperand(MI, 0xE, Address, this))
393 return MCDisassembler::Fail;
400 return MCDisassembler::Fail;
404 extern MCInstrDesc ARMInsts[];
407 // Thumb1 instructions don't have explicit S bits. Rather, they
408 // implicitly set CPSR. Since it's not represented in the encoding, the
409 // auto-generated decoder won't inject the CPSR operand. We need to fix
410 // that as a post-pass.
411 static void AddThumb1SBit(MCInst &MI, bool InITBlock) {
412 const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
413 unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
414 MCInst::iterator I = MI.begin();
415 for (unsigned i = 0; i < NumOps; ++i, ++I) {
416 if (I == MI.end()) break;
417 if (OpInfo[i].isOptionalDef() && OpInfo[i].RegClass == ARM::CCRRegClassID) {
418 if (i > 0 && OpInfo[i-1].isPredicate()) continue;
419 MI.insert(I, MCOperand::CreateReg(InITBlock ? 0 : ARM::CPSR));
424 MI.insert(I, MCOperand::CreateReg(InITBlock ? 0 : ARM::CPSR));
427 // Most Thumb instructions don't have explicit predicates in the
428 // encoding, but rather get their predicates from IT context. We need
429 // to fix up the predicate operands using this context information as a
431 void ThumbDisassembler::AddThumbPredicate(MCInst &MI) const {
432 // A few instructions actually have predicates encoded in them. Don't
433 // try to overwrite it if we're seeing one of those.
434 switch (MI.getOpcode()) {
442 // If we're in an IT block, base the predicate on that. Otherwise,
443 // assume a predicate of AL.
445 if (!ITBlock.empty()) {
453 const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
454 unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
455 MCInst::iterator I = MI.begin();
456 for (unsigned i = 0; i < NumOps; ++i, ++I) {
457 if (I == MI.end()) break;
458 if (OpInfo[i].isPredicate()) {
459 I = MI.insert(I, MCOperand::CreateImm(CC));
462 MI.insert(I, MCOperand::CreateReg(0));
464 MI.insert(I, MCOperand::CreateReg(ARM::CPSR));
469 I = MI.insert(I, MCOperand::CreateImm(CC));
472 MI.insert(I, MCOperand::CreateReg(0));
474 MI.insert(I, MCOperand::CreateReg(ARM::CPSR));
477 // Thumb VFP instructions are a special case. Because we share their
478 // encodings between ARM and Thumb modes, and they are predicable in ARM
479 // mode, the auto-generated decoder will give them an (incorrect)
480 // predicate operand. We need to rewrite these operands based on the IT
481 // context as a post-pass.
482 void ThumbDisassembler::UpdateThumbVFPPredicate(MCInst &MI) const {
484 if (!ITBlock.empty()) {
490 const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
491 MCInst::iterator I = MI.begin();
492 unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
493 for (unsigned i = 0; i < NumOps; ++i, ++I) {
494 if (OpInfo[i].isPredicate() ) {
500 I->setReg(ARM::CPSR);
506 DecodeStatus ThumbDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
507 const MemoryObject &Region,
509 raw_ostream &os) const {
512 assert((STI.getFeatureBits() & ARM::ModeThumb) &&
513 "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
515 // We want to read exactly 2 bytes of data.
516 if (Region.readBytes(Address, 2, (uint8_t*)bytes, NULL) == -1) {
518 return MCDisassembler::Fail;
521 uint16_t insn16 = (bytes[1] << 8) | bytes[0];
522 DecodeStatus result = decodeThumbInstruction16(MI, insn16, Address, this, STI);
523 if (result != MCDisassembler::Fail) {
525 AddThumbPredicate(MI);
530 result = decodeThumbSBitInstruction16(MI, insn16, Address, this, STI);
533 bool InITBlock = !ITBlock.empty();
534 AddThumbPredicate(MI);
535 AddThumb1SBit(MI, InITBlock);
540 result = decodeThumb2Instruction16(MI, insn16, Address, this, STI);
541 if (result != MCDisassembler::Fail) {
543 AddThumbPredicate(MI);
545 // If we find an IT instruction, we need to parse its condition
546 // code and mask operands so that we can apply them correctly
547 // to the subsequent instructions.
548 if (MI.getOpcode() == ARM::t2IT) {
549 // (3 - the number of trailing zeros) is the number of then / else.
550 unsigned firstcond = MI.getOperand(0).getImm();
551 unsigned Mask = MI.getOperand(1).getImm();
552 unsigned CondBit0 = Mask >> 4 & 1;
553 unsigned NumTZ = CountTrailingZeros_32(Mask);
554 assert(NumTZ <= 3 && "Invalid IT mask!");
555 for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) {
556 bool T = ((Mask >> Pos) & 1) == CondBit0;
558 ITBlock.insert(ITBlock.begin(), firstcond);
560 ITBlock.insert(ITBlock.begin(), firstcond ^ 1);
563 ITBlock.push_back(firstcond);
569 // We want to read exactly 4 bytes of data.
570 if (Region.readBytes(Address, 4, (uint8_t*)bytes, NULL) == -1) {
572 return MCDisassembler::Fail;
575 uint32_t insn32 = (bytes[3] << 8) |
580 result = decodeThumbInstruction32(MI, insn32, Address, this, STI);
581 if (result != MCDisassembler::Fail) {
583 bool InITBlock = ITBlock.size();
584 AddThumbPredicate(MI);
585 AddThumb1SBit(MI, InITBlock);
590 result = decodeThumb2Instruction32(MI, insn32, Address, this, STI);
591 if (result != MCDisassembler::Fail) {
593 AddThumbPredicate(MI);
598 result = decodeCommonInstruction32(MI, insn32, Address, this, STI);
599 if (result != MCDisassembler::Fail) {
601 AddThumbPredicate(MI);
606 result = decodeVFPInstruction32(MI, insn32, Address, this, STI);
607 if (result != MCDisassembler::Fail) {
609 UpdateThumbVFPPredicate(MI);
614 result = decodeNEONDupInstruction32(MI, insn32, Address, this, STI);
615 if (result != MCDisassembler::Fail) {
617 AddThumbPredicate(MI);
621 if (fieldFromInstruction32(insn32, 24, 8) == 0xF9) {
623 uint32_t NEONLdStInsn = insn32;
624 NEONLdStInsn &= 0xF0FFFFFF;
625 NEONLdStInsn |= 0x04000000;
626 result = decodeNEONLoadStoreInstruction32(MI, NEONLdStInsn, Address, this, STI);
627 if (result != MCDisassembler::Fail) {
629 AddThumbPredicate(MI);
634 if (fieldFromInstruction32(insn32, 24, 4) == 0xF) {
636 uint32_t NEONDataInsn = insn32;
637 NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24
638 NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4; // Move bit 28 to bit 24
639 NEONDataInsn |= 0x12000000; // Set bits 28 and 25
640 result = decodeNEONDataInstruction32(MI, NEONDataInsn, Address, this, STI);
641 if (result != MCDisassembler::Fail) {
643 AddThumbPredicate(MI);
649 return MCDisassembler::Fail;
653 extern "C" void LLVMInitializeARMDisassembler() {
654 TargetRegistry::RegisterMCDisassembler(TheARMTarget,
655 createARMDisassembler);
656 TargetRegistry::RegisterMCDisassembler(TheThumbTarget,
657 createThumbDisassembler);
660 static const unsigned GPRDecoderTable[] = {
661 ARM::R0, ARM::R1, ARM::R2, ARM::R3,
662 ARM::R4, ARM::R5, ARM::R6, ARM::R7,
663 ARM::R8, ARM::R9, ARM::R10, ARM::R11,
664 ARM::R12, ARM::SP, ARM::LR, ARM::PC
667 static DecodeStatus DecodeGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
668 uint64_t Address, const void *Decoder) {
670 return MCDisassembler::Fail;
672 unsigned Register = GPRDecoderTable[RegNo];
673 Inst.addOperand(MCOperand::CreateReg(Register));
674 return MCDisassembler::Success;
678 DecodeGPRnopcRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
679 uint64_t Address, const void *Decoder) {
680 if (RegNo == 15) return MCDisassembler::Fail;
681 return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
684 static DecodeStatus DecodetGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
685 uint64_t Address, const void *Decoder) {
687 return MCDisassembler::Fail;
688 return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
691 static DecodeStatus DecodetcGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
692 uint64_t Address, const void *Decoder) {
693 unsigned Register = 0;
714 return MCDisassembler::Fail;
717 Inst.addOperand(MCOperand::CreateReg(Register));
718 return MCDisassembler::Success;
721 static DecodeStatus DecoderGPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
722 uint64_t Address, const void *Decoder) {
723 if (RegNo == 13 || RegNo == 15) return MCDisassembler::Fail;
724 return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
727 static const unsigned SPRDecoderTable[] = {
728 ARM::S0, ARM::S1, ARM::S2, ARM::S3,
729 ARM::S4, ARM::S5, ARM::S6, ARM::S7,
730 ARM::S8, ARM::S9, ARM::S10, ARM::S11,
731 ARM::S12, ARM::S13, ARM::S14, ARM::S15,
732 ARM::S16, ARM::S17, ARM::S18, ARM::S19,
733 ARM::S20, ARM::S21, ARM::S22, ARM::S23,
734 ARM::S24, ARM::S25, ARM::S26, ARM::S27,
735 ARM::S28, ARM::S29, ARM::S30, ARM::S31
738 static DecodeStatus DecodeSPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
739 uint64_t Address, const void *Decoder) {
741 return MCDisassembler::Fail;
743 unsigned Register = SPRDecoderTable[RegNo];
744 Inst.addOperand(MCOperand::CreateReg(Register));
745 return MCDisassembler::Success;
748 static const unsigned DPRDecoderTable[] = {
749 ARM::D0, ARM::D1, ARM::D2, ARM::D3,
750 ARM::D4, ARM::D5, ARM::D6, ARM::D7,
751 ARM::D8, ARM::D9, ARM::D10, ARM::D11,
752 ARM::D12, ARM::D13, ARM::D14, ARM::D15,
753 ARM::D16, ARM::D17, ARM::D18, ARM::D19,
754 ARM::D20, ARM::D21, ARM::D22, ARM::D23,
755 ARM::D24, ARM::D25, ARM::D26, ARM::D27,
756 ARM::D28, ARM::D29, ARM::D30, ARM::D31
759 static DecodeStatus DecodeDPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
760 uint64_t Address, const void *Decoder) {
762 return MCDisassembler::Fail;
764 unsigned Register = DPRDecoderTable[RegNo];
765 Inst.addOperand(MCOperand::CreateReg(Register));
766 return MCDisassembler::Success;
769 static DecodeStatus DecodeDPR_8RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
770 uint64_t Address, const void *Decoder) {
772 return MCDisassembler::Fail;
773 return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
777 DecodeDPR_VFP2RegisterClass(llvm::MCInst &Inst, unsigned RegNo,
778 uint64_t Address, const void *Decoder) {
780 return MCDisassembler::Fail;
781 return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
784 static const unsigned QPRDecoderTable[] = {
785 ARM::Q0, ARM::Q1, ARM::Q2, ARM::Q3,
786 ARM::Q4, ARM::Q5, ARM::Q6, ARM::Q7,
787 ARM::Q8, ARM::Q9, ARM::Q10, ARM::Q11,
788 ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
792 static DecodeStatus DecodeQPRRegisterClass(llvm::MCInst &Inst, unsigned RegNo,
793 uint64_t Address, const void *Decoder) {
795 return MCDisassembler::Fail;
798 unsigned Register = QPRDecoderTable[RegNo];
799 Inst.addOperand(MCOperand::CreateReg(Register));
800 return MCDisassembler::Success;
803 static DecodeStatus DecodePredicateOperand(llvm::MCInst &Inst, unsigned Val,
804 uint64_t Address, const void *Decoder) {
805 if (Val == 0xF) return MCDisassembler::Fail;
806 // AL predicate is not allowed on Thumb1 branches.
807 if (Inst.getOpcode() == ARM::tBcc && Val == 0xE)
808 return MCDisassembler::Fail;
809 Inst.addOperand(MCOperand::CreateImm(Val));
810 if (Val == ARMCC::AL) {
811 Inst.addOperand(MCOperand::CreateReg(0));
813 Inst.addOperand(MCOperand::CreateReg(ARM::CPSR));
814 return MCDisassembler::Success;
817 static DecodeStatus DecodeCCOutOperand(llvm::MCInst &Inst, unsigned Val,
818 uint64_t Address, const void *Decoder) {
820 Inst.addOperand(MCOperand::CreateReg(ARM::CPSR));
822 Inst.addOperand(MCOperand::CreateReg(0));
823 return MCDisassembler::Success;
826 static DecodeStatus DecodeSOImmOperand(llvm::MCInst &Inst, unsigned Val,
827 uint64_t Address, const void *Decoder) {
828 uint32_t imm = Val & 0xFF;
829 uint32_t rot = (Val & 0xF00) >> 7;
830 uint32_t rot_imm = (imm >> rot) | (imm << (32-rot));
831 Inst.addOperand(MCOperand::CreateImm(rot_imm));
832 return MCDisassembler::Success;
835 static DecodeStatus DecodeSORegImmOperand(llvm::MCInst &Inst, unsigned Val,
836 uint64_t Address, const void *Decoder) {
837 DecodeStatus S = MCDisassembler::Success;
839 unsigned Rm = fieldFromInstruction32(Val, 0, 4);
840 unsigned type = fieldFromInstruction32(Val, 5, 2);
841 unsigned imm = fieldFromInstruction32(Val, 7, 5);
843 // Register-immediate
844 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
845 return MCDisassembler::Fail;
847 ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
863 if (Shift == ARM_AM::ror && imm == 0)
866 unsigned Op = Shift | (imm << 3);
867 Inst.addOperand(MCOperand::CreateImm(Op));
872 static DecodeStatus DecodeSORegRegOperand(llvm::MCInst &Inst, unsigned Val,
873 uint64_t Address, const void *Decoder) {
874 DecodeStatus S = MCDisassembler::Success;
876 unsigned Rm = fieldFromInstruction32(Val, 0, 4);
877 unsigned type = fieldFromInstruction32(Val, 5, 2);
878 unsigned Rs = fieldFromInstruction32(Val, 8, 4);
881 if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
882 return MCDisassembler::Fail;
883 if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder)))
884 return MCDisassembler::Fail;
886 ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
902 Inst.addOperand(MCOperand::CreateImm(Shift));
907 static DecodeStatus DecodeRegListOperand(llvm::MCInst &Inst, unsigned Val,
908 uint64_t Address, const void *Decoder) {
909 DecodeStatus S = MCDisassembler::Success;
911 // Empty register lists are not allowed.
912 if (CountPopulation_32(Val) == 0) return MCDisassembler::Fail;
913 for (unsigned i = 0; i < 16; ++i) {
914 if (Val & (1 << i)) {
915 if (!Check(S, DecodeGPRRegisterClass(Inst, i, Address, Decoder)))
916 return MCDisassembler::Fail;
923 static DecodeStatus DecodeSPRRegListOperand(llvm::MCInst &Inst, unsigned Val,
924 uint64_t Address, const void *Decoder) {
925 DecodeStatus S = MCDisassembler::Success;
927 unsigned Vd = fieldFromInstruction32(Val, 8, 4);
928 unsigned regs = Val & 0xFF;
930 if (!Check(S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder)))
931 return MCDisassembler::Fail;
932 for (unsigned i = 0; i < (regs - 1); ++i) {
933 if (!Check(S, DecodeSPRRegisterClass(Inst, ++Vd, Address, Decoder)))
934 return MCDisassembler::Fail;
940 static DecodeStatus DecodeDPRRegListOperand(llvm::MCInst &Inst, unsigned Val,
941 uint64_t Address, const void *Decoder) {
942 DecodeStatus S = MCDisassembler::Success;
944 unsigned Vd = fieldFromInstruction32(Val, 8, 4);
945 unsigned regs = (Val & 0xFF) / 2;
947 if (!Check(S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
948 return MCDisassembler::Fail;
949 for (unsigned i = 0; i < (regs - 1); ++i) {
950 if (!Check(S, DecodeDPRRegisterClass(Inst, ++Vd, Address, Decoder)))
951 return MCDisassembler::Fail;
957 static DecodeStatus DecodeBitfieldMaskOperand(llvm::MCInst &Inst, unsigned Val,
958 uint64_t Address, const void *Decoder) {
959 // This operand encodes a mask of contiguous zeros between a specified MSB
960 // and LSB. To decode it, we create the mask of all bits MSB-and-lower,
961 // the mask of all bits LSB-and-lower, and then xor them to create
962 // the mask of that's all ones on [msb, lsb]. Finally we not it to
963 // create the final mask.
964 unsigned msb = fieldFromInstruction32(Val, 5, 5);
965 unsigned lsb = fieldFromInstruction32(Val, 0, 5);
966 uint32_t msb_mask = (1 << (msb+1)) - 1;
967 uint32_t lsb_mask = (1 << lsb) - 1;
968 Inst.addOperand(MCOperand::CreateImm(~(msb_mask ^ lsb_mask)));
969 return MCDisassembler::Success;
972 static DecodeStatus DecodeCopMemInstruction(llvm::MCInst &Inst, unsigned Insn,
973 uint64_t Address, const void *Decoder) {
974 DecodeStatus S = MCDisassembler::Success;
976 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
977 unsigned CRd = fieldFromInstruction32(Insn, 12, 4);
978 unsigned coproc = fieldFromInstruction32(Insn, 8, 4);
979 unsigned imm = fieldFromInstruction32(Insn, 0, 8);
980 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
981 unsigned U = fieldFromInstruction32(Insn, 23, 1);
983 switch (Inst.getOpcode()) {
984 case ARM::LDC_OFFSET:
987 case ARM::LDC_OPTION:
988 case ARM::LDCL_OFFSET:
991 case ARM::LDCL_OPTION:
992 case ARM::STC_OFFSET:
995 case ARM::STC_OPTION:
996 case ARM::STCL_OFFSET:
999 case ARM::STCL_OPTION:
1000 case ARM::t2LDC_OFFSET:
1001 case ARM::t2LDC_PRE:
1002 case ARM::t2LDC_POST:
1003 case ARM::t2LDC_OPTION:
1004 case ARM::t2LDCL_OFFSET:
1005 case ARM::t2LDCL_PRE:
1006 case ARM::t2LDCL_POST:
1007 case ARM::t2LDCL_OPTION:
1008 case ARM::t2STC_OFFSET:
1009 case ARM::t2STC_PRE:
1010 case ARM::t2STC_POST:
1011 case ARM::t2STC_OPTION:
1012 case ARM::t2STCL_OFFSET:
1013 case ARM::t2STCL_PRE:
1014 case ARM::t2STCL_POST:
1015 case ARM::t2STCL_OPTION:
1016 if (coproc == 0xA || coproc == 0xB)
1017 return MCDisassembler::Fail;
1023 Inst.addOperand(MCOperand::CreateImm(coproc));
1024 Inst.addOperand(MCOperand::CreateImm(CRd));
1025 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1026 return MCDisassembler::Fail;
1027 switch (Inst.getOpcode()) {
1028 case ARM::LDC_OPTION:
1029 case ARM::LDCL_OPTION:
1030 case ARM::LDC2_OPTION:
1031 case ARM::LDC2L_OPTION:
1032 case ARM::STC_OPTION:
1033 case ARM::STCL_OPTION:
1034 case ARM::STC2_OPTION:
1035 case ARM::STC2L_OPTION:
1036 case ARM::LDCL_POST:
1037 case ARM::STCL_POST:
1038 case ARM::LDC2L_POST:
1039 case ARM::STC2L_POST:
1040 case ARM::t2LDC_OPTION:
1041 case ARM::t2LDCL_OPTION:
1042 case ARM::t2STC_OPTION:
1043 case ARM::t2STCL_OPTION:
1044 case ARM::t2LDCL_POST:
1045 case ARM::t2STCL_POST:
1048 Inst.addOperand(MCOperand::CreateReg(0));
1052 unsigned P = fieldFromInstruction32(Insn, 24, 1);
1053 unsigned W = fieldFromInstruction32(Insn, 21, 1);
1055 bool writeback = (P == 0) || (W == 1);
1056 unsigned idx_mode = 0;
1058 idx_mode = ARMII::IndexModePre;
1059 else if (!P && writeback)
1060 idx_mode = ARMII::IndexModePost;
1062 switch (Inst.getOpcode()) {
1063 case ARM::LDCL_POST:
1064 case ARM::STCL_POST:
1065 case ARM::t2LDCL_POST:
1066 case ARM::t2STCL_POST:
1067 case ARM::LDC2L_POST:
1068 case ARM::STC2L_POST:
1070 case ARM::LDC_OPTION:
1071 case ARM::LDCL_OPTION:
1072 case ARM::LDC2_OPTION:
1073 case ARM::LDC2L_OPTION:
1074 case ARM::STC_OPTION:
1075 case ARM::STCL_OPTION:
1076 case ARM::STC2_OPTION:
1077 case ARM::STC2L_OPTION:
1078 case ARM::t2LDC_OPTION:
1079 case ARM::t2LDCL_OPTION:
1080 case ARM::t2STC_OPTION:
1081 case ARM::t2STCL_OPTION:
1082 Inst.addOperand(MCOperand::CreateImm(imm));
1086 Inst.addOperand(MCOperand::CreateImm(
1087 ARM_AM::getAM2Opc(ARM_AM::add, imm, ARM_AM::lsl, idx_mode)));
1089 Inst.addOperand(MCOperand::CreateImm(
1090 ARM_AM::getAM2Opc(ARM_AM::sub, imm, ARM_AM::lsl, idx_mode)));
1094 switch (Inst.getOpcode()) {
1095 case ARM::LDC_OFFSET:
1098 case ARM::LDC_OPTION:
1099 case ARM::LDCL_OFFSET:
1101 case ARM::LDCL_POST:
1102 case ARM::LDCL_OPTION:
1103 case ARM::STC_OFFSET:
1106 case ARM::STC_OPTION:
1107 case ARM::STCL_OFFSET:
1109 case ARM::STCL_POST:
1110 case ARM::STCL_OPTION:
1111 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1112 return MCDisassembler::Fail;
1122 DecodeAddrMode2IdxInstruction(llvm::MCInst &Inst, unsigned Insn,
1123 uint64_t Address, const void *Decoder) {
1124 DecodeStatus S = MCDisassembler::Success;
1126 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1127 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
1128 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
1129 unsigned imm = fieldFromInstruction32(Insn, 0, 12);
1130 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1131 unsigned reg = fieldFromInstruction32(Insn, 25, 1);
1132 unsigned P = fieldFromInstruction32(Insn, 24, 1);
1133 unsigned W = fieldFromInstruction32(Insn, 21, 1);
1135 // On stores, the writeback operand precedes Rt.
1136 switch (Inst.getOpcode()) {
1137 case ARM::STR_POST_IMM:
1138 case ARM::STR_POST_REG:
1139 case ARM::STRB_POST_IMM:
1140 case ARM::STRB_POST_REG:
1141 case ARM::STRT_POST_REG:
1142 case ARM::STRT_POST_IMM:
1143 case ARM::STRBT_POST_REG:
1144 case ARM::STRBT_POST_IMM:
1145 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1146 return MCDisassembler::Fail;
1152 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1153 return MCDisassembler::Fail;
1155 // On loads, the writeback operand comes after Rt.
1156 switch (Inst.getOpcode()) {
1157 case ARM::LDR_POST_IMM:
1158 case ARM::LDR_POST_REG:
1159 case ARM::LDRB_POST_IMM:
1160 case ARM::LDRB_POST_REG:
1161 case ARM::LDRBT_POST_REG:
1162 case ARM::LDRBT_POST_IMM:
1163 case ARM::LDRT_POST_REG:
1164 case ARM::LDRT_POST_IMM:
1165 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1166 return MCDisassembler::Fail;
1172 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1173 return MCDisassembler::Fail;
1175 ARM_AM::AddrOpc Op = ARM_AM::add;
1176 if (!fieldFromInstruction32(Insn, 23, 1))
1179 bool writeback = (P == 0) || (W == 1);
1180 unsigned idx_mode = 0;
1182 idx_mode = ARMII::IndexModePre;
1183 else if (!P && writeback)
1184 idx_mode = ARMII::IndexModePost;
1186 if (writeback && (Rn == 15 || Rn == Rt))
1187 S = MCDisassembler::SoftFail; // UNPREDICTABLE
1190 if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1191 return MCDisassembler::Fail;
1192 ARM_AM::ShiftOpc Opc = ARM_AM::lsl;
1193 switch( fieldFromInstruction32(Insn, 5, 2)) {
1207 return MCDisassembler::Fail;
1209 unsigned amt = fieldFromInstruction32(Insn, 7, 5);
1210 unsigned imm = ARM_AM::getAM2Opc(Op, amt, Opc, idx_mode);
1212 Inst.addOperand(MCOperand::CreateImm(imm));
1214 Inst.addOperand(MCOperand::CreateReg(0));
1215 unsigned tmp = ARM_AM::getAM2Opc(Op, imm, ARM_AM::lsl, idx_mode);
1216 Inst.addOperand(MCOperand::CreateImm(tmp));
1219 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1220 return MCDisassembler::Fail;
1225 static DecodeStatus DecodeSORegMemOperand(llvm::MCInst &Inst, unsigned Val,
1226 uint64_t Address, const void *Decoder) {
1227 DecodeStatus S = MCDisassembler::Success;
1229 unsigned Rn = fieldFromInstruction32(Val, 13, 4);
1230 unsigned Rm = fieldFromInstruction32(Val, 0, 4);
1231 unsigned type = fieldFromInstruction32(Val, 5, 2);
1232 unsigned imm = fieldFromInstruction32(Val, 7, 5);
1233 unsigned U = fieldFromInstruction32(Val, 12, 1);
1235 ARM_AM::ShiftOpc ShOp = ARM_AM::lsl;
1251 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1252 return MCDisassembler::Fail;
1253 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1254 return MCDisassembler::Fail;
1257 shift = ARM_AM::getAM2Opc(ARM_AM::add, imm, ShOp);
1259 shift = ARM_AM::getAM2Opc(ARM_AM::sub, imm, ShOp);
1260 Inst.addOperand(MCOperand::CreateImm(shift));
1266 DecodeAddrMode3Instruction(llvm::MCInst &Inst, unsigned Insn,
1267 uint64_t Address, const void *Decoder) {
1268 DecodeStatus S = MCDisassembler::Success;
1270 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
1271 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1272 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
1273 unsigned type = fieldFromInstruction32(Insn, 22, 1);
1274 unsigned imm = fieldFromInstruction32(Insn, 8, 4);
1275 unsigned U = ((~fieldFromInstruction32(Insn, 23, 1)) & 1) << 8;
1276 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1277 unsigned W = fieldFromInstruction32(Insn, 21, 1);
1278 unsigned P = fieldFromInstruction32(Insn, 24, 1);
1280 bool writeback = (W == 1) | (P == 0);
1282 // For {LD,ST}RD, Rt must be even, else undefined.
1283 switch (Inst.getOpcode()) {
1286 case ARM::STRD_POST:
1289 case ARM::LDRD_POST:
1290 if (Rt & 0x1) return MCDisassembler::Fail;
1296 if (writeback) { // Writeback
1298 U |= ARMII::IndexModePre << 9;
1300 U |= ARMII::IndexModePost << 9;
1302 // On stores, the writeback operand precedes Rt.
1303 switch (Inst.getOpcode()) {
1306 case ARM::STRD_POST:
1309 case ARM::STRH_POST:
1310 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1311 return MCDisassembler::Fail;
1318 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1319 return MCDisassembler::Fail;
1320 switch (Inst.getOpcode()) {
1323 case ARM::STRD_POST:
1326 case ARM::LDRD_POST:
1327 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
1328 return MCDisassembler::Fail;
1335 // On loads, the writeback operand comes after Rt.
1336 switch (Inst.getOpcode()) {
1339 case ARM::LDRD_POST:
1342 case ARM::LDRH_POST:
1344 case ARM::LDRSH_PRE:
1345 case ARM::LDRSH_POST:
1347 case ARM::LDRSB_PRE:
1348 case ARM::LDRSB_POST:
1351 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1352 return MCDisassembler::Fail;
1359 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1360 return MCDisassembler::Fail;
1363 Inst.addOperand(MCOperand::CreateReg(0));
1364 Inst.addOperand(MCOperand::CreateImm(U | (imm << 4) | Rm));
1366 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1367 return MCDisassembler::Fail;
1368 Inst.addOperand(MCOperand::CreateImm(U));
1371 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1372 return MCDisassembler::Fail;
1377 static DecodeStatus DecodeRFEInstruction(llvm::MCInst &Inst, unsigned Insn,
1378 uint64_t Address, const void *Decoder) {
1379 DecodeStatus S = MCDisassembler::Success;
1381 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1382 unsigned mode = fieldFromInstruction32(Insn, 23, 2);
1399 Inst.addOperand(MCOperand::CreateImm(mode));
1400 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1401 return MCDisassembler::Fail;
1406 static DecodeStatus DecodeMemMultipleWritebackInstruction(llvm::MCInst &Inst,
1408 uint64_t Address, const void *Decoder) {
1409 DecodeStatus S = MCDisassembler::Success;
1411 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1412 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1413 unsigned reglist = fieldFromInstruction32(Insn, 0, 16);
1416 switch (Inst.getOpcode()) {
1418 Inst.setOpcode(ARM::RFEDA);
1420 case ARM::LDMDA_UPD:
1421 Inst.setOpcode(ARM::RFEDA_UPD);
1424 Inst.setOpcode(ARM::RFEDB);
1426 case ARM::LDMDB_UPD:
1427 Inst.setOpcode(ARM::RFEDB_UPD);
1430 Inst.setOpcode(ARM::RFEIA);
1432 case ARM::LDMIA_UPD:
1433 Inst.setOpcode(ARM::RFEIA_UPD);
1436 Inst.setOpcode(ARM::RFEIB);
1438 case ARM::LDMIB_UPD:
1439 Inst.setOpcode(ARM::RFEIB_UPD);
1442 Inst.setOpcode(ARM::SRSDA);
1444 case ARM::STMDA_UPD:
1445 Inst.setOpcode(ARM::SRSDA_UPD);
1448 Inst.setOpcode(ARM::SRSDB);
1450 case ARM::STMDB_UPD:
1451 Inst.setOpcode(ARM::SRSDB_UPD);
1454 Inst.setOpcode(ARM::SRSIA);
1456 case ARM::STMIA_UPD:
1457 Inst.setOpcode(ARM::SRSIA_UPD);
1460 Inst.setOpcode(ARM::SRSIB);
1462 case ARM::STMIB_UPD:
1463 Inst.setOpcode(ARM::SRSIB_UPD);
1466 if (!Check(S, MCDisassembler::Fail)) return MCDisassembler::Fail;
1469 // For stores (which become SRS's, the only operand is the mode.
1470 if (fieldFromInstruction32(Insn, 20, 1) == 0) {
1472 MCOperand::CreateImm(fieldFromInstruction32(Insn, 0, 4)));
1476 return DecodeRFEInstruction(Inst, Insn, Address, Decoder);
1479 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1480 return MCDisassembler::Fail;
1481 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1482 return MCDisassembler::Fail; // Tied
1483 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1484 return MCDisassembler::Fail;
1485 if (!Check(S, DecodeRegListOperand(Inst, reglist, Address, Decoder)))
1486 return MCDisassembler::Fail;
1491 static DecodeStatus DecodeCPSInstruction(llvm::MCInst &Inst, unsigned Insn,
1492 uint64_t Address, const void *Decoder) {
1493 unsigned imod = fieldFromInstruction32(Insn, 18, 2);
1494 unsigned M = fieldFromInstruction32(Insn, 17, 1);
1495 unsigned iflags = fieldFromInstruction32(Insn, 6, 3);
1496 unsigned mode = fieldFromInstruction32(Insn, 0, 5);
1498 DecodeStatus S = MCDisassembler::Success;
1500 // imod == '01' --> UNPREDICTABLE
1501 // NOTE: Even though this is technically UNPREDICTABLE, we choose to
1502 // return failure here. The '01' imod value is unprintable, so there's
1503 // nothing useful we could do even if we returned UNPREDICTABLE.
1505 if (imod == 1) return MCDisassembler::Fail;
1508 Inst.setOpcode(ARM::CPS3p);
1509 Inst.addOperand(MCOperand::CreateImm(imod));
1510 Inst.addOperand(MCOperand::CreateImm(iflags));
1511 Inst.addOperand(MCOperand::CreateImm(mode));
1512 } else if (imod && !M) {
1513 Inst.setOpcode(ARM::CPS2p);
1514 Inst.addOperand(MCOperand::CreateImm(imod));
1515 Inst.addOperand(MCOperand::CreateImm(iflags));
1516 if (mode) S = MCDisassembler::SoftFail;
1517 } else if (!imod && M) {
1518 Inst.setOpcode(ARM::CPS1p);
1519 Inst.addOperand(MCOperand::CreateImm(mode));
1520 if (iflags) S = MCDisassembler::SoftFail;
1522 // imod == '00' && M == '0' --> UNPREDICTABLE
1523 Inst.setOpcode(ARM::CPS1p);
1524 Inst.addOperand(MCOperand::CreateImm(mode));
1525 S = MCDisassembler::SoftFail;
1531 static DecodeStatus DecodeT2CPSInstruction(llvm::MCInst &Inst, unsigned Insn,
1532 uint64_t Address, const void *Decoder) {
1533 unsigned imod = fieldFromInstruction32(Insn, 9, 2);
1534 unsigned M = fieldFromInstruction32(Insn, 8, 1);
1535 unsigned iflags = fieldFromInstruction32(Insn, 5, 3);
1536 unsigned mode = fieldFromInstruction32(Insn, 0, 5);
1538 DecodeStatus S = MCDisassembler::Success;
1540 // imod == '01' --> UNPREDICTABLE
1541 // NOTE: Even though this is technically UNPREDICTABLE, we choose to
1542 // return failure here. The '01' imod value is unprintable, so there's
1543 // nothing useful we could do even if we returned UNPREDICTABLE.
1545 if (imod == 1) return MCDisassembler::Fail;
1548 Inst.setOpcode(ARM::t2CPS3p);
1549 Inst.addOperand(MCOperand::CreateImm(imod));
1550 Inst.addOperand(MCOperand::CreateImm(iflags));
1551 Inst.addOperand(MCOperand::CreateImm(mode));
1552 } else if (imod && !M) {
1553 Inst.setOpcode(ARM::t2CPS2p);
1554 Inst.addOperand(MCOperand::CreateImm(imod));
1555 Inst.addOperand(MCOperand::CreateImm(iflags));
1556 if (mode) S = MCDisassembler::SoftFail;
1557 } else if (!imod && M) {
1558 Inst.setOpcode(ARM::t2CPS1p);
1559 Inst.addOperand(MCOperand::CreateImm(mode));
1560 if (iflags) S = MCDisassembler::SoftFail;
1562 // imod == '00' && M == '0' --> UNPREDICTABLE
1563 Inst.setOpcode(ARM::t2CPS1p);
1564 Inst.addOperand(MCOperand::CreateImm(mode));
1565 S = MCDisassembler::SoftFail;
1572 static DecodeStatus DecodeSMLAInstruction(llvm::MCInst &Inst, unsigned Insn,
1573 uint64_t Address, const void *Decoder) {
1574 DecodeStatus S = MCDisassembler::Success;
1576 unsigned Rd = fieldFromInstruction32(Insn, 16, 4);
1577 unsigned Rn = fieldFromInstruction32(Insn, 0, 4);
1578 unsigned Rm = fieldFromInstruction32(Insn, 8, 4);
1579 unsigned Ra = fieldFromInstruction32(Insn, 12, 4);
1580 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1583 return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
1585 if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
1586 return MCDisassembler::Fail;
1587 if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
1588 return MCDisassembler::Fail;
1589 if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1590 return MCDisassembler::Fail;
1591 if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder)))
1592 return MCDisassembler::Fail;
1594 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1595 return MCDisassembler::Fail;
1600 static DecodeStatus DecodeAddrModeImm12Operand(llvm::MCInst &Inst, unsigned Val,
1601 uint64_t Address, const void *Decoder) {
1602 DecodeStatus S = MCDisassembler::Success;
1604 unsigned add = fieldFromInstruction32(Val, 12, 1);
1605 unsigned imm = fieldFromInstruction32(Val, 0, 12);
1606 unsigned Rn = fieldFromInstruction32(Val, 13, 4);
1608 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1609 return MCDisassembler::Fail;
1611 if (!add) imm *= -1;
1612 if (imm == 0 && !add) imm = INT32_MIN;
1613 Inst.addOperand(MCOperand::CreateImm(imm));
1618 static DecodeStatus DecodeAddrMode5Operand(llvm::MCInst &Inst, unsigned Val,
1619 uint64_t Address, const void *Decoder) {
1620 DecodeStatus S = MCDisassembler::Success;
1622 unsigned Rn = fieldFromInstruction32(Val, 9, 4);
1623 unsigned U = fieldFromInstruction32(Val, 8, 1);
1624 unsigned imm = fieldFromInstruction32(Val, 0, 8);
1626 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1627 return MCDisassembler::Fail;
1630 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::add, imm)));
1632 Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::sub, imm)));
1637 static DecodeStatus DecodeAddrMode7Operand(llvm::MCInst &Inst, unsigned Val,
1638 uint64_t Address, const void *Decoder) {
1639 return DecodeGPRRegisterClass(Inst, Val, Address, Decoder);
1643 DecodeBranchImmInstruction(llvm::MCInst &Inst, unsigned Insn,
1644 uint64_t Address, const void *Decoder) {
1645 DecodeStatus S = MCDisassembler::Success;
1647 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1648 unsigned imm = fieldFromInstruction32(Insn, 0, 24) << 2;
1651 Inst.setOpcode(ARM::BLXi);
1652 imm |= fieldFromInstruction32(Insn, 24, 1) << 1;
1653 Inst.addOperand(MCOperand::CreateImm(SignExtend32<26>(imm)));
1657 Inst.addOperand(MCOperand::CreateImm(SignExtend32<26>(imm)));
1658 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1659 return MCDisassembler::Fail;
1665 static DecodeStatus DecodeVCVTImmOperand(llvm::MCInst &Inst, unsigned Val,
1666 uint64_t Address, const void *Decoder) {
1667 Inst.addOperand(MCOperand::CreateImm(64 - Val));
1668 return MCDisassembler::Success;
1671 static DecodeStatus DecodeAddrMode6Operand(llvm::MCInst &Inst, unsigned Val,
1672 uint64_t Address, const void *Decoder) {
1673 DecodeStatus S = MCDisassembler::Success;
1675 unsigned Rm = fieldFromInstruction32(Val, 0, 4);
1676 unsigned align = fieldFromInstruction32(Val, 4, 2);
1678 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1679 return MCDisassembler::Fail;
1681 Inst.addOperand(MCOperand::CreateImm(0));
1683 Inst.addOperand(MCOperand::CreateImm(4 << align));
1688 static DecodeStatus DecodeVLDInstruction(llvm::MCInst &Inst, unsigned Insn,
1689 uint64_t Address, const void *Decoder) {
1690 DecodeStatus S = MCDisassembler::Success;
1692 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
1693 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
1694 unsigned wb = fieldFromInstruction32(Insn, 16, 4);
1695 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1696 Rn |= fieldFromInstruction32(Insn, 4, 2) << 4;
1697 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
1699 // First output register
1700 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
1701 return MCDisassembler::Fail;
1703 // Second output register
1704 switch (Inst.getOpcode()) {
1709 case ARM::VLD1q8_UPD:
1710 case ARM::VLD1q16_UPD:
1711 case ARM::VLD1q32_UPD:
1712 case ARM::VLD1q64_UPD:
1717 case ARM::VLD1d8T_UPD:
1718 case ARM::VLD1d16T_UPD:
1719 case ARM::VLD1d32T_UPD:
1720 case ARM::VLD1d64T_UPD:
1725 case ARM::VLD1d8Q_UPD:
1726 case ARM::VLD1d16Q_UPD:
1727 case ARM::VLD1d32Q_UPD:
1728 case ARM::VLD1d64Q_UPD:
1732 case ARM::VLD2d8_UPD:
1733 case ARM::VLD2d16_UPD:
1734 case ARM::VLD2d32_UPD:
1738 case ARM::VLD2q8_UPD:
1739 case ARM::VLD2q16_UPD:
1740 case ARM::VLD2q32_UPD:
1744 case ARM::VLD3d8_UPD:
1745 case ARM::VLD3d16_UPD:
1746 case ARM::VLD3d32_UPD:
1750 case ARM::VLD4d8_UPD:
1751 case ARM::VLD4d16_UPD:
1752 case ARM::VLD4d32_UPD:
1753 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
1754 return MCDisassembler::Fail;
1759 case ARM::VLD2b8_UPD:
1760 case ARM::VLD2b16_UPD:
1761 case ARM::VLD2b32_UPD:
1765 case ARM::VLD3q8_UPD:
1766 case ARM::VLD3q16_UPD:
1767 case ARM::VLD3q32_UPD:
1771 case ARM::VLD4q8_UPD:
1772 case ARM::VLD4q16_UPD:
1773 case ARM::VLD4q32_UPD:
1774 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
1775 return MCDisassembler::Fail;
1780 // Third output register
1781 switch(Inst.getOpcode()) {
1786 case ARM::VLD1d8T_UPD:
1787 case ARM::VLD1d16T_UPD:
1788 case ARM::VLD1d32T_UPD:
1789 case ARM::VLD1d64T_UPD:
1794 case ARM::VLD1d8Q_UPD:
1795 case ARM::VLD1d16Q_UPD:
1796 case ARM::VLD1d32Q_UPD:
1797 case ARM::VLD1d64Q_UPD:
1801 case ARM::VLD2q8_UPD:
1802 case ARM::VLD2q16_UPD:
1803 case ARM::VLD2q32_UPD:
1807 case ARM::VLD3d8_UPD:
1808 case ARM::VLD3d16_UPD:
1809 case ARM::VLD3d32_UPD:
1813 case ARM::VLD4d8_UPD:
1814 case ARM::VLD4d16_UPD:
1815 case ARM::VLD4d32_UPD:
1816 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
1817 return MCDisassembler::Fail;
1822 case ARM::VLD3q8_UPD:
1823 case ARM::VLD3q16_UPD:
1824 case ARM::VLD3q32_UPD:
1828 case ARM::VLD4q8_UPD:
1829 case ARM::VLD4q16_UPD:
1830 case ARM::VLD4q32_UPD:
1831 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
1832 return MCDisassembler::Fail;
1838 // Fourth output register
1839 switch (Inst.getOpcode()) {
1844 case ARM::VLD1d8Q_UPD:
1845 case ARM::VLD1d16Q_UPD:
1846 case ARM::VLD1d32Q_UPD:
1847 case ARM::VLD1d64Q_UPD:
1851 case ARM::VLD2q8_UPD:
1852 case ARM::VLD2q16_UPD:
1853 case ARM::VLD2q32_UPD:
1857 case ARM::VLD4d8_UPD:
1858 case ARM::VLD4d16_UPD:
1859 case ARM::VLD4d32_UPD:
1860 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
1861 return MCDisassembler::Fail;
1866 case ARM::VLD4q8_UPD:
1867 case ARM::VLD4q16_UPD:
1868 case ARM::VLD4q32_UPD:
1869 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
1870 return MCDisassembler::Fail;
1876 // Writeback operand
1877 switch (Inst.getOpcode()) {
1878 case ARM::VLD1d8_UPD:
1879 case ARM::VLD1d16_UPD:
1880 case ARM::VLD1d32_UPD:
1881 case ARM::VLD1d64_UPD:
1882 case ARM::VLD1q8_UPD:
1883 case ARM::VLD1q16_UPD:
1884 case ARM::VLD1q32_UPD:
1885 case ARM::VLD1q64_UPD:
1886 case ARM::VLD1d8T_UPD:
1887 case ARM::VLD1d16T_UPD:
1888 case ARM::VLD1d32T_UPD:
1889 case ARM::VLD1d64T_UPD:
1890 case ARM::VLD1d8Q_UPD:
1891 case ARM::VLD1d16Q_UPD:
1892 case ARM::VLD1d32Q_UPD:
1893 case ARM::VLD1d64Q_UPD:
1894 case ARM::VLD2d8_UPD:
1895 case ARM::VLD2d16_UPD:
1896 case ARM::VLD2d32_UPD:
1897 case ARM::VLD2q8_UPD:
1898 case ARM::VLD2q16_UPD:
1899 case ARM::VLD2q32_UPD:
1900 case ARM::VLD2b8_UPD:
1901 case ARM::VLD2b16_UPD:
1902 case ARM::VLD2b32_UPD:
1903 case ARM::VLD3d8_UPD:
1904 case ARM::VLD3d16_UPD:
1905 case ARM::VLD3d32_UPD:
1906 case ARM::VLD3q8_UPD:
1907 case ARM::VLD3q16_UPD:
1908 case ARM::VLD3q32_UPD:
1909 case ARM::VLD4d8_UPD:
1910 case ARM::VLD4d16_UPD:
1911 case ARM::VLD4d32_UPD:
1912 case ARM::VLD4q8_UPD:
1913 case ARM::VLD4q16_UPD:
1914 case ARM::VLD4q32_UPD:
1915 if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
1916 return MCDisassembler::Fail;
1922 // AddrMode6 Base (register+alignment)
1923 if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
1924 return MCDisassembler::Fail;
1926 // AddrMode6 Offset (register)
1928 Inst.addOperand(MCOperand::CreateReg(0));
1929 else if (Rm != 0xF) {
1930 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1931 return MCDisassembler::Fail;
1937 static DecodeStatus DecodeVSTInstruction(llvm::MCInst &Inst, unsigned Insn,
1938 uint64_t Address, const void *Decoder) {
1939 DecodeStatus S = MCDisassembler::Success;
1941 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
1942 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
1943 unsigned wb = fieldFromInstruction32(Insn, 16, 4);
1944 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1945 Rn |= fieldFromInstruction32(Insn, 4, 2) << 4;
1946 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
1948 // Writeback Operand
1949 switch (Inst.getOpcode()) {
1950 case ARM::VST1d8_UPD:
1951 case ARM::VST1d16_UPD:
1952 case ARM::VST1d32_UPD:
1953 case ARM::VST1d64_UPD:
1954 case ARM::VST1q8_UPD:
1955 case ARM::VST1q16_UPD:
1956 case ARM::VST1q32_UPD:
1957 case ARM::VST1q64_UPD:
1958 case ARM::VST1d8T_UPD:
1959 case ARM::VST1d16T_UPD:
1960 case ARM::VST1d32T_UPD:
1961 case ARM::VST1d64T_UPD:
1962 case ARM::VST1d8Q_UPD:
1963 case ARM::VST1d16Q_UPD:
1964 case ARM::VST1d32Q_UPD:
1965 case ARM::VST1d64Q_UPD:
1966 case ARM::VST2d8_UPD:
1967 case ARM::VST2d16_UPD:
1968 case ARM::VST2d32_UPD:
1969 case ARM::VST2q8_UPD:
1970 case ARM::VST2q16_UPD:
1971 case ARM::VST2q32_UPD:
1972 case ARM::VST2b8_UPD:
1973 case ARM::VST2b16_UPD:
1974 case ARM::VST2b32_UPD:
1975 case ARM::VST3d8_UPD:
1976 case ARM::VST3d16_UPD:
1977 case ARM::VST3d32_UPD:
1978 case ARM::VST3q8_UPD:
1979 case ARM::VST3q16_UPD:
1980 case ARM::VST3q32_UPD:
1981 case ARM::VST4d8_UPD:
1982 case ARM::VST4d16_UPD:
1983 case ARM::VST4d32_UPD:
1984 case ARM::VST4q8_UPD:
1985 case ARM::VST4q16_UPD:
1986 case ARM::VST4q32_UPD:
1987 if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
1988 return MCDisassembler::Fail;
1994 // AddrMode6 Base (register+alignment)
1995 if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
1996 return MCDisassembler::Fail;
1998 // AddrMode6 Offset (register)
2000 Inst.addOperand(MCOperand::CreateReg(0));
2001 else if (Rm != 0xF) {
2002 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2003 return MCDisassembler::Fail;
2006 // First input register
2007 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2008 return MCDisassembler::Fail;
2010 // Second input register
2011 switch (Inst.getOpcode()) {
2016 case ARM::VST1q8_UPD:
2017 case ARM::VST1q16_UPD:
2018 case ARM::VST1q32_UPD:
2019 case ARM::VST1q64_UPD:
2024 case ARM::VST1d8T_UPD:
2025 case ARM::VST1d16T_UPD:
2026 case ARM::VST1d32T_UPD:
2027 case ARM::VST1d64T_UPD:
2032 case ARM::VST1d8Q_UPD:
2033 case ARM::VST1d16Q_UPD:
2034 case ARM::VST1d32Q_UPD:
2035 case ARM::VST1d64Q_UPD:
2039 case ARM::VST2d8_UPD:
2040 case ARM::VST2d16_UPD:
2041 case ARM::VST2d32_UPD:
2045 case ARM::VST2q8_UPD:
2046 case ARM::VST2q16_UPD:
2047 case ARM::VST2q32_UPD:
2051 case ARM::VST3d8_UPD:
2052 case ARM::VST3d16_UPD:
2053 case ARM::VST3d32_UPD:
2057 case ARM::VST4d8_UPD:
2058 case ARM::VST4d16_UPD:
2059 case ARM::VST4d32_UPD:
2060 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
2061 return MCDisassembler::Fail;
2066 case ARM::VST2b8_UPD:
2067 case ARM::VST2b16_UPD:
2068 case ARM::VST2b32_UPD:
2072 case ARM::VST3q8_UPD:
2073 case ARM::VST3q16_UPD:
2074 case ARM::VST3q32_UPD:
2078 case ARM::VST4q8_UPD:
2079 case ARM::VST4q16_UPD:
2080 case ARM::VST4q32_UPD:
2081 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2082 return MCDisassembler::Fail;
2088 // Third input register
2089 switch (Inst.getOpcode()) {
2094 case ARM::VST1d8T_UPD:
2095 case ARM::VST1d16T_UPD:
2096 case ARM::VST1d32T_UPD:
2097 case ARM::VST1d64T_UPD:
2102 case ARM::VST1d8Q_UPD:
2103 case ARM::VST1d16Q_UPD:
2104 case ARM::VST1d32Q_UPD:
2105 case ARM::VST1d64Q_UPD:
2109 case ARM::VST2q8_UPD:
2110 case ARM::VST2q16_UPD:
2111 case ARM::VST2q32_UPD:
2115 case ARM::VST3d8_UPD:
2116 case ARM::VST3d16_UPD:
2117 case ARM::VST3d32_UPD:
2121 case ARM::VST4d8_UPD:
2122 case ARM::VST4d16_UPD:
2123 case ARM::VST4d32_UPD:
2124 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2125 return MCDisassembler::Fail;
2130 case ARM::VST3q8_UPD:
2131 case ARM::VST3q16_UPD:
2132 case ARM::VST3q32_UPD:
2136 case ARM::VST4q8_UPD:
2137 case ARM::VST4q16_UPD:
2138 case ARM::VST4q32_UPD:
2139 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
2140 return MCDisassembler::Fail;
2146 // Fourth input register
2147 switch (Inst.getOpcode()) {
2152 case ARM::VST1d8Q_UPD:
2153 case ARM::VST1d16Q_UPD:
2154 case ARM::VST1d32Q_UPD:
2155 case ARM::VST1d64Q_UPD:
2159 case ARM::VST2q8_UPD:
2160 case ARM::VST2q16_UPD:
2161 case ARM::VST2q32_UPD:
2165 case ARM::VST4d8_UPD:
2166 case ARM::VST4d16_UPD:
2167 case ARM::VST4d32_UPD:
2168 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
2169 return MCDisassembler::Fail;
2174 case ARM::VST4q8_UPD:
2175 case ARM::VST4q16_UPD:
2176 case ARM::VST4q32_UPD:
2177 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
2178 return MCDisassembler::Fail;
2187 static DecodeStatus DecodeVLD1DupInstruction(llvm::MCInst &Inst, unsigned Insn,
2188 uint64_t Address, const void *Decoder) {
2189 DecodeStatus S = MCDisassembler::Success;
2191 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2192 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2193 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2194 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2195 unsigned align = fieldFromInstruction32(Insn, 4, 1);
2196 unsigned size = fieldFromInstruction32(Insn, 6, 2);
2197 unsigned regs = fieldFromInstruction32(Insn, 5, 1) + 1;
2199 align *= (1 << size);
2201 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2202 return MCDisassembler::Fail;
2204 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
2205 return MCDisassembler::Fail;
2208 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2209 return MCDisassembler::Fail;
2212 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2213 return MCDisassembler::Fail;
2214 Inst.addOperand(MCOperand::CreateImm(align));
2217 Inst.addOperand(MCOperand::CreateReg(0));
2218 else if (Rm != 0xF) {
2219 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2220 return MCDisassembler::Fail;
2226 static DecodeStatus DecodeVLD2DupInstruction(llvm::MCInst &Inst, unsigned Insn,
2227 uint64_t Address, const void *Decoder) {
2228 DecodeStatus S = MCDisassembler::Success;
2230 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2231 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2232 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2233 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2234 unsigned align = fieldFromInstruction32(Insn, 4, 1);
2235 unsigned size = 1 << fieldFromInstruction32(Insn, 6, 2);
2236 unsigned inc = fieldFromInstruction32(Insn, 5, 1) + 1;
2239 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2240 return MCDisassembler::Fail;
2241 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
2242 return MCDisassembler::Fail;
2244 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2245 return MCDisassembler::Fail;
2248 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2249 return MCDisassembler::Fail;
2250 Inst.addOperand(MCOperand::CreateImm(align));
2253 Inst.addOperand(MCOperand::CreateReg(0));
2254 else if (Rm != 0xF) {
2255 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2256 return MCDisassembler::Fail;
2262 static DecodeStatus DecodeVLD3DupInstruction(llvm::MCInst &Inst, unsigned Insn,
2263 uint64_t Address, const void *Decoder) {
2264 DecodeStatus S = MCDisassembler::Success;
2266 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2267 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2268 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2269 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2270 unsigned inc = fieldFromInstruction32(Insn, 5, 1) + 1;
2272 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2273 return MCDisassembler::Fail;
2274 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
2275 return MCDisassembler::Fail;
2276 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
2277 return MCDisassembler::Fail;
2279 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2280 return MCDisassembler::Fail;
2283 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2284 return MCDisassembler::Fail;
2285 Inst.addOperand(MCOperand::CreateImm(0));
2288 Inst.addOperand(MCOperand::CreateReg(0));
2289 else if (Rm != 0xF) {
2290 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2291 return MCDisassembler::Fail;
2297 static DecodeStatus DecodeVLD4DupInstruction(llvm::MCInst &Inst, unsigned Insn,
2298 uint64_t Address, const void *Decoder) {
2299 DecodeStatus S = MCDisassembler::Success;
2301 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2302 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2303 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2304 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2305 unsigned size = fieldFromInstruction32(Insn, 6, 2);
2306 unsigned inc = fieldFromInstruction32(Insn, 5, 1) + 1;
2307 unsigned align = fieldFromInstruction32(Insn, 4, 1);
2322 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2323 return MCDisassembler::Fail;
2324 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
2325 return MCDisassembler::Fail;
2326 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
2327 return MCDisassembler::Fail;
2328 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3*inc)%32, Address, Decoder)))
2329 return MCDisassembler::Fail;
2331 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2332 return MCDisassembler::Fail;
2335 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2336 return MCDisassembler::Fail;
2337 Inst.addOperand(MCOperand::CreateImm(align));
2340 Inst.addOperand(MCOperand::CreateReg(0));
2341 else if (Rm != 0xF) {
2342 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2343 return MCDisassembler::Fail;
2350 DecodeNEONModImmInstruction(llvm::MCInst &Inst, unsigned Insn,
2351 uint64_t Address, const void *Decoder) {
2352 DecodeStatus S = MCDisassembler::Success;
2354 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2355 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2356 unsigned imm = fieldFromInstruction32(Insn, 0, 4);
2357 imm |= fieldFromInstruction32(Insn, 16, 3) << 4;
2358 imm |= fieldFromInstruction32(Insn, 24, 1) << 7;
2359 imm |= fieldFromInstruction32(Insn, 8, 4) << 8;
2360 imm |= fieldFromInstruction32(Insn, 5, 1) << 12;
2361 unsigned Q = fieldFromInstruction32(Insn, 6, 1);
2364 if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
2365 return MCDisassembler::Fail;
2367 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2368 return MCDisassembler::Fail;
2371 Inst.addOperand(MCOperand::CreateImm(imm));
2373 switch (Inst.getOpcode()) {
2374 case ARM::VORRiv4i16:
2375 case ARM::VORRiv2i32:
2376 case ARM::VBICiv4i16:
2377 case ARM::VBICiv2i32:
2378 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2379 return MCDisassembler::Fail;
2381 case ARM::VORRiv8i16:
2382 case ARM::VORRiv4i32:
2383 case ARM::VBICiv8i16:
2384 case ARM::VBICiv4i32:
2385 if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
2386 return MCDisassembler::Fail;
2395 static DecodeStatus DecodeVSHLMaxInstruction(llvm::MCInst &Inst, unsigned Insn,
2396 uint64_t Address, const void *Decoder) {
2397 DecodeStatus S = MCDisassembler::Success;
2399 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2400 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2401 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2402 Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
2403 unsigned size = fieldFromInstruction32(Insn, 18, 2);
2405 if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
2406 return MCDisassembler::Fail;
2407 if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
2408 return MCDisassembler::Fail;
2409 Inst.addOperand(MCOperand::CreateImm(8 << size));
2414 static DecodeStatus DecodeShiftRight8Imm(llvm::MCInst &Inst, unsigned Val,
2415 uint64_t Address, const void *Decoder) {
2416 Inst.addOperand(MCOperand::CreateImm(8 - Val));
2417 return MCDisassembler::Success;
2420 static DecodeStatus DecodeShiftRight16Imm(llvm::MCInst &Inst, unsigned Val,
2421 uint64_t Address, const void *Decoder) {
2422 Inst.addOperand(MCOperand::CreateImm(16 - Val));
2423 return MCDisassembler::Success;
2426 static DecodeStatus DecodeShiftRight32Imm(llvm::MCInst &Inst, unsigned Val,
2427 uint64_t Address, const void *Decoder) {
2428 Inst.addOperand(MCOperand::CreateImm(32 - Val));
2429 return MCDisassembler::Success;
2432 static DecodeStatus DecodeShiftRight64Imm(llvm::MCInst &Inst, unsigned Val,
2433 uint64_t Address, const void *Decoder) {
2434 Inst.addOperand(MCOperand::CreateImm(64 - Val));
2435 return MCDisassembler::Success;
2438 static DecodeStatus DecodeTBLInstruction(llvm::MCInst &Inst, unsigned Insn,
2439 uint64_t Address, const void *Decoder) {
2440 DecodeStatus S = MCDisassembler::Success;
2442 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2443 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2444 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2445 Rn |= fieldFromInstruction32(Insn, 7, 1) << 4;
2446 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2447 Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
2448 unsigned op = fieldFromInstruction32(Insn, 6, 1);
2449 unsigned length = fieldFromInstruction32(Insn, 8, 2) + 1;
2451 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2452 return MCDisassembler::Fail;
2454 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2455 return MCDisassembler::Fail; // Writeback
2458 for (unsigned i = 0; i < length; ++i) {
2459 if (!Check(S, DecodeDPRRegisterClass(Inst, (Rn+i)%32, Address, Decoder)))
2460 return MCDisassembler::Fail;
2463 if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
2464 return MCDisassembler::Fail;
2469 static DecodeStatus DecodeVFPfpImm(llvm::MCInst &Inst, unsigned Val,
2470 uint64_t Address, const void *Decoder) {
2471 // The immediate needs to be a fully instantiated float. However, the
2472 // auto-generated decoder is only able to fill in some of the bits
2473 // necessary. For instance, the 'b' bit is replicated multiple times,
2474 // and is even present in inverted form in one bit. We do a little
2475 // binary parsing here to fill in those missing bits, and then
2476 // reinterpret it all as a float.
2482 fp_conv.integer = Val;
2483 uint32_t b = fieldFromInstruction32(Val, 25, 1);
2484 fp_conv.integer |= b << 26;
2485 fp_conv.integer |= b << 27;
2486 fp_conv.integer |= b << 28;
2487 fp_conv.integer |= b << 29;
2488 fp_conv.integer |= (~b & 0x1) << 30;
2490 Inst.addOperand(MCOperand::CreateFPImm(fp_conv.fp));
2491 return MCDisassembler::Success;
2494 static DecodeStatus DecodeThumbAddSpecialReg(llvm::MCInst &Inst, uint16_t Insn,
2495 uint64_t Address, const void *Decoder) {
2496 DecodeStatus S = MCDisassembler::Success;
2498 unsigned dst = fieldFromInstruction16(Insn, 8, 3);
2499 unsigned imm = fieldFromInstruction16(Insn, 0, 8);
2501 if (!Check(S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder)))
2502 return MCDisassembler::Fail;
2504 switch(Inst.getOpcode()) {
2506 return MCDisassembler::Fail;
2508 break; // tADR does not explicitly represent the PC as an operand.
2510 Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2514 Inst.addOperand(MCOperand::CreateImm(imm));
2518 static DecodeStatus DecodeThumbBROperand(llvm::MCInst &Inst, unsigned Val,
2519 uint64_t Address, const void *Decoder) {
2520 Inst.addOperand(MCOperand::CreateImm(SignExtend32<12>(Val << 1)));
2521 return MCDisassembler::Success;
2524 static DecodeStatus DecodeT2BROperand(llvm::MCInst &Inst, unsigned Val,
2525 uint64_t Address, const void *Decoder) {
2526 Inst.addOperand(MCOperand::CreateImm(SignExtend32<21>(Val)));
2527 return MCDisassembler::Success;
2530 static DecodeStatus DecodeThumbCmpBROperand(llvm::MCInst &Inst, unsigned Val,
2531 uint64_t Address, const void *Decoder) {
2532 Inst.addOperand(MCOperand::CreateImm(SignExtend32<7>(Val << 1)));
2533 return MCDisassembler::Success;
2536 static DecodeStatus DecodeThumbAddrModeRR(llvm::MCInst &Inst, unsigned Val,
2537 uint64_t Address, const void *Decoder) {
2538 DecodeStatus S = MCDisassembler::Success;
2540 unsigned Rn = fieldFromInstruction32(Val, 0, 3);
2541 unsigned Rm = fieldFromInstruction32(Val, 3, 3);
2543 if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
2544 return MCDisassembler::Fail;
2545 if (!Check(S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder)))
2546 return MCDisassembler::Fail;
2551 static DecodeStatus DecodeThumbAddrModeIS(llvm::MCInst &Inst, unsigned Val,
2552 uint64_t Address, const void *Decoder) {
2553 DecodeStatus S = MCDisassembler::Success;
2555 unsigned Rn = fieldFromInstruction32(Val, 0, 3);
2556 unsigned imm = fieldFromInstruction32(Val, 3, 5);
2558 if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
2559 return MCDisassembler::Fail;
2560 Inst.addOperand(MCOperand::CreateImm(imm));
2565 static DecodeStatus DecodeThumbAddrModePC(llvm::MCInst &Inst, unsigned Val,
2566 uint64_t Address, const void *Decoder) {
2567 Inst.addOperand(MCOperand::CreateImm(Val << 2));
2569 return MCDisassembler::Success;
2572 static DecodeStatus DecodeThumbAddrModeSP(llvm::MCInst &Inst, unsigned Val,
2573 uint64_t Address, const void *Decoder) {
2574 Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2575 Inst.addOperand(MCOperand::CreateImm(Val));
2577 return MCDisassembler::Success;
2580 static DecodeStatus DecodeT2AddrModeSOReg(llvm::MCInst &Inst, unsigned Val,
2581 uint64_t Address, const void *Decoder) {
2582 DecodeStatus S = MCDisassembler::Success;
2584 unsigned Rn = fieldFromInstruction32(Val, 6, 4);
2585 unsigned Rm = fieldFromInstruction32(Val, 2, 4);
2586 unsigned imm = fieldFromInstruction32(Val, 0, 2);
2588 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2589 return MCDisassembler::Fail;
2590 if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
2591 return MCDisassembler::Fail;
2592 Inst.addOperand(MCOperand::CreateImm(imm));
2597 static DecodeStatus DecodeT2LoadShift(llvm::MCInst &Inst, unsigned Insn,
2598 uint64_t Address, const void *Decoder) {
2599 DecodeStatus S = MCDisassembler::Success;
2601 switch (Inst.getOpcode()) {
2607 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
2608 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
2609 return MCDisassembler::Fail;
2613 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2615 switch (Inst.getOpcode()) {
2617 Inst.setOpcode(ARM::t2LDRBpci);
2620 Inst.setOpcode(ARM::t2LDRHpci);
2623 Inst.setOpcode(ARM::t2LDRSHpci);
2626 Inst.setOpcode(ARM::t2LDRSBpci);
2629 Inst.setOpcode(ARM::t2PLDi12);
2630 Inst.addOperand(MCOperand::CreateReg(ARM::PC));
2633 return MCDisassembler::Fail;
2636 int imm = fieldFromInstruction32(Insn, 0, 12);
2637 if (!fieldFromInstruction32(Insn, 23, 1)) imm *= -1;
2638 Inst.addOperand(MCOperand::CreateImm(imm));
2643 unsigned addrmode = fieldFromInstruction32(Insn, 4, 2);
2644 addrmode |= fieldFromInstruction32(Insn, 0, 4) << 2;
2645 addrmode |= fieldFromInstruction32(Insn, 16, 4) << 6;
2646 if (!Check(S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder)))
2647 return MCDisassembler::Fail;
2652 static DecodeStatus DecodeT2Imm8S4(llvm::MCInst &Inst, unsigned Val,
2653 uint64_t Address, const void *Decoder) {
2654 int imm = Val & 0xFF;
2655 if (!(Val & 0x100)) imm *= -1;
2656 Inst.addOperand(MCOperand::CreateImm(imm << 2));
2658 return MCDisassembler::Success;
2661 static DecodeStatus DecodeT2AddrModeImm8s4(llvm::MCInst &Inst, unsigned Val,
2662 uint64_t Address, const void *Decoder) {
2663 DecodeStatus S = MCDisassembler::Success;
2665 unsigned Rn = fieldFromInstruction32(Val, 9, 4);
2666 unsigned imm = fieldFromInstruction32(Val, 0, 9);
2668 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2669 return MCDisassembler::Fail;
2670 if (!Check(S, DecodeT2Imm8S4(Inst, imm, Address, Decoder)))
2671 return MCDisassembler::Fail;
2676 static DecodeStatus DecodeT2Imm8(llvm::MCInst &Inst, unsigned Val,
2677 uint64_t Address, const void *Decoder) {
2678 int imm = Val & 0xFF;
2679 if (!(Val & 0x100)) imm *= -1;
2680 Inst.addOperand(MCOperand::CreateImm(imm));
2682 return MCDisassembler::Success;
2686 static DecodeStatus DecodeT2AddrModeImm8(llvm::MCInst &Inst, unsigned Val,
2687 uint64_t Address, const void *Decoder) {
2688 DecodeStatus S = MCDisassembler::Success;
2690 unsigned Rn = fieldFromInstruction32(Val, 9, 4);
2691 unsigned imm = fieldFromInstruction32(Val, 0, 9);
2693 // Some instructions always use an additive offset.
2694 switch (Inst.getOpcode()) {
2706 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2707 return MCDisassembler::Fail;
2708 if (!Check(S, DecodeT2Imm8(Inst, imm, Address, Decoder)))
2709 return MCDisassembler::Fail;
2715 static DecodeStatus DecodeT2AddrModeImm12(llvm::MCInst &Inst, unsigned Val,
2716 uint64_t Address, const void *Decoder) {
2717 DecodeStatus S = MCDisassembler::Success;
2719 unsigned Rn = fieldFromInstruction32(Val, 13, 4);
2720 unsigned imm = fieldFromInstruction32(Val, 0, 12);
2722 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2723 return MCDisassembler::Fail;
2724 Inst.addOperand(MCOperand::CreateImm(imm));
2730 static DecodeStatus DecodeThumbAddSPImm(llvm::MCInst &Inst, uint16_t Insn,
2731 uint64_t Address, const void *Decoder) {
2732 unsigned imm = fieldFromInstruction16(Insn, 0, 7);
2734 Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2735 Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2736 Inst.addOperand(MCOperand::CreateImm(imm));
2738 return MCDisassembler::Success;
2741 static DecodeStatus DecodeThumbAddSPReg(llvm::MCInst &Inst, uint16_t Insn,
2742 uint64_t Address, const void *Decoder) {
2743 DecodeStatus S = MCDisassembler::Success;
2745 if (Inst.getOpcode() == ARM::tADDrSP) {
2746 unsigned Rdm = fieldFromInstruction16(Insn, 0, 3);
2747 Rdm |= fieldFromInstruction16(Insn, 7, 1) << 3;
2749 if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
2750 return MCDisassembler::Fail;
2751 if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
2752 return MCDisassembler::Fail;
2753 Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2754 } else if (Inst.getOpcode() == ARM::tADDspr) {
2755 unsigned Rm = fieldFromInstruction16(Insn, 3, 4);
2757 Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2758 Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2759 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2760 return MCDisassembler::Fail;
2766 static DecodeStatus DecodeThumbCPS(llvm::MCInst &Inst, uint16_t Insn,
2767 uint64_t Address, const void *Decoder) {
2768 unsigned imod = fieldFromInstruction16(Insn, 4, 1) | 0x2;
2769 unsigned flags = fieldFromInstruction16(Insn, 0, 3);
2771 Inst.addOperand(MCOperand::CreateImm(imod));
2772 Inst.addOperand(MCOperand::CreateImm(flags));
2774 return MCDisassembler::Success;
2777 static DecodeStatus DecodePostIdxReg(llvm::MCInst &Inst, unsigned Insn,
2778 uint64_t Address, const void *Decoder) {
2779 DecodeStatus S = MCDisassembler::Success;
2780 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2781 unsigned add = fieldFromInstruction32(Insn, 4, 1);
2783 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2784 return MCDisassembler::Fail;
2785 Inst.addOperand(MCOperand::CreateImm(add));
2790 static DecodeStatus DecodeThumbBLXOffset(llvm::MCInst &Inst, unsigned Val,
2791 uint64_t Address, const void *Decoder) {
2792 Inst.addOperand(MCOperand::CreateImm(SignExtend32<22>(Val << 1)));
2793 return MCDisassembler::Success;
2796 static DecodeStatus DecodeCoprocessor(llvm::MCInst &Inst, unsigned Val,
2797 uint64_t Address, const void *Decoder) {
2798 if (Val == 0xA || Val == 0xB)
2799 return MCDisassembler::Fail;
2801 Inst.addOperand(MCOperand::CreateImm(Val));
2802 return MCDisassembler::Success;
2806 DecodeThumb2BCCInstruction(llvm::MCInst &Inst, unsigned Insn,
2807 uint64_t Address, const void *Decoder) {
2808 DecodeStatus S = MCDisassembler::Success;
2810 unsigned pred = fieldFromInstruction32(Insn, 22, 4);
2811 if (pred == 0xE || pred == 0xF) {
2812 unsigned opc = fieldFromInstruction32(Insn, 4, 28);
2815 return MCDisassembler::Fail;
2817 Inst.setOpcode(ARM::t2DSB);
2820 Inst.setOpcode(ARM::t2DMB);
2823 Inst.setOpcode(ARM::t2ISB);
2827 unsigned imm = fieldFromInstruction32(Insn, 0, 4);
2828 return DecodeMemBarrierOption(Inst, imm, Address, Decoder);
2831 unsigned brtarget = fieldFromInstruction32(Insn, 0, 11) << 1;
2832 brtarget |= fieldFromInstruction32(Insn, 11, 1) << 19;
2833 brtarget |= fieldFromInstruction32(Insn, 13, 1) << 18;
2834 brtarget |= fieldFromInstruction32(Insn, 16, 6) << 12;
2835 brtarget |= fieldFromInstruction32(Insn, 26, 1) << 20;
2837 if (!Check(S, DecodeT2BROperand(Inst, brtarget, Address, Decoder)))
2838 return MCDisassembler::Fail;
2839 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2840 return MCDisassembler::Fail;
2845 // Decode a shifted immediate operand. These basically consist
2846 // of an 8-bit value, and a 4-bit directive that specifies either
2847 // a splat operation or a rotation.
2848 static DecodeStatus DecodeT2SOImm(llvm::MCInst &Inst, unsigned Val,
2849 uint64_t Address, const void *Decoder) {
2850 unsigned ctrl = fieldFromInstruction32(Val, 10, 2);
2852 unsigned byte = fieldFromInstruction32(Val, 8, 2);
2853 unsigned imm = fieldFromInstruction32(Val, 0, 8);
2856 Inst.addOperand(MCOperand::CreateImm(imm));
2859 Inst.addOperand(MCOperand::CreateImm((imm << 16) | imm));
2862 Inst.addOperand(MCOperand::CreateImm((imm << 24) | (imm << 8)));
2865 Inst.addOperand(MCOperand::CreateImm((imm << 24) | (imm << 16) |
2870 unsigned unrot = fieldFromInstruction32(Val, 0, 7) | 0x80;
2871 unsigned rot = fieldFromInstruction32(Val, 7, 5);
2872 unsigned imm = (unrot >> rot) | (unrot << ((32-rot)&31));
2873 Inst.addOperand(MCOperand::CreateImm(imm));
2876 return MCDisassembler::Success;
2880 DecodeThumbBCCTargetOperand(llvm::MCInst &Inst, unsigned Val,
2881 uint64_t Address, const void *Decoder){
2882 Inst.addOperand(MCOperand::CreateImm(Val << 1));
2883 return MCDisassembler::Success;
2886 static DecodeStatus DecodeThumbBLTargetOperand(llvm::MCInst &Inst, unsigned Val,
2887 uint64_t Address, const void *Decoder){
2888 Inst.addOperand(MCOperand::CreateImm(SignExtend32<22>(Val << 1)));
2889 return MCDisassembler::Success;
2892 static DecodeStatus DecodeMemBarrierOption(llvm::MCInst &Inst, unsigned Val,
2893 uint64_t Address, const void *Decoder) {
2896 return MCDisassembler::Fail;
2908 Inst.addOperand(MCOperand::CreateImm(Val));
2909 return MCDisassembler::Success;
2912 static DecodeStatus DecodeMSRMask(llvm::MCInst &Inst, unsigned Val,
2913 uint64_t Address, const void *Decoder) {
2914 if (!Val) return MCDisassembler::Fail;
2915 Inst.addOperand(MCOperand::CreateImm(Val));
2916 return MCDisassembler::Success;
2919 static DecodeStatus DecodeDoubleRegLoad(llvm::MCInst &Inst, unsigned Insn,
2920 uint64_t Address, const void *Decoder) {
2921 DecodeStatus S = MCDisassembler::Success;
2923 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
2924 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2925 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
2927 if ((Rt & 1) || Rt == 0xE || Rn == 0xF) return MCDisassembler::Fail;
2929 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
2930 return MCDisassembler::Fail;
2931 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
2932 return MCDisassembler::Fail;
2933 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2934 return MCDisassembler::Fail;
2935 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2936 return MCDisassembler::Fail;
2942 static DecodeStatus DecodeDoubleRegStore(llvm::MCInst &Inst, unsigned Insn,
2943 uint64_t Address, const void *Decoder){
2944 DecodeStatus S = MCDisassembler::Success;
2946 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2947 unsigned Rt = fieldFromInstruction32(Insn, 0, 4);
2948 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2949 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
2951 if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
2952 return MCDisassembler::Fail;
2954 if ((Rt & 1) || Rt == 0xE || Rn == 0xF) return MCDisassembler::Fail;
2955 if (Rd == Rn || Rd == Rt || Rd == Rt+1) return MCDisassembler::Fail;
2957 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
2958 return MCDisassembler::Fail;
2959 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
2960 return MCDisassembler::Fail;
2961 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2962 return MCDisassembler::Fail;
2963 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2964 return MCDisassembler::Fail;
2969 static DecodeStatus DecodeLDRPreImm(llvm::MCInst &Inst, unsigned Insn,
2970 uint64_t Address, const void *Decoder) {
2971 DecodeStatus S = MCDisassembler::Success;
2973 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2974 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
2975 unsigned imm = fieldFromInstruction32(Insn, 0, 12);
2976 imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
2977 imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
2978 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
2980 if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
2982 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
2983 return MCDisassembler::Fail;
2984 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2985 return MCDisassembler::Fail;
2986 if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
2987 return MCDisassembler::Fail;
2988 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2989 return MCDisassembler::Fail;
2994 static DecodeStatus DecodeLDRPreReg(llvm::MCInst &Inst, unsigned Insn,
2995 uint64_t Address, const void *Decoder) {
2996 DecodeStatus S = MCDisassembler::Success;
2998 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2999 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3000 unsigned imm = fieldFromInstruction32(Insn, 0, 12);
3001 imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
3002 imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
3003 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3004 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3006 if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
3007 if (Rm == 0xF) S = MCDisassembler::SoftFail;
3009 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3010 return MCDisassembler::Fail;
3011 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3012 return MCDisassembler::Fail;
3013 if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
3014 return MCDisassembler::Fail;
3015 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3016 return MCDisassembler::Fail;
3022 static DecodeStatus DecodeSTRPreImm(llvm::MCInst &Inst, unsigned Insn,
3023 uint64_t Address, const void *Decoder) {
3024 DecodeStatus S = MCDisassembler::Success;
3026 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3027 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3028 unsigned imm = fieldFromInstruction32(Insn, 0, 12);
3029 imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
3030 imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
3031 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3033 if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
3035 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3036 return MCDisassembler::Fail;
3037 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3038 return MCDisassembler::Fail;
3039 if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
3040 return MCDisassembler::Fail;
3041 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3042 return MCDisassembler::Fail;
3047 static DecodeStatus DecodeSTRPreReg(llvm::MCInst &Inst, unsigned Insn,
3048 uint64_t Address, const void *Decoder) {
3049 DecodeStatus S = MCDisassembler::Success;
3051 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3052 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3053 unsigned imm = fieldFromInstruction32(Insn, 0, 12);
3054 imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
3055 imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
3056 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3058 if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
3060 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3061 return MCDisassembler::Fail;
3062 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3063 return MCDisassembler::Fail;
3064 if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
3065 return MCDisassembler::Fail;
3066 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3067 return MCDisassembler::Fail;
3072 static DecodeStatus DecodeVLD1LN(llvm::MCInst &Inst, unsigned Insn,
3073 uint64_t Address, const void *Decoder) {
3074 DecodeStatus S = MCDisassembler::Success;
3076 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3077 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3078 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3079 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3080 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3086 return MCDisassembler::Fail;
3088 if (fieldFromInstruction32(Insn, 4, 1))
3089 return MCDisassembler::Fail; // UNDEFINED
3090 index = fieldFromInstruction32(Insn, 5, 3);
3093 if (fieldFromInstruction32(Insn, 5, 1))
3094 return MCDisassembler::Fail; // UNDEFINED
3095 index = fieldFromInstruction32(Insn, 6, 2);
3096 if (fieldFromInstruction32(Insn, 4, 1))
3100 if (fieldFromInstruction32(Insn, 6, 1))
3101 return MCDisassembler::Fail; // UNDEFINED
3102 index = fieldFromInstruction32(Insn, 7, 1);
3103 if (fieldFromInstruction32(Insn, 4, 2) != 0)
3107 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3108 return MCDisassembler::Fail;
3109 if (Rm != 0xF) { // Writeback
3110 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3111 return MCDisassembler::Fail;
3113 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3114 return MCDisassembler::Fail;
3115 Inst.addOperand(MCOperand::CreateImm(align));
3118 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3119 return MCDisassembler::Fail;
3121 Inst.addOperand(MCOperand::CreateReg(0));
3124 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3125 return MCDisassembler::Fail;
3126 Inst.addOperand(MCOperand::CreateImm(index));
3131 static DecodeStatus DecodeVST1LN(llvm::MCInst &Inst, unsigned Insn,
3132 uint64_t Address, const void *Decoder) {
3133 DecodeStatus S = MCDisassembler::Success;
3135 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3136 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3137 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3138 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3139 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3145 return MCDisassembler::Fail;
3147 if (fieldFromInstruction32(Insn, 4, 1))
3148 return MCDisassembler::Fail; // UNDEFINED
3149 index = fieldFromInstruction32(Insn, 5, 3);
3152 if (fieldFromInstruction32(Insn, 5, 1))
3153 return MCDisassembler::Fail; // UNDEFINED
3154 index = fieldFromInstruction32(Insn, 6, 2);
3155 if (fieldFromInstruction32(Insn, 4, 1))
3159 if (fieldFromInstruction32(Insn, 6, 1))
3160 return MCDisassembler::Fail; // UNDEFINED
3161 index = fieldFromInstruction32(Insn, 7, 1);
3162 if (fieldFromInstruction32(Insn, 4, 2) != 0)
3166 if (Rm != 0xF) { // Writeback
3167 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3168 return MCDisassembler::Fail;
3170 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3171 return MCDisassembler::Fail;
3172 Inst.addOperand(MCOperand::CreateImm(align));
3175 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3176 return MCDisassembler::Fail;
3178 Inst.addOperand(MCOperand::CreateReg(0));
3181 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3182 return MCDisassembler::Fail;
3183 Inst.addOperand(MCOperand::CreateImm(index));
3189 static DecodeStatus DecodeVLD2LN(llvm::MCInst &Inst, unsigned Insn,
3190 uint64_t Address, const void *Decoder) {
3191 DecodeStatus S = MCDisassembler::Success;
3193 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3194 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3195 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3196 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3197 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3204 return MCDisassembler::Fail;
3206 index = fieldFromInstruction32(Insn, 5, 3);
3207 if (fieldFromInstruction32(Insn, 4, 1))
3211 index = fieldFromInstruction32(Insn, 6, 2);
3212 if (fieldFromInstruction32(Insn, 4, 1))
3214 if (fieldFromInstruction32(Insn, 5, 1))
3218 if (fieldFromInstruction32(Insn, 5, 1))
3219 return MCDisassembler::Fail; // UNDEFINED
3220 index = fieldFromInstruction32(Insn, 7, 1);
3221 if (fieldFromInstruction32(Insn, 4, 1) != 0)
3223 if (fieldFromInstruction32(Insn, 6, 1))
3228 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3229 return MCDisassembler::Fail;
3230 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3231 return MCDisassembler::Fail;
3232 if (Rm != 0xF) { // Writeback
3233 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3234 return MCDisassembler::Fail;
3236 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3237 return MCDisassembler::Fail;
3238 Inst.addOperand(MCOperand::CreateImm(align));
3241 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3242 return MCDisassembler::Fail;
3244 Inst.addOperand(MCOperand::CreateReg(0));
3247 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3248 return MCDisassembler::Fail;
3249 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3250 return MCDisassembler::Fail;
3251 Inst.addOperand(MCOperand::CreateImm(index));
3256 static DecodeStatus DecodeVST2LN(llvm::MCInst &Inst, unsigned Insn,
3257 uint64_t Address, const void *Decoder) {
3258 DecodeStatus S = MCDisassembler::Success;
3260 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3261 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3262 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3263 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3264 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3271 return MCDisassembler::Fail;
3273 index = fieldFromInstruction32(Insn, 5, 3);
3274 if (fieldFromInstruction32(Insn, 4, 1))
3278 index = fieldFromInstruction32(Insn, 6, 2);
3279 if (fieldFromInstruction32(Insn, 4, 1))
3281 if (fieldFromInstruction32(Insn, 5, 1))
3285 if (fieldFromInstruction32(Insn, 5, 1))
3286 return MCDisassembler::Fail; // UNDEFINED
3287 index = fieldFromInstruction32(Insn, 7, 1);
3288 if (fieldFromInstruction32(Insn, 4, 1) != 0)
3290 if (fieldFromInstruction32(Insn, 6, 1))
3295 if (Rm != 0xF) { // Writeback
3296 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3297 return MCDisassembler::Fail;
3299 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3300 return MCDisassembler::Fail;
3301 Inst.addOperand(MCOperand::CreateImm(align));
3304 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3305 return MCDisassembler::Fail;
3307 Inst.addOperand(MCOperand::CreateReg(0));
3310 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3311 return MCDisassembler::Fail;
3312 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3313 return MCDisassembler::Fail;
3314 Inst.addOperand(MCOperand::CreateImm(index));
3320 static DecodeStatus DecodeVLD3LN(llvm::MCInst &Inst, unsigned Insn,
3321 uint64_t Address, const void *Decoder) {
3322 DecodeStatus S = MCDisassembler::Success;
3324 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3325 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3326 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3327 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3328 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3335 return MCDisassembler::Fail;
3337 if (fieldFromInstruction32(Insn, 4, 1))
3338 return MCDisassembler::Fail; // UNDEFINED
3339 index = fieldFromInstruction32(Insn, 5, 3);
3342 if (fieldFromInstruction32(Insn, 4, 1))
3343 return MCDisassembler::Fail; // UNDEFINED
3344 index = fieldFromInstruction32(Insn, 6, 2);
3345 if (fieldFromInstruction32(Insn, 5, 1))
3349 if (fieldFromInstruction32(Insn, 4, 2))
3350 return MCDisassembler::Fail; // UNDEFINED
3351 index = fieldFromInstruction32(Insn, 7, 1);
3352 if (fieldFromInstruction32(Insn, 6, 1))
3357 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3358 return MCDisassembler::Fail;
3359 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3360 return MCDisassembler::Fail;
3361 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3362 return MCDisassembler::Fail;
3364 if (Rm != 0xF) { // Writeback
3365 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3366 return MCDisassembler::Fail;
3368 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3369 return MCDisassembler::Fail;
3370 Inst.addOperand(MCOperand::CreateImm(align));
3373 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3374 return MCDisassembler::Fail;
3376 Inst.addOperand(MCOperand::CreateReg(0));
3379 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3380 return MCDisassembler::Fail;
3381 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3382 return MCDisassembler::Fail;
3383 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3384 return MCDisassembler::Fail;
3385 Inst.addOperand(MCOperand::CreateImm(index));
3390 static DecodeStatus DecodeVST3LN(llvm::MCInst &Inst, unsigned Insn,
3391 uint64_t Address, const void *Decoder) {
3392 DecodeStatus S = MCDisassembler::Success;
3394 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3395 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3396 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3397 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3398 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3405 return MCDisassembler::Fail;
3407 if (fieldFromInstruction32(Insn, 4, 1))
3408 return MCDisassembler::Fail; // UNDEFINED
3409 index = fieldFromInstruction32(Insn, 5, 3);
3412 if (fieldFromInstruction32(Insn, 4, 1))
3413 return MCDisassembler::Fail; // UNDEFINED
3414 index = fieldFromInstruction32(Insn, 6, 2);
3415 if (fieldFromInstruction32(Insn, 5, 1))
3419 if (fieldFromInstruction32(Insn, 4, 2))
3420 return MCDisassembler::Fail; // UNDEFINED
3421 index = fieldFromInstruction32(Insn, 7, 1);
3422 if (fieldFromInstruction32(Insn, 6, 1))
3427 if (Rm != 0xF) { // Writeback
3428 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3429 return MCDisassembler::Fail;
3431 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3432 return MCDisassembler::Fail;
3433 Inst.addOperand(MCOperand::CreateImm(align));
3436 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3437 return MCDisassembler::Fail;
3439 Inst.addOperand(MCOperand::CreateReg(0));
3442 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3443 return MCDisassembler::Fail;
3444 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3445 return MCDisassembler::Fail;
3446 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3447 return MCDisassembler::Fail;
3448 Inst.addOperand(MCOperand::CreateImm(index));
3454 static DecodeStatus DecodeVLD4LN(llvm::MCInst &Inst, unsigned Insn,
3455 uint64_t Address, const void *Decoder) {
3456 DecodeStatus S = MCDisassembler::Success;
3458 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3459 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3460 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3461 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3462 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3469 return MCDisassembler::Fail;
3471 if (fieldFromInstruction32(Insn, 4, 1))
3473 index = fieldFromInstruction32(Insn, 5, 3);
3476 if (fieldFromInstruction32(Insn, 4, 1))
3478 index = fieldFromInstruction32(Insn, 6, 2);
3479 if (fieldFromInstruction32(Insn, 5, 1))
3483 if (fieldFromInstruction32(Insn, 4, 2))
3484 align = 4 << fieldFromInstruction32(Insn, 4, 2);
3485 index = fieldFromInstruction32(Insn, 7, 1);
3486 if (fieldFromInstruction32(Insn, 6, 1))
3491 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3492 return MCDisassembler::Fail;
3493 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3494 return MCDisassembler::Fail;
3495 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3496 return MCDisassembler::Fail;
3497 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
3498 return MCDisassembler::Fail;
3500 if (Rm != 0xF) { // Writeback
3501 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3502 return MCDisassembler::Fail;
3504 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3505 return MCDisassembler::Fail;
3506 Inst.addOperand(MCOperand::CreateImm(align));
3509 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3510 return MCDisassembler::Fail;
3512 Inst.addOperand(MCOperand::CreateReg(0));
3515 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3516 return MCDisassembler::Fail;
3517 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3518 return MCDisassembler::Fail;
3519 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3520 return MCDisassembler::Fail;
3521 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
3522 return MCDisassembler::Fail;
3523 Inst.addOperand(MCOperand::CreateImm(index));
3528 static DecodeStatus DecodeVST4LN(llvm::MCInst &Inst, unsigned Insn,
3529 uint64_t Address, const void *Decoder) {
3530 DecodeStatus S = MCDisassembler::Success;
3532 unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3533 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3534 unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3535 Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3536 unsigned size = fieldFromInstruction32(Insn, 10, 2);
3543 return MCDisassembler::Fail;
3545 if (fieldFromInstruction32(Insn, 4, 1))
3547 index = fieldFromInstruction32(Insn, 5, 3);
3550 if (fieldFromInstruction32(Insn, 4, 1))
3552 index = fieldFromInstruction32(Insn, 6, 2);
3553 if (fieldFromInstruction32(Insn, 5, 1))
3557 if (fieldFromInstruction32(Insn, 4, 2))
3558 align = 4 << fieldFromInstruction32(Insn, 4, 2);
3559 index = fieldFromInstruction32(Insn, 7, 1);
3560 if (fieldFromInstruction32(Insn, 6, 1))
3565 if (Rm != 0xF) { // Writeback
3566 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3567 return MCDisassembler::Fail;
3569 if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3570 return MCDisassembler::Fail;
3571 Inst.addOperand(MCOperand::CreateImm(align));
3574 if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3575 return MCDisassembler::Fail;
3577 Inst.addOperand(MCOperand::CreateReg(0));
3580 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3581 return MCDisassembler::Fail;
3582 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3583 return MCDisassembler::Fail;
3584 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3585 return MCDisassembler::Fail;
3586 if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
3587 return MCDisassembler::Fail;
3588 Inst.addOperand(MCOperand::CreateImm(index));
3593 static DecodeStatus DecodeVMOVSRR(llvm::MCInst &Inst, unsigned Insn,
3594 uint64_t Address, const void *Decoder) {
3595 DecodeStatus S = MCDisassembler::Success;
3596 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3597 unsigned Rt2 = fieldFromInstruction32(Insn, 16, 4);
3598 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3599 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3600 Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
3602 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
3603 S = MCDisassembler::SoftFail;
3605 if (!Check(S, DecodeSPRRegisterClass(Inst, Rm , Address, Decoder)))
3606 return MCDisassembler::Fail;
3607 if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
3608 return MCDisassembler::Fail;
3609 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt , Address, Decoder)))
3610 return MCDisassembler::Fail;
3611 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
3612 return MCDisassembler::Fail;
3613 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3614 return MCDisassembler::Fail;
3619 static DecodeStatus DecodeVMOVRRS(llvm::MCInst &Inst, unsigned Insn,
3620 uint64_t Address, const void *Decoder) {
3621 DecodeStatus S = MCDisassembler::Success;
3622 unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3623 unsigned Rt2 = fieldFromInstruction32(Insn, 16, 4);
3624 unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3625 unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3626 Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
3628 if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
3629 S = MCDisassembler::SoftFail;
3631 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt , Address, Decoder)))
3632 return MCDisassembler::Fail;
3633 if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
3634 return MCDisassembler::Fail;
3635 if (!Check(S, DecodeSPRRegisterClass(Inst, Rm , Address, Decoder)))
3636 return MCDisassembler::Fail;
3637 if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
3638 return MCDisassembler::Fail;
3639 if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3640 return MCDisassembler::Fail;
3645 static DecodeStatus DecodeIT(llvm::MCInst &Inst, unsigned Insn,
3646 uint64_t Address, const void *Decoder) {
3647 DecodeStatus S = MCDisassembler::Success;
3648 unsigned pred = fieldFromInstruction16(Insn, 4, 4);
3649 // The InstPrinter needs to have the low bit of the predicate in
3650 // the mask operand to be able to print it properly.
3651 unsigned mask = fieldFromInstruction16(Insn, 0, 5);
3655 S = MCDisassembler::SoftFail;
3658 if ((mask & 0xF) == 0) {
3659 // Preserve the high bit of the mask, which is the low bit of
3663 S = MCDisassembler::SoftFail;
3666 Inst.addOperand(MCOperand::CreateImm(pred));
3667 Inst.addOperand(MCOperand::CreateImm(mask));