Fix a few more places in the ARM disassembler so that branches get
[oota-llvm.git] / lib / Target / ARM / Disassembler / ARMDisassembler.cpp
1 //===-- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA --------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #define DEBUG_TYPE "arm-disassembler"
11
12 #include "MCTargetDesc/ARMAddressingModes.h"
13 #include "MCTargetDesc/ARMMCExpr.h"
14 #include "MCTargetDesc/ARMBaseInfo.h"
15 #include "llvm/MC/EDInstInfo.h"
16 #include "llvm/MC/MCInst.h"
17 #include "llvm/MC/MCInstrDesc.h"
18 #include "llvm/MC/MCExpr.h"
19 #include "llvm/MC/MCContext.h"
20 #include "llvm/MC/MCDisassembler.h"
21 #include "llvm/MC/MCSubtargetInfo.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"
27
28 using namespace llvm;
29
30 typedef MCDisassembler::DecodeStatus DecodeStatus;
31
32 namespace {
33 /// ARMDisassembler - ARM disassembler for all ARM platforms.
34 class ARMDisassembler : public MCDisassembler {
35 public:
36   /// Constructor     - Initializes the disassembler.
37   ///
38   ARMDisassembler(const MCSubtargetInfo &STI) :
39     MCDisassembler(STI) {
40   }
41
42   ~ARMDisassembler() {
43   }
44
45   /// getInstruction - See MCDisassembler.
46   DecodeStatus getInstruction(MCInst &instr,
47                               uint64_t &size,
48                               const MemoryObject &region,
49                               uint64_t address,
50                               raw_ostream &vStream,
51                               raw_ostream &cStream) const;
52
53   /// getEDInfo - See MCDisassembler.
54   const EDInstInfo *getEDInfo() const;
55 private:
56 };
57
58 /// ThumbDisassembler - Thumb disassembler for all Thumb platforms.
59 class ThumbDisassembler : public MCDisassembler {
60 public:
61   /// Constructor     - Initializes the disassembler.
62   ///
63   ThumbDisassembler(const MCSubtargetInfo &STI) :
64     MCDisassembler(STI) {
65   }
66
67   ~ThumbDisassembler() {
68   }
69
70   /// getInstruction - See MCDisassembler.
71   DecodeStatus getInstruction(MCInst &instr,
72                               uint64_t &size,
73                               const MemoryObject &region,
74                               uint64_t address,
75                               raw_ostream &vStream,
76                               raw_ostream &cStream) const;
77
78   /// getEDInfo - See MCDisassembler.
79   const EDInstInfo *getEDInfo() const;
80 private:
81   mutable std::vector<unsigned> ITBlock;
82   DecodeStatus AddThumbPredicate(MCInst&) const;
83   void UpdateThumbVFPPredicate(MCInst&) const;
84 };
85 }
86
87 static bool Check(DecodeStatus &Out, DecodeStatus In) {
88   switch (In) {
89     case MCDisassembler::Success:
90       // Out stays the same.
91       return true;
92     case MCDisassembler::SoftFail:
93       Out = In;
94       return true;
95     case MCDisassembler::Fail:
96       Out = In;
97       return false;
98   }
99   llvm_unreachable("Invalid DecodeStatus!");
100 }
101
102
103 // Forward declare these because the autogenerated code will reference them.
104 // Definitions are further down.
105 static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo,
106                                    uint64_t Address, const void *Decoder);
107 static DecodeStatus DecodeGPRnopcRegisterClass(MCInst &Inst,
108                                                unsigned RegNo, uint64_t Address,
109                                                const void *Decoder);
110 static DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo,
111                                    uint64_t Address, const void *Decoder);
112 static DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo,
113                                    uint64_t Address, const void *Decoder);
114 static DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo,
115                                    uint64_t Address, const void *Decoder);
116 static DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo,
117                                    uint64_t Address, const void *Decoder);
118 static DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo,
119                                    uint64_t Address, const void *Decoder);
120 static DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo,
121                                    uint64_t Address, const void *Decoder);
122 static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst &Inst,
123                                                 unsigned RegNo,
124                                                 uint64_t Address,
125                                                 const void *Decoder);
126 static DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo,
127                                    uint64_t Address, const void *Decoder);
128 static DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo,
129                                    uint64_t Address, const void *Decoder);
130 static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst,
131                                unsigned RegNo, uint64_t Address,
132                                const void *Decoder);
133
134 static DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val,
135                                uint64_t Address, const void *Decoder);
136 static DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val,
137                                uint64_t Address, const void *Decoder);
138 static DecodeStatus DecodeSOImmOperand(MCInst &Inst, unsigned Val,
139                                uint64_t Address, const void *Decoder);
140 static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val,
141                                uint64_t Address, const void *Decoder);
142 static DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val,
143                                uint64_t Address, const void *Decoder);
144 static DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val,
145                                uint64_t Address, const void *Decoder);
146
147 static DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Insn,
148                                uint64_t Address, const void *Decoder);
149 static DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn,
150                                uint64_t Address, const void *Decoder);
151 static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst &Inst,
152                                                   unsigned Insn,
153                                                   uint64_t Address,
154                                                   const void *Decoder);
155 static DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Insn,
156                                uint64_t Address, const void *Decoder);
157 static DecodeStatus DecodeAddrMode3Instruction(MCInst &Inst,unsigned Insn,
158                                uint64_t Address, const void *Decoder);
159 static DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Insn,
160                                uint64_t Address, const void *Decoder);
161 static DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Insn,
162                                uint64_t Address, const void *Decoder);
163
164 static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst & Inst,
165                                                   unsigned Insn,
166                                                   uint64_t Adddress,
167                                                   const void *Decoder);
168 static DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn,
169                                uint64_t Address, const void *Decoder);
170 static DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn,
171                                uint64_t Address, const void *Decoder);
172 static DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn,
173                                uint64_t Address, const void *Decoder);
174 static DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn,
175                                uint64_t Address, const void *Decoder);
176 static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
177                                uint64_t Address, const void *Decoder);
178 static DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val,
179                                uint64_t Address, const void *Decoder);
180 static DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val,
181                                uint64_t Address, const void *Decoder);
182 static DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val,
183                                uint64_t Address, const void *Decoder);
184 static DecodeStatus DecodeT2BInstruction(MCInst &Inst, unsigned Insn,
185                                uint64_t Address, const void *Decoder);
186 static DecodeStatus DecodeBranchImmInstruction(MCInst &Inst,unsigned Insn,
187                                uint64_t Address, const void *Decoder);
188 static DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val,
189                                uint64_t Address, const void *Decoder);
190 static DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Val,
191                                uint64_t Address, const void *Decoder);
192 static DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Val,
193                                uint64_t Address, const void *Decoder);
194 static DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Val,
195                                uint64_t Address, const void *Decoder);
196 static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Val,
197                                uint64_t Address, const void *Decoder);
198 static DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Val,
199                                uint64_t Address, const void *Decoder);
200 static DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Val,
201                                uint64_t Address, const void *Decoder);
202 static DecodeStatus DecodeNEONModImmInstruction(MCInst &Inst,unsigned Val,
203                                uint64_t Address, const void *Decoder);
204 static DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Val,
205                                uint64_t Address, const void *Decoder);
206 static DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val,
207                                uint64_t Address, const void *Decoder);
208 static DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val,
209                                uint64_t Address, const void *Decoder);
210 static DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val,
211                                uint64_t Address, const void *Decoder);
212 static DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val,
213                                uint64_t Address, const void *Decoder);
214 static DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn,
215                                uint64_t Address, const void *Decoder);
216 static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
217                                uint64_t Address, const void *Decoder);
218 static DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Insn,
219                                uint64_t Address, const void *Decoder);
220 static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Insn,
221                                uint64_t Address, const void *Decoder);
222 static DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Insn,
223                                uint64_t Address, const void *Decoder);
224 static DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn,
225                                uint64_t Address, const void *Decoder);
226 static DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn,
227                                uint64_t Address, const void *Decoder);
228 static DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn,
229                                uint64_t Address, const void *Decoder);
230 static DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn,
231                                uint64_t Address, const void *Decoder);
232 static DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn,
233                                uint64_t Address, const void *Decoder);
234 static DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn,
235                                uint64_t Address, const void *Decoder);
236 static DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn,
237                                uint64_t Address, const void *Decoder);
238 static DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn,
239                                uint64_t Address, const void *Decoder);
240 static DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn,
241                                uint64_t Address, const void *Decoder);
242 static DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn,
243                                uint64_t Address, const void *Decoder);
244 static DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn,
245                                uint64_t Address, const void *Decoder);
246 static DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn,
247                                uint64_t Address, const void *Decoder);
248 static DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn,
249                                uint64_t Address, const void *Decoder);
250 static DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn,
251                                uint64_t Address, const void *Decoder);
252 static DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn,
253                                uint64_t Address, const void *Decoder);
254 static DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn,
255                                uint64_t Address, const void *Decoder);
256 static DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn,
257                                uint64_t Address, const void *Decoder);
258 static DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn,
259                                 uint64_t Address, const void *Decoder);
260 static DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn,
261                                 uint64_t Address, const void *Decoder);
262
263
264 static DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn,
265                                uint64_t Address, const void *Decoder);
266 static DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val,
267                                uint64_t Address, const void *Decoder);
268 static DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val,
269                                uint64_t Address, const void *Decoder);
270 static DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val,
271                                uint64_t Address, const void *Decoder);
272 static DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val,
273                                uint64_t Address, const void *Decoder);
274 static DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val,
275                                uint64_t Address, const void *Decoder);
276 static DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val,
277                                uint64_t Address, const void *Decoder);
278 static DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val,
279                                uint64_t Address, const void *Decoder);
280 static DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val,
281                                uint64_t Address, const void *Decoder);
282 static DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Val,
283                                uint64_t Address, const void *Decoder);
284 static DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val,
285                                uint64_t Address, const void *Decoder);
286 static DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val,
287                                uint64_t Address, const void *Decoder);
288 static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
289                                uint64_t Address, const void *Decoder);
290 static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
291                                uint64_t Address, const void *Decoder);
292 static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
293                                uint64_t Address, const void *Decoder);
294 static DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Val,
295                                uint64_t Address, const void *Decoder);
296 static DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn,
297                                 uint64_t Address, const void *Decoder);
298 static DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn,
299                                 uint64_t Address, const void *Decoder);
300 static DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Insn,
301                                 uint64_t Address, const void *Decoder);
302 static DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val,
303                                 uint64_t Address, const void *Decoder);
304 static DecodeStatus DecodeThumbTableBranch(MCInst &Inst, unsigned Val,
305                                 uint64_t Address, const void *Decoder);
306 static DecodeStatus DecodeThumb2BCCInstruction(MCInst &Inst, unsigned Val,
307                                 uint64_t Address, const void *Decoder);
308 static DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val,
309                                 uint64_t Address, const void *Decoder);
310 static DecodeStatus DecodeThumbBCCTargetOperand(MCInst &Inst,unsigned Val,
311                                 uint64_t Address, const void *Decoder);
312 static DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val,
313                                 uint64_t Address, const void *Decoder);
314 static DecodeStatus DecodeIT(MCInst &Inst, unsigned Val,
315                                 uint64_t Address, const void *Decoder);
316 static DecodeStatus DecodeT2LDRDPreInstruction(MCInst &Inst,unsigned Insn,
317                                uint64_t Address, const void *Decoder);
318 static DecodeStatus DecodeT2STRDPreInstruction(MCInst &Inst,unsigned Insn,
319                                uint64_t Address, const void *Decoder);
320 static DecodeStatus DecodeT2Adr(MCInst &Inst, unsigned Val,
321                                 uint64_t Address, const void *Decoder);
322 static DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Val,
323                                 uint64_t Address, const void *Decoder);
324 static DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, unsigned Val,
325                                 uint64_t Address, const void *Decoder);
326
327 static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val,
328                                 uint64_t Address, const void *Decoder);
329 #include "ARMGenDisassemblerTables.inc"
330 #include "ARMGenInstrInfo.inc"
331 #include "ARMGenEDInfo.inc"
332
333 static MCDisassembler *createARMDisassembler(const Target &T, const MCSubtargetInfo &STI) {
334   return new ARMDisassembler(STI);
335 }
336
337 static MCDisassembler *createThumbDisassembler(const Target &T, const MCSubtargetInfo &STI) {
338   return new ThumbDisassembler(STI);
339 }
340
341 const EDInstInfo *ARMDisassembler::getEDInfo() const {
342   return instInfoARM;
343 }
344
345 const EDInstInfo *ThumbDisassembler::getEDInfo() const {
346   return instInfoARM;
347 }
348
349 DecodeStatus ARMDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
350                                              const MemoryObject &Region,
351                                              uint64_t Address,
352                                              raw_ostream &os,
353                                              raw_ostream &cs) const {
354   CommentStream = &cs;
355
356   uint8_t bytes[4];
357
358   assert(!(STI.getFeatureBits() & ARM::ModeThumb) &&
359          "Asked to disassemble an ARM instruction but Subtarget is in Thumb mode!");
360
361   // We want to read exactly 4 bytes of data.
362   if (Region.readBytes(Address, 4, (uint8_t*)bytes, NULL) == -1) {
363     Size = 0;
364     return MCDisassembler::Fail;
365   }
366
367   // Encoded as a small-endian 32-bit word in the stream.
368   uint32_t insn = (bytes[3] << 24) |
369                   (bytes[2] << 16) |
370                   (bytes[1] <<  8) |
371                   (bytes[0] <<  0);
372
373   // Calling the auto-generated decoder function.
374   DecodeStatus result = decodeARMInstruction32(MI, insn, Address, this, STI);
375   if (result != MCDisassembler::Fail) {
376     Size = 4;
377     return result;
378   }
379
380   // VFP and NEON instructions, similarly, are shared between ARM
381   // and Thumb modes.
382   MI.clear();
383   result = decodeVFPInstruction32(MI, insn, Address, this, STI);
384   if (result != MCDisassembler::Fail) {
385     Size = 4;
386     return result;
387   }
388
389   MI.clear();
390   result = decodeNEONDataInstruction32(MI, insn, Address, this, STI);
391   if (result != MCDisassembler::Fail) {
392     Size = 4;
393     // Add a fake predicate operand, because we share these instruction
394     // definitions with Thumb2 where these instructions are predicable.
395     if (!DecodePredicateOperand(MI, 0xE, Address, this))
396       return MCDisassembler::Fail;
397     return result;
398   }
399
400   MI.clear();
401   result = decodeNEONLoadStoreInstruction32(MI, insn, Address, this, STI);
402   if (result != MCDisassembler::Fail) {
403     Size = 4;
404     // Add a fake predicate operand, because we share these instruction
405     // definitions with Thumb2 where these instructions are predicable.
406     if (!DecodePredicateOperand(MI, 0xE, Address, this))
407       return MCDisassembler::Fail;
408     return result;
409   }
410
411   MI.clear();
412   result = decodeNEONDupInstruction32(MI, insn, Address, this, STI);
413   if (result != MCDisassembler::Fail) {
414     Size = 4;
415     // Add a fake predicate operand, because we share these instruction
416     // definitions with Thumb2 where these instructions are predicable.
417     if (!DecodePredicateOperand(MI, 0xE, Address, this))
418       return MCDisassembler::Fail;
419     return result;
420   }
421
422   MI.clear();
423
424   Size = 0;
425   return MCDisassembler::Fail;
426 }
427
428 namespace llvm {
429 extern const MCInstrDesc ARMInsts[];
430 }
431
432 /// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
433 /// immediate Value in the MCInst.  The immediate Value has had any PC
434 /// adjustment made by the caller.  If the instruction is a branch instruction
435 /// then isBranch is true, else false.  If the getOpInfo() function was set as
436 /// part of the setupForSymbolicDisassembly() call then that function is called
437 /// to get any symbolic information at the Address for this instruction.  If
438 /// that returns non-zero then the symbolic information it returns is used to
439 /// create an MCExpr and that is added as an operand to the MCInst.  If
440 /// getOpInfo() returns zero and isBranch is true then a symbol look up for
441 /// Value is done and if a symbol is found an MCExpr is created with that, else
442 /// an MCExpr with Value is created.  This function returns true if it adds an
443 /// operand to the MCInst and false otherwise.
444 static bool tryAddingSymbolicOperand(uint64_t Address, int32_t Value,
445                                      bool isBranch, uint64_t InstSize,
446                                      MCInst &MI, const void *Decoder) {
447   const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
448   LLVMOpInfoCallback getOpInfo = Dis->getLLVMOpInfoCallback();
449   struct LLVMOpInfo1 SymbolicOp;
450   memset(&SymbolicOp, '\0', sizeof(struct LLVMOpInfo1));
451   SymbolicOp.Value = Value;
452   void *DisInfo = Dis->getDisInfoBlock();
453
454   if (!getOpInfo ||
455       !getOpInfo(DisInfo, Address, 0 /* Offset */, InstSize, 1, &SymbolicOp)) {
456     // Clear SymbolicOp.Value from above and also all other fields.
457     memset(&SymbolicOp, '\0', sizeof(struct LLVMOpInfo1));
458     LLVMSymbolLookupCallback SymbolLookUp = Dis->getLLVMSymbolLookupCallback();
459     if (!SymbolLookUp)
460       return false;
461     uint64_t ReferenceType;
462     if (isBranch)
463        ReferenceType = LLVMDisassembler_ReferenceType_In_Branch;
464     else
465        ReferenceType = LLVMDisassembler_ReferenceType_InOut_None;
466     const char *ReferenceName;
467     const char *Name = SymbolLookUp(DisInfo, Value, &ReferenceType, Address,
468                                     &ReferenceName);
469     if (Name) {
470       SymbolicOp.AddSymbol.Name = Name;
471       SymbolicOp.AddSymbol.Present = true;
472     }
473     // For branches always create an MCExpr so it gets printed as hex address.
474     else if (isBranch) {
475       SymbolicOp.Value = Value;
476     }
477     if(ReferenceType == LLVMDisassembler_ReferenceType_Out_SymbolStub)
478       (*Dis->CommentStream) << "symbol stub for: " << ReferenceName;
479     if (!Name && !isBranch)
480       return false;
481   }
482
483   MCContext *Ctx = Dis->getMCContext();
484   const MCExpr *Add = NULL;
485   if (SymbolicOp.AddSymbol.Present) {
486     if (SymbolicOp.AddSymbol.Name) {
487       StringRef Name(SymbolicOp.AddSymbol.Name);
488       MCSymbol *Sym = Ctx->GetOrCreateSymbol(Name);
489       Add = MCSymbolRefExpr::Create(Sym, *Ctx);
490     } else {
491       Add = MCConstantExpr::Create(SymbolicOp.AddSymbol.Value, *Ctx);
492     }
493   }
494
495   const MCExpr *Sub = NULL;
496   if (SymbolicOp.SubtractSymbol.Present) {
497     if (SymbolicOp.SubtractSymbol.Name) {
498       StringRef Name(SymbolicOp.SubtractSymbol.Name);
499       MCSymbol *Sym = Ctx->GetOrCreateSymbol(Name);
500       Sub = MCSymbolRefExpr::Create(Sym, *Ctx);
501     } else {
502       Sub = MCConstantExpr::Create(SymbolicOp.SubtractSymbol.Value, *Ctx);
503     }
504   }
505
506   const MCExpr *Off = NULL;
507   if (SymbolicOp.Value != 0)
508     Off = MCConstantExpr::Create(SymbolicOp.Value, *Ctx);
509
510   const MCExpr *Expr;
511   if (Sub) {
512     const MCExpr *LHS;
513     if (Add)
514       LHS = MCBinaryExpr::CreateSub(Add, Sub, *Ctx);
515     else
516       LHS = MCUnaryExpr::CreateMinus(Sub, *Ctx);
517     if (Off != 0)
518       Expr = MCBinaryExpr::CreateAdd(LHS, Off, *Ctx);
519     else
520       Expr = LHS;
521   } else if (Add) {
522     if (Off != 0)
523       Expr = MCBinaryExpr::CreateAdd(Add, Off, *Ctx);
524     else
525       Expr = Add;
526   } else {
527     if (Off != 0)
528       Expr = Off;
529     else
530       Expr = MCConstantExpr::Create(0, *Ctx);
531   }
532
533   if (SymbolicOp.VariantKind == LLVMDisassembler_VariantKind_ARM_HI16)
534     MI.addOperand(MCOperand::CreateExpr(ARMMCExpr::CreateUpper16(Expr, *Ctx)));
535   else if (SymbolicOp.VariantKind == LLVMDisassembler_VariantKind_ARM_LO16)
536     MI.addOperand(MCOperand::CreateExpr(ARMMCExpr::CreateLower16(Expr, *Ctx)));
537   else if (SymbolicOp.VariantKind == LLVMDisassembler_VariantKind_None)
538     MI.addOperand(MCOperand::CreateExpr(Expr));
539   else
540     llvm_unreachable("bad SymbolicOp.VariantKind");
541
542   return true;
543 }
544
545 /// tryAddingPcLoadReferenceComment - trys to add a comment as to what is being
546 /// referenced by a load instruction with the base register that is the Pc.
547 /// These can often be values in a literal pool near the Address of the
548 /// instruction.  The Address of the instruction and its immediate Value are
549 /// used as a possible literal pool entry.  The SymbolLookUp call back will
550 /// return the name of a symbol referenced by the the literal pool's entry if
551 /// the referenced address is that of a symbol.  Or it will return a pointer to
552 /// a literal 'C' string if the referenced address of the literal pool's entry
553 /// is an address into a section with 'C' string literals.
554 static void tryAddingPcLoadReferenceComment(uint64_t Address, int Value,
555                                             const void *Decoder) {
556   const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
557   LLVMSymbolLookupCallback SymbolLookUp = Dis->getLLVMSymbolLookupCallback();
558   if (SymbolLookUp) {
559     void *DisInfo = Dis->getDisInfoBlock();
560     uint64_t ReferenceType;
561     ReferenceType = LLVMDisassembler_ReferenceType_In_PCrel_Load;
562     const char *ReferenceName;
563     (void)SymbolLookUp(DisInfo, Value, &ReferenceType, Address, &ReferenceName);
564     if(ReferenceType == LLVMDisassembler_ReferenceType_Out_LitPool_SymAddr ||
565        ReferenceType == LLVMDisassembler_ReferenceType_Out_LitPool_CstrAddr)
566       (*Dis->CommentStream) << "literal pool for: " << ReferenceName;
567   }
568 }
569
570 // Thumb1 instructions don't have explicit S bits.  Rather, they
571 // implicitly set CPSR.  Since it's not represented in the encoding, the
572 // auto-generated decoder won't inject the CPSR operand.  We need to fix
573 // that as a post-pass.
574 static void AddThumb1SBit(MCInst &MI, bool InITBlock) {
575   const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
576   unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
577   MCInst::iterator I = MI.begin();
578   for (unsigned i = 0; i < NumOps; ++i, ++I) {
579     if (I == MI.end()) break;
580     if (OpInfo[i].isOptionalDef() && OpInfo[i].RegClass == ARM::CCRRegClassID) {
581       if (i > 0 && OpInfo[i-1].isPredicate()) continue;
582       MI.insert(I, MCOperand::CreateReg(InITBlock ? 0 : ARM::CPSR));
583       return;
584     }
585   }
586
587   MI.insert(I, MCOperand::CreateReg(InITBlock ? 0 : ARM::CPSR));
588 }
589
590 // Most Thumb instructions don't have explicit predicates in the
591 // encoding, but rather get their predicates from IT context.  We need
592 // to fix up the predicate operands using this context information as a
593 // post-pass.
594 MCDisassembler::DecodeStatus
595 ThumbDisassembler::AddThumbPredicate(MCInst &MI) const {
596   MCDisassembler::DecodeStatus S = Success;
597
598   // A few instructions actually have predicates encoded in them.  Don't
599   // try to overwrite it if we're seeing one of those.
600   switch (MI.getOpcode()) {
601     case ARM::tBcc:
602     case ARM::t2Bcc:
603     case ARM::tCBZ:
604     case ARM::tCBNZ:
605     case ARM::tCPS:
606     case ARM::t2CPS3p:
607     case ARM::t2CPS2p:
608     case ARM::t2CPS1p:
609     case ARM::tMOVSr:
610     case ARM::tSETEND:
611       // Some instructions (mostly conditional branches) are not
612       // allowed in IT blocks.
613       if (!ITBlock.empty())
614         S = SoftFail;
615       else
616         return Success;
617       break;
618     case ARM::tB:
619     case ARM::t2B:
620     case ARM::t2TBB:
621     case ARM::t2TBH:
622       // Some instructions (mostly unconditional branches) can
623       // only appears at the end of, or outside of, an IT.
624       if (ITBlock.size() > 1)
625         S = SoftFail;
626       break;
627     default:
628       break;
629   }
630
631   // If we're in an IT block, base the predicate on that.  Otherwise,
632   // assume a predicate of AL.
633   unsigned CC;
634   if (!ITBlock.empty()) {
635     CC = ITBlock.back();
636     if (CC == 0xF)
637       CC = ARMCC::AL;
638     ITBlock.pop_back();
639   } else
640     CC = ARMCC::AL;
641
642   const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
643   unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
644   MCInst::iterator I = MI.begin();
645   for (unsigned i = 0; i < NumOps; ++i, ++I) {
646     if (I == MI.end()) break;
647     if (OpInfo[i].isPredicate()) {
648       I = MI.insert(I, MCOperand::CreateImm(CC));
649       ++I;
650       if (CC == ARMCC::AL)
651         MI.insert(I, MCOperand::CreateReg(0));
652       else
653         MI.insert(I, MCOperand::CreateReg(ARM::CPSR));
654       return S;
655     }
656   }
657
658   I = MI.insert(I, MCOperand::CreateImm(CC));
659   ++I;
660   if (CC == ARMCC::AL)
661     MI.insert(I, MCOperand::CreateReg(0));
662   else
663     MI.insert(I, MCOperand::CreateReg(ARM::CPSR));
664
665   return S;
666 }
667
668 // Thumb VFP instructions are a special case.  Because we share their
669 // encodings between ARM and Thumb modes, and they are predicable in ARM
670 // mode, the auto-generated decoder will give them an (incorrect)
671 // predicate operand.  We need to rewrite these operands based on the IT
672 // context as a post-pass.
673 void ThumbDisassembler::UpdateThumbVFPPredicate(MCInst &MI) const {
674   unsigned CC;
675   if (!ITBlock.empty()) {
676     CC = ITBlock.back();
677     ITBlock.pop_back();
678   } else
679     CC = ARMCC::AL;
680
681   const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
682   MCInst::iterator I = MI.begin();
683   unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
684   for (unsigned i = 0; i < NumOps; ++i, ++I) {
685     if (OpInfo[i].isPredicate() ) {
686       I->setImm(CC);
687       ++I;
688       if (CC == ARMCC::AL)
689         I->setReg(0);
690       else
691         I->setReg(ARM::CPSR);
692       return;
693     }
694   }
695 }
696
697 DecodeStatus ThumbDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
698                                                const MemoryObject &Region,
699                                                uint64_t Address,
700                                                raw_ostream &os,
701                                                raw_ostream &cs) const {
702   CommentStream = &cs;
703
704   uint8_t bytes[4];
705
706   assert((STI.getFeatureBits() & ARM::ModeThumb) &&
707          "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
708
709   // We want to read exactly 2 bytes of data.
710   if (Region.readBytes(Address, 2, (uint8_t*)bytes, NULL) == -1) {
711     Size = 0;
712     return MCDisassembler::Fail;
713   }
714
715   uint16_t insn16 = (bytes[1] << 8) | bytes[0];
716   DecodeStatus result = decodeThumbInstruction16(MI, insn16, Address, this, STI);
717   if (result != MCDisassembler::Fail) {
718     Size = 2;
719     Check(result, AddThumbPredicate(MI));
720     return result;
721   }
722
723   MI.clear();
724   result = decodeThumbSBitInstruction16(MI, insn16, Address, this, STI);
725   if (result) {
726     Size = 2;
727     bool InITBlock = !ITBlock.empty();
728     Check(result, AddThumbPredicate(MI));
729     AddThumb1SBit(MI, InITBlock);
730     return result;
731   }
732
733   MI.clear();
734   result = decodeThumb2Instruction16(MI, insn16, Address, this, STI);
735   if (result != MCDisassembler::Fail) {
736     Size = 2;
737
738     // Nested IT blocks are UNPREDICTABLE.  Must be checked before we add
739     // the Thumb predicate.
740     if (MI.getOpcode() == ARM::t2IT && !ITBlock.empty())
741       result = MCDisassembler::SoftFail;
742
743     Check(result, AddThumbPredicate(MI));
744
745     // If we find an IT instruction, we need to parse its condition
746     // code and mask operands so that we can apply them correctly
747     // to the subsequent instructions.
748     if (MI.getOpcode() == ARM::t2IT) {
749
750       // (3 - the number of trailing zeros) is the number of then / else.
751       unsigned firstcond = MI.getOperand(0).getImm();
752       unsigned Mask = MI.getOperand(1).getImm();
753       unsigned CondBit0 = Mask >> 4 & 1;
754       unsigned NumTZ = CountTrailingZeros_32(Mask);
755       assert(NumTZ <= 3 && "Invalid IT mask!");
756       for (unsigned Pos = 3, e = NumTZ; Pos > e; --Pos) {
757         bool T = ((Mask >> Pos) & 1) == CondBit0;
758         if (T)
759           ITBlock.insert(ITBlock.begin(), firstcond);
760         else
761           ITBlock.insert(ITBlock.begin(), firstcond ^ 1);
762       }
763
764       ITBlock.push_back(firstcond);
765     }
766
767     return result;
768   }
769
770   // We want to read exactly 4 bytes of data.
771   if (Region.readBytes(Address, 4, (uint8_t*)bytes, NULL) == -1) {
772     Size = 0;
773     return MCDisassembler::Fail;
774   }
775
776   uint32_t insn32 = (bytes[3] <<  8) |
777                     (bytes[2] <<  0) |
778                     (bytes[1] << 24) |
779                     (bytes[0] << 16);
780   MI.clear();
781   result = decodeThumbInstruction32(MI, insn32, Address, this, STI);
782   if (result != MCDisassembler::Fail) {
783     Size = 4;
784     bool InITBlock = ITBlock.size();
785     Check(result, AddThumbPredicate(MI));
786     AddThumb1SBit(MI, InITBlock);
787     return result;
788   }
789
790   MI.clear();
791   result = decodeThumb2Instruction32(MI, insn32, Address, this, STI);
792   if (result != MCDisassembler::Fail) {
793     Size = 4;
794     Check(result, AddThumbPredicate(MI));
795     return result;
796   }
797
798   MI.clear();
799   result = decodeVFPInstruction32(MI, insn32, Address, this, STI);
800   if (result != MCDisassembler::Fail) {
801     Size = 4;
802     UpdateThumbVFPPredicate(MI);
803     return result;
804   }
805
806   MI.clear();
807   result = decodeNEONDupInstruction32(MI, insn32, Address, this, STI);
808   if (result != MCDisassembler::Fail) {
809     Size = 4;
810     Check(result, AddThumbPredicate(MI));
811     return result;
812   }
813
814   if (fieldFromInstruction32(insn32, 24, 8) == 0xF9) {
815     MI.clear();
816     uint32_t NEONLdStInsn = insn32;
817     NEONLdStInsn &= 0xF0FFFFFF;
818     NEONLdStInsn |= 0x04000000;
819     result = decodeNEONLoadStoreInstruction32(MI, NEONLdStInsn, Address, this, STI);
820     if (result != MCDisassembler::Fail) {
821       Size = 4;
822       Check(result, AddThumbPredicate(MI));
823       return result;
824     }
825   }
826
827   if (fieldFromInstruction32(insn32, 24, 4) == 0xF) {
828     MI.clear();
829     uint32_t NEONDataInsn = insn32;
830     NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24
831     NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4; // Move bit 28 to bit 24
832     NEONDataInsn |= 0x12000000; // Set bits 28 and 25
833     result = decodeNEONDataInstruction32(MI, NEONDataInsn, Address, this, STI);
834     if (result != MCDisassembler::Fail) {
835       Size = 4;
836       Check(result, AddThumbPredicate(MI));
837       return result;
838     }
839   }
840
841   Size = 0;
842   return MCDisassembler::Fail;
843 }
844
845
846 extern "C" void LLVMInitializeARMDisassembler() {
847   TargetRegistry::RegisterMCDisassembler(TheARMTarget,
848                                          createARMDisassembler);
849   TargetRegistry::RegisterMCDisassembler(TheThumbTarget,
850                                          createThumbDisassembler);
851 }
852
853 static const uint16_t GPRDecoderTable[] = {
854   ARM::R0, ARM::R1, ARM::R2, ARM::R3,
855   ARM::R4, ARM::R5, ARM::R6, ARM::R7,
856   ARM::R8, ARM::R9, ARM::R10, ARM::R11,
857   ARM::R12, ARM::SP, ARM::LR, ARM::PC
858 };
859
860 static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo,
861                                    uint64_t Address, const void *Decoder) {
862   if (RegNo > 15)
863     return MCDisassembler::Fail;
864
865   unsigned Register = GPRDecoderTable[RegNo];
866   Inst.addOperand(MCOperand::CreateReg(Register));
867   return MCDisassembler::Success;
868 }
869
870 static DecodeStatus
871 DecodeGPRnopcRegisterClass(MCInst &Inst, unsigned RegNo,
872                            uint64_t Address, const void *Decoder) {
873   DecodeStatus S = MCDisassembler::Success;
874   
875   if (RegNo == 15) 
876     S = MCDisassembler::SoftFail;
877
878   Check(S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
879
880   return S;
881 }
882
883 static DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo,
884                                    uint64_t Address, const void *Decoder) {
885   if (RegNo > 7)
886     return MCDisassembler::Fail;
887   return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
888 }
889
890 static DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo,
891                                    uint64_t Address, const void *Decoder) {
892   unsigned Register = 0;
893   switch (RegNo) {
894     case 0:
895       Register = ARM::R0;
896       break;
897     case 1:
898       Register = ARM::R1;
899       break;
900     case 2:
901       Register = ARM::R2;
902       break;
903     case 3:
904       Register = ARM::R3;
905       break;
906     case 9:
907       Register = ARM::R9;
908       break;
909     case 12:
910       Register = ARM::R12;
911       break;
912     default:
913       return MCDisassembler::Fail;
914     }
915
916   Inst.addOperand(MCOperand::CreateReg(Register));
917   return MCDisassembler::Success;
918 }
919
920 static DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo,
921                                    uint64_t Address, const void *Decoder) {
922   if (RegNo == 13 || RegNo == 15) return MCDisassembler::Fail;
923   return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
924 }
925
926 static const uint16_t SPRDecoderTable[] = {
927      ARM::S0,  ARM::S1,  ARM::S2,  ARM::S3,
928      ARM::S4,  ARM::S5,  ARM::S6,  ARM::S7,
929      ARM::S8,  ARM::S9, ARM::S10, ARM::S11,
930     ARM::S12, ARM::S13, ARM::S14, ARM::S15,
931     ARM::S16, ARM::S17, ARM::S18, ARM::S19,
932     ARM::S20, ARM::S21, ARM::S22, ARM::S23,
933     ARM::S24, ARM::S25, ARM::S26, ARM::S27,
934     ARM::S28, ARM::S29, ARM::S30, ARM::S31
935 };
936
937 static DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo,
938                                    uint64_t Address, const void *Decoder) {
939   if (RegNo > 31)
940     return MCDisassembler::Fail;
941
942   unsigned Register = SPRDecoderTable[RegNo];
943   Inst.addOperand(MCOperand::CreateReg(Register));
944   return MCDisassembler::Success;
945 }
946
947 static const uint16_t DPRDecoderTable[] = {
948      ARM::D0,  ARM::D1,  ARM::D2,  ARM::D3,
949      ARM::D4,  ARM::D5,  ARM::D6,  ARM::D7,
950      ARM::D8,  ARM::D9, ARM::D10, ARM::D11,
951     ARM::D12, ARM::D13, ARM::D14, ARM::D15,
952     ARM::D16, ARM::D17, ARM::D18, ARM::D19,
953     ARM::D20, ARM::D21, ARM::D22, ARM::D23,
954     ARM::D24, ARM::D25, ARM::D26, ARM::D27,
955     ARM::D28, ARM::D29, ARM::D30, ARM::D31
956 };
957
958 static DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo,
959                                    uint64_t Address, const void *Decoder) {
960   if (RegNo > 31)
961     return MCDisassembler::Fail;
962
963   unsigned Register = DPRDecoderTable[RegNo];
964   Inst.addOperand(MCOperand::CreateReg(Register));
965   return MCDisassembler::Success;
966 }
967
968 static DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo,
969                                    uint64_t Address, const void *Decoder) {
970   if (RegNo > 7)
971     return MCDisassembler::Fail;
972   return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
973 }
974
975 static DecodeStatus
976 DecodeDPR_VFP2RegisterClass(MCInst &Inst, unsigned RegNo,
977                             uint64_t Address, const void *Decoder) {
978   if (RegNo > 15)
979     return MCDisassembler::Fail;
980   return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
981 }
982
983 static const uint16_t QPRDecoderTable[] = {
984      ARM::Q0,  ARM::Q1,  ARM::Q2,  ARM::Q3,
985      ARM::Q4,  ARM::Q5,  ARM::Q6,  ARM::Q7,
986      ARM::Q8,  ARM::Q9, ARM::Q10, ARM::Q11,
987     ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
988 };
989
990
991 static DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo,
992                                    uint64_t Address, const void *Decoder) {
993   if (RegNo > 31)
994     return MCDisassembler::Fail;
995   RegNo >>= 1;
996
997   unsigned Register = QPRDecoderTable[RegNo];
998   Inst.addOperand(MCOperand::CreateReg(Register));
999   return MCDisassembler::Success;
1000 }
1001
1002 static const uint16_t DPairDecoderTable[] = {
1003   ARM::Q0,  ARM::D1_D2,   ARM::Q1,  ARM::D3_D4,   ARM::Q2,  ARM::D5_D6,
1004   ARM::Q3,  ARM::D7_D8,   ARM::Q4,  ARM::D9_D10,  ARM::Q5,  ARM::D11_D12,
1005   ARM::Q6,  ARM::D13_D14, ARM::Q7,  ARM::D15_D16, ARM::Q8,  ARM::D17_D18,
1006   ARM::Q9,  ARM::D19_D20, ARM::Q10, ARM::D21_D22, ARM::Q11, ARM::D23_D24,
1007   ARM::Q12, ARM::D25_D26, ARM::Q13, ARM::D27_D28, ARM::Q14, ARM::D29_D30,
1008   ARM::Q15
1009 };
1010
1011 static DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo,
1012                                    uint64_t Address, const void *Decoder) {
1013   if (RegNo > 30)
1014     return MCDisassembler::Fail;
1015
1016   unsigned Register = DPairDecoderTable[RegNo];
1017   Inst.addOperand(MCOperand::CreateReg(Register));
1018   return MCDisassembler::Success;
1019 }
1020
1021 static const uint16_t DPairSpacedDecoderTable[] = {
1022   ARM::D0_D2,   ARM::D1_D3,   ARM::D2_D4,   ARM::D3_D5,
1023   ARM::D4_D6,   ARM::D5_D7,   ARM::D6_D8,   ARM::D7_D9,
1024   ARM::D8_D10,  ARM::D9_D11,  ARM::D10_D12, ARM::D11_D13,
1025   ARM::D12_D14, ARM::D13_D15, ARM::D14_D16, ARM::D15_D17,
1026   ARM::D16_D18, ARM::D17_D19, ARM::D18_D20, ARM::D19_D21,
1027   ARM::D20_D22, ARM::D21_D23, ARM::D22_D24, ARM::D23_D25,
1028   ARM::D24_D26, ARM::D25_D27, ARM::D26_D28, ARM::D27_D29,
1029   ARM::D28_D30, ARM::D29_D31
1030 };
1031
1032 static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst,
1033                                                    unsigned RegNo,
1034                                                    uint64_t Address,
1035                                                    const void *Decoder) {
1036   if (RegNo > 29)
1037     return MCDisassembler::Fail;
1038
1039   unsigned Register = DPairSpacedDecoderTable[RegNo];
1040   Inst.addOperand(MCOperand::CreateReg(Register));
1041   return MCDisassembler::Success;
1042 }
1043
1044 static DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val,
1045                                uint64_t Address, const void *Decoder) {
1046   if (Val == 0xF) return MCDisassembler::Fail;
1047   // AL predicate is not allowed on Thumb1 branches.
1048   if (Inst.getOpcode() == ARM::tBcc && Val == 0xE)
1049     return MCDisassembler::Fail;
1050   Inst.addOperand(MCOperand::CreateImm(Val));
1051   if (Val == ARMCC::AL) {
1052     Inst.addOperand(MCOperand::CreateReg(0));
1053   } else
1054     Inst.addOperand(MCOperand::CreateReg(ARM::CPSR));
1055   return MCDisassembler::Success;
1056 }
1057
1058 static DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val,
1059                                uint64_t Address, const void *Decoder) {
1060   if (Val)
1061     Inst.addOperand(MCOperand::CreateReg(ARM::CPSR));
1062   else
1063     Inst.addOperand(MCOperand::CreateReg(0));
1064   return MCDisassembler::Success;
1065 }
1066
1067 static DecodeStatus DecodeSOImmOperand(MCInst &Inst, unsigned Val,
1068                                uint64_t Address, const void *Decoder) {
1069   uint32_t imm = Val & 0xFF;
1070   uint32_t rot = (Val & 0xF00) >> 7;
1071   uint32_t rot_imm = (imm >> rot) | (imm << ((32-rot) & 0x1F));
1072   Inst.addOperand(MCOperand::CreateImm(rot_imm));
1073   return MCDisassembler::Success;
1074 }
1075
1076 static DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Val,
1077                                uint64_t Address, const void *Decoder) {
1078   DecodeStatus S = MCDisassembler::Success;
1079
1080   unsigned Rm = fieldFromInstruction32(Val, 0, 4);
1081   unsigned type = fieldFromInstruction32(Val, 5, 2);
1082   unsigned imm = fieldFromInstruction32(Val, 7, 5);
1083
1084   // Register-immediate
1085   if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1086     return MCDisassembler::Fail;
1087
1088   ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
1089   switch (type) {
1090     case 0:
1091       Shift = ARM_AM::lsl;
1092       break;
1093     case 1:
1094       Shift = ARM_AM::lsr;
1095       break;
1096     case 2:
1097       Shift = ARM_AM::asr;
1098       break;
1099     case 3:
1100       Shift = ARM_AM::ror;
1101       break;
1102   }
1103
1104   if (Shift == ARM_AM::ror && imm == 0)
1105     Shift = ARM_AM::rrx;
1106
1107   unsigned Op = Shift | (imm << 3);
1108   Inst.addOperand(MCOperand::CreateImm(Op));
1109
1110   return S;
1111 }
1112
1113 static DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Val,
1114                                uint64_t Address, const void *Decoder) {
1115   DecodeStatus S = MCDisassembler::Success;
1116
1117   unsigned Rm = fieldFromInstruction32(Val, 0, 4);
1118   unsigned type = fieldFromInstruction32(Val, 5, 2);
1119   unsigned Rs = fieldFromInstruction32(Val, 8, 4);
1120
1121   // Register-register
1122   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1123     return MCDisassembler::Fail;
1124   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder)))
1125     return MCDisassembler::Fail;
1126
1127   ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
1128   switch (type) {
1129     case 0:
1130       Shift = ARM_AM::lsl;
1131       break;
1132     case 1:
1133       Shift = ARM_AM::lsr;
1134       break;
1135     case 2:
1136       Shift = ARM_AM::asr;
1137       break;
1138     case 3:
1139       Shift = ARM_AM::ror;
1140       break;
1141   }
1142
1143   Inst.addOperand(MCOperand::CreateImm(Shift));
1144
1145   return S;
1146 }
1147
1148 static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val,
1149                                  uint64_t Address, const void *Decoder) {
1150   DecodeStatus S = MCDisassembler::Success;
1151
1152   bool writebackLoad = false;
1153   unsigned writebackReg = 0;
1154   switch (Inst.getOpcode()) {
1155     default:
1156       break;
1157     case ARM::LDMIA_UPD:
1158     case ARM::LDMDB_UPD:
1159     case ARM::LDMIB_UPD:
1160     case ARM::LDMDA_UPD:
1161     case ARM::t2LDMIA_UPD:
1162     case ARM::t2LDMDB_UPD:
1163       writebackLoad = true;
1164       writebackReg = Inst.getOperand(0).getReg();
1165       break;
1166   }
1167
1168   // Empty register lists are not allowed.
1169   if (CountPopulation_32(Val) == 0) return MCDisassembler::Fail;
1170   for (unsigned i = 0; i < 16; ++i) {
1171     if (Val & (1 << i)) {
1172       if (!Check(S, DecodeGPRRegisterClass(Inst, i, Address, Decoder)))
1173         return MCDisassembler::Fail;
1174       // Writeback not allowed if Rn is in the target list.
1175       if (writebackLoad && writebackReg == Inst.end()[-1].getReg())
1176         Check(S, MCDisassembler::SoftFail);
1177     }
1178   }
1179
1180   return S;
1181 }
1182
1183 static DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val,
1184                                  uint64_t Address, const void *Decoder) {
1185   DecodeStatus S = MCDisassembler::Success;
1186
1187   unsigned Vd = fieldFromInstruction32(Val, 8, 4);
1188   unsigned regs = Val & 0xFF;
1189
1190   if (!Check(S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder)))
1191     return MCDisassembler::Fail;
1192   for (unsigned i = 0; i < (regs - 1); ++i) {
1193     if (!Check(S, DecodeSPRRegisterClass(Inst, ++Vd, Address, Decoder)))
1194       return MCDisassembler::Fail;
1195   }
1196
1197   return S;
1198 }
1199
1200 static DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val,
1201                                  uint64_t Address, const void *Decoder) {
1202   DecodeStatus S = MCDisassembler::Success;
1203
1204   unsigned Vd = fieldFromInstruction32(Val, 8, 4);
1205   unsigned regs = (Val & 0xFF) / 2;
1206
1207   if (!Check(S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
1208       return MCDisassembler::Fail;
1209   for (unsigned i = 0; i < (regs - 1); ++i) {
1210     if (!Check(S, DecodeDPRRegisterClass(Inst, ++Vd, Address, Decoder)))
1211       return MCDisassembler::Fail;
1212   }
1213
1214   return S;
1215 }
1216
1217 static DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Val,
1218                                       uint64_t Address, const void *Decoder) {
1219   // This operand encodes a mask of contiguous zeros between a specified MSB
1220   // and LSB.  To decode it, we create the mask of all bits MSB-and-lower,
1221   // the mask of all bits LSB-and-lower, and then xor them to create
1222   // the mask of that's all ones on [msb, lsb].  Finally we not it to
1223   // create the final mask.
1224   unsigned msb = fieldFromInstruction32(Val, 5, 5);
1225   unsigned lsb = fieldFromInstruction32(Val, 0, 5);
1226
1227   DecodeStatus S = MCDisassembler::Success;
1228   if (lsb > msb) Check(S, MCDisassembler::SoftFail);
1229
1230   uint32_t msb_mask = 0xFFFFFFFF;
1231   if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
1232   uint32_t lsb_mask = (1U << lsb) - 1;
1233
1234   Inst.addOperand(MCOperand::CreateImm(~(msb_mask ^ lsb_mask)));
1235   return S;
1236 }
1237
1238 static DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn,
1239                                   uint64_t Address, const void *Decoder) {
1240   DecodeStatus S = MCDisassembler::Success;
1241
1242   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1243   unsigned CRd = fieldFromInstruction32(Insn, 12, 4);
1244   unsigned coproc = fieldFromInstruction32(Insn, 8, 4);
1245   unsigned imm = fieldFromInstruction32(Insn, 0, 8);
1246   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1247   unsigned U = fieldFromInstruction32(Insn, 23, 1);
1248
1249   switch (Inst.getOpcode()) {
1250     case ARM::LDC_OFFSET:
1251     case ARM::LDC_PRE:
1252     case ARM::LDC_POST:
1253     case ARM::LDC_OPTION:
1254     case ARM::LDCL_OFFSET:
1255     case ARM::LDCL_PRE:
1256     case ARM::LDCL_POST:
1257     case ARM::LDCL_OPTION:
1258     case ARM::STC_OFFSET:
1259     case ARM::STC_PRE:
1260     case ARM::STC_POST:
1261     case ARM::STC_OPTION:
1262     case ARM::STCL_OFFSET:
1263     case ARM::STCL_PRE:
1264     case ARM::STCL_POST:
1265     case ARM::STCL_OPTION:
1266     case ARM::t2LDC_OFFSET:
1267     case ARM::t2LDC_PRE:
1268     case ARM::t2LDC_POST:
1269     case ARM::t2LDC_OPTION:
1270     case ARM::t2LDCL_OFFSET:
1271     case ARM::t2LDCL_PRE:
1272     case ARM::t2LDCL_POST:
1273     case ARM::t2LDCL_OPTION:
1274     case ARM::t2STC_OFFSET:
1275     case ARM::t2STC_PRE:
1276     case ARM::t2STC_POST:
1277     case ARM::t2STC_OPTION:
1278     case ARM::t2STCL_OFFSET:
1279     case ARM::t2STCL_PRE:
1280     case ARM::t2STCL_POST:
1281     case ARM::t2STCL_OPTION:
1282       if (coproc == 0xA || coproc == 0xB)
1283         return MCDisassembler::Fail;
1284       break;
1285     default:
1286       break;
1287   }
1288
1289   Inst.addOperand(MCOperand::CreateImm(coproc));
1290   Inst.addOperand(MCOperand::CreateImm(CRd));
1291   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1292     return MCDisassembler::Fail;
1293
1294   switch (Inst.getOpcode()) {
1295     case ARM::t2LDC2_OFFSET:
1296     case ARM::t2LDC2L_OFFSET:
1297     case ARM::t2LDC2_PRE:
1298     case ARM::t2LDC2L_PRE:
1299     case ARM::t2STC2_OFFSET:
1300     case ARM::t2STC2L_OFFSET:
1301     case ARM::t2STC2_PRE:
1302     case ARM::t2STC2L_PRE:
1303     case ARM::LDC2_OFFSET:
1304     case ARM::LDC2L_OFFSET:
1305     case ARM::LDC2_PRE:
1306     case ARM::LDC2L_PRE:
1307     case ARM::STC2_OFFSET:
1308     case ARM::STC2L_OFFSET:
1309     case ARM::STC2_PRE:
1310     case ARM::STC2L_PRE:
1311     case ARM::t2LDC_OFFSET:
1312     case ARM::t2LDCL_OFFSET:
1313     case ARM::t2LDC_PRE:
1314     case ARM::t2LDCL_PRE:
1315     case ARM::t2STC_OFFSET:
1316     case ARM::t2STCL_OFFSET:
1317     case ARM::t2STC_PRE:
1318     case ARM::t2STCL_PRE:
1319     case ARM::LDC_OFFSET:
1320     case ARM::LDCL_OFFSET:
1321     case ARM::LDC_PRE:
1322     case ARM::LDCL_PRE:
1323     case ARM::STC_OFFSET:
1324     case ARM::STCL_OFFSET:
1325     case ARM::STC_PRE:
1326     case ARM::STCL_PRE:
1327       imm = ARM_AM::getAM5Opc(U ? ARM_AM::add : ARM_AM::sub, imm);
1328       Inst.addOperand(MCOperand::CreateImm(imm));
1329       break;
1330     case ARM::t2LDC2_POST:
1331     case ARM::t2LDC2L_POST:
1332     case ARM::t2STC2_POST:
1333     case ARM::t2STC2L_POST:
1334     case ARM::LDC2_POST:
1335     case ARM::LDC2L_POST:
1336     case ARM::STC2_POST:
1337     case ARM::STC2L_POST:
1338     case ARM::t2LDC_POST:
1339     case ARM::t2LDCL_POST:
1340     case ARM::t2STC_POST:
1341     case ARM::t2STCL_POST:
1342     case ARM::LDC_POST:
1343     case ARM::LDCL_POST:
1344     case ARM::STC_POST:
1345     case ARM::STCL_POST:
1346       imm |= U << 8;
1347       // fall through.
1348     default:
1349       // The 'option' variant doesn't encode 'U' in the immediate since
1350       // the immediate is unsigned [0,255].
1351       Inst.addOperand(MCOperand::CreateImm(imm));
1352       break;
1353   }
1354
1355   switch (Inst.getOpcode()) {
1356     case ARM::LDC_OFFSET:
1357     case ARM::LDC_PRE:
1358     case ARM::LDC_POST:
1359     case ARM::LDC_OPTION:
1360     case ARM::LDCL_OFFSET:
1361     case ARM::LDCL_PRE:
1362     case ARM::LDCL_POST:
1363     case ARM::LDCL_OPTION:
1364     case ARM::STC_OFFSET:
1365     case ARM::STC_PRE:
1366     case ARM::STC_POST:
1367     case ARM::STC_OPTION:
1368     case ARM::STCL_OFFSET:
1369     case ARM::STCL_PRE:
1370     case ARM::STCL_POST:
1371     case ARM::STCL_OPTION:
1372       if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1373         return MCDisassembler::Fail;
1374       break;
1375     default:
1376       break;
1377   }
1378
1379   return S;
1380 }
1381
1382 static DecodeStatus
1383 DecodeAddrMode2IdxInstruction(MCInst &Inst, unsigned Insn,
1384                               uint64_t Address, const void *Decoder) {
1385   DecodeStatus S = MCDisassembler::Success;
1386
1387   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1388   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
1389   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
1390   unsigned imm = fieldFromInstruction32(Insn, 0, 12);
1391   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1392   unsigned reg = fieldFromInstruction32(Insn, 25, 1);
1393   unsigned P = fieldFromInstruction32(Insn, 24, 1);
1394   unsigned W = fieldFromInstruction32(Insn, 21, 1);
1395
1396   // On stores, the writeback operand precedes Rt.
1397   switch (Inst.getOpcode()) {
1398     case ARM::STR_POST_IMM:
1399     case ARM::STR_POST_REG:
1400     case ARM::STRB_POST_IMM:
1401     case ARM::STRB_POST_REG:
1402     case ARM::STRT_POST_REG:
1403     case ARM::STRT_POST_IMM:
1404     case ARM::STRBT_POST_REG:
1405     case ARM::STRBT_POST_IMM:
1406       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1407         return MCDisassembler::Fail;
1408       break;
1409     default:
1410       break;
1411   }
1412
1413   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1414     return MCDisassembler::Fail;
1415
1416   // On loads, the writeback operand comes after Rt.
1417   switch (Inst.getOpcode()) {
1418     case ARM::LDR_POST_IMM:
1419     case ARM::LDR_POST_REG:
1420     case ARM::LDRB_POST_IMM:
1421     case ARM::LDRB_POST_REG:
1422     case ARM::LDRBT_POST_REG:
1423     case ARM::LDRBT_POST_IMM:
1424     case ARM::LDRT_POST_REG:
1425     case ARM::LDRT_POST_IMM:
1426       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1427         return MCDisassembler::Fail;
1428       break;
1429     default:
1430       break;
1431   }
1432
1433   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1434     return MCDisassembler::Fail;
1435
1436   ARM_AM::AddrOpc Op = ARM_AM::add;
1437   if (!fieldFromInstruction32(Insn, 23, 1))
1438     Op = ARM_AM::sub;
1439
1440   bool writeback = (P == 0) || (W == 1);
1441   unsigned idx_mode = 0;
1442   if (P && writeback)
1443     idx_mode = ARMII::IndexModePre;
1444   else if (!P && writeback)
1445     idx_mode = ARMII::IndexModePost;
1446
1447   if (writeback && (Rn == 15 || Rn == Rt))
1448     S = MCDisassembler::SoftFail; // UNPREDICTABLE
1449
1450   if (reg) {
1451     if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1452       return MCDisassembler::Fail;
1453     ARM_AM::ShiftOpc Opc = ARM_AM::lsl;
1454     switch( fieldFromInstruction32(Insn, 5, 2)) {
1455       case 0:
1456         Opc = ARM_AM::lsl;
1457         break;
1458       case 1:
1459         Opc = ARM_AM::lsr;
1460         break;
1461       case 2:
1462         Opc = ARM_AM::asr;
1463         break;
1464       case 3:
1465         Opc = ARM_AM::ror;
1466         break;
1467       default:
1468         return MCDisassembler::Fail;
1469     }
1470     unsigned amt = fieldFromInstruction32(Insn, 7, 5);
1471     unsigned imm = ARM_AM::getAM2Opc(Op, amt, Opc, idx_mode);
1472
1473     Inst.addOperand(MCOperand::CreateImm(imm));
1474   } else {
1475     Inst.addOperand(MCOperand::CreateReg(0));
1476     unsigned tmp = ARM_AM::getAM2Opc(Op, imm, ARM_AM::lsl, idx_mode);
1477     Inst.addOperand(MCOperand::CreateImm(tmp));
1478   }
1479
1480   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1481     return MCDisassembler::Fail;
1482
1483   return S;
1484 }
1485
1486 static DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Val,
1487                                   uint64_t Address, const void *Decoder) {
1488   DecodeStatus S = MCDisassembler::Success;
1489
1490   unsigned Rn = fieldFromInstruction32(Val, 13, 4);
1491   unsigned Rm = fieldFromInstruction32(Val,  0, 4);
1492   unsigned type = fieldFromInstruction32(Val, 5, 2);
1493   unsigned imm = fieldFromInstruction32(Val, 7, 5);
1494   unsigned U = fieldFromInstruction32(Val, 12, 1);
1495
1496   ARM_AM::ShiftOpc ShOp = ARM_AM::lsl;
1497   switch (type) {
1498     case 0:
1499       ShOp = ARM_AM::lsl;
1500       break;
1501     case 1:
1502       ShOp = ARM_AM::lsr;
1503       break;
1504     case 2:
1505       ShOp = ARM_AM::asr;
1506       break;
1507     case 3:
1508       ShOp = ARM_AM::ror;
1509       break;
1510   }
1511
1512   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1513     return MCDisassembler::Fail;
1514   if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1515     return MCDisassembler::Fail;
1516   unsigned shift;
1517   if (U)
1518     shift = ARM_AM::getAM2Opc(ARM_AM::add, imm, ShOp);
1519   else
1520     shift = ARM_AM::getAM2Opc(ARM_AM::sub, imm, ShOp);
1521   Inst.addOperand(MCOperand::CreateImm(shift));
1522
1523   return S;
1524 }
1525
1526 static DecodeStatus
1527 DecodeAddrMode3Instruction(MCInst &Inst, unsigned Insn,
1528                            uint64_t Address, const void *Decoder) {
1529   DecodeStatus S = MCDisassembler::Success;
1530
1531   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
1532   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1533   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
1534   unsigned type = fieldFromInstruction32(Insn, 22, 1);
1535   unsigned imm = fieldFromInstruction32(Insn, 8, 4);
1536   unsigned U = ((~fieldFromInstruction32(Insn, 23, 1)) & 1) << 8;
1537   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1538   unsigned W = fieldFromInstruction32(Insn, 21, 1);
1539   unsigned P = fieldFromInstruction32(Insn, 24, 1);
1540   unsigned Rt2 = Rt + 1;
1541
1542   bool writeback = (W == 1) | (P == 0);
1543
1544   // For {LD,ST}RD, Rt must be even, else undefined.
1545   switch (Inst.getOpcode()) {
1546     case ARM::STRD:
1547     case ARM::STRD_PRE:
1548     case ARM::STRD_POST:
1549     case ARM::LDRD:
1550     case ARM::LDRD_PRE:
1551     case ARM::LDRD_POST:
1552       if (Rt & 0x1) S = MCDisassembler::SoftFail;
1553       break;
1554     default:
1555       break;
1556   }
1557   switch (Inst.getOpcode()) {
1558     case ARM::STRD:
1559     case ARM::STRD_PRE:
1560     case ARM::STRD_POST:
1561       if (P == 0 && W == 1)
1562         S = MCDisassembler::SoftFail;
1563       
1564       if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
1565         S = MCDisassembler::SoftFail;
1566       if (type && Rm == 15)
1567         S = MCDisassembler::SoftFail;
1568       if (Rt2 == 15)
1569         S = MCDisassembler::SoftFail;
1570       if (!type && fieldFromInstruction32(Insn, 8, 4))
1571         S = MCDisassembler::SoftFail;
1572       break;
1573     case ARM::STRH:
1574     case ARM::STRH_PRE:
1575     case ARM::STRH_POST:
1576       if (Rt == 15)
1577         S = MCDisassembler::SoftFail;
1578       if (writeback && (Rn == 15 || Rn == Rt))
1579         S = MCDisassembler::SoftFail;
1580       if (!type && Rm == 15)
1581         S = MCDisassembler::SoftFail;
1582       break;
1583     case ARM::LDRD:
1584     case ARM::LDRD_PRE:
1585     case ARM::LDRD_POST:
1586       if (type && Rn == 15){
1587         if (Rt2 == 15)
1588           S = MCDisassembler::SoftFail;
1589         break;
1590       }
1591       if (P == 0 && W == 1)
1592         S = MCDisassembler::SoftFail;
1593       if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
1594         S = MCDisassembler::SoftFail;
1595       if (!type && writeback && Rn == 15)
1596         S = MCDisassembler::SoftFail;
1597       if (writeback && (Rn == Rt || Rn == Rt2))
1598         S = MCDisassembler::SoftFail;
1599       break;
1600     case ARM::LDRH:
1601     case ARM::LDRH_PRE:
1602     case ARM::LDRH_POST:
1603       if (type && Rn == 15){
1604         if (Rt == 15)
1605           S = MCDisassembler::SoftFail;
1606         break;
1607       }
1608       if (Rt == 15)
1609         S = MCDisassembler::SoftFail;
1610       if (!type && Rm == 15)
1611         S = MCDisassembler::SoftFail;
1612       if (!type && writeback && (Rn == 15 || Rn == Rt))
1613         S = MCDisassembler::SoftFail;
1614       break;
1615     case ARM::LDRSH:
1616     case ARM::LDRSH_PRE:
1617     case ARM::LDRSH_POST:
1618     case ARM::LDRSB:
1619     case ARM::LDRSB_PRE:
1620     case ARM::LDRSB_POST:
1621       if (type && Rn == 15){
1622         if (Rt == 15)
1623           S = MCDisassembler::SoftFail;
1624         break;
1625       }
1626       if (type && (Rt == 15 || (writeback && Rn == Rt)))
1627         S = MCDisassembler::SoftFail;
1628       if (!type && (Rt == 15 || Rm == 15))
1629         S = MCDisassembler::SoftFail;
1630       if (!type && writeback && (Rn == 15 || Rn == Rt))
1631         S = MCDisassembler::SoftFail;
1632       break;
1633     default:
1634       break;
1635   }
1636
1637   if (writeback) { // Writeback
1638     if (P)
1639       U |= ARMII::IndexModePre << 9;
1640     else
1641       U |= ARMII::IndexModePost << 9;
1642
1643     // On stores, the writeback operand precedes Rt.
1644     switch (Inst.getOpcode()) {
1645     case ARM::STRD:
1646     case ARM::STRD_PRE:
1647     case ARM::STRD_POST:
1648     case ARM::STRH:
1649     case ARM::STRH_PRE:
1650     case ARM::STRH_POST:
1651       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1652         return MCDisassembler::Fail;
1653       break;
1654     default:
1655       break;
1656     }
1657   }
1658
1659   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
1660     return MCDisassembler::Fail;
1661   switch (Inst.getOpcode()) {
1662     case ARM::STRD:
1663     case ARM::STRD_PRE:
1664     case ARM::STRD_POST:
1665     case ARM::LDRD:
1666     case ARM::LDRD_PRE:
1667     case ARM::LDRD_POST:
1668       if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
1669         return MCDisassembler::Fail;
1670       break;
1671     default:
1672       break;
1673   }
1674
1675   if (writeback) {
1676     // On loads, the writeback operand comes after Rt.
1677     switch (Inst.getOpcode()) {
1678     case ARM::LDRD:
1679     case ARM::LDRD_PRE:
1680     case ARM::LDRD_POST:
1681     case ARM::LDRH:
1682     case ARM::LDRH_PRE:
1683     case ARM::LDRH_POST:
1684     case ARM::LDRSH:
1685     case ARM::LDRSH_PRE:
1686     case ARM::LDRSH_POST:
1687     case ARM::LDRSB:
1688     case ARM::LDRSB_PRE:
1689     case ARM::LDRSB_POST:
1690     case ARM::LDRHTr:
1691     case ARM::LDRSBTr:
1692       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1693         return MCDisassembler::Fail;
1694       break;
1695     default:
1696       break;
1697     }
1698   }
1699
1700   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1701     return MCDisassembler::Fail;
1702
1703   if (type) {
1704     Inst.addOperand(MCOperand::CreateReg(0));
1705     Inst.addOperand(MCOperand::CreateImm(U | (imm << 4) | Rm));
1706   } else {
1707     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
1708     return MCDisassembler::Fail;
1709     Inst.addOperand(MCOperand::CreateImm(U));
1710   }
1711
1712   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1713     return MCDisassembler::Fail;
1714
1715   return S;
1716 }
1717
1718 static DecodeStatus DecodeRFEInstruction(MCInst &Inst, unsigned Insn,
1719                                  uint64_t Address, const void *Decoder) {
1720   DecodeStatus S = MCDisassembler::Success;
1721
1722   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1723   unsigned mode = fieldFromInstruction32(Insn, 23, 2);
1724
1725   switch (mode) {
1726     case 0:
1727       mode = ARM_AM::da;
1728       break;
1729     case 1:
1730       mode = ARM_AM::ia;
1731       break;
1732     case 2:
1733       mode = ARM_AM::db;
1734       break;
1735     case 3:
1736       mode = ARM_AM::ib;
1737       break;
1738   }
1739
1740   Inst.addOperand(MCOperand::CreateImm(mode));
1741   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1742     return MCDisassembler::Fail;
1743
1744   return S;
1745 }
1746
1747 static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst &Inst,
1748                                   unsigned Insn,
1749                                   uint64_t Address, const void *Decoder) {
1750   DecodeStatus S = MCDisassembler::Success;
1751
1752   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
1753   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1754   unsigned reglist = fieldFromInstruction32(Insn, 0, 16);
1755
1756   if (pred == 0xF) {
1757     switch (Inst.getOpcode()) {
1758       case ARM::LDMDA:
1759         Inst.setOpcode(ARM::RFEDA);
1760         break;
1761       case ARM::LDMDA_UPD:
1762         Inst.setOpcode(ARM::RFEDA_UPD);
1763         break;
1764       case ARM::LDMDB:
1765         Inst.setOpcode(ARM::RFEDB);
1766         break;
1767       case ARM::LDMDB_UPD:
1768         Inst.setOpcode(ARM::RFEDB_UPD);
1769         break;
1770       case ARM::LDMIA:
1771         Inst.setOpcode(ARM::RFEIA);
1772         break;
1773       case ARM::LDMIA_UPD:
1774         Inst.setOpcode(ARM::RFEIA_UPD);
1775         break;
1776       case ARM::LDMIB:
1777         Inst.setOpcode(ARM::RFEIB);
1778         break;
1779       case ARM::LDMIB_UPD:
1780         Inst.setOpcode(ARM::RFEIB_UPD);
1781         break;
1782       case ARM::STMDA:
1783         Inst.setOpcode(ARM::SRSDA);
1784         break;
1785       case ARM::STMDA_UPD:
1786         Inst.setOpcode(ARM::SRSDA_UPD);
1787         break;
1788       case ARM::STMDB:
1789         Inst.setOpcode(ARM::SRSDB);
1790         break;
1791       case ARM::STMDB_UPD:
1792         Inst.setOpcode(ARM::SRSDB_UPD);
1793         break;
1794       case ARM::STMIA:
1795         Inst.setOpcode(ARM::SRSIA);
1796         break;
1797       case ARM::STMIA_UPD:
1798         Inst.setOpcode(ARM::SRSIA_UPD);
1799         break;
1800       case ARM::STMIB:
1801         Inst.setOpcode(ARM::SRSIB);
1802         break;
1803       case ARM::STMIB_UPD:
1804         Inst.setOpcode(ARM::SRSIB_UPD);
1805         break;
1806       default:
1807         if (!Check(S, MCDisassembler::Fail)) return MCDisassembler::Fail;
1808     }
1809
1810     // For stores (which become SRS's, the only operand is the mode.
1811     if (fieldFromInstruction32(Insn, 20, 1) == 0) {
1812       Inst.addOperand(
1813           MCOperand::CreateImm(fieldFromInstruction32(Insn, 0, 4)));
1814       return S;
1815     }
1816
1817     return DecodeRFEInstruction(Inst, Insn, Address, Decoder);
1818   }
1819
1820   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1821     return MCDisassembler::Fail;
1822   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1823     return MCDisassembler::Fail; // Tied
1824   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1825     return MCDisassembler::Fail;
1826   if (!Check(S, DecodeRegListOperand(Inst, reglist, Address, Decoder)))
1827     return MCDisassembler::Fail;
1828
1829   return S;
1830 }
1831
1832 static DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn,
1833                                  uint64_t Address, const void *Decoder) {
1834   unsigned imod = fieldFromInstruction32(Insn, 18, 2);
1835   unsigned M = fieldFromInstruction32(Insn, 17, 1);
1836   unsigned iflags = fieldFromInstruction32(Insn, 6, 3);
1837   unsigned mode = fieldFromInstruction32(Insn, 0, 5);
1838
1839   DecodeStatus S = MCDisassembler::Success;
1840
1841   // imod == '01' --> UNPREDICTABLE
1842   // NOTE: Even though this is technically UNPREDICTABLE, we choose to
1843   // return failure here.  The '01' imod value is unprintable, so there's
1844   // nothing useful we could do even if we returned UNPREDICTABLE.
1845
1846   if (imod == 1) return MCDisassembler::Fail;
1847
1848   if (imod && M) {
1849     Inst.setOpcode(ARM::CPS3p);
1850     Inst.addOperand(MCOperand::CreateImm(imod));
1851     Inst.addOperand(MCOperand::CreateImm(iflags));
1852     Inst.addOperand(MCOperand::CreateImm(mode));
1853   } else if (imod && !M) {
1854     Inst.setOpcode(ARM::CPS2p);
1855     Inst.addOperand(MCOperand::CreateImm(imod));
1856     Inst.addOperand(MCOperand::CreateImm(iflags));
1857     if (mode) S = MCDisassembler::SoftFail;
1858   } else if (!imod && M) {
1859     Inst.setOpcode(ARM::CPS1p);
1860     Inst.addOperand(MCOperand::CreateImm(mode));
1861     if (iflags) S = MCDisassembler::SoftFail;
1862   } else {
1863     // imod == '00' && M == '0' --> UNPREDICTABLE
1864     Inst.setOpcode(ARM::CPS1p);
1865     Inst.addOperand(MCOperand::CreateImm(mode));
1866     S = MCDisassembler::SoftFail;
1867   }
1868
1869   return S;
1870 }
1871
1872 static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
1873                                  uint64_t Address, const void *Decoder) {
1874   unsigned imod = fieldFromInstruction32(Insn, 9, 2);
1875   unsigned M = fieldFromInstruction32(Insn, 8, 1);
1876   unsigned iflags = fieldFromInstruction32(Insn, 5, 3);
1877   unsigned mode = fieldFromInstruction32(Insn, 0, 5);
1878
1879   DecodeStatus S = MCDisassembler::Success;
1880
1881   // imod == '01' --> UNPREDICTABLE
1882   // NOTE: Even though this is technically UNPREDICTABLE, we choose to
1883   // return failure here.  The '01' imod value is unprintable, so there's
1884   // nothing useful we could do even if we returned UNPREDICTABLE.
1885
1886   if (imod == 1) return MCDisassembler::Fail;
1887
1888   if (imod && M) {
1889     Inst.setOpcode(ARM::t2CPS3p);
1890     Inst.addOperand(MCOperand::CreateImm(imod));
1891     Inst.addOperand(MCOperand::CreateImm(iflags));
1892     Inst.addOperand(MCOperand::CreateImm(mode));
1893   } else if (imod && !M) {
1894     Inst.setOpcode(ARM::t2CPS2p);
1895     Inst.addOperand(MCOperand::CreateImm(imod));
1896     Inst.addOperand(MCOperand::CreateImm(iflags));
1897     if (mode) S = MCDisassembler::SoftFail;
1898   } else if (!imod && M) {
1899     Inst.setOpcode(ARM::t2CPS1p);
1900     Inst.addOperand(MCOperand::CreateImm(mode));
1901     if (iflags) S = MCDisassembler::SoftFail;
1902   } else {
1903     // imod == '00' && M == '0' --> UNPREDICTABLE
1904     Inst.setOpcode(ARM::t2CPS1p);
1905     Inst.addOperand(MCOperand::CreateImm(mode));
1906     S = MCDisassembler::SoftFail;
1907   }
1908
1909   return S;
1910 }
1911
1912 static DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn,
1913                                  uint64_t Address, const void *Decoder) {
1914   DecodeStatus S = MCDisassembler::Success;
1915
1916   unsigned Rd = fieldFromInstruction32(Insn, 8, 4);
1917   unsigned imm = 0;
1918
1919   imm |= (fieldFromInstruction32(Insn, 0, 8) << 0);
1920   imm |= (fieldFromInstruction32(Insn, 12, 3) << 8);
1921   imm |= (fieldFromInstruction32(Insn, 16, 4) << 12);
1922   imm |= (fieldFromInstruction32(Insn, 26, 1) << 11);
1923
1924   if (Inst.getOpcode() == ARM::t2MOVTi16)
1925     if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
1926       return MCDisassembler::Fail;
1927   if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
1928     return MCDisassembler::Fail;
1929
1930   if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
1931     Inst.addOperand(MCOperand::CreateImm(imm));
1932
1933   return S;
1934 }
1935
1936 static DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn,
1937                                  uint64_t Address, const void *Decoder) {
1938   DecodeStatus S = MCDisassembler::Success;
1939
1940   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
1941   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1942   unsigned imm = 0;
1943
1944   imm |= (fieldFromInstruction32(Insn, 0, 12) << 0);
1945   imm |= (fieldFromInstruction32(Insn, 16, 4) << 12);
1946
1947   if (Inst.getOpcode() == ARM::MOVTi16)
1948     if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
1949       return MCDisassembler::Fail;
1950   if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
1951     return MCDisassembler::Fail;
1952
1953   if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
1954     Inst.addOperand(MCOperand::CreateImm(imm));
1955
1956   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1957     return MCDisassembler::Fail;
1958
1959   return S;
1960 }
1961
1962 static DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn,
1963                                  uint64_t Address, const void *Decoder) {
1964   DecodeStatus S = MCDisassembler::Success;
1965
1966   unsigned Rd = fieldFromInstruction32(Insn, 16, 4);
1967   unsigned Rn = fieldFromInstruction32(Insn, 0, 4);
1968   unsigned Rm = fieldFromInstruction32(Insn, 8, 4);
1969   unsigned Ra = fieldFromInstruction32(Insn, 12, 4);
1970   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
1971
1972   if (pred == 0xF)
1973     return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
1974
1975   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
1976     return MCDisassembler::Fail;
1977   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
1978     return MCDisassembler::Fail;
1979   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
1980     return MCDisassembler::Fail;
1981   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder)))
1982     return MCDisassembler::Fail;
1983
1984   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
1985     return MCDisassembler::Fail;
1986
1987   return S;
1988 }
1989
1990 static DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val,
1991                            uint64_t Address, const void *Decoder) {
1992   DecodeStatus S = MCDisassembler::Success;
1993
1994   unsigned add = fieldFromInstruction32(Val, 12, 1);
1995   unsigned imm = fieldFromInstruction32(Val, 0, 12);
1996   unsigned Rn = fieldFromInstruction32(Val, 13, 4);
1997
1998   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
1999     return MCDisassembler::Fail;
2000
2001   if (!add) imm *= -1;
2002   if (imm == 0 && !add) imm = INT32_MIN;
2003   Inst.addOperand(MCOperand::CreateImm(imm));
2004   if (Rn == 15)
2005     tryAddingPcLoadReferenceComment(Address, Address + imm + 8, Decoder);
2006
2007   return S;
2008 }
2009
2010 static DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val,
2011                                    uint64_t Address, const void *Decoder) {
2012   DecodeStatus S = MCDisassembler::Success;
2013
2014   unsigned Rn = fieldFromInstruction32(Val, 9, 4);
2015   unsigned U = fieldFromInstruction32(Val, 8, 1);
2016   unsigned imm = fieldFromInstruction32(Val, 0, 8);
2017
2018   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2019     return MCDisassembler::Fail;
2020
2021   if (U)
2022     Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::add, imm)));
2023   else
2024     Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::sub, imm)));
2025
2026   return S;
2027 }
2028
2029 static DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val,
2030                                    uint64_t Address, const void *Decoder) {
2031   return DecodeGPRRegisterClass(Inst, Val, Address, Decoder);
2032 }
2033
2034 static DecodeStatus
2035 DecodeT2BInstruction(MCInst &Inst, unsigned Insn,
2036                      uint64_t Address, const void *Decoder) {
2037   DecodeStatus S = MCDisassembler::Success;
2038   unsigned imm = (fieldFromInstruction32(Insn, 0, 11) << 0) |
2039                  (fieldFromInstruction32(Insn, 11, 1) << 18) |
2040                  (fieldFromInstruction32(Insn, 13, 1) << 17) |
2041                  (fieldFromInstruction32(Insn, 16, 6) << 11) |
2042                  (fieldFromInstruction32(Insn, 26, 1) << 19);
2043   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<20>(imm<<1) + 4,
2044                                 true, 4, Inst, Decoder))
2045     Inst.addOperand(MCOperand::CreateImm(SignExtend32<20>(imm << 1)));
2046   return S;
2047 }
2048
2049 static DecodeStatus
2050 DecodeBranchImmInstruction(MCInst &Inst, unsigned Insn,
2051                            uint64_t Address, const void *Decoder) {
2052   DecodeStatus S = MCDisassembler::Success;
2053
2054   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
2055   unsigned imm = fieldFromInstruction32(Insn, 0, 24) << 2;
2056
2057   if (pred == 0xF) {
2058     Inst.setOpcode(ARM::BLXi);
2059     imm |= fieldFromInstruction32(Insn, 24, 1) << 1;
2060     if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<26>(imm) + 8,
2061                                   true, 4, Inst, Decoder))
2062     Inst.addOperand(MCOperand::CreateImm(SignExtend32<26>(imm)));
2063     return S;
2064   }
2065
2066   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<26>(imm) + 8,
2067                                 true, 4, Inst, Decoder))
2068     Inst.addOperand(MCOperand::CreateImm(SignExtend32<26>(imm)));
2069   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2070     return MCDisassembler::Fail;
2071
2072   return S;
2073 }
2074
2075
2076 static DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val,
2077                                    uint64_t Address, const void *Decoder) {
2078   DecodeStatus S = MCDisassembler::Success;
2079
2080   unsigned Rm = fieldFromInstruction32(Val, 0, 4);
2081   unsigned align = fieldFromInstruction32(Val, 4, 2);
2082
2083   if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2084     return MCDisassembler::Fail;
2085   if (!align)
2086     Inst.addOperand(MCOperand::CreateImm(0));
2087   else
2088     Inst.addOperand(MCOperand::CreateImm(4 << align));
2089
2090   return S;
2091 }
2092
2093 static DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Insn,
2094                                    uint64_t Address, const void *Decoder) {
2095   DecodeStatus S = MCDisassembler::Success;
2096
2097   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2098   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2099   unsigned wb = fieldFromInstruction32(Insn, 16, 4);
2100   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2101   Rn |= fieldFromInstruction32(Insn, 4, 2) << 4;
2102   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2103
2104   // First output register
2105   switch (Inst.getOpcode()) {
2106   case ARM::VLD1q16: case ARM::VLD1q32: case ARM::VLD1q64: case ARM::VLD1q8:
2107   case ARM::VLD1q16wb_fixed: case ARM::VLD1q16wb_register:
2108   case ARM::VLD1q32wb_fixed: case ARM::VLD1q32wb_register:
2109   case ARM::VLD1q64wb_fixed: case ARM::VLD1q64wb_register:
2110   case ARM::VLD1q8wb_fixed: case ARM::VLD1q8wb_register:
2111   case ARM::VLD2d16: case ARM::VLD2d32: case ARM::VLD2d8:
2112   case ARM::VLD2d16wb_fixed: case ARM::VLD2d16wb_register:
2113   case ARM::VLD2d32wb_fixed: case ARM::VLD2d32wb_register:
2114   case ARM::VLD2d8wb_fixed: case ARM::VLD2d8wb_register:
2115     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
2116       return MCDisassembler::Fail;
2117     break;
2118   case ARM::VLD2b16:
2119   case ARM::VLD2b32:
2120   case ARM::VLD2b8:
2121   case ARM::VLD2b16wb_fixed:
2122   case ARM::VLD2b16wb_register:
2123   case ARM::VLD2b32wb_fixed:
2124   case ARM::VLD2b32wb_register:
2125   case ARM::VLD2b8wb_fixed:
2126   case ARM::VLD2b8wb_register:
2127     if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
2128       return MCDisassembler::Fail;
2129     break;
2130   default:
2131     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2132       return MCDisassembler::Fail;
2133   }
2134
2135   // Second output register
2136   switch (Inst.getOpcode()) {
2137     case ARM::VLD3d8:
2138     case ARM::VLD3d16:
2139     case ARM::VLD3d32:
2140     case ARM::VLD3d8_UPD:
2141     case ARM::VLD3d16_UPD:
2142     case ARM::VLD3d32_UPD:
2143     case ARM::VLD4d8:
2144     case ARM::VLD4d16:
2145     case ARM::VLD4d32:
2146     case ARM::VLD4d8_UPD:
2147     case ARM::VLD4d16_UPD:
2148     case ARM::VLD4d32_UPD:
2149       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
2150         return MCDisassembler::Fail;
2151       break;
2152     case ARM::VLD3q8:
2153     case ARM::VLD3q16:
2154     case ARM::VLD3q32:
2155     case ARM::VLD3q8_UPD:
2156     case ARM::VLD3q16_UPD:
2157     case ARM::VLD3q32_UPD:
2158     case ARM::VLD4q8:
2159     case ARM::VLD4q16:
2160     case ARM::VLD4q32:
2161     case ARM::VLD4q8_UPD:
2162     case ARM::VLD4q16_UPD:
2163     case ARM::VLD4q32_UPD:
2164       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2165         return MCDisassembler::Fail;
2166     default:
2167       break;
2168   }
2169
2170   // Third output register
2171   switch(Inst.getOpcode()) {
2172     case ARM::VLD3d8:
2173     case ARM::VLD3d16:
2174     case ARM::VLD3d32:
2175     case ARM::VLD3d8_UPD:
2176     case ARM::VLD3d16_UPD:
2177     case ARM::VLD3d32_UPD:
2178     case ARM::VLD4d8:
2179     case ARM::VLD4d16:
2180     case ARM::VLD4d32:
2181     case ARM::VLD4d8_UPD:
2182     case ARM::VLD4d16_UPD:
2183     case ARM::VLD4d32_UPD:
2184       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2185         return MCDisassembler::Fail;
2186       break;
2187     case ARM::VLD3q8:
2188     case ARM::VLD3q16:
2189     case ARM::VLD3q32:
2190     case ARM::VLD3q8_UPD:
2191     case ARM::VLD3q16_UPD:
2192     case ARM::VLD3q32_UPD:
2193     case ARM::VLD4q8:
2194     case ARM::VLD4q16:
2195     case ARM::VLD4q32:
2196     case ARM::VLD4q8_UPD:
2197     case ARM::VLD4q16_UPD:
2198     case ARM::VLD4q32_UPD:
2199       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
2200         return MCDisassembler::Fail;
2201       break;
2202     default:
2203       break;
2204   }
2205
2206   // Fourth output register
2207   switch (Inst.getOpcode()) {
2208     case ARM::VLD4d8:
2209     case ARM::VLD4d16:
2210     case ARM::VLD4d32:
2211     case ARM::VLD4d8_UPD:
2212     case ARM::VLD4d16_UPD:
2213     case ARM::VLD4d32_UPD:
2214       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
2215         return MCDisassembler::Fail;
2216       break;
2217     case ARM::VLD4q8:
2218     case ARM::VLD4q16:
2219     case ARM::VLD4q32:
2220     case ARM::VLD4q8_UPD:
2221     case ARM::VLD4q16_UPD:
2222     case ARM::VLD4q32_UPD:
2223       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
2224         return MCDisassembler::Fail;
2225       break;
2226     default:
2227       break;
2228   }
2229
2230   // Writeback operand
2231   switch (Inst.getOpcode()) {
2232     case ARM::VLD1d8wb_fixed:
2233     case ARM::VLD1d16wb_fixed:
2234     case ARM::VLD1d32wb_fixed:
2235     case ARM::VLD1d64wb_fixed:
2236     case ARM::VLD1d8wb_register:
2237     case ARM::VLD1d16wb_register:
2238     case ARM::VLD1d32wb_register:
2239     case ARM::VLD1d64wb_register:
2240     case ARM::VLD1q8wb_fixed:
2241     case ARM::VLD1q16wb_fixed:
2242     case ARM::VLD1q32wb_fixed:
2243     case ARM::VLD1q64wb_fixed:
2244     case ARM::VLD1q8wb_register:
2245     case ARM::VLD1q16wb_register:
2246     case ARM::VLD1q32wb_register:
2247     case ARM::VLD1q64wb_register:
2248     case ARM::VLD1d8Twb_fixed:
2249     case ARM::VLD1d8Twb_register:
2250     case ARM::VLD1d16Twb_fixed:
2251     case ARM::VLD1d16Twb_register:
2252     case ARM::VLD1d32Twb_fixed:
2253     case ARM::VLD1d32Twb_register:
2254     case ARM::VLD1d64Twb_fixed:
2255     case ARM::VLD1d64Twb_register:
2256     case ARM::VLD1d8Qwb_fixed:
2257     case ARM::VLD1d8Qwb_register:
2258     case ARM::VLD1d16Qwb_fixed:
2259     case ARM::VLD1d16Qwb_register:
2260     case ARM::VLD1d32Qwb_fixed:
2261     case ARM::VLD1d32Qwb_register:
2262     case ARM::VLD1d64Qwb_fixed:
2263     case ARM::VLD1d64Qwb_register:
2264     case ARM::VLD2d8wb_fixed:
2265     case ARM::VLD2d16wb_fixed:
2266     case ARM::VLD2d32wb_fixed:
2267     case ARM::VLD2q8wb_fixed:
2268     case ARM::VLD2q16wb_fixed:
2269     case ARM::VLD2q32wb_fixed:
2270     case ARM::VLD2d8wb_register:
2271     case ARM::VLD2d16wb_register:
2272     case ARM::VLD2d32wb_register:
2273     case ARM::VLD2q8wb_register:
2274     case ARM::VLD2q16wb_register:
2275     case ARM::VLD2q32wb_register:
2276     case ARM::VLD2b8wb_fixed:
2277     case ARM::VLD2b16wb_fixed:
2278     case ARM::VLD2b32wb_fixed:
2279     case ARM::VLD2b8wb_register:
2280     case ARM::VLD2b16wb_register:
2281     case ARM::VLD2b32wb_register:
2282       Inst.addOperand(MCOperand::CreateImm(0));
2283       break;
2284     case ARM::VLD3d8_UPD:
2285     case ARM::VLD3d16_UPD:
2286     case ARM::VLD3d32_UPD:
2287     case ARM::VLD3q8_UPD:
2288     case ARM::VLD3q16_UPD:
2289     case ARM::VLD3q32_UPD:
2290     case ARM::VLD4d8_UPD:
2291     case ARM::VLD4d16_UPD:
2292     case ARM::VLD4d32_UPD:
2293     case ARM::VLD4q8_UPD:
2294     case ARM::VLD4q16_UPD:
2295     case ARM::VLD4q32_UPD:
2296       if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
2297         return MCDisassembler::Fail;
2298       break;
2299     default:
2300       break;
2301   }
2302
2303   // AddrMode6 Base (register+alignment)
2304   if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
2305     return MCDisassembler::Fail;
2306
2307   // AddrMode6 Offset (register)
2308   switch (Inst.getOpcode()) {
2309   default:
2310     // The below have been updated to have explicit am6offset split
2311     // between fixed and register offset. For those instructions not
2312     // yet updated, we need to add an additional reg0 operand for the
2313     // fixed variant.
2314     //
2315     // The fixed offset encodes as Rm == 0xd, so we check for that.
2316     if (Rm == 0xd) {
2317       Inst.addOperand(MCOperand::CreateReg(0));
2318       break;
2319     }
2320     // Fall through to handle the register offset variant.
2321   case ARM::VLD1d8wb_fixed:
2322   case ARM::VLD1d16wb_fixed:
2323   case ARM::VLD1d32wb_fixed:
2324   case ARM::VLD1d64wb_fixed:
2325   case ARM::VLD1d8Twb_fixed:
2326   case ARM::VLD1d16Twb_fixed:
2327   case ARM::VLD1d32Twb_fixed:
2328   case ARM::VLD1d64Twb_fixed:
2329   case ARM::VLD1d8Qwb_fixed:
2330   case ARM::VLD1d16Qwb_fixed:
2331   case ARM::VLD1d32Qwb_fixed:
2332   case ARM::VLD1d64Qwb_fixed:
2333   case ARM::VLD1d8wb_register:
2334   case ARM::VLD1d16wb_register:
2335   case ARM::VLD1d32wb_register:
2336   case ARM::VLD1d64wb_register:
2337   case ARM::VLD1q8wb_fixed:
2338   case ARM::VLD1q16wb_fixed:
2339   case ARM::VLD1q32wb_fixed:
2340   case ARM::VLD1q64wb_fixed:
2341   case ARM::VLD1q8wb_register:
2342   case ARM::VLD1q16wb_register:
2343   case ARM::VLD1q32wb_register:
2344   case ARM::VLD1q64wb_register:
2345     // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
2346     // variant encodes Rm == 0xf. Anything else is a register offset post-
2347     // increment and we need to add the register operand to the instruction.
2348     if (Rm != 0xD && Rm != 0xF &&
2349         !Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2350       return MCDisassembler::Fail;
2351     break;
2352   case ARM::VLD2d8wb_fixed:
2353   case ARM::VLD2d16wb_fixed:
2354   case ARM::VLD2d32wb_fixed:
2355   case ARM::VLD2b8wb_fixed:
2356   case ARM::VLD2b16wb_fixed:
2357   case ARM::VLD2b32wb_fixed:
2358   case ARM::VLD2q8wb_fixed:
2359   case ARM::VLD2q16wb_fixed:
2360   case ARM::VLD2q32wb_fixed:
2361     break;
2362   }
2363
2364   return S;
2365 }
2366
2367 static DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Insn,
2368                                  uint64_t Address, const void *Decoder) {
2369   DecodeStatus S = MCDisassembler::Success;
2370
2371   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2372   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2373   unsigned wb = fieldFromInstruction32(Insn, 16, 4);
2374   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2375   Rn |= fieldFromInstruction32(Insn, 4, 2) << 4;
2376   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2377
2378   // Writeback Operand
2379   switch (Inst.getOpcode()) {
2380     case ARM::VST1d8wb_fixed:
2381     case ARM::VST1d16wb_fixed:
2382     case ARM::VST1d32wb_fixed:
2383     case ARM::VST1d64wb_fixed:
2384     case ARM::VST1d8wb_register:
2385     case ARM::VST1d16wb_register:
2386     case ARM::VST1d32wb_register:
2387     case ARM::VST1d64wb_register:
2388     case ARM::VST1q8wb_fixed:
2389     case ARM::VST1q16wb_fixed:
2390     case ARM::VST1q32wb_fixed:
2391     case ARM::VST1q64wb_fixed:
2392     case ARM::VST1q8wb_register:
2393     case ARM::VST1q16wb_register:
2394     case ARM::VST1q32wb_register:
2395     case ARM::VST1q64wb_register:
2396     case ARM::VST1d8Twb_fixed:
2397     case ARM::VST1d16Twb_fixed:
2398     case ARM::VST1d32Twb_fixed:
2399     case ARM::VST1d64Twb_fixed:
2400     case ARM::VST1d8Twb_register:
2401     case ARM::VST1d16Twb_register:
2402     case ARM::VST1d32Twb_register:
2403     case ARM::VST1d64Twb_register:
2404     case ARM::VST1d8Qwb_fixed:
2405     case ARM::VST1d16Qwb_fixed:
2406     case ARM::VST1d32Qwb_fixed:
2407     case ARM::VST1d64Qwb_fixed:
2408     case ARM::VST1d8Qwb_register:
2409     case ARM::VST1d16Qwb_register:
2410     case ARM::VST1d32Qwb_register:
2411     case ARM::VST1d64Qwb_register:
2412     case ARM::VST2d8wb_fixed:
2413     case ARM::VST2d16wb_fixed:
2414     case ARM::VST2d32wb_fixed:
2415     case ARM::VST2d8wb_register:
2416     case ARM::VST2d16wb_register:
2417     case ARM::VST2d32wb_register:
2418     case ARM::VST2q8wb_fixed:
2419     case ARM::VST2q16wb_fixed:
2420     case ARM::VST2q32wb_fixed:
2421     case ARM::VST2q8wb_register:
2422     case ARM::VST2q16wb_register:
2423     case ARM::VST2q32wb_register:
2424     case ARM::VST2b8wb_fixed:
2425     case ARM::VST2b16wb_fixed:
2426     case ARM::VST2b32wb_fixed:
2427     case ARM::VST2b8wb_register:
2428     case ARM::VST2b16wb_register:
2429     case ARM::VST2b32wb_register:
2430       if (Rm == 0xF)
2431         return MCDisassembler::Fail;
2432       Inst.addOperand(MCOperand::CreateImm(0));
2433       break;
2434     case ARM::VST3d8_UPD:
2435     case ARM::VST3d16_UPD:
2436     case ARM::VST3d32_UPD:
2437     case ARM::VST3q8_UPD:
2438     case ARM::VST3q16_UPD:
2439     case ARM::VST3q32_UPD:
2440     case ARM::VST4d8_UPD:
2441     case ARM::VST4d16_UPD:
2442     case ARM::VST4d32_UPD:
2443     case ARM::VST4q8_UPD:
2444     case ARM::VST4q16_UPD:
2445     case ARM::VST4q32_UPD:
2446       if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
2447         return MCDisassembler::Fail;
2448       break;
2449     default:
2450       break;
2451   }
2452
2453   // AddrMode6 Base (register+alignment)
2454   if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
2455     return MCDisassembler::Fail;
2456
2457   // AddrMode6 Offset (register)
2458   switch (Inst.getOpcode()) {
2459     default:
2460       if (Rm == 0xD)
2461         Inst.addOperand(MCOperand::CreateReg(0));
2462       else if (Rm != 0xF) {
2463         if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2464           return MCDisassembler::Fail;
2465       }
2466       break;
2467     case ARM::VST1d8wb_fixed:
2468     case ARM::VST1d16wb_fixed:
2469     case ARM::VST1d32wb_fixed:
2470     case ARM::VST1d64wb_fixed:
2471     case ARM::VST1q8wb_fixed:
2472     case ARM::VST1q16wb_fixed:
2473     case ARM::VST1q32wb_fixed:
2474     case ARM::VST1q64wb_fixed:
2475     case ARM::VST1d8Twb_fixed:
2476     case ARM::VST1d16Twb_fixed:
2477     case ARM::VST1d32Twb_fixed:
2478     case ARM::VST1d64Twb_fixed:
2479     case ARM::VST1d8Qwb_fixed:
2480     case ARM::VST1d16Qwb_fixed:
2481     case ARM::VST1d32Qwb_fixed:
2482     case ARM::VST1d64Qwb_fixed:
2483     case ARM::VST2d8wb_fixed:
2484     case ARM::VST2d16wb_fixed:
2485     case ARM::VST2d32wb_fixed:
2486     case ARM::VST2q8wb_fixed:
2487     case ARM::VST2q16wb_fixed:
2488     case ARM::VST2q32wb_fixed:
2489     case ARM::VST2b8wb_fixed:
2490     case ARM::VST2b16wb_fixed:
2491     case ARM::VST2b32wb_fixed:
2492       break;
2493   }
2494
2495
2496   // First input register
2497   switch (Inst.getOpcode()) {
2498   case ARM::VST1q16:
2499   case ARM::VST1q32:
2500   case ARM::VST1q64:
2501   case ARM::VST1q8:
2502   case ARM::VST1q16wb_fixed:
2503   case ARM::VST1q16wb_register:
2504   case ARM::VST1q32wb_fixed:
2505   case ARM::VST1q32wb_register:
2506   case ARM::VST1q64wb_fixed:
2507   case ARM::VST1q64wb_register:
2508   case ARM::VST1q8wb_fixed:
2509   case ARM::VST1q8wb_register:
2510   case ARM::VST2d16:
2511   case ARM::VST2d32:
2512   case ARM::VST2d8:
2513   case ARM::VST2d16wb_fixed:
2514   case ARM::VST2d16wb_register:
2515   case ARM::VST2d32wb_fixed:
2516   case ARM::VST2d32wb_register:
2517   case ARM::VST2d8wb_fixed:
2518   case ARM::VST2d8wb_register:
2519     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
2520       return MCDisassembler::Fail;
2521     break;
2522   case ARM::VST2b16:
2523   case ARM::VST2b32:
2524   case ARM::VST2b8:
2525   case ARM::VST2b16wb_fixed:
2526   case ARM::VST2b16wb_register:
2527   case ARM::VST2b32wb_fixed:
2528   case ARM::VST2b32wb_register:
2529   case ARM::VST2b8wb_fixed:
2530   case ARM::VST2b8wb_register:
2531     if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
2532       return MCDisassembler::Fail;
2533     break;
2534   default:
2535     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2536       return MCDisassembler::Fail;
2537   }
2538
2539   // Second input register
2540   switch (Inst.getOpcode()) {
2541     case ARM::VST3d8:
2542     case ARM::VST3d16:
2543     case ARM::VST3d32:
2544     case ARM::VST3d8_UPD:
2545     case ARM::VST3d16_UPD:
2546     case ARM::VST3d32_UPD:
2547     case ARM::VST4d8:
2548     case ARM::VST4d16:
2549     case ARM::VST4d32:
2550     case ARM::VST4d8_UPD:
2551     case ARM::VST4d16_UPD:
2552     case ARM::VST4d32_UPD:
2553       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
2554         return MCDisassembler::Fail;
2555       break;
2556     case ARM::VST3q8:
2557     case ARM::VST3q16:
2558     case ARM::VST3q32:
2559     case ARM::VST3q8_UPD:
2560     case ARM::VST3q16_UPD:
2561     case ARM::VST3q32_UPD:
2562     case ARM::VST4q8:
2563     case ARM::VST4q16:
2564     case ARM::VST4q32:
2565     case ARM::VST4q8_UPD:
2566     case ARM::VST4q16_UPD:
2567     case ARM::VST4q32_UPD:
2568       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2569         return MCDisassembler::Fail;
2570       break;
2571     default:
2572       break;
2573   }
2574
2575   // Third input register
2576   switch (Inst.getOpcode()) {
2577     case ARM::VST3d8:
2578     case ARM::VST3d16:
2579     case ARM::VST3d32:
2580     case ARM::VST3d8_UPD:
2581     case ARM::VST3d16_UPD:
2582     case ARM::VST3d32_UPD:
2583     case ARM::VST4d8:
2584     case ARM::VST4d16:
2585     case ARM::VST4d32:
2586     case ARM::VST4d8_UPD:
2587     case ARM::VST4d16_UPD:
2588     case ARM::VST4d32_UPD:
2589       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
2590         return MCDisassembler::Fail;
2591       break;
2592     case ARM::VST3q8:
2593     case ARM::VST3q16:
2594     case ARM::VST3q32:
2595     case ARM::VST3q8_UPD:
2596     case ARM::VST3q16_UPD:
2597     case ARM::VST3q32_UPD:
2598     case ARM::VST4q8:
2599     case ARM::VST4q16:
2600     case ARM::VST4q32:
2601     case ARM::VST4q8_UPD:
2602     case ARM::VST4q16_UPD:
2603     case ARM::VST4q32_UPD:
2604       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
2605         return MCDisassembler::Fail;
2606       break;
2607     default:
2608       break;
2609   }
2610
2611   // Fourth input register
2612   switch (Inst.getOpcode()) {
2613     case ARM::VST4d8:
2614     case ARM::VST4d16:
2615     case ARM::VST4d32:
2616     case ARM::VST4d8_UPD:
2617     case ARM::VST4d16_UPD:
2618     case ARM::VST4d32_UPD:
2619       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
2620         return MCDisassembler::Fail;
2621       break;
2622     case ARM::VST4q8:
2623     case ARM::VST4q16:
2624     case ARM::VST4q32:
2625     case ARM::VST4q8_UPD:
2626     case ARM::VST4q16_UPD:
2627     case ARM::VST4q32_UPD:
2628       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
2629         return MCDisassembler::Fail;
2630       break;
2631     default:
2632       break;
2633   }
2634
2635   return S;
2636 }
2637
2638 static DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Insn,
2639                                     uint64_t Address, const void *Decoder) {
2640   DecodeStatus S = MCDisassembler::Success;
2641
2642   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2643   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2644   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2645   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2646   unsigned align = fieldFromInstruction32(Insn, 4, 1);
2647   unsigned size = fieldFromInstruction32(Insn, 6, 2);
2648
2649   align *= (1 << size);
2650
2651   switch (Inst.getOpcode()) {
2652   case ARM::VLD1DUPq16: case ARM::VLD1DUPq32: case ARM::VLD1DUPq8:
2653   case ARM::VLD1DUPq16wb_fixed: case ARM::VLD1DUPq16wb_register:
2654   case ARM::VLD1DUPq32wb_fixed: case ARM::VLD1DUPq32wb_register:
2655   case ARM::VLD1DUPq8wb_fixed: case ARM::VLD1DUPq8wb_register:
2656     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
2657       return MCDisassembler::Fail;
2658     break;
2659   default:
2660     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2661       return MCDisassembler::Fail;
2662     break;
2663   }
2664   if (Rm != 0xF) {
2665     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2666       return MCDisassembler::Fail;
2667   }
2668
2669   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2670     return MCDisassembler::Fail;
2671   Inst.addOperand(MCOperand::CreateImm(align));
2672
2673   // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
2674   // variant encodes Rm == 0xf. Anything else is a register offset post-
2675   // increment and we need to add the register operand to the instruction.
2676   if (Rm != 0xD && Rm != 0xF &&
2677       !Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2678     return MCDisassembler::Fail;
2679
2680   return S;
2681 }
2682
2683 static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Insn,
2684                                     uint64_t Address, const void *Decoder) {
2685   DecodeStatus S = MCDisassembler::Success;
2686
2687   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2688   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2689   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2690   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2691   unsigned align = fieldFromInstruction32(Insn, 4, 1);
2692   unsigned size = 1 << fieldFromInstruction32(Insn, 6, 2);
2693   unsigned pred = fieldFromInstruction32(Insn, 22, 4);
2694   align *= 2*size;
2695
2696   switch (Inst.getOpcode()) {
2697   case ARM::VLD2DUPd16: case ARM::VLD2DUPd32: case ARM::VLD2DUPd8:
2698   case ARM::VLD2DUPd16wb_fixed: case ARM::VLD2DUPd16wb_register:
2699   case ARM::VLD2DUPd32wb_fixed: case ARM::VLD2DUPd32wb_register:
2700   case ARM::VLD2DUPd8wb_fixed: case ARM::VLD2DUPd8wb_register:
2701     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
2702       return MCDisassembler::Fail;
2703     break;
2704   case ARM::VLD2DUPd16x2: case ARM::VLD2DUPd32x2: case ARM::VLD2DUPd8x2:
2705   case ARM::VLD2DUPd16x2wb_fixed: case ARM::VLD2DUPd16x2wb_register:
2706   case ARM::VLD2DUPd32x2wb_fixed: case ARM::VLD2DUPd32x2wb_register:
2707   case ARM::VLD2DUPd8x2wb_fixed: case ARM::VLD2DUPd8x2wb_register:
2708     if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
2709       return MCDisassembler::Fail;
2710     break;
2711   default:
2712     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2713       return MCDisassembler::Fail;
2714     break;
2715   }
2716
2717   if (Rm != 0xF)
2718     Inst.addOperand(MCOperand::CreateImm(0));
2719
2720   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2721     return MCDisassembler::Fail;
2722   Inst.addOperand(MCOperand::CreateImm(align));
2723
2724   if (Rm == 0xD)
2725     Inst.addOperand(MCOperand::CreateReg(0));
2726   else if (Rm != 0xF) {
2727     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2728       return MCDisassembler::Fail;
2729   }
2730
2731   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
2732     return MCDisassembler::Fail;
2733
2734   return S;
2735 }
2736
2737 static DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Insn,
2738                                     uint64_t Address, const void *Decoder) {
2739   DecodeStatus S = MCDisassembler::Success;
2740
2741   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2742   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2743   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2744   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2745   unsigned inc = fieldFromInstruction32(Insn, 5, 1) + 1;
2746
2747   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2748     return MCDisassembler::Fail;
2749   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
2750     return MCDisassembler::Fail;
2751   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
2752     return MCDisassembler::Fail;
2753   if (Rm != 0xF) {
2754     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2755       return MCDisassembler::Fail;
2756   }
2757
2758   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2759     return MCDisassembler::Fail;
2760   Inst.addOperand(MCOperand::CreateImm(0));
2761
2762   if (Rm == 0xD)
2763     Inst.addOperand(MCOperand::CreateReg(0));
2764   else if (Rm != 0xF) {
2765     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2766       return MCDisassembler::Fail;
2767   }
2768
2769   return S;
2770 }
2771
2772 static DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Insn,
2773                                     uint64_t Address, const void *Decoder) {
2774   DecodeStatus S = MCDisassembler::Success;
2775
2776   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2777   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2778   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2779   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2780   unsigned size = fieldFromInstruction32(Insn, 6, 2);
2781   unsigned inc = fieldFromInstruction32(Insn, 5, 1) + 1;
2782   unsigned align = fieldFromInstruction32(Insn, 4, 1);
2783
2784   if (size == 0x3) {
2785     size = 4;
2786     align = 16;
2787   } else {
2788     if (size == 2) {
2789       size = 1 << size;
2790       align *= 8;
2791     } else {
2792       size = 1 << size;
2793       align *= 4*size;
2794     }
2795   }
2796
2797   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2798     return MCDisassembler::Fail;
2799   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
2800     return MCDisassembler::Fail;
2801   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
2802     return MCDisassembler::Fail;
2803   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3*inc)%32, Address, Decoder)))
2804     return MCDisassembler::Fail;
2805   if (Rm != 0xF) {
2806     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2807       return MCDisassembler::Fail;
2808   }
2809
2810   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
2811     return MCDisassembler::Fail;
2812   Inst.addOperand(MCOperand::CreateImm(align));
2813
2814   if (Rm == 0xD)
2815     Inst.addOperand(MCOperand::CreateReg(0));
2816   else if (Rm != 0xF) {
2817     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
2818       return MCDisassembler::Fail;
2819   }
2820
2821   return S;
2822 }
2823
2824 static DecodeStatus
2825 DecodeNEONModImmInstruction(MCInst &Inst, unsigned Insn,
2826                             uint64_t Address, const void *Decoder) {
2827   DecodeStatus S = MCDisassembler::Success;
2828
2829   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2830   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2831   unsigned imm = fieldFromInstruction32(Insn, 0, 4);
2832   imm |= fieldFromInstruction32(Insn, 16, 3) << 4;
2833   imm |= fieldFromInstruction32(Insn, 24, 1) << 7;
2834   imm |= fieldFromInstruction32(Insn, 8, 4) << 8;
2835   imm |= fieldFromInstruction32(Insn, 5, 1) << 12;
2836   unsigned Q = fieldFromInstruction32(Insn, 6, 1);
2837
2838   if (Q) {
2839     if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
2840     return MCDisassembler::Fail;
2841   } else {
2842     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2843     return MCDisassembler::Fail;
2844   }
2845
2846   Inst.addOperand(MCOperand::CreateImm(imm));
2847
2848   switch (Inst.getOpcode()) {
2849     case ARM::VORRiv4i16:
2850     case ARM::VORRiv2i32:
2851     case ARM::VBICiv4i16:
2852     case ARM::VBICiv2i32:
2853       if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2854         return MCDisassembler::Fail;
2855       break;
2856     case ARM::VORRiv8i16:
2857     case ARM::VORRiv4i32:
2858     case ARM::VBICiv8i16:
2859     case ARM::VBICiv4i32:
2860       if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
2861         return MCDisassembler::Fail;
2862       break;
2863     default:
2864       break;
2865   }
2866
2867   return S;
2868 }
2869
2870 static DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Insn,
2871                                         uint64_t Address, const void *Decoder) {
2872   DecodeStatus S = MCDisassembler::Success;
2873
2874   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2875   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2876   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2877   Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
2878   unsigned size = fieldFromInstruction32(Insn, 18, 2);
2879
2880   if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
2881     return MCDisassembler::Fail;
2882   if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
2883     return MCDisassembler::Fail;
2884   Inst.addOperand(MCOperand::CreateImm(8 << size));
2885
2886   return S;
2887 }
2888
2889 static DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val,
2890                                uint64_t Address, const void *Decoder) {
2891   Inst.addOperand(MCOperand::CreateImm(8 - Val));
2892   return MCDisassembler::Success;
2893 }
2894
2895 static DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val,
2896                                uint64_t Address, const void *Decoder) {
2897   Inst.addOperand(MCOperand::CreateImm(16 - Val));
2898   return MCDisassembler::Success;
2899 }
2900
2901 static DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val,
2902                                uint64_t Address, const void *Decoder) {
2903   Inst.addOperand(MCOperand::CreateImm(32 - Val));
2904   return MCDisassembler::Success;
2905 }
2906
2907 static DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val,
2908                                uint64_t Address, const void *Decoder) {
2909   Inst.addOperand(MCOperand::CreateImm(64 - Val));
2910   return MCDisassembler::Success;
2911 }
2912
2913 static DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn,
2914                                uint64_t Address, const void *Decoder) {
2915   DecodeStatus S = MCDisassembler::Success;
2916
2917   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
2918   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
2919   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
2920   Rn |= fieldFromInstruction32(Insn, 7, 1) << 4;
2921   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
2922   Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
2923   unsigned op = fieldFromInstruction32(Insn, 6, 1);
2924
2925   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2926     return MCDisassembler::Fail;
2927   if (op) {
2928     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
2929     return MCDisassembler::Fail; // Writeback
2930   }
2931
2932   switch (Inst.getOpcode()) {
2933   case ARM::VTBL2:
2934   case ARM::VTBX2:
2935     if (!Check(S, DecodeDPairRegisterClass(Inst, Rn, Address, Decoder)))
2936       return MCDisassembler::Fail;
2937     break;
2938   default:
2939     if (!Check(S, DecodeDPRRegisterClass(Inst, Rn, Address, Decoder)))
2940       return MCDisassembler::Fail;
2941   }
2942
2943   if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
2944     return MCDisassembler::Fail;
2945
2946   return S;
2947 }
2948
2949 static DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn,
2950                                      uint64_t Address, const void *Decoder) {
2951   DecodeStatus S = MCDisassembler::Success;
2952
2953   unsigned dst = fieldFromInstruction16(Insn, 8, 3);
2954   unsigned imm = fieldFromInstruction16(Insn, 0, 8);
2955
2956   if (!Check(S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder)))
2957     return MCDisassembler::Fail;
2958
2959   switch(Inst.getOpcode()) {
2960     default:
2961       return MCDisassembler::Fail;
2962     case ARM::tADR:
2963       break; // tADR does not explicitly represent the PC as an operand.
2964     case ARM::tADDrSPi:
2965       Inst.addOperand(MCOperand::CreateReg(ARM::SP));
2966       break;
2967   }
2968
2969   Inst.addOperand(MCOperand::CreateImm(imm));
2970   return S;
2971 }
2972
2973 static DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val,
2974                                  uint64_t Address, const void *Decoder) {
2975   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<12>(Val<<1) + 4,
2976                                 true, 2, Inst, Decoder))
2977     Inst.addOperand(MCOperand::CreateImm(SignExtend32<12>(Val << 1)));
2978   return MCDisassembler::Success;
2979 }
2980
2981 static DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val,
2982                                  uint64_t Address, const void *Decoder) {
2983   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<22>(Val<<1) + 4,
2984                                 true, 4, Inst, Decoder))
2985     Inst.addOperand(MCOperand::CreateImm(SignExtend32<21>(Val)));
2986   return MCDisassembler::Success;
2987 }
2988
2989 static DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val,
2990                                  uint64_t Address, const void *Decoder) {
2991   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<7>(Val<<1) + 4,
2992                                 true, 2, Inst, Decoder))
2993     Inst.addOperand(MCOperand::CreateImm(SignExtend32<7>(Val << 1)));
2994   return MCDisassembler::Success;
2995 }
2996
2997 static DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val,
2998                                  uint64_t Address, const void *Decoder) {
2999   DecodeStatus S = MCDisassembler::Success;
3000
3001   unsigned Rn = fieldFromInstruction32(Val, 0, 3);
3002   unsigned Rm = fieldFromInstruction32(Val, 3, 3);
3003
3004   if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
3005     return MCDisassembler::Fail;
3006   if (!Check(S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder)))
3007     return MCDisassembler::Fail;
3008
3009   return S;
3010 }
3011
3012 static DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val,
3013                                   uint64_t Address, const void *Decoder) {
3014   DecodeStatus S = MCDisassembler::Success;
3015
3016   unsigned Rn = fieldFromInstruction32(Val, 0, 3);
3017   unsigned imm = fieldFromInstruction32(Val, 3, 5);
3018
3019   if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
3020     return MCDisassembler::Fail;
3021   Inst.addOperand(MCOperand::CreateImm(imm));
3022
3023   return S;
3024 }
3025
3026 static DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val,
3027                                   uint64_t Address, const void *Decoder) {
3028   unsigned imm = Val << 2;
3029
3030   Inst.addOperand(MCOperand::CreateImm(imm));
3031   tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4, Decoder);
3032
3033   return MCDisassembler::Success;
3034 }
3035
3036 static DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val,
3037                                   uint64_t Address, const void *Decoder) {
3038   Inst.addOperand(MCOperand::CreateReg(ARM::SP));
3039   Inst.addOperand(MCOperand::CreateImm(Val));
3040
3041   return MCDisassembler::Success;
3042 }
3043
3044 static DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val,
3045                                   uint64_t Address, const void *Decoder) {
3046   DecodeStatus S = MCDisassembler::Success;
3047
3048   unsigned Rn = fieldFromInstruction32(Val, 6, 4);
3049   unsigned Rm = fieldFromInstruction32(Val, 2, 4);
3050   unsigned imm = fieldFromInstruction32(Val, 0, 2);
3051
3052   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3053     return MCDisassembler::Fail;
3054   if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
3055     return MCDisassembler::Fail;
3056   Inst.addOperand(MCOperand::CreateImm(imm));
3057
3058   return S;
3059 }
3060
3061 static DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Insn,
3062                               uint64_t Address, const void *Decoder) {
3063   DecodeStatus S = MCDisassembler::Success;
3064
3065   switch (Inst.getOpcode()) {
3066     case ARM::t2PLDs:
3067     case ARM::t2PLDWs:
3068     case ARM::t2PLIs:
3069       break;
3070     default: {
3071       unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3072       if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
3073     return MCDisassembler::Fail;
3074     }
3075   }
3076
3077   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3078   if (Rn == 0xF) {
3079     switch (Inst.getOpcode()) {
3080       case ARM::t2LDRBs:
3081         Inst.setOpcode(ARM::t2LDRBpci);
3082         break;
3083       case ARM::t2LDRHs:
3084         Inst.setOpcode(ARM::t2LDRHpci);
3085         break;
3086       case ARM::t2LDRSHs:
3087         Inst.setOpcode(ARM::t2LDRSHpci);
3088         break;
3089       case ARM::t2LDRSBs:
3090         Inst.setOpcode(ARM::t2LDRSBpci);
3091         break;
3092       case ARM::t2PLDs:
3093         Inst.setOpcode(ARM::t2PLDi12);
3094         Inst.addOperand(MCOperand::CreateReg(ARM::PC));
3095         break;
3096       default:
3097         return MCDisassembler::Fail;
3098     }
3099
3100     int imm = fieldFromInstruction32(Insn, 0, 12);
3101     if (!fieldFromInstruction32(Insn, 23, 1)) imm *= -1;
3102     Inst.addOperand(MCOperand::CreateImm(imm));
3103
3104     return S;
3105   }
3106
3107   unsigned addrmode = fieldFromInstruction32(Insn, 4, 2);
3108   addrmode |= fieldFromInstruction32(Insn, 0, 4) << 2;
3109   addrmode |= fieldFromInstruction32(Insn, 16, 4) << 6;
3110   if (!Check(S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder)))
3111     return MCDisassembler::Fail;
3112
3113   return S;
3114 }
3115
3116 static DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val,
3117                            uint64_t Address, const void *Decoder) {
3118   int imm = Val & 0xFF;
3119   if (!(Val & 0x100)) imm *= -1;
3120   Inst.addOperand(MCOperand::CreateImm(imm << 2));
3121
3122   return MCDisassembler::Success;
3123 }
3124
3125 static DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val,
3126                                    uint64_t Address, const void *Decoder) {
3127   DecodeStatus S = MCDisassembler::Success;
3128
3129   unsigned Rn = fieldFromInstruction32(Val, 9, 4);
3130   unsigned imm = fieldFromInstruction32(Val, 0, 9);
3131
3132   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3133     return MCDisassembler::Fail;
3134   if (!Check(S, DecodeT2Imm8S4(Inst, imm, Address, Decoder)))
3135     return MCDisassembler::Fail;
3136
3137   return S;
3138 }
3139
3140 static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
3141                                    uint64_t Address, const void *Decoder) {
3142   DecodeStatus S = MCDisassembler::Success;
3143
3144   unsigned Rn = fieldFromInstruction32(Val, 8, 4);
3145   unsigned imm = fieldFromInstruction32(Val, 0, 8);
3146
3147   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
3148     return MCDisassembler::Fail;
3149
3150   Inst.addOperand(MCOperand::CreateImm(imm));
3151
3152   return S;
3153 }
3154
3155 static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
3156                          uint64_t Address, const void *Decoder) {
3157   int imm = Val & 0xFF;
3158   if (Val == 0)
3159     imm = INT32_MIN;
3160   else if (!(Val & 0x100))
3161     imm *= -1;
3162   Inst.addOperand(MCOperand::CreateImm(imm));
3163
3164   return MCDisassembler::Success;
3165 }
3166
3167
3168 static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
3169                                  uint64_t Address, const void *Decoder) {
3170   DecodeStatus S = MCDisassembler::Success;
3171
3172   unsigned Rn = fieldFromInstruction32(Val, 9, 4);
3173   unsigned imm = fieldFromInstruction32(Val, 0, 9);
3174
3175   // Some instructions always use an additive offset.
3176   switch (Inst.getOpcode()) {
3177     case ARM::t2LDRT:
3178     case ARM::t2LDRBT:
3179     case ARM::t2LDRHT:
3180     case ARM::t2LDRSBT:
3181     case ARM::t2LDRSHT:
3182     case ARM::t2STRT:
3183     case ARM::t2STRBT:
3184     case ARM::t2STRHT:
3185       imm |= 0x100;
3186       break;
3187     default:
3188       break;
3189   }
3190
3191   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3192     return MCDisassembler::Fail;
3193   if (!Check(S, DecodeT2Imm8(Inst, imm, Address, Decoder)))
3194     return MCDisassembler::Fail;
3195
3196   return S;
3197 }
3198
3199 static DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Insn,
3200                                     uint64_t Address, const void *Decoder) {
3201   DecodeStatus S = MCDisassembler::Success;
3202
3203   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3204   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3205   unsigned addr = fieldFromInstruction32(Insn, 0, 8);
3206   addr |= fieldFromInstruction32(Insn, 9, 1) << 8;
3207   addr |= Rn << 9;
3208   unsigned load = fieldFromInstruction32(Insn, 20, 1);
3209
3210   if (!load) {
3211     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3212       return MCDisassembler::Fail;
3213   }
3214
3215   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
3216     return MCDisassembler::Fail;
3217
3218   if (load) {
3219     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3220       return MCDisassembler::Fail;
3221   }
3222
3223   if (!Check(S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder)))
3224     return MCDisassembler::Fail;
3225
3226   return S;
3227 }
3228
3229 static DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val,
3230                                   uint64_t Address, const void *Decoder) {
3231   DecodeStatus S = MCDisassembler::Success;
3232
3233   unsigned Rn = fieldFromInstruction32(Val, 13, 4);
3234   unsigned imm = fieldFromInstruction32(Val, 0, 12);
3235
3236   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3237     return MCDisassembler::Fail;
3238   Inst.addOperand(MCOperand::CreateImm(imm));
3239
3240   return S;
3241 }
3242
3243
3244 static DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Insn,
3245                                 uint64_t Address, const void *Decoder) {
3246   unsigned imm = fieldFromInstruction16(Insn, 0, 7);
3247
3248   Inst.addOperand(MCOperand::CreateReg(ARM::SP));
3249   Inst.addOperand(MCOperand::CreateReg(ARM::SP));
3250   Inst.addOperand(MCOperand::CreateImm(imm));
3251
3252   return MCDisassembler::Success;
3253 }
3254
3255 static DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn,
3256                                 uint64_t Address, const void *Decoder) {
3257   DecodeStatus S = MCDisassembler::Success;
3258
3259   if (Inst.getOpcode() == ARM::tADDrSP) {
3260     unsigned Rdm = fieldFromInstruction16(Insn, 0, 3);
3261     Rdm |= fieldFromInstruction16(Insn, 7, 1) << 3;
3262
3263     if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
3264     return MCDisassembler::Fail;
3265     if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
3266     return MCDisassembler::Fail;
3267     Inst.addOperand(MCOperand::CreateReg(ARM::SP));
3268   } else if (Inst.getOpcode() == ARM::tADDspr) {
3269     unsigned Rm = fieldFromInstruction16(Insn, 3, 4);
3270
3271     Inst.addOperand(MCOperand::CreateReg(ARM::SP));
3272     Inst.addOperand(MCOperand::CreateReg(ARM::SP));
3273     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3274     return MCDisassembler::Fail;
3275   }
3276
3277   return S;
3278 }
3279
3280 static DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn,
3281                            uint64_t Address, const void *Decoder) {
3282   unsigned imod = fieldFromInstruction16(Insn, 4, 1) | 0x2;
3283   unsigned flags = fieldFromInstruction16(Insn, 0, 3);
3284
3285   Inst.addOperand(MCOperand::CreateImm(imod));
3286   Inst.addOperand(MCOperand::CreateImm(flags));
3287
3288   return MCDisassembler::Success;
3289 }
3290
3291 static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
3292                              uint64_t Address, const void *Decoder) {
3293   DecodeStatus S = MCDisassembler::Success;
3294   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3295   unsigned add = fieldFromInstruction32(Insn, 4, 1);
3296
3297   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
3298     return MCDisassembler::Fail;
3299   Inst.addOperand(MCOperand::CreateImm(add));
3300
3301   return S;
3302 }
3303
3304 static DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Val,
3305                                  uint64_t Address, const void *Decoder) {
3306   if (!tryAddingSymbolicOperand(Address,
3307                                 (Address & ~2u) + SignExtend32<22>(Val << 1) + 4,
3308                                 true, 4, Inst, Decoder))
3309     Inst.addOperand(MCOperand::CreateImm(SignExtend32<22>(Val << 1)));
3310   return MCDisassembler::Success;
3311 }
3312
3313 static DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Val,
3314                               uint64_t Address, const void *Decoder) {
3315   if (Val == 0xA || Val == 0xB)
3316     return MCDisassembler::Fail;
3317
3318   Inst.addOperand(MCOperand::CreateImm(Val));
3319   return MCDisassembler::Success;
3320 }
3321
3322 static DecodeStatus
3323 DecodeThumbTableBranch(MCInst &Inst, unsigned Insn,
3324                        uint64_t Address, const void *Decoder) {
3325   DecodeStatus S = MCDisassembler::Success;
3326
3327   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3328   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3329
3330   if (Rn == ARM::SP) S = MCDisassembler::SoftFail;
3331   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3332     return MCDisassembler::Fail;
3333   if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
3334     return MCDisassembler::Fail;
3335   return S;
3336 }
3337
3338 static DecodeStatus
3339 DecodeThumb2BCCInstruction(MCInst &Inst, unsigned Insn,
3340                            uint64_t Address, const void *Decoder) {
3341   DecodeStatus S = MCDisassembler::Success;
3342
3343   unsigned pred = fieldFromInstruction32(Insn, 22, 4);
3344   if (pred == 0xE || pred == 0xF) {
3345     unsigned opc = fieldFromInstruction32(Insn, 4, 28);
3346     switch (opc) {
3347       default:
3348         return MCDisassembler::Fail;
3349       case 0xf3bf8f4:
3350         Inst.setOpcode(ARM::t2DSB);
3351         break;
3352       case 0xf3bf8f5:
3353         Inst.setOpcode(ARM::t2DMB);
3354         break;
3355       case 0xf3bf8f6:
3356         Inst.setOpcode(ARM::t2ISB);
3357         break;
3358     }
3359
3360     unsigned imm = fieldFromInstruction32(Insn, 0, 4);
3361     return DecodeMemBarrierOption(Inst, imm, Address, Decoder);
3362   }
3363
3364   unsigned brtarget = fieldFromInstruction32(Insn, 0, 11) << 1;
3365   brtarget |= fieldFromInstruction32(Insn, 11, 1) << 19;
3366   brtarget |= fieldFromInstruction32(Insn, 13, 1) << 18;
3367   brtarget |= fieldFromInstruction32(Insn, 16, 6) << 12;
3368   brtarget |= fieldFromInstruction32(Insn, 26, 1) << 20;
3369
3370   if (!Check(S, DecodeT2BROperand(Inst, brtarget, Address, Decoder)))
3371     return MCDisassembler::Fail;
3372   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3373     return MCDisassembler::Fail;
3374
3375   return S;
3376 }
3377
3378 // Decode a shifted immediate operand.  These basically consist
3379 // of an 8-bit value, and a 4-bit directive that specifies either
3380 // a splat operation or a rotation.
3381 static DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val,
3382                           uint64_t Address, const void *Decoder) {
3383   unsigned ctrl = fieldFromInstruction32(Val, 10, 2);
3384   if (ctrl == 0) {
3385     unsigned byte = fieldFromInstruction32(Val, 8, 2);
3386     unsigned imm = fieldFromInstruction32(Val, 0, 8);
3387     switch (byte) {
3388       case 0:
3389         Inst.addOperand(MCOperand::CreateImm(imm));
3390         break;
3391       case 1:
3392         Inst.addOperand(MCOperand::CreateImm((imm << 16) | imm));
3393         break;
3394       case 2:
3395         Inst.addOperand(MCOperand::CreateImm((imm << 24) | (imm << 8)));
3396         break;
3397       case 3:
3398         Inst.addOperand(MCOperand::CreateImm((imm << 24) | (imm << 16) |
3399                                              (imm << 8)  |  imm));
3400         break;
3401     }
3402   } else {
3403     unsigned unrot = fieldFromInstruction32(Val, 0, 7) | 0x80;
3404     unsigned rot = fieldFromInstruction32(Val, 7, 5);
3405     unsigned imm = (unrot >> rot) | (unrot << ((32-rot)&31));
3406     Inst.addOperand(MCOperand::CreateImm(imm));
3407   }
3408
3409   return MCDisassembler::Success;
3410 }
3411
3412 static DecodeStatus
3413 DecodeThumbBCCTargetOperand(MCInst &Inst, unsigned Val,
3414                             uint64_t Address, const void *Decoder){
3415   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<8>(Val<<1) + 4,
3416                                 true, 2, Inst, Decoder))
3417     Inst.addOperand(MCOperand::CreateImm(SignExtend32<8>(Val << 1)));
3418   return MCDisassembler::Success;
3419 }
3420
3421 static DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val,
3422                                        uint64_t Address, const void *Decoder){
3423   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<22>(Val<<1) + 4,
3424                                 true, 4, Inst, Decoder))
3425     Inst.addOperand(MCOperand::CreateImm(SignExtend32<22>(Val << 1)));
3426   return MCDisassembler::Success;
3427 }
3428
3429 static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Val,
3430                                    uint64_t Address, const void *Decoder) {
3431   switch (Val) {
3432   default:
3433     return MCDisassembler::Fail;
3434   case 0xF: // SY
3435   case 0xE: // ST
3436   case 0xB: // ISH
3437   case 0xA: // ISHST
3438   case 0x7: // NSH
3439   case 0x6: // NSHST
3440   case 0x3: // OSH
3441   case 0x2: // OSHST
3442     break;
3443   }
3444
3445   Inst.addOperand(MCOperand::CreateImm(Val));
3446   return MCDisassembler::Success;
3447 }
3448
3449 static DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Val,
3450                           uint64_t Address, const void *Decoder) {
3451   if (!Val) return MCDisassembler::Fail;
3452   Inst.addOperand(MCOperand::CreateImm(Val));
3453   return MCDisassembler::Success;
3454 }
3455
3456 static DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn,
3457                                         uint64_t Address, const void *Decoder) {
3458   DecodeStatus S = MCDisassembler::Success;
3459
3460   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3461   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3462   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3463
3464   if ((Rt & 1) || Rt == 0xE || Rn == 0xF) return MCDisassembler::Fail;
3465
3466   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3467     return MCDisassembler::Fail;
3468   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
3469     return MCDisassembler::Fail;
3470   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3471     return MCDisassembler::Fail;
3472   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3473     return MCDisassembler::Fail;
3474
3475   return S;
3476 }
3477
3478
3479 static DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn,
3480                                          uint64_t Address, const void *Decoder){
3481   DecodeStatus S = MCDisassembler::Success;
3482
3483   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3484   unsigned Rt = fieldFromInstruction32(Insn, 0, 4);
3485   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3486   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3487
3488   if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
3489     return MCDisassembler::Fail;
3490
3491   if ((Rt & 1) || Rt == 0xE || Rn == 0xF) return MCDisassembler::Fail;
3492   if (Rd == Rn || Rd == Rt || Rd == Rt+1) return MCDisassembler::Fail;
3493
3494   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3495     return MCDisassembler::Fail;
3496   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
3497     return MCDisassembler::Fail;
3498   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3499     return MCDisassembler::Fail;
3500   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3501     return MCDisassembler::Fail;
3502
3503   return S;
3504 }
3505
3506 static DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn,
3507                             uint64_t Address, const void *Decoder) {
3508   DecodeStatus S = MCDisassembler::Success;
3509
3510   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3511   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3512   unsigned imm = fieldFromInstruction32(Insn, 0, 12);
3513   imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
3514   imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
3515   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3516
3517   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
3518
3519   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3520     return MCDisassembler::Fail;
3521   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3522     return MCDisassembler::Fail;
3523   if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
3524     return MCDisassembler::Fail;
3525   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3526     return MCDisassembler::Fail;
3527
3528   return S;
3529 }
3530
3531 static DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn,
3532                             uint64_t Address, const void *Decoder) {
3533   DecodeStatus S = MCDisassembler::Success;
3534
3535   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3536   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3537   unsigned imm = fieldFromInstruction32(Insn, 0, 12);
3538   imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
3539   imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
3540   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3541   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3542
3543   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
3544   if (Rm == 0xF) S = MCDisassembler::SoftFail;
3545
3546   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3547     return MCDisassembler::Fail;
3548   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3549     return MCDisassembler::Fail;
3550   if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
3551     return MCDisassembler::Fail;
3552   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3553     return MCDisassembler::Fail;
3554
3555   return S;
3556 }
3557
3558
3559 static DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn,
3560                             uint64_t Address, const void *Decoder) {
3561   DecodeStatus S = MCDisassembler::Success;
3562
3563   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3564   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3565   unsigned imm = fieldFromInstruction32(Insn, 0, 12);
3566   imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
3567   imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
3568   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3569
3570   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
3571
3572   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3573     return MCDisassembler::Fail;
3574   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3575     return MCDisassembler::Fail;
3576   if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
3577     return MCDisassembler::Fail;
3578   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3579     return MCDisassembler::Fail;
3580
3581   return S;
3582 }
3583
3584 static DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn,
3585                             uint64_t Address, const void *Decoder) {
3586   DecodeStatus S = MCDisassembler::Success;
3587
3588   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3589   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
3590   unsigned imm = fieldFromInstruction32(Insn, 0, 12);
3591   imm |= fieldFromInstruction32(Insn, 16, 4) << 13;
3592   imm |= fieldFromInstruction32(Insn, 23, 1) << 12;
3593   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
3594
3595   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
3596
3597   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3598     return MCDisassembler::Fail;
3599   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
3600     return MCDisassembler::Fail;
3601   if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
3602     return MCDisassembler::Fail;
3603   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
3604     return MCDisassembler::Fail;
3605
3606   return S;
3607 }
3608
3609 static DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn,
3610                          uint64_t Address, const void *Decoder) {
3611   DecodeStatus S = MCDisassembler::Success;
3612
3613   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3614   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3615   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3616   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3617   unsigned size = fieldFromInstruction32(Insn, 10, 2);
3618
3619   unsigned align = 0;
3620   unsigned index = 0;
3621   switch (size) {
3622     default:
3623       return MCDisassembler::Fail;
3624     case 0:
3625       if (fieldFromInstruction32(Insn, 4, 1))
3626         return MCDisassembler::Fail; // UNDEFINED
3627       index = fieldFromInstruction32(Insn, 5, 3);
3628       break;
3629     case 1:
3630       if (fieldFromInstruction32(Insn, 5, 1))
3631         return MCDisassembler::Fail; // UNDEFINED
3632       index = fieldFromInstruction32(Insn, 6, 2);
3633       if (fieldFromInstruction32(Insn, 4, 1))
3634         align = 2;
3635       break;
3636     case 2:
3637       if (fieldFromInstruction32(Insn, 6, 1))
3638         return MCDisassembler::Fail; // UNDEFINED
3639       index = fieldFromInstruction32(Insn, 7, 1);
3640       if (fieldFromInstruction32(Insn, 4, 2) != 0)
3641         align = 4;
3642   }
3643
3644   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3645     return MCDisassembler::Fail;
3646   if (Rm != 0xF) { // Writeback
3647     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3648       return MCDisassembler::Fail;
3649   }
3650   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3651     return MCDisassembler::Fail;
3652   Inst.addOperand(MCOperand::CreateImm(align));
3653   if (Rm != 0xF) {
3654     if (Rm != 0xD) {
3655       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3656         return MCDisassembler::Fail;
3657     } else
3658       Inst.addOperand(MCOperand::CreateReg(0));
3659   }
3660
3661   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3662     return MCDisassembler::Fail;
3663   Inst.addOperand(MCOperand::CreateImm(index));
3664
3665   return S;
3666 }
3667
3668 static DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn,
3669                          uint64_t Address, const void *Decoder) {
3670   DecodeStatus S = MCDisassembler::Success;
3671
3672   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3673   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3674   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3675   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3676   unsigned size = fieldFromInstruction32(Insn, 10, 2);
3677
3678   unsigned align = 0;
3679   unsigned index = 0;
3680   switch (size) {
3681     default:
3682       return MCDisassembler::Fail;
3683     case 0:
3684       if (fieldFromInstruction32(Insn, 4, 1))
3685         return MCDisassembler::Fail; // UNDEFINED
3686       index = fieldFromInstruction32(Insn, 5, 3);
3687       break;
3688     case 1:
3689       if (fieldFromInstruction32(Insn, 5, 1))
3690         return MCDisassembler::Fail; // UNDEFINED
3691       index = fieldFromInstruction32(Insn, 6, 2);
3692       if (fieldFromInstruction32(Insn, 4, 1))
3693         align = 2;
3694       break;
3695     case 2:
3696       if (fieldFromInstruction32(Insn, 6, 1))
3697         return MCDisassembler::Fail; // UNDEFINED
3698       index = fieldFromInstruction32(Insn, 7, 1);
3699       if (fieldFromInstruction32(Insn, 4, 2) != 0)
3700         align = 4;
3701   }
3702
3703   if (Rm != 0xF) { // Writeback
3704     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3705     return MCDisassembler::Fail;
3706   }
3707   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3708     return MCDisassembler::Fail;
3709   Inst.addOperand(MCOperand::CreateImm(align));
3710   if (Rm != 0xF) {
3711     if (Rm != 0xD) {
3712       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3713     return MCDisassembler::Fail;
3714     } else
3715       Inst.addOperand(MCOperand::CreateReg(0));
3716   }
3717
3718   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3719     return MCDisassembler::Fail;
3720   Inst.addOperand(MCOperand::CreateImm(index));
3721
3722   return S;
3723 }
3724
3725
3726 static DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn,
3727                          uint64_t Address, const void *Decoder) {
3728   DecodeStatus S = MCDisassembler::Success;
3729
3730   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3731   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3732   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3733   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3734   unsigned size = fieldFromInstruction32(Insn, 10, 2);
3735
3736   unsigned align = 0;
3737   unsigned index = 0;
3738   unsigned inc = 1;
3739   switch (size) {
3740     default:
3741       return MCDisassembler::Fail;
3742     case 0:
3743       index = fieldFromInstruction32(Insn, 5, 3);
3744       if (fieldFromInstruction32(Insn, 4, 1))
3745         align = 2;
3746       break;
3747     case 1:
3748       index = fieldFromInstruction32(Insn, 6, 2);
3749       if (fieldFromInstruction32(Insn, 4, 1))
3750         align = 4;
3751       if (fieldFromInstruction32(Insn, 5, 1))
3752         inc = 2;
3753       break;
3754     case 2:
3755       if (fieldFromInstruction32(Insn, 5, 1))
3756         return MCDisassembler::Fail; // UNDEFINED
3757       index = fieldFromInstruction32(Insn, 7, 1);
3758       if (fieldFromInstruction32(Insn, 4, 1) != 0)
3759         align = 8;
3760       if (fieldFromInstruction32(Insn, 6, 1))
3761         inc = 2;
3762       break;
3763   }
3764
3765   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3766     return MCDisassembler::Fail;
3767   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3768     return MCDisassembler::Fail;
3769   if (Rm != 0xF) { // Writeback
3770     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3771       return MCDisassembler::Fail;
3772   }
3773   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3774     return MCDisassembler::Fail;
3775   Inst.addOperand(MCOperand::CreateImm(align));
3776   if (Rm != 0xF) {
3777     if (Rm != 0xD) {
3778       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3779         return MCDisassembler::Fail;
3780     } else
3781       Inst.addOperand(MCOperand::CreateReg(0));
3782   }
3783
3784   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3785     return MCDisassembler::Fail;
3786   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3787     return MCDisassembler::Fail;
3788   Inst.addOperand(MCOperand::CreateImm(index));
3789
3790   return S;
3791 }
3792
3793 static DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn,
3794                          uint64_t Address, const void *Decoder) {
3795   DecodeStatus S = MCDisassembler::Success;
3796
3797   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3798   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3799   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3800   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3801   unsigned size = fieldFromInstruction32(Insn, 10, 2);
3802
3803   unsigned align = 0;
3804   unsigned index = 0;
3805   unsigned inc = 1;
3806   switch (size) {
3807     default:
3808       return MCDisassembler::Fail;
3809     case 0:
3810       index = fieldFromInstruction32(Insn, 5, 3);
3811       if (fieldFromInstruction32(Insn, 4, 1))
3812         align = 2;
3813       break;
3814     case 1:
3815       index = fieldFromInstruction32(Insn, 6, 2);
3816       if (fieldFromInstruction32(Insn, 4, 1))
3817         align = 4;
3818       if (fieldFromInstruction32(Insn, 5, 1))
3819         inc = 2;
3820       break;
3821     case 2:
3822       if (fieldFromInstruction32(Insn, 5, 1))
3823         return MCDisassembler::Fail; // UNDEFINED
3824       index = fieldFromInstruction32(Insn, 7, 1);
3825       if (fieldFromInstruction32(Insn, 4, 1) != 0)
3826         align = 8;
3827       if (fieldFromInstruction32(Insn, 6, 1))
3828         inc = 2;
3829       break;
3830   }
3831
3832   if (Rm != 0xF) { // Writeback
3833     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3834       return MCDisassembler::Fail;
3835   }
3836   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3837     return MCDisassembler::Fail;
3838   Inst.addOperand(MCOperand::CreateImm(align));
3839   if (Rm != 0xF) {
3840     if (Rm != 0xD) {
3841       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3842         return MCDisassembler::Fail;
3843     } else
3844       Inst.addOperand(MCOperand::CreateReg(0));
3845   }
3846
3847   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3848     return MCDisassembler::Fail;
3849   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3850     return MCDisassembler::Fail;
3851   Inst.addOperand(MCOperand::CreateImm(index));
3852
3853   return S;
3854 }
3855
3856
3857 static DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn,
3858                          uint64_t Address, const void *Decoder) {
3859   DecodeStatus S = MCDisassembler::Success;
3860
3861   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3862   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3863   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3864   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3865   unsigned size = fieldFromInstruction32(Insn, 10, 2);
3866
3867   unsigned align = 0;
3868   unsigned index = 0;
3869   unsigned inc = 1;
3870   switch (size) {
3871     default:
3872       return MCDisassembler::Fail;
3873     case 0:
3874       if (fieldFromInstruction32(Insn, 4, 1))
3875         return MCDisassembler::Fail; // UNDEFINED
3876       index = fieldFromInstruction32(Insn, 5, 3);
3877       break;
3878     case 1:
3879       if (fieldFromInstruction32(Insn, 4, 1))
3880         return MCDisassembler::Fail; // UNDEFINED
3881       index = fieldFromInstruction32(Insn, 6, 2);
3882       if (fieldFromInstruction32(Insn, 5, 1))
3883         inc = 2;
3884       break;
3885     case 2:
3886       if (fieldFromInstruction32(Insn, 4, 2))
3887         return MCDisassembler::Fail; // UNDEFINED
3888       index = fieldFromInstruction32(Insn, 7, 1);
3889       if (fieldFromInstruction32(Insn, 6, 1))
3890         inc = 2;
3891       break;
3892   }
3893
3894   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3895     return MCDisassembler::Fail;
3896   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3897     return MCDisassembler::Fail;
3898   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3899     return MCDisassembler::Fail;
3900
3901   if (Rm != 0xF) { // Writeback
3902     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3903     return MCDisassembler::Fail;
3904   }
3905   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3906     return MCDisassembler::Fail;
3907   Inst.addOperand(MCOperand::CreateImm(align));
3908   if (Rm != 0xF) {
3909     if (Rm != 0xD) {
3910       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3911     return MCDisassembler::Fail;
3912     } else
3913       Inst.addOperand(MCOperand::CreateReg(0));
3914   }
3915
3916   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3917     return MCDisassembler::Fail;
3918   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3919     return MCDisassembler::Fail;
3920   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3921     return MCDisassembler::Fail;
3922   Inst.addOperand(MCOperand::CreateImm(index));
3923
3924   return S;
3925 }
3926
3927 static DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn,
3928                          uint64_t Address, const void *Decoder) {
3929   DecodeStatus S = MCDisassembler::Success;
3930
3931   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3932   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3933   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3934   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3935   unsigned size = fieldFromInstruction32(Insn, 10, 2);
3936
3937   unsigned align = 0;
3938   unsigned index = 0;
3939   unsigned inc = 1;
3940   switch (size) {
3941     default:
3942       return MCDisassembler::Fail;
3943     case 0:
3944       if (fieldFromInstruction32(Insn, 4, 1))
3945         return MCDisassembler::Fail; // UNDEFINED
3946       index = fieldFromInstruction32(Insn, 5, 3);
3947       break;
3948     case 1:
3949       if (fieldFromInstruction32(Insn, 4, 1))
3950         return MCDisassembler::Fail; // UNDEFINED
3951       index = fieldFromInstruction32(Insn, 6, 2);
3952       if (fieldFromInstruction32(Insn, 5, 1))
3953         inc = 2;
3954       break;
3955     case 2:
3956       if (fieldFromInstruction32(Insn, 4, 2))
3957         return MCDisassembler::Fail; // UNDEFINED
3958       index = fieldFromInstruction32(Insn, 7, 1);
3959       if (fieldFromInstruction32(Insn, 6, 1))
3960         inc = 2;
3961       break;
3962   }
3963
3964   if (Rm != 0xF) { // Writeback
3965     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3966     return MCDisassembler::Fail;
3967   }
3968   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
3969     return MCDisassembler::Fail;
3970   Inst.addOperand(MCOperand::CreateImm(align));
3971   if (Rm != 0xF) {
3972     if (Rm != 0xD) {
3973       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
3974     return MCDisassembler::Fail;
3975     } else
3976       Inst.addOperand(MCOperand::CreateReg(0));
3977   }
3978
3979   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
3980     return MCDisassembler::Fail;
3981   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
3982     return MCDisassembler::Fail;
3983   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
3984     return MCDisassembler::Fail;
3985   Inst.addOperand(MCOperand::CreateImm(index));
3986
3987   return S;
3988 }
3989
3990
3991 static DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn,
3992                          uint64_t Address, const void *Decoder) {
3993   DecodeStatus S = MCDisassembler::Success;
3994
3995   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
3996   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
3997   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
3998   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
3999   unsigned size = fieldFromInstruction32(Insn, 10, 2);
4000
4001   unsigned align = 0;
4002   unsigned index = 0;
4003   unsigned inc = 1;
4004   switch (size) {
4005     default:
4006       return MCDisassembler::Fail;
4007     case 0:
4008       if (fieldFromInstruction32(Insn, 4, 1))
4009         align = 4;
4010       index = fieldFromInstruction32(Insn, 5, 3);
4011       break;
4012     case 1:
4013       if (fieldFromInstruction32(Insn, 4, 1))
4014         align = 8;
4015       index = fieldFromInstruction32(Insn, 6, 2);
4016       if (fieldFromInstruction32(Insn, 5, 1))
4017         inc = 2;
4018       break;
4019     case 2:
4020       if (fieldFromInstruction32(Insn, 4, 2))
4021         align = 4 << fieldFromInstruction32(Insn, 4, 2);
4022       index = fieldFromInstruction32(Insn, 7, 1);
4023       if (fieldFromInstruction32(Insn, 6, 1))
4024         inc = 2;
4025       break;
4026   }
4027
4028   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4029     return MCDisassembler::Fail;
4030   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4031     return MCDisassembler::Fail;
4032   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4033     return MCDisassembler::Fail;
4034   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
4035     return MCDisassembler::Fail;
4036
4037   if (Rm != 0xF) { // Writeback
4038     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4039       return MCDisassembler::Fail;
4040   }
4041   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4042     return MCDisassembler::Fail;
4043   Inst.addOperand(MCOperand::CreateImm(align));
4044   if (Rm != 0xF) {
4045     if (Rm != 0xD) {
4046       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4047         return MCDisassembler::Fail;
4048     } else
4049       Inst.addOperand(MCOperand::CreateReg(0));
4050   }
4051
4052   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4053     return MCDisassembler::Fail;
4054   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4055     return MCDisassembler::Fail;
4056   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4057     return MCDisassembler::Fail;
4058   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
4059     return MCDisassembler::Fail;
4060   Inst.addOperand(MCOperand::CreateImm(index));
4061
4062   return S;
4063 }
4064
4065 static DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn,
4066                          uint64_t Address, const void *Decoder) {
4067   DecodeStatus S = MCDisassembler::Success;
4068
4069   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
4070   unsigned Rm = fieldFromInstruction32(Insn, 0, 4);
4071   unsigned Rd = fieldFromInstruction32(Insn, 12, 4);
4072   Rd |= fieldFromInstruction32(Insn, 22, 1) << 4;
4073   unsigned size = fieldFromInstruction32(Insn, 10, 2);
4074
4075   unsigned align = 0;
4076   unsigned index = 0;
4077   unsigned inc = 1;
4078   switch (size) {
4079     default:
4080       return MCDisassembler::Fail;
4081     case 0:
4082       if (fieldFromInstruction32(Insn, 4, 1))
4083         align = 4;
4084       index = fieldFromInstruction32(Insn, 5, 3);
4085       break;
4086     case 1:
4087       if (fieldFromInstruction32(Insn, 4, 1))
4088         align = 8;
4089       index = fieldFromInstruction32(Insn, 6, 2);
4090       if (fieldFromInstruction32(Insn, 5, 1))
4091         inc = 2;
4092       break;
4093     case 2:
4094       if (fieldFromInstruction32(Insn, 4, 2))
4095         align = 4 << fieldFromInstruction32(Insn, 4, 2);
4096       index = fieldFromInstruction32(Insn, 7, 1);
4097       if (fieldFromInstruction32(Insn, 6, 1))
4098         inc = 2;
4099       break;
4100   }
4101
4102   if (Rm != 0xF) { // Writeback
4103     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4104     return MCDisassembler::Fail;
4105   }
4106   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
4107     return MCDisassembler::Fail;
4108   Inst.addOperand(MCOperand::CreateImm(align));
4109   if (Rm != 0xF) {
4110     if (Rm != 0xD) {
4111       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
4112     return MCDisassembler::Fail;
4113     } else
4114       Inst.addOperand(MCOperand::CreateReg(0));
4115   }
4116
4117   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
4118     return MCDisassembler::Fail;
4119   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
4120     return MCDisassembler::Fail;
4121   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
4122     return MCDisassembler::Fail;
4123   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
4124     return MCDisassembler::Fail;
4125   Inst.addOperand(MCOperand::CreateImm(index));
4126
4127   return S;
4128 }
4129
4130 static DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn,
4131                                   uint64_t Address, const void *Decoder) {
4132   DecodeStatus S = MCDisassembler::Success;
4133   unsigned Rt  = fieldFromInstruction32(Insn, 12, 4);
4134   unsigned Rt2 = fieldFromInstruction32(Insn, 16, 4);
4135   unsigned Rm  = fieldFromInstruction32(Insn,  0, 4);
4136   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
4137   Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
4138
4139   if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4140     S = MCDisassembler::SoftFail;
4141
4142   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
4143     return MCDisassembler::Fail;
4144   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
4145     return MCDisassembler::Fail;
4146   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
4147     return MCDisassembler::Fail;
4148   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
4149     return MCDisassembler::Fail;
4150   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4151     return MCDisassembler::Fail;
4152
4153   return S;
4154 }
4155
4156 static DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn,
4157                                   uint64_t Address, const void *Decoder) {
4158   DecodeStatus S = MCDisassembler::Success;
4159   unsigned Rt  = fieldFromInstruction32(Insn, 12, 4);
4160   unsigned Rt2 = fieldFromInstruction32(Insn, 16, 4);
4161   unsigned Rm  = fieldFromInstruction32(Insn,  0, 4);
4162   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
4163   Rm |= fieldFromInstruction32(Insn, 5, 1) << 4;
4164
4165   if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
4166     S = MCDisassembler::SoftFail;
4167
4168   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
4169     return MCDisassembler::Fail;
4170   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
4171     return MCDisassembler::Fail;
4172   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
4173     return MCDisassembler::Fail;
4174   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
4175     return MCDisassembler::Fail;
4176   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4177     return MCDisassembler::Fail;
4178
4179   return S;
4180 }
4181
4182 static DecodeStatus DecodeIT(MCInst &Inst, unsigned Insn,
4183                              uint64_t Address, const void *Decoder) {
4184   DecodeStatus S = MCDisassembler::Success;
4185   unsigned pred = fieldFromInstruction16(Insn, 4, 4);
4186   // The InstPrinter needs to have the low bit of the predicate in
4187   // the mask operand to be able to print it properly.
4188   unsigned mask = fieldFromInstruction16(Insn, 0, 5);
4189
4190   if (pred == 0xF) {
4191     pred = 0xE;
4192     S = MCDisassembler::SoftFail;
4193   }
4194
4195   if ((mask & 0xF) == 0) {
4196     // Preserve the high bit of the mask, which is the low bit of
4197     // the predicate.
4198     mask &= 0x10;
4199     mask |= 0x8;
4200     S = MCDisassembler::SoftFail;
4201   }
4202
4203   Inst.addOperand(MCOperand::CreateImm(pred));
4204   Inst.addOperand(MCOperand::CreateImm(mask));
4205   return S;
4206 }
4207
4208 static DecodeStatus
4209 DecodeT2LDRDPreInstruction(MCInst &Inst, unsigned Insn,
4210                            uint64_t Address, const void *Decoder) {
4211   DecodeStatus S = MCDisassembler::Success;
4212
4213   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
4214   unsigned Rt2 = fieldFromInstruction32(Insn, 8, 4);
4215   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
4216   unsigned addr = fieldFromInstruction32(Insn, 0, 8);
4217   unsigned W = fieldFromInstruction32(Insn, 21, 1);
4218   unsigned U = fieldFromInstruction32(Insn, 23, 1);
4219   unsigned P = fieldFromInstruction32(Insn, 24, 1);
4220   bool writeback = (W == 1) | (P == 0);
4221
4222   addr |= (U << 8) | (Rn << 9);
4223
4224   if (writeback && (Rn == Rt || Rn == Rt2))
4225     Check(S, MCDisassembler::SoftFail);
4226   if (Rt == Rt2)
4227     Check(S, MCDisassembler::SoftFail);
4228
4229   // Rt
4230   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
4231     return MCDisassembler::Fail;
4232   // Rt2
4233   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
4234     return MCDisassembler::Fail;
4235   // Writeback operand
4236   if (!Check(S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
4237     return MCDisassembler::Fail;
4238   // addr
4239   if (!Check(S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
4240     return MCDisassembler::Fail;
4241
4242   return S;
4243 }
4244
4245 static DecodeStatus
4246 DecodeT2STRDPreInstruction(MCInst &Inst, unsigned Insn,
4247                            uint64_t Address, const void *Decoder) {
4248   DecodeStatus S = MCDisassembler::Success;
4249
4250   unsigned Rt = fieldFromInstruction32(Insn, 12, 4);
4251   unsigned Rt2 = fieldFromInstruction32(Insn, 8, 4);
4252   unsigned Rn = fieldFromInstruction32(Insn, 16, 4);
4253   unsigned addr = fieldFromInstruction32(Insn, 0, 8);
4254   unsigned W = fieldFromInstruction32(Insn, 21, 1);
4255   unsigned U = fieldFromInstruction32(Insn, 23, 1);
4256   unsigned P = fieldFromInstruction32(Insn, 24, 1);
4257   bool writeback = (W == 1) | (P == 0);
4258
4259   addr |= (U << 8) | (Rn << 9);
4260
4261   if (writeback && (Rn == Rt || Rn == Rt2))
4262     Check(S, MCDisassembler::SoftFail);
4263
4264   // Writeback operand
4265   if (!Check(S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
4266     return MCDisassembler::Fail;
4267   // Rt
4268   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
4269     return MCDisassembler::Fail;
4270   // Rt2
4271   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
4272     return MCDisassembler::Fail;
4273   // addr
4274   if (!Check(S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
4275     return MCDisassembler::Fail;
4276
4277   return S;
4278 }
4279
4280 static DecodeStatus DecodeT2Adr(MCInst &Inst, uint32_t Insn,
4281                                 uint64_t Address, const void *Decoder) {
4282   unsigned sign1 = fieldFromInstruction32(Insn, 21, 1);
4283   unsigned sign2 = fieldFromInstruction32(Insn, 23, 1);
4284   if (sign1 != sign2) return MCDisassembler::Fail;
4285
4286   unsigned Val = fieldFromInstruction32(Insn, 0, 8);
4287   Val |= fieldFromInstruction32(Insn, 12, 3) << 8;
4288   Val |= fieldFromInstruction32(Insn, 26, 1) << 11;
4289   Val |= sign1 << 12;
4290   Inst.addOperand(MCOperand::CreateImm(SignExtend32<13>(Val)));
4291
4292   return MCDisassembler::Success;
4293 }
4294
4295 static DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, uint32_t Val,
4296                                               uint64_t Address,
4297                                               const void *Decoder) {
4298   DecodeStatus S = MCDisassembler::Success;
4299
4300   // Shift of "asr #32" is not allowed in Thumb2 mode.
4301   if (Val == 0x20) S = MCDisassembler::SoftFail;
4302   Inst.addOperand(MCOperand::CreateImm(Val));
4303   return S;
4304 }
4305
4306 static DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn,
4307                                uint64_t Address, const void *Decoder) {
4308   unsigned Rt   = fieldFromInstruction32(Insn, 12, 4);
4309   unsigned Rt2  = fieldFromInstruction32(Insn, 0,  4);
4310   unsigned Rn   = fieldFromInstruction32(Insn, 16, 4);
4311   unsigned pred = fieldFromInstruction32(Insn, 28, 4);
4312
4313   if (pred == 0xF)
4314     return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
4315
4316   DecodeStatus S = MCDisassembler::Success;
4317   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
4318     return MCDisassembler::Fail;
4319   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
4320     return MCDisassembler::Fail;
4321   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4322     return MCDisassembler::Fail;
4323   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
4324     return MCDisassembler::Fail;
4325
4326   return S;
4327 }
4328
4329 static DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn,
4330                                 uint64_t Address, const void *Decoder) {
4331   unsigned Vd = (fieldFromInstruction32(Insn, 12, 4) << 0);
4332   Vd |= (fieldFromInstruction32(Insn, 22, 1) << 4);
4333   unsigned Vm = (fieldFromInstruction32(Insn, 0, 4) << 0);
4334   Vm |= (fieldFromInstruction32(Insn, 5, 1) << 4);
4335   unsigned imm = fieldFromInstruction32(Insn, 16, 6);
4336   unsigned cmode = fieldFromInstruction32(Insn, 8, 4);
4337
4338   DecodeStatus S = MCDisassembler::Success;
4339
4340   // VMOVv2f32 is ambiguous with these decodings.
4341   if (!(imm & 0x38) && cmode == 0xF) {
4342     Inst.setOpcode(ARM::VMOVv2f32);
4343     return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
4344   }
4345
4346   if (!(imm & 0x20)) Check(S, MCDisassembler::SoftFail);
4347
4348   if (!Check(S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
4349     return MCDisassembler::Fail;
4350   if (!Check(S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
4351     return MCDisassembler::Fail;
4352   Inst.addOperand(MCOperand::CreateImm(64 - imm));
4353
4354   return S;
4355 }
4356
4357 static DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn,
4358                                 uint64_t Address, const void *Decoder) {
4359   unsigned Vd = (fieldFromInstruction32(Insn, 12, 4) << 0);
4360   Vd |= (fieldFromInstruction32(Insn, 22, 1) << 4);
4361   unsigned Vm = (fieldFromInstruction32(Insn, 0, 4) << 0);
4362   Vm |= (fieldFromInstruction32(Insn, 5, 1) << 4);
4363   unsigned imm = fieldFromInstruction32(Insn, 16, 6);
4364   unsigned cmode = fieldFromInstruction32(Insn, 8, 4);
4365
4366   DecodeStatus S = MCDisassembler::Success;
4367
4368   // VMOVv4f32 is ambiguous with these decodings.
4369   if (!(imm & 0x38) && cmode == 0xF) {
4370     Inst.setOpcode(ARM::VMOVv4f32);
4371     return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
4372   }
4373
4374   if (!(imm & 0x20)) Check(S, MCDisassembler::SoftFail);
4375
4376   if (!Check(S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
4377     return MCDisassembler::Fail;
4378   if (!Check(S, DecodeQPRRegisterClass(Inst, Vm, Address, Decoder)))
4379     return MCDisassembler::Fail;
4380   Inst.addOperand(MCOperand::CreateImm(64 - imm));
4381
4382   return S;
4383 }
4384
4385 static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val,
4386                                 uint64_t Address, const void *Decoder) {
4387   DecodeStatus S = MCDisassembler::Success;
4388
4389   unsigned Rn = fieldFromInstruction32(Val, 16, 4);
4390   unsigned Rt = fieldFromInstruction32(Val, 12, 4);
4391   unsigned Rm = fieldFromInstruction32(Val, 0, 4);
4392   Rm |= (fieldFromInstruction32(Val, 23, 1) << 4);
4393   unsigned Cond = fieldFromInstruction32(Val, 28, 4);
4394  
4395   if (fieldFromInstruction32(Val, 8, 4) != 0 || Rn == Rt)
4396     S = MCDisassembler::SoftFail;
4397
4398   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
4399     return MCDisassembler::Fail;
4400   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
4401     return MCDisassembler::Fail;
4402   if (!Check(S, DecodeAddrMode7Operand(Inst, Rn, Address, Decoder))) 
4403     return MCDisassembler::Fail;
4404   if (!Check(S, DecodePostIdxReg(Inst, Rm, Address, Decoder)))
4405     return MCDisassembler::Fail;
4406   if (!Check(S, DecodePredicateOperand(Inst, Cond, Address, Decoder)))
4407     return MCDisassembler::Fail;
4408
4409   return S;
4410 }
4411