LLVM API Documentation

ARMDisassembler.cpp
Go to the documentation of this file.
00001 //===-- ARMDisassembler.cpp - Disassembler for ARM/Thumb ISA --------------===//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 
00010 #define DEBUG_TYPE "arm-disassembler"
00011 
00012 #include "llvm/MC/MCDisassembler.h"
00013 #include "MCTargetDesc/ARMAddressingModes.h"
00014 #include "MCTargetDesc/ARMBaseInfo.h"
00015 #include "MCTargetDesc/ARMMCExpr.h"
00016 #include "llvm/MC/MCContext.h"
00017 #include "llvm/MC/MCExpr.h"
00018 #include "llvm/MC/MCFixedLenDisassembler.h"
00019 #include "llvm/MC/MCInst.h"
00020 #include "llvm/MC/MCInstrDesc.h"
00021 #include "llvm/MC/MCSubtargetInfo.h"
00022 #include "llvm/Support/Debug.h"
00023 #include "llvm/Support/ErrorHandling.h"
00024 #include "llvm/Support/LEB128.h"
00025 #include "llvm/Support/MemoryObject.h"
00026 #include "llvm/Support/TargetRegistry.h"
00027 #include "llvm/Support/raw_ostream.h"
00028 #include <vector>
00029 
00030 using namespace llvm;
00031 
00032 typedef MCDisassembler::DecodeStatus DecodeStatus;
00033 
00034 namespace {
00035   // Handles the condition code status of instructions in IT blocks
00036   class ITStatus
00037   {
00038     public:
00039       // Returns the condition code for instruction in IT block
00040       unsigned getITCC() {
00041         unsigned CC = ARMCC::AL;
00042         if (instrInITBlock())
00043           CC = ITStates.back();
00044         return CC;
00045       }
00046 
00047       // Advances the IT block state to the next T or E
00048       void advanceITState() {
00049         ITStates.pop_back();
00050       }
00051 
00052       // Returns true if the current instruction is in an IT block
00053       bool instrInITBlock() {
00054         return !ITStates.empty();
00055       }
00056 
00057       // Returns true if current instruction is the last instruction in an IT block
00058       bool instrLastInITBlock() {
00059         return ITStates.size() == 1;
00060       }
00061 
00062       // Called when decoding an IT instruction. Sets the IT state for the following
00063       // instructions that for the IT block. Firstcond and Mask correspond to the 
00064       // fields in the IT instruction encoding.
00065       void setITState(char Firstcond, char Mask) {
00066         // (3 - the number of trailing zeros) is the number of then / else.
00067         unsigned CondBit0 = Firstcond & 1;
00068         unsigned NumTZ = CountTrailingZeros_32(Mask);
00069         unsigned char CCBits = static_cast<unsigned char>(Firstcond & 0xf);
00070         assert(NumTZ <= 3 && "Invalid IT mask!");
00071         // push condition codes onto the stack the correct order for the pops
00072         for (unsigned Pos = NumTZ+1; Pos <= 3; ++Pos) {
00073           bool T = ((Mask >> Pos) & 1) == CondBit0;
00074           if (T)
00075             ITStates.push_back(CCBits);
00076           else
00077             ITStates.push_back(CCBits ^ 1);
00078         }
00079         ITStates.push_back(CCBits);
00080       }
00081 
00082     private:
00083       std::vector<unsigned char> ITStates;
00084   };
00085 }
00086 
00087 namespace {
00088 /// ARMDisassembler - ARM disassembler for all ARM platforms.
00089 class ARMDisassembler : public MCDisassembler {
00090 public:
00091   /// Constructor     - Initializes the disassembler.
00092   ///
00093   ARMDisassembler(const MCSubtargetInfo &STI) :
00094     MCDisassembler(STI) {
00095   }
00096 
00097   ~ARMDisassembler() {
00098   }
00099 
00100   /// getInstruction - See MCDisassembler.
00101   DecodeStatus getInstruction(MCInst &instr,
00102                               uint64_t &size,
00103                               const MemoryObject &region,
00104                               uint64_t address,
00105                               raw_ostream &vStream,
00106                               raw_ostream &cStream) const;
00107 };
00108 
00109 /// ThumbDisassembler - Thumb disassembler for all Thumb platforms.
00110 class ThumbDisassembler : public MCDisassembler {
00111 public:
00112   /// Constructor     - Initializes the disassembler.
00113   ///
00114   ThumbDisassembler(const MCSubtargetInfo &STI) :
00115     MCDisassembler(STI) {
00116   }
00117 
00118   ~ThumbDisassembler() {
00119   }
00120 
00121   /// getInstruction - See MCDisassembler.
00122   DecodeStatus getInstruction(MCInst &instr,
00123                               uint64_t &size,
00124                               const MemoryObject &region,
00125                               uint64_t address,
00126                               raw_ostream &vStream,
00127                               raw_ostream &cStream) const;
00128 
00129 private:
00130   mutable ITStatus ITBlock;
00131   DecodeStatus AddThumbPredicate(MCInst&) const;
00132   void UpdateThumbVFPPredicate(MCInst&) const;
00133 };
00134 }
00135 
00136 static bool Check(DecodeStatus &Out, DecodeStatus In) {
00137   switch (In) {
00138     case MCDisassembler::Success:
00139       // Out stays the same.
00140       return true;
00141     case MCDisassembler::SoftFail:
00142       Out = In;
00143       return true;
00144     case MCDisassembler::Fail:
00145       Out = In;
00146       return false;
00147   }
00148   llvm_unreachable("Invalid DecodeStatus!");
00149 }
00150 
00151 
00152 // Forward declare these because the autogenerated code will reference them.
00153 // Definitions are further down.
00154 static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00155                                    uint64_t Address, const void *Decoder);
00156 static DecodeStatus DecodeGPRnopcRegisterClass(MCInst &Inst,
00157                                                unsigned RegNo, uint64_t Address,
00158                                                const void *Decoder);
00159 static DecodeStatus DecodeGPRwithAPSRRegisterClass(MCInst &Inst,
00160                                                unsigned RegNo, uint64_t Address,
00161                                                const void *Decoder);
00162 static DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00163                                    uint64_t Address, const void *Decoder);
00164 static DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00165                                    uint64_t Address, const void *Decoder);
00166 static DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00167                                    uint64_t Address, const void *Decoder);
00168 static DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo,
00169                                    uint64_t Address, const void *Decoder);
00170 static DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo,
00171                                    uint64_t Address, const void *Decoder);
00172 static DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo,
00173                                    uint64_t Address, const void *Decoder);
00174 static DecodeStatus DecodeDPR_VFP2RegisterClass(MCInst &Inst,
00175                                                 unsigned RegNo,
00176                                                 uint64_t Address,
00177                                                 const void *Decoder);
00178 static DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo,
00179                                    uint64_t Address, const void *Decoder);
00180 static DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo,
00181                                    uint64_t Address, const void *Decoder);
00182 static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst,
00183                                unsigned RegNo, uint64_t Address,
00184                                const void *Decoder);
00185 
00186 static DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val,
00187                                uint64_t Address, const void *Decoder);
00188 static DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val,
00189                                uint64_t Address, const void *Decoder);
00190 static DecodeStatus DecodeSOImmOperand(MCInst &Inst, unsigned Val,
00191                                uint64_t Address, const void *Decoder);
00192 static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val,
00193                                uint64_t Address, const void *Decoder);
00194 static DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val,
00195                                uint64_t Address, const void *Decoder);
00196 static DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val,
00197                                uint64_t Address, const void *Decoder);
00198 
00199 static DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Insn,
00200                                uint64_t Address, const void *Decoder);
00201 static DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn,
00202                                uint64_t Address, const void *Decoder);
00203 static DecodeStatus DecodeAddrMode2IdxInstruction(MCInst &Inst,
00204                                                   unsigned Insn,
00205                                                   uint64_t Address,
00206                                                   const void *Decoder);
00207 static DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Insn,
00208                                uint64_t Address, const void *Decoder);
00209 static DecodeStatus DecodeAddrMode3Instruction(MCInst &Inst,unsigned Insn,
00210                                uint64_t Address, const void *Decoder);
00211 static DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Insn,
00212                                uint64_t Address, const void *Decoder);
00213 static DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Insn,
00214                                uint64_t Address, const void *Decoder);
00215 
00216 static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst & Inst,
00217                                                   unsigned Insn,
00218                                                   uint64_t Adddress,
00219                                                   const void *Decoder);
00220 static DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn,
00221                                uint64_t Address, const void *Decoder);
00222 static DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn,
00223                                uint64_t Address, const void *Decoder);
00224 static DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn,
00225                                uint64_t Address, const void *Decoder);
00226 static DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn,
00227                                uint64_t Address, const void *Decoder);
00228 static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
00229                                uint64_t Address, const void *Decoder);
00230 static DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val,
00231                                uint64_t Address, const void *Decoder);
00232 static DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val,
00233                                uint64_t Address, const void *Decoder);
00234 static DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val,
00235                                uint64_t Address, const void *Decoder);
00236 static DecodeStatus DecodeT2BInstruction(MCInst &Inst, unsigned Insn,
00237                                uint64_t Address, const void *Decoder);
00238 static DecodeStatus DecodeBranchImmInstruction(MCInst &Inst,unsigned Insn,
00239                                uint64_t Address, const void *Decoder);
00240 static DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val,
00241                                uint64_t Address, const void *Decoder);
00242 static DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Val,
00243                                uint64_t Address, const void *Decoder);
00244 static DecodeStatus DecodeVST1Instruction(MCInst &Inst, unsigned Val,
00245                                uint64_t Address, const void *Decoder);
00246 static DecodeStatus DecodeVST2Instruction(MCInst &Inst, unsigned Val,
00247                                uint64_t Address, const void *Decoder);
00248 static DecodeStatus DecodeVST3Instruction(MCInst &Inst, unsigned Val,
00249                                uint64_t Address, const void *Decoder);
00250 static DecodeStatus DecodeVST4Instruction(MCInst &Inst, unsigned Val,
00251                                uint64_t Address, const void *Decoder);
00252 static DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Val,
00253                                uint64_t Address, const void *Decoder);
00254 static DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Val,
00255                                uint64_t Address, const void *Decoder);
00256 static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Val,
00257                                uint64_t Address, const void *Decoder);
00258 static DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Val,
00259                                uint64_t Address, const void *Decoder);
00260 static DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Val,
00261                                uint64_t Address, const void *Decoder);
00262 static DecodeStatus DecodeNEONModImmInstruction(MCInst &Inst,unsigned Val,
00263                                uint64_t Address, const void *Decoder);
00264 static DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Val,
00265                                uint64_t Address, const void *Decoder);
00266 static DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val,
00267                                uint64_t Address, const void *Decoder);
00268 static DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val,
00269                                uint64_t Address, const void *Decoder);
00270 static DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val,
00271                                uint64_t Address, const void *Decoder);
00272 static DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val,
00273                                uint64_t Address, const void *Decoder);
00274 static DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn,
00275                                uint64_t Address, const void *Decoder);
00276 static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
00277                                uint64_t Address, const void *Decoder);
00278 static DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Insn,
00279                                uint64_t Address, const void *Decoder);
00280 static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Insn,
00281                                uint64_t Address, const void *Decoder);
00282 static DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Insn,
00283                                uint64_t Address, const void *Decoder);
00284 static DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn,
00285                                uint64_t Address, const void *Decoder);
00286 static DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn,
00287                                uint64_t Address, const void *Decoder);
00288 static DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn,
00289                                uint64_t Address, const void *Decoder);
00290 static DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn,
00291                                uint64_t Address, const void *Decoder);
00292 static DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn,
00293                                uint64_t Address, const void *Decoder);
00294 static DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn,
00295                                uint64_t Address, const void *Decoder);
00296 static DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn,
00297                                uint64_t Address, const void *Decoder);
00298 static DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn,
00299                                uint64_t Address, const void *Decoder);
00300 static DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn,
00301                                uint64_t Address, const void *Decoder);
00302 static DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn,
00303                                uint64_t Address, const void *Decoder);
00304 static DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn,
00305                                uint64_t Address, const void *Decoder);
00306 static DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn,
00307                                uint64_t Address, const void *Decoder);
00308 static DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn,
00309                                uint64_t Address, const void *Decoder);
00310 static DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn,
00311                                uint64_t Address, const void *Decoder);
00312 static DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn,
00313                                uint64_t Address, const void *Decoder);
00314 static DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn,
00315                                uint64_t Address, const void *Decoder);
00316 static DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn,
00317                                uint64_t Address, const void *Decoder);
00318 static DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn,
00319                                 uint64_t Address, const void *Decoder);
00320 static DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn,
00321                                 uint64_t Address, const void *Decoder);
00322 static DecodeStatus DecodeImm0_4(MCInst &Inst, unsigned Insn, uint64_t Address,
00323                                  const void *Decoder);
00324 
00325 
00326 static DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn,
00327                                uint64_t Address, const void *Decoder);
00328 static DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val,
00329                                uint64_t Address, const void *Decoder);
00330 static DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val,
00331                                uint64_t Address, const void *Decoder);
00332 static DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val,
00333                                uint64_t Address, const void *Decoder);
00334 static DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val,
00335                                uint64_t Address, const void *Decoder);
00336 static DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val,
00337                                uint64_t Address, const void *Decoder);
00338 static DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val,
00339                                uint64_t Address, const void *Decoder);
00340 static DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val,
00341                                uint64_t Address, const void *Decoder);
00342 static DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val,
00343                                uint64_t Address, const void *Decoder);
00344 static DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Val,
00345                                uint64_t Address, const void *Decoder);
00346 static DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val,
00347                                uint64_t Address, const void *Decoder);
00348 static DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val,
00349                                uint64_t Address, const void *Decoder);
00350 static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
00351                                uint64_t Address, const void *Decoder);
00352 static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
00353                                uint64_t Address, const void *Decoder);
00354 static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
00355                                uint64_t Address, const void *Decoder);
00356 static DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Val,
00357                                uint64_t Address, const void *Decoder);
00358 static DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn,
00359                                 uint64_t Address, const void *Decoder);
00360 static DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn,
00361                                 uint64_t Address, const void *Decoder);
00362 static DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Insn,
00363                                 uint64_t Address, const void *Decoder);
00364 static DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val,
00365                                 uint64_t Address, const void *Decoder);
00366 static DecodeStatus DecodeThumbTableBranch(MCInst &Inst, unsigned Val,
00367                                 uint64_t Address, const void *Decoder);
00368 static DecodeStatus DecodeThumb2BCCInstruction(MCInst &Inst, unsigned Val,
00369                                 uint64_t Address, const void *Decoder);
00370 static DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val,
00371                                 uint64_t Address, const void *Decoder);
00372 static DecodeStatus DecodeThumbBCCTargetOperand(MCInst &Inst,unsigned Val,
00373                                 uint64_t Address, const void *Decoder);
00374 static DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val,
00375                                 uint64_t Address, const void *Decoder);
00376 static DecodeStatus DecodeIT(MCInst &Inst, unsigned Val,
00377                                 uint64_t Address, const void *Decoder);
00378 static DecodeStatus DecodeT2LDRDPreInstruction(MCInst &Inst,unsigned Insn,
00379                                uint64_t Address, const void *Decoder);
00380 static DecodeStatus DecodeT2STRDPreInstruction(MCInst &Inst,unsigned Insn,
00381                                uint64_t Address, const void *Decoder);
00382 static DecodeStatus DecodeT2Adr(MCInst &Inst, unsigned Val,
00383                                 uint64_t Address, const void *Decoder);
00384 static DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Val,
00385                                 uint64_t Address, const void *Decoder);
00386 static DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, unsigned Val,
00387                                 uint64_t Address, const void *Decoder);
00388 
00389 static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val,
00390                                 uint64_t Address, const void *Decoder);
00391 static DecodeStatus DecodeMRRC2(llvm::MCInst &Inst, unsigned Val,
00392                                 uint64_t Address, const void *Decoder);
00393 #include "ARMGenDisassemblerTables.inc"
00394 
00395 static MCDisassembler *createARMDisassembler(const Target &T, const MCSubtargetInfo &STI) {
00396   return new ARMDisassembler(STI);
00397 }
00398 
00399 static MCDisassembler *createThumbDisassembler(const Target &T, const MCSubtargetInfo &STI) {
00400   return new ThumbDisassembler(STI);
00401 }
00402 
00403 DecodeStatus ARMDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
00404                                              const MemoryObject &Region,
00405                                              uint64_t Address,
00406                                              raw_ostream &os,
00407                                              raw_ostream &cs) const {
00408   CommentStream = &cs;
00409 
00410   uint8_t bytes[4];
00411 
00412   assert(!(STI.getFeatureBits() & ARM::ModeThumb) &&
00413          "Asked to disassemble an ARM instruction but Subtarget is in Thumb mode!");
00414 
00415   // We want to read exactly 4 bytes of data.
00416   if (Region.readBytes(Address, 4, (uint8_t*)bytes, NULL) == -1) {
00417     Size = 0;
00418     return MCDisassembler::Fail;
00419   }
00420 
00421   // Encoded as a small-endian 32-bit word in the stream.
00422   uint32_t insn = (bytes[3] << 24) |
00423                   (bytes[2] << 16) |
00424                   (bytes[1] <<  8) |
00425                   (bytes[0] <<  0);
00426 
00427   // Calling the auto-generated decoder function.
00428   DecodeStatus result = decodeInstruction(DecoderTableARM32, MI, insn,
00429                                           Address, this, STI);
00430   if (result != MCDisassembler::Fail) {
00431     Size = 4;
00432     return result;
00433   }
00434 
00435   // VFP and NEON instructions, similarly, are shared between ARM
00436   // and Thumb modes.
00437   MI.clear();
00438   result = decodeInstruction(DecoderTableVFP32, MI, insn, Address, this, STI);
00439   if (result != MCDisassembler::Fail) {
00440     Size = 4;
00441     return result;
00442   }
00443 
00444   MI.clear();
00445   result = decodeInstruction(DecoderTableNEONData32, MI, insn, Address,
00446                              this, STI);
00447   if (result != MCDisassembler::Fail) {
00448     Size = 4;
00449     // Add a fake predicate operand, because we share these instruction
00450     // definitions with Thumb2 where these instructions are predicable.
00451     if (!DecodePredicateOperand(MI, 0xE, Address, this))
00452       return MCDisassembler::Fail;
00453     return result;
00454   }
00455 
00456   MI.clear();
00457   result = decodeInstruction(DecoderTableNEONLoadStore32, MI, insn, Address,
00458                              this, STI);
00459   if (result != MCDisassembler::Fail) {
00460     Size = 4;
00461     // Add a fake predicate operand, because we share these instruction
00462     // definitions with Thumb2 where these instructions are predicable.
00463     if (!DecodePredicateOperand(MI, 0xE, Address, this))
00464       return MCDisassembler::Fail;
00465     return result;
00466   }
00467 
00468   MI.clear();
00469   result = decodeInstruction(DecoderTableNEONDup32, MI, insn, Address,
00470                              this, STI);
00471   if (result != MCDisassembler::Fail) {
00472     Size = 4;
00473     // Add a fake predicate operand, because we share these instruction
00474     // definitions with Thumb2 where these instructions are predicable.
00475     if (!DecodePredicateOperand(MI, 0xE, Address, this))
00476       return MCDisassembler::Fail;
00477     return result;
00478   }
00479 
00480   MI.clear();
00481 
00482   Size = 0;
00483   return MCDisassembler::Fail;
00484 }
00485 
00486 namespace llvm {
00487 extern const MCInstrDesc ARMInsts[];
00488 }
00489 
00490 /// tryAddingSymbolicOperand - trys to add a symbolic operand in place of the
00491 /// immediate Value in the MCInst.  The immediate Value has had any PC
00492 /// adjustment made by the caller.  If the instruction is a branch instruction
00493 /// then isBranch is true, else false.  If the getOpInfo() function was set as
00494 /// part of the setupForSymbolicDisassembly() call then that function is called
00495 /// to get any symbolic information at the Address for this instruction.  If
00496 /// that returns non-zero then the symbolic information it returns is used to
00497 /// create an MCExpr and that is added as an operand to the MCInst.  If
00498 /// getOpInfo() returns zero and isBranch is true then a symbol look up for
00499 /// Value is done and if a symbol is found an MCExpr is created with that, else
00500 /// an MCExpr with Value is created.  This function returns true if it adds an
00501 /// operand to the MCInst and false otherwise.
00502 static bool tryAddingSymbolicOperand(uint64_t Address, int32_t Value,
00503                                      bool isBranch, uint64_t InstSize,
00504                                      MCInst &MI, const void *Decoder) {
00505   const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
00506   // FIXME: Does it make sense for value to be negative?
00507   return Dis->tryAddingSymbolicOperand(MI, (uint32_t)Value, Address, isBranch,
00508                                        /* Offset */ 0, InstSize);
00509 }
00510 
00511 /// tryAddingPcLoadReferenceComment - trys to add a comment as to what is being
00512 /// referenced by a load instruction with the base register that is the Pc.
00513 /// These can often be values in a literal pool near the Address of the
00514 /// instruction.  The Address of the instruction and its immediate Value are
00515 /// used as a possible literal pool entry.  The SymbolLookUp call back will
00516 /// return the name of a symbol referenced by the literal pool's entry if
00517 /// the referenced address is that of a symbol.  Or it will return a pointer to
00518 /// a literal 'C' string if the referenced address of the literal pool's entry
00519 /// is an address into a section with 'C' string literals.
00520 static void tryAddingPcLoadReferenceComment(uint64_t Address, int Value,
00521                                             const void *Decoder) {
00522   const MCDisassembler *Dis = static_cast<const MCDisassembler*>(Decoder);
00523   Dis->tryAddingPcLoadReferenceComment(Value, Address);
00524 }
00525 
00526 // Thumb1 instructions don't have explicit S bits.  Rather, they
00527 // implicitly set CPSR.  Since it's not represented in the encoding, the
00528 // auto-generated decoder won't inject the CPSR operand.  We need to fix
00529 // that as a post-pass.
00530 static void AddThumb1SBit(MCInst &MI, bool InITBlock) {
00531   const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
00532   unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
00533   MCInst::iterator I = MI.begin();
00534   for (unsigned i = 0; i < NumOps; ++i, ++I) {
00535     if (I == MI.end()) break;
00536     if (OpInfo[i].isOptionalDef() && OpInfo[i].RegClass == ARM::CCRRegClassID) {
00537       if (i > 0 && OpInfo[i-1].isPredicate()) continue;
00538       MI.insert(I, MCOperand::CreateReg(InITBlock ? 0 : ARM::CPSR));
00539       return;
00540     }
00541   }
00542 
00543   MI.insert(I, MCOperand::CreateReg(InITBlock ? 0 : ARM::CPSR));
00544 }
00545 
00546 // Most Thumb instructions don't have explicit predicates in the
00547 // encoding, but rather get their predicates from IT context.  We need
00548 // to fix up the predicate operands using this context information as a
00549 // post-pass.
00550 MCDisassembler::DecodeStatus
00551 ThumbDisassembler::AddThumbPredicate(MCInst &MI) const {
00552   MCDisassembler::DecodeStatus S = Success;
00553 
00554   // A few instructions actually have predicates encoded in them.  Don't
00555   // try to overwrite it if we're seeing one of those.
00556   switch (MI.getOpcode()) {
00557     case ARM::tBcc:
00558     case ARM::t2Bcc:
00559     case ARM::tCBZ:
00560     case ARM::tCBNZ:
00561     case ARM::tCPS:
00562     case ARM::t2CPS3p:
00563     case ARM::t2CPS2p:
00564     case ARM::t2CPS1p:
00565     case ARM::tMOVSr:
00566     case ARM::tSETEND:
00567       // Some instructions (mostly conditional branches) are not
00568       // allowed in IT blocks.
00569       if (ITBlock.instrInITBlock())
00570         S = SoftFail;
00571       else
00572         return Success;
00573       break;
00574     case ARM::tB:
00575     case ARM::t2B:
00576     case ARM::t2TBB:
00577     case ARM::t2TBH:
00578       // Some instructions (mostly unconditional branches) can
00579       // only appears at the end of, or outside of, an IT.
00580       if (ITBlock.instrInITBlock() && !ITBlock.instrLastInITBlock())
00581         S = SoftFail;
00582       break;
00583     default:
00584       break;
00585   }
00586 
00587   // If we're in an IT block, base the predicate on that.  Otherwise,
00588   // assume a predicate of AL.
00589   unsigned CC;
00590   CC = ITBlock.getITCC();
00591   if (CC == 0xF) 
00592     CC = ARMCC::AL;
00593   if (ITBlock.instrInITBlock())
00594     ITBlock.advanceITState();
00595 
00596   const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
00597   unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
00598   MCInst::iterator I = MI.begin();
00599   for (unsigned i = 0; i < NumOps; ++i, ++I) {
00600     if (I == MI.end()) break;
00601     if (OpInfo[i].isPredicate()) {
00602       I = MI.insert(I, MCOperand::CreateImm(CC));
00603       ++I;
00604       if (CC == ARMCC::AL)
00605         MI.insert(I, MCOperand::CreateReg(0));
00606       else
00607         MI.insert(I, MCOperand::CreateReg(ARM::CPSR));
00608       return S;
00609     }
00610   }
00611 
00612   I = MI.insert(I, MCOperand::CreateImm(CC));
00613   ++I;
00614   if (CC == ARMCC::AL)
00615     MI.insert(I, MCOperand::CreateReg(0));
00616   else
00617     MI.insert(I, MCOperand::CreateReg(ARM::CPSR));
00618 
00619   return S;
00620 }
00621 
00622 // Thumb VFP instructions are a special case.  Because we share their
00623 // encodings between ARM and Thumb modes, and they are predicable in ARM
00624 // mode, the auto-generated decoder will give them an (incorrect)
00625 // predicate operand.  We need to rewrite these operands based on the IT
00626 // context as a post-pass.
00627 void ThumbDisassembler::UpdateThumbVFPPredicate(MCInst &MI) const {
00628   unsigned CC;
00629   CC = ITBlock.getITCC();
00630   if (ITBlock.instrInITBlock())
00631     ITBlock.advanceITState();
00632 
00633   const MCOperandInfo *OpInfo = ARMInsts[MI.getOpcode()].OpInfo;
00634   MCInst::iterator I = MI.begin();
00635   unsigned short NumOps = ARMInsts[MI.getOpcode()].NumOperands;
00636   for (unsigned i = 0; i < NumOps; ++i, ++I) {
00637     if (OpInfo[i].isPredicate() ) {
00638       I->setImm(CC);
00639       ++I;
00640       if (CC == ARMCC::AL)
00641         I->setReg(0);
00642       else
00643         I->setReg(ARM::CPSR);
00644       return;
00645     }
00646   }
00647 }
00648 
00649 DecodeStatus ThumbDisassembler::getInstruction(MCInst &MI, uint64_t &Size,
00650                                                const MemoryObject &Region,
00651                                                uint64_t Address,
00652                                                raw_ostream &os,
00653                                                raw_ostream &cs) const {
00654   CommentStream = &cs;
00655 
00656   uint8_t bytes[4];
00657 
00658   assert((STI.getFeatureBits() & ARM::ModeThumb) &&
00659          "Asked to disassemble in Thumb mode but Subtarget is in ARM mode!");
00660 
00661   // We want to read exactly 2 bytes of data.
00662   if (Region.readBytes(Address, 2, (uint8_t*)bytes, NULL) == -1) {
00663     Size = 0;
00664     return MCDisassembler::Fail;
00665   }
00666 
00667   uint16_t insn16 = (bytes[1] << 8) | bytes[0];
00668   DecodeStatus result = decodeInstruction(DecoderTableThumb16, MI, insn16,
00669                                           Address, this, STI);
00670   if (result != MCDisassembler::Fail) {
00671     Size = 2;
00672     Check(result, AddThumbPredicate(MI));
00673     return result;
00674   }
00675 
00676   MI.clear();
00677   result = decodeInstruction(DecoderTableThumbSBit16, MI, insn16,
00678                              Address, this, STI);
00679   if (result) {
00680     Size = 2;
00681     bool InITBlock = ITBlock.instrInITBlock();
00682     Check(result, AddThumbPredicate(MI));
00683     AddThumb1SBit(MI, InITBlock);
00684     return result;
00685   }
00686 
00687   MI.clear();
00688   result = decodeInstruction(DecoderTableThumb216, MI, insn16,
00689                              Address, this, STI);
00690   if (result != MCDisassembler::Fail) {
00691     Size = 2;
00692 
00693     // Nested IT blocks are UNPREDICTABLE.  Must be checked before we add
00694     // the Thumb predicate.
00695     if (MI.getOpcode() == ARM::t2IT && ITBlock.instrInITBlock())
00696       result = MCDisassembler::SoftFail;
00697 
00698     Check(result, AddThumbPredicate(MI));
00699 
00700     // If we find an IT instruction, we need to parse its condition
00701     // code and mask operands so that we can apply them correctly
00702     // to the subsequent instructions.
00703     if (MI.getOpcode() == ARM::t2IT) {
00704 
00705       unsigned Firstcond = MI.getOperand(0).getImm();
00706       unsigned Mask = MI.getOperand(1).getImm();
00707       ITBlock.setITState(Firstcond, Mask);
00708     }
00709 
00710     return result;
00711   }
00712 
00713   // We want to read exactly 4 bytes of data.
00714   if (Region.readBytes(Address, 4, (uint8_t*)bytes, NULL) == -1) {
00715     Size = 0;
00716     return MCDisassembler::Fail;
00717   }
00718 
00719   uint32_t insn32 = (bytes[3] <<  8) |
00720                     (bytes[2] <<  0) |
00721                     (bytes[1] << 24) |
00722                     (bytes[0] << 16);
00723   MI.clear();
00724   result = decodeInstruction(DecoderTableThumb32, MI, insn32, Address,
00725                              this, STI);
00726   if (result != MCDisassembler::Fail) {
00727     Size = 4;
00728     bool InITBlock = ITBlock.instrInITBlock();
00729     Check(result, AddThumbPredicate(MI));
00730     AddThumb1SBit(MI, InITBlock);
00731     return result;
00732   }
00733 
00734   MI.clear();
00735   result = decodeInstruction(DecoderTableThumb232, MI, insn32, Address,
00736                              this, STI);
00737   if (result != MCDisassembler::Fail) {
00738     Size = 4;
00739     Check(result, AddThumbPredicate(MI));
00740     return result;
00741   }
00742 
00743   MI.clear();
00744   result = decodeInstruction(DecoderTableVFP32, MI, insn32, Address, this, STI);
00745   if (result != MCDisassembler::Fail) {
00746     Size = 4;
00747     UpdateThumbVFPPredicate(MI);
00748     return result;
00749   }
00750 
00751   MI.clear();
00752   result = decodeInstruction(DecoderTableNEONDup32, MI, insn32, Address,
00753                              this, STI);
00754   if (result != MCDisassembler::Fail) {
00755     Size = 4;
00756     Check(result, AddThumbPredicate(MI));
00757     return result;
00758   }
00759 
00760   if (fieldFromInstruction(insn32, 24, 8) == 0xF9) {
00761     MI.clear();
00762     uint32_t NEONLdStInsn = insn32;
00763     NEONLdStInsn &= 0xF0FFFFFF;
00764     NEONLdStInsn |= 0x04000000;
00765     result = decodeInstruction(DecoderTableNEONLoadStore32, MI, NEONLdStInsn,
00766                                Address, this, STI);
00767     if (result != MCDisassembler::Fail) {
00768       Size = 4;
00769       Check(result, AddThumbPredicate(MI));
00770       return result;
00771     }
00772   }
00773 
00774   if (fieldFromInstruction(insn32, 24, 4) == 0xF) {
00775     MI.clear();
00776     uint32_t NEONDataInsn = insn32;
00777     NEONDataInsn &= 0xF0FFFFFF; // Clear bits 27-24
00778     NEONDataInsn |= (NEONDataInsn & 0x10000000) >> 4; // Move bit 28 to bit 24
00779     NEONDataInsn |= 0x12000000; // Set bits 28 and 25
00780     result = decodeInstruction(DecoderTableNEONData32, MI, NEONDataInsn,
00781                                Address, this, STI);
00782     if (result != MCDisassembler::Fail) {
00783       Size = 4;
00784       Check(result, AddThumbPredicate(MI));
00785       return result;
00786     }
00787   }
00788 
00789   Size = 0;
00790   return MCDisassembler::Fail;
00791 }
00792 
00793 
00794 extern "C" void LLVMInitializeARMDisassembler() {
00795   TargetRegistry::RegisterMCDisassembler(TheARMTarget,
00796                                          createARMDisassembler);
00797   TargetRegistry::RegisterMCDisassembler(TheThumbTarget,
00798                                          createThumbDisassembler);
00799 }
00800 
00801 static const uint16_t GPRDecoderTable[] = {
00802   ARM::R0, ARM::R1, ARM::R2, ARM::R3,
00803   ARM::R4, ARM::R5, ARM::R6, ARM::R7,
00804   ARM::R8, ARM::R9, ARM::R10, ARM::R11,
00805   ARM::R12, ARM::SP, ARM::LR, ARM::PC
00806 };
00807 
00808 static DecodeStatus DecodeGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00809                                    uint64_t Address, const void *Decoder) {
00810   if (RegNo > 15)
00811     return MCDisassembler::Fail;
00812 
00813   unsigned Register = GPRDecoderTable[RegNo];
00814   Inst.addOperand(MCOperand::CreateReg(Register));
00815   return MCDisassembler::Success;
00816 }
00817 
00818 static DecodeStatus
00819 DecodeGPRnopcRegisterClass(MCInst &Inst, unsigned RegNo,
00820                            uint64_t Address, const void *Decoder) {
00821   DecodeStatus S = MCDisassembler::Success;
00822   
00823   if (RegNo == 15) 
00824     S = MCDisassembler::SoftFail;
00825 
00826   Check(S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
00827 
00828   return S;
00829 }
00830 
00831 static DecodeStatus
00832 DecodeGPRwithAPSRRegisterClass(MCInst &Inst, unsigned RegNo,
00833                                uint64_t Address, const void *Decoder) {
00834   DecodeStatus S = MCDisassembler::Success;
00835 
00836   if (RegNo == 15)
00837   {
00838     Inst.addOperand(MCOperand::CreateReg(ARM::APSR_NZCV));
00839     return MCDisassembler::Success;
00840   }
00841 
00842   Check(S, DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder));
00843   return S;
00844 }
00845 
00846 static DecodeStatus DecodetGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00847                                    uint64_t Address, const void *Decoder) {
00848   if (RegNo > 7)
00849     return MCDisassembler::Fail;
00850   return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
00851 }
00852 
00853 static DecodeStatus DecodetcGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00854                                    uint64_t Address, const void *Decoder) {
00855   unsigned Register = 0;
00856   switch (RegNo) {
00857     case 0:
00858       Register = ARM::R0;
00859       break;
00860     case 1:
00861       Register = ARM::R1;
00862       break;
00863     case 2:
00864       Register = ARM::R2;
00865       break;
00866     case 3:
00867       Register = ARM::R3;
00868       break;
00869     case 9:
00870       Register = ARM::R9;
00871       break;
00872     case 12:
00873       Register = ARM::R12;
00874       break;
00875     default:
00876       return MCDisassembler::Fail;
00877     }
00878 
00879   Inst.addOperand(MCOperand::CreateReg(Register));
00880   return MCDisassembler::Success;
00881 }
00882 
00883 static DecodeStatus DecoderGPRRegisterClass(MCInst &Inst, unsigned RegNo,
00884                                    uint64_t Address, const void *Decoder) {
00885   if (RegNo == 13 || RegNo == 15) return MCDisassembler::Fail;
00886   return DecodeGPRRegisterClass(Inst, RegNo, Address, Decoder);
00887 }
00888 
00889 static const uint16_t SPRDecoderTable[] = {
00890      ARM::S0,  ARM::S1,  ARM::S2,  ARM::S3,
00891      ARM::S4,  ARM::S5,  ARM::S6,  ARM::S7,
00892      ARM::S8,  ARM::S9, ARM::S10, ARM::S11,
00893     ARM::S12, ARM::S13, ARM::S14, ARM::S15,
00894     ARM::S16, ARM::S17, ARM::S18, ARM::S19,
00895     ARM::S20, ARM::S21, ARM::S22, ARM::S23,
00896     ARM::S24, ARM::S25, ARM::S26, ARM::S27,
00897     ARM::S28, ARM::S29, ARM::S30, ARM::S31
00898 };
00899 
00900 static DecodeStatus DecodeSPRRegisterClass(MCInst &Inst, unsigned RegNo,
00901                                    uint64_t Address, const void *Decoder) {
00902   if (RegNo > 31)
00903     return MCDisassembler::Fail;
00904 
00905   unsigned Register = SPRDecoderTable[RegNo];
00906   Inst.addOperand(MCOperand::CreateReg(Register));
00907   return MCDisassembler::Success;
00908 }
00909 
00910 static const uint16_t DPRDecoderTable[] = {
00911      ARM::D0,  ARM::D1,  ARM::D2,  ARM::D3,
00912      ARM::D4,  ARM::D5,  ARM::D6,  ARM::D7,
00913      ARM::D8,  ARM::D9, ARM::D10, ARM::D11,
00914     ARM::D12, ARM::D13, ARM::D14, ARM::D15,
00915     ARM::D16, ARM::D17, ARM::D18, ARM::D19,
00916     ARM::D20, ARM::D21, ARM::D22, ARM::D23,
00917     ARM::D24, ARM::D25, ARM::D26, ARM::D27,
00918     ARM::D28, ARM::D29, ARM::D30, ARM::D31
00919 };
00920 
00921 static DecodeStatus DecodeDPRRegisterClass(MCInst &Inst, unsigned RegNo,
00922                                    uint64_t Address, const void *Decoder) {
00923   if (RegNo > 31)
00924     return MCDisassembler::Fail;
00925 
00926   unsigned Register = DPRDecoderTable[RegNo];
00927   Inst.addOperand(MCOperand::CreateReg(Register));
00928   return MCDisassembler::Success;
00929 }
00930 
00931 static DecodeStatus DecodeDPR_8RegisterClass(MCInst &Inst, unsigned RegNo,
00932                                    uint64_t Address, const void *Decoder) {
00933   if (RegNo > 7)
00934     return MCDisassembler::Fail;
00935   return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
00936 }
00937 
00938 static DecodeStatus
00939 DecodeDPR_VFP2RegisterClass(MCInst &Inst, unsigned RegNo,
00940                             uint64_t Address, const void *Decoder) {
00941   if (RegNo > 15)
00942     return MCDisassembler::Fail;
00943   return DecodeDPRRegisterClass(Inst, RegNo, Address, Decoder);
00944 }
00945 
00946 static const uint16_t QPRDecoderTable[] = {
00947      ARM::Q0,  ARM::Q1,  ARM::Q2,  ARM::Q3,
00948      ARM::Q4,  ARM::Q5,  ARM::Q6,  ARM::Q7,
00949      ARM::Q8,  ARM::Q9, ARM::Q10, ARM::Q11,
00950     ARM::Q12, ARM::Q13, ARM::Q14, ARM::Q15
00951 };
00952 
00953 
00954 static DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo,
00955                                    uint64_t Address, const void *Decoder) {
00956   if (RegNo > 31 || (RegNo & 1) != 0)
00957     return MCDisassembler::Fail;
00958   RegNo >>= 1;
00959 
00960   unsigned Register = QPRDecoderTable[RegNo];
00961   Inst.addOperand(MCOperand::CreateReg(Register));
00962   return MCDisassembler::Success;
00963 }
00964 
00965 static const uint16_t DPairDecoderTable[] = {
00966   ARM::Q0,  ARM::D1_D2,   ARM::Q1,  ARM::D3_D4,   ARM::Q2,  ARM::D5_D6,
00967   ARM::Q3,  ARM::D7_D8,   ARM::Q4,  ARM::D9_D10,  ARM::Q5,  ARM::D11_D12,
00968   ARM::Q6,  ARM::D13_D14, ARM::Q7,  ARM::D15_D16, ARM::Q8,  ARM::D17_D18,
00969   ARM::Q9,  ARM::D19_D20, ARM::Q10, ARM::D21_D22, ARM::Q11, ARM::D23_D24,
00970   ARM::Q12, ARM::D25_D26, ARM::Q13, ARM::D27_D28, ARM::Q14, ARM::D29_D30,
00971   ARM::Q15
00972 };
00973 
00974 static DecodeStatus DecodeDPairRegisterClass(MCInst &Inst, unsigned RegNo,
00975                                    uint64_t Address, const void *Decoder) {
00976   if (RegNo > 30)
00977     return MCDisassembler::Fail;
00978 
00979   unsigned Register = DPairDecoderTable[RegNo];
00980   Inst.addOperand(MCOperand::CreateReg(Register));
00981   return MCDisassembler::Success;
00982 }
00983 
00984 static const uint16_t DPairSpacedDecoderTable[] = {
00985   ARM::D0_D2,   ARM::D1_D3,   ARM::D2_D4,   ARM::D3_D5,
00986   ARM::D4_D6,   ARM::D5_D7,   ARM::D6_D8,   ARM::D7_D9,
00987   ARM::D8_D10,  ARM::D9_D11,  ARM::D10_D12, ARM::D11_D13,
00988   ARM::D12_D14, ARM::D13_D15, ARM::D14_D16, ARM::D15_D17,
00989   ARM::D16_D18, ARM::D17_D19, ARM::D18_D20, ARM::D19_D21,
00990   ARM::D20_D22, ARM::D21_D23, ARM::D22_D24, ARM::D23_D25,
00991   ARM::D24_D26, ARM::D25_D27, ARM::D26_D28, ARM::D27_D29,
00992   ARM::D28_D30, ARM::D29_D31
00993 };
00994 
00995 static DecodeStatus DecodeDPairSpacedRegisterClass(MCInst &Inst,
00996                                                    unsigned RegNo,
00997                                                    uint64_t Address,
00998                                                    const void *Decoder) {
00999   if (RegNo > 29)
01000     return MCDisassembler::Fail;
01001 
01002   unsigned Register = DPairSpacedDecoderTable[RegNo];
01003   Inst.addOperand(MCOperand::CreateReg(Register));
01004   return MCDisassembler::Success;
01005 }
01006 
01007 static DecodeStatus DecodePredicateOperand(MCInst &Inst, unsigned Val,
01008                                uint64_t Address, const void *Decoder) {
01009   if (Val == 0xF) return MCDisassembler::Fail;
01010   // AL predicate is not allowed on Thumb1 branches.
01011   if (Inst.getOpcode() == ARM::tBcc && Val == 0xE)
01012     return MCDisassembler::Fail;
01013   Inst.addOperand(MCOperand::CreateImm(Val));
01014   if (Val == ARMCC::AL) {
01015     Inst.addOperand(MCOperand::CreateReg(0));
01016   } else
01017     Inst.addOperand(MCOperand::CreateReg(ARM::CPSR));
01018   return MCDisassembler::Success;
01019 }
01020 
01021 static DecodeStatus DecodeCCOutOperand(MCInst &Inst, unsigned Val,
01022                                uint64_t Address, const void *Decoder) {
01023   if (Val)
01024     Inst.addOperand(MCOperand::CreateReg(ARM::CPSR));
01025   else
01026     Inst.addOperand(MCOperand::CreateReg(0));
01027   return MCDisassembler::Success;
01028 }
01029 
01030 static DecodeStatus DecodeSOImmOperand(MCInst &Inst, unsigned Val,
01031                                uint64_t Address, const void *Decoder) {
01032   uint32_t imm = Val & 0xFF;
01033   uint32_t rot = (Val & 0xF00) >> 7;
01034   uint32_t rot_imm = (imm >> rot) | (imm << ((32-rot) & 0x1F));
01035   Inst.addOperand(MCOperand::CreateImm(rot_imm));
01036   return MCDisassembler::Success;
01037 }
01038 
01039 static DecodeStatus DecodeSORegImmOperand(MCInst &Inst, unsigned Val,
01040                                uint64_t Address, const void *Decoder) {
01041   DecodeStatus S = MCDisassembler::Success;
01042 
01043   unsigned Rm = fieldFromInstruction(Val, 0, 4);
01044   unsigned type = fieldFromInstruction(Val, 5, 2);
01045   unsigned imm = fieldFromInstruction(Val, 7, 5);
01046 
01047   // Register-immediate
01048   if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
01049     return MCDisassembler::Fail;
01050 
01051   ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
01052   switch (type) {
01053     case 0:
01054       Shift = ARM_AM::lsl;
01055       break;
01056     case 1:
01057       Shift = ARM_AM::lsr;
01058       break;
01059     case 2:
01060       Shift = ARM_AM::asr;
01061       break;
01062     case 3:
01063       Shift = ARM_AM::ror;
01064       break;
01065   }
01066 
01067   if (Shift == ARM_AM::ror && imm == 0)
01068     Shift = ARM_AM::rrx;
01069 
01070   unsigned Op = Shift | (imm << 3);
01071   Inst.addOperand(MCOperand::CreateImm(Op));
01072 
01073   return S;
01074 }
01075 
01076 static DecodeStatus DecodeSORegRegOperand(MCInst &Inst, unsigned Val,
01077                                uint64_t Address, const void *Decoder) {
01078   DecodeStatus S = MCDisassembler::Success;
01079 
01080   unsigned Rm = fieldFromInstruction(Val, 0, 4);
01081   unsigned type = fieldFromInstruction(Val, 5, 2);
01082   unsigned Rs = fieldFromInstruction(Val, 8, 4);
01083 
01084   // Register-register
01085   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
01086     return MCDisassembler::Fail;
01087   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rs, Address, Decoder)))
01088     return MCDisassembler::Fail;
01089 
01090   ARM_AM::ShiftOpc Shift = ARM_AM::lsl;
01091   switch (type) {
01092     case 0:
01093       Shift = ARM_AM::lsl;
01094       break;
01095     case 1:
01096       Shift = ARM_AM::lsr;
01097       break;
01098     case 2:
01099       Shift = ARM_AM::asr;
01100       break;
01101     case 3:
01102       Shift = ARM_AM::ror;
01103       break;
01104   }
01105 
01106   Inst.addOperand(MCOperand::CreateImm(Shift));
01107 
01108   return S;
01109 }
01110 
01111 static DecodeStatus DecodeRegListOperand(MCInst &Inst, unsigned Val,
01112                                  uint64_t Address, const void *Decoder) {
01113   DecodeStatus S = MCDisassembler::Success;
01114 
01115   bool writebackLoad = false;
01116   unsigned writebackReg = 0;
01117   switch (Inst.getOpcode()) {
01118     default:
01119       break;
01120     case ARM::LDMIA_UPD:
01121     case ARM::LDMDB_UPD:
01122     case ARM::LDMIB_UPD:
01123     case ARM::LDMDA_UPD:
01124     case ARM::t2LDMIA_UPD:
01125     case ARM::t2LDMDB_UPD:
01126       writebackLoad = true;
01127       writebackReg = Inst.getOperand(0).getReg();
01128       break;
01129   }
01130 
01131   // Empty register lists are not allowed.
01132   if (Val == 0) return MCDisassembler::Fail;
01133   for (unsigned i = 0; i < 16; ++i) {
01134     if (Val & (1 << i)) {
01135       if (!Check(S, DecodeGPRRegisterClass(Inst, i, Address, Decoder)))
01136         return MCDisassembler::Fail;
01137       // Writeback not allowed if Rn is in the target list.
01138       if (writebackLoad && writebackReg == Inst.end()[-1].getReg())
01139         Check(S, MCDisassembler::SoftFail);
01140     }
01141   }
01142 
01143   return S;
01144 }
01145 
01146 static DecodeStatus DecodeSPRRegListOperand(MCInst &Inst, unsigned Val,
01147                                  uint64_t Address, const void *Decoder) {
01148   DecodeStatus S = MCDisassembler::Success;
01149 
01150   unsigned Vd = fieldFromInstruction(Val, 8, 5);
01151   unsigned regs = fieldFromInstruction(Val, 0, 8);
01152 
01153   if (!Check(S, DecodeSPRRegisterClass(Inst, Vd, Address, Decoder)))
01154     return MCDisassembler::Fail;
01155   for (unsigned i = 0; i < (regs - 1); ++i) {
01156     if (!Check(S, DecodeSPRRegisterClass(Inst, ++Vd, Address, Decoder)))
01157       return MCDisassembler::Fail;
01158   }
01159 
01160   return S;
01161 }
01162 
01163 static DecodeStatus DecodeDPRRegListOperand(MCInst &Inst, unsigned Val,
01164                                  uint64_t Address, const void *Decoder) {
01165   DecodeStatus S = MCDisassembler::Success;
01166 
01167   unsigned Vd = fieldFromInstruction(Val, 8, 5);
01168   unsigned regs = fieldFromInstruction(Val, 0, 8);
01169 
01170   regs = regs >> 1;
01171 
01172   if (!Check(S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
01173       return MCDisassembler::Fail;
01174   for (unsigned i = 0; i < (regs - 1); ++i) {
01175     if (!Check(S, DecodeDPRRegisterClass(Inst, ++Vd, Address, Decoder)))
01176       return MCDisassembler::Fail;
01177   }
01178 
01179   return S;
01180 }
01181 
01182 static DecodeStatus DecodeBitfieldMaskOperand(MCInst &Inst, unsigned Val,
01183                                       uint64_t Address, const void *Decoder) {
01184   // This operand encodes a mask of contiguous zeros between a specified MSB
01185   // and LSB.  To decode it, we create the mask of all bits MSB-and-lower,
01186   // the mask of all bits LSB-and-lower, and then xor them to create
01187   // the mask of that's all ones on [msb, lsb].  Finally we not it to
01188   // create the final mask.
01189   unsigned msb = fieldFromInstruction(Val, 5, 5);
01190   unsigned lsb = fieldFromInstruction(Val, 0, 5);
01191 
01192   DecodeStatus S = MCDisassembler::Success;
01193   if (lsb > msb) {
01194     Check(S, MCDisassembler::SoftFail);
01195     // The check above will cause the warning for the "potentially undefined
01196     // instruction encoding" but we can't build a bad MCOperand value here
01197     // with a lsb > msb or else printing the MCInst will cause a crash.
01198     lsb = msb;
01199   }
01200 
01201   uint32_t msb_mask = 0xFFFFFFFF;
01202   if (msb != 31) msb_mask = (1U << (msb+1)) - 1;
01203   uint32_t lsb_mask = (1U << lsb) - 1;
01204 
01205   Inst.addOperand(MCOperand::CreateImm(~(msb_mask ^ lsb_mask)));
01206   return S;
01207 }
01208 
01209 static DecodeStatus DecodeCopMemInstruction(MCInst &Inst, unsigned Insn,
01210                                   uint64_t Address, const void *Decoder) {
01211   DecodeStatus S = MCDisassembler::Success;
01212 
01213   unsigned pred = fieldFromInstruction(Insn, 28, 4);
01214   unsigned CRd = fieldFromInstruction(Insn, 12, 4);
01215   unsigned coproc = fieldFromInstruction(Insn, 8, 4);
01216   unsigned imm = fieldFromInstruction(Insn, 0, 8);
01217   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
01218   unsigned U = fieldFromInstruction(Insn, 23, 1);
01219 
01220   switch (Inst.getOpcode()) {
01221     case ARM::LDC_OFFSET:
01222     case ARM::LDC_PRE:
01223     case ARM::LDC_POST:
01224     case ARM::LDC_OPTION:
01225     case ARM::LDCL_OFFSET:
01226     case ARM::LDCL_PRE:
01227     case ARM::LDCL_POST:
01228     case ARM::LDCL_OPTION:
01229     case ARM::STC_OFFSET:
01230     case ARM::STC_PRE:
01231     case ARM::STC_POST:
01232     case ARM::STC_OPTION:
01233     case ARM::STCL_OFFSET:
01234     case ARM::STCL_PRE:
01235     case ARM::STCL_POST:
01236     case ARM::STCL_OPTION:
01237     case ARM::t2LDC_OFFSET:
01238     case ARM::t2LDC_PRE:
01239     case ARM::t2LDC_POST:
01240     case ARM::t2LDC_OPTION:
01241     case ARM::t2LDCL_OFFSET:
01242     case ARM::t2LDCL_PRE:
01243     case ARM::t2LDCL_POST:
01244     case ARM::t2LDCL_OPTION:
01245     case ARM::t2STC_OFFSET:
01246     case ARM::t2STC_PRE:
01247     case ARM::t2STC_POST:
01248     case ARM::t2STC_OPTION:
01249     case ARM::t2STCL_OFFSET:
01250     case ARM::t2STCL_PRE:
01251     case ARM::t2STCL_POST:
01252     case ARM::t2STCL_OPTION:
01253       if (coproc == 0xA || coproc == 0xB)
01254         return MCDisassembler::Fail;
01255       break;
01256     default:
01257       break;
01258   }
01259 
01260   Inst.addOperand(MCOperand::CreateImm(coproc));
01261   Inst.addOperand(MCOperand::CreateImm(CRd));
01262   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01263     return MCDisassembler::Fail;
01264 
01265   switch (Inst.getOpcode()) {
01266     case ARM::t2LDC2_OFFSET:
01267     case ARM::t2LDC2L_OFFSET:
01268     case ARM::t2LDC2_PRE:
01269     case ARM::t2LDC2L_PRE:
01270     case ARM::t2STC2_OFFSET:
01271     case ARM::t2STC2L_OFFSET:
01272     case ARM::t2STC2_PRE:
01273     case ARM::t2STC2L_PRE:
01274     case ARM::LDC2_OFFSET:
01275     case ARM::LDC2L_OFFSET:
01276     case ARM::LDC2_PRE:
01277     case ARM::LDC2L_PRE:
01278     case ARM::STC2_OFFSET:
01279     case ARM::STC2L_OFFSET:
01280     case ARM::STC2_PRE:
01281     case ARM::STC2L_PRE:
01282     case ARM::t2LDC_OFFSET:
01283     case ARM::t2LDCL_OFFSET:
01284     case ARM::t2LDC_PRE:
01285     case ARM::t2LDCL_PRE:
01286     case ARM::t2STC_OFFSET:
01287     case ARM::t2STCL_OFFSET:
01288     case ARM::t2STC_PRE:
01289     case ARM::t2STCL_PRE:
01290     case ARM::LDC_OFFSET:
01291     case ARM::LDCL_OFFSET:
01292     case ARM::LDC_PRE:
01293     case ARM::LDCL_PRE:
01294     case ARM::STC_OFFSET:
01295     case ARM::STCL_OFFSET:
01296     case ARM::STC_PRE:
01297     case ARM::STCL_PRE:
01298       imm = ARM_AM::getAM5Opc(U ? ARM_AM::add : ARM_AM::sub, imm);
01299       Inst.addOperand(MCOperand::CreateImm(imm));
01300       break;
01301     case ARM::t2LDC2_POST:
01302     case ARM::t2LDC2L_POST:
01303     case ARM::t2STC2_POST:
01304     case ARM::t2STC2L_POST:
01305     case ARM::LDC2_POST:
01306     case ARM::LDC2L_POST:
01307     case ARM::STC2_POST:
01308     case ARM::STC2L_POST:
01309     case ARM::t2LDC_POST:
01310     case ARM::t2LDCL_POST:
01311     case ARM::t2STC_POST:
01312     case ARM::t2STCL_POST:
01313     case ARM::LDC_POST:
01314     case ARM::LDCL_POST:
01315     case ARM::STC_POST:
01316     case ARM::STCL_POST:
01317       imm |= U << 8;
01318       // fall through.
01319     default:
01320       // The 'option' variant doesn't encode 'U' in the immediate since
01321       // the immediate is unsigned [0,255].
01322       Inst.addOperand(MCOperand::CreateImm(imm));
01323       break;
01324   }
01325 
01326   switch (Inst.getOpcode()) {
01327     case ARM::LDC_OFFSET:
01328     case ARM::LDC_PRE:
01329     case ARM::LDC_POST:
01330     case ARM::LDC_OPTION:
01331     case ARM::LDCL_OFFSET:
01332     case ARM::LDCL_PRE:
01333     case ARM::LDCL_POST:
01334     case ARM::LDCL_OPTION:
01335     case ARM::STC_OFFSET:
01336     case ARM::STC_PRE:
01337     case ARM::STC_POST:
01338     case ARM::STC_OPTION:
01339     case ARM::STCL_OFFSET:
01340     case ARM::STCL_PRE:
01341     case ARM::STCL_POST:
01342     case ARM::STCL_OPTION:
01343       if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
01344         return MCDisassembler::Fail;
01345       break;
01346     default:
01347       break;
01348   }
01349 
01350   return S;
01351 }
01352 
01353 static DecodeStatus
01354 DecodeAddrMode2IdxInstruction(MCInst &Inst, unsigned Insn,
01355                               uint64_t Address, const void *Decoder) {
01356   DecodeStatus S = MCDisassembler::Success;
01357 
01358   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
01359   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
01360   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
01361   unsigned imm = fieldFromInstruction(Insn, 0, 12);
01362   unsigned pred = fieldFromInstruction(Insn, 28, 4);
01363   unsigned reg = fieldFromInstruction(Insn, 25, 1);
01364   unsigned P = fieldFromInstruction(Insn, 24, 1);
01365   unsigned W = fieldFromInstruction(Insn, 21, 1);
01366 
01367   // On stores, the writeback operand precedes Rt.
01368   switch (Inst.getOpcode()) {
01369     case ARM::STR_POST_IMM:
01370     case ARM::STR_POST_REG:
01371     case ARM::STRB_POST_IMM:
01372     case ARM::STRB_POST_REG:
01373     case ARM::STRT_POST_REG:
01374     case ARM::STRT_POST_IMM:
01375     case ARM::STRBT_POST_REG:
01376     case ARM::STRBT_POST_IMM:
01377       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01378         return MCDisassembler::Fail;
01379       break;
01380     default:
01381       break;
01382   }
01383 
01384   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
01385     return MCDisassembler::Fail;
01386 
01387   // On loads, the writeback operand comes after Rt.
01388   switch (Inst.getOpcode()) {
01389     case ARM::LDR_POST_IMM:
01390     case ARM::LDR_POST_REG:
01391     case ARM::LDRB_POST_IMM:
01392     case ARM::LDRB_POST_REG:
01393     case ARM::LDRBT_POST_REG:
01394     case ARM::LDRBT_POST_IMM:
01395     case ARM::LDRT_POST_REG:
01396     case ARM::LDRT_POST_IMM:
01397       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01398         return MCDisassembler::Fail;
01399       break;
01400     default:
01401       break;
01402   }
01403 
01404   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01405     return MCDisassembler::Fail;
01406 
01407   ARM_AM::AddrOpc Op = ARM_AM::add;
01408   if (!fieldFromInstruction(Insn, 23, 1))
01409     Op = ARM_AM::sub;
01410 
01411   bool writeback = (P == 0) || (W == 1);
01412   unsigned idx_mode = 0;
01413   if (P && writeback)
01414     idx_mode = ARMII::IndexModePre;
01415   else if (!P && writeback)
01416     idx_mode = ARMII::IndexModePost;
01417 
01418   if (writeback && (Rn == 15 || Rn == Rt))
01419     S = MCDisassembler::SoftFail; // UNPREDICTABLE
01420 
01421   if (reg) {
01422     if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
01423       return MCDisassembler::Fail;
01424     ARM_AM::ShiftOpc Opc = ARM_AM::lsl;
01425     switch( fieldFromInstruction(Insn, 5, 2)) {
01426       case 0:
01427         Opc = ARM_AM::lsl;
01428         break;
01429       case 1:
01430         Opc = ARM_AM::lsr;
01431         break;
01432       case 2:
01433         Opc = ARM_AM::asr;
01434         break;
01435       case 3:
01436         Opc = ARM_AM::ror;
01437         break;
01438       default:
01439         return MCDisassembler::Fail;
01440     }
01441     unsigned amt = fieldFromInstruction(Insn, 7, 5);
01442     if (Opc == ARM_AM::ror && amt == 0)
01443       Opc = ARM_AM::rrx;
01444     unsigned imm = ARM_AM::getAM2Opc(Op, amt, Opc, idx_mode);
01445 
01446     Inst.addOperand(MCOperand::CreateImm(imm));
01447   } else {
01448     Inst.addOperand(MCOperand::CreateReg(0));
01449     unsigned tmp = ARM_AM::getAM2Opc(Op, imm, ARM_AM::lsl, idx_mode);
01450     Inst.addOperand(MCOperand::CreateImm(tmp));
01451   }
01452 
01453   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
01454     return MCDisassembler::Fail;
01455 
01456   return S;
01457 }
01458 
01459 static DecodeStatus DecodeSORegMemOperand(MCInst &Inst, unsigned Val,
01460                                   uint64_t Address, const void *Decoder) {
01461   DecodeStatus S = MCDisassembler::Success;
01462 
01463   unsigned Rn = fieldFromInstruction(Val, 13, 4);
01464   unsigned Rm = fieldFromInstruction(Val,  0, 4);
01465   unsigned type = fieldFromInstruction(Val, 5, 2);
01466   unsigned imm = fieldFromInstruction(Val, 7, 5);
01467   unsigned U = fieldFromInstruction(Val, 12, 1);
01468 
01469   ARM_AM::ShiftOpc ShOp = ARM_AM::lsl;
01470   switch (type) {
01471     case 0:
01472       ShOp = ARM_AM::lsl;
01473       break;
01474     case 1:
01475       ShOp = ARM_AM::lsr;
01476       break;
01477     case 2:
01478       ShOp = ARM_AM::asr;
01479       break;
01480     case 3:
01481       ShOp = ARM_AM::ror;
01482       break;
01483   }
01484 
01485   if (ShOp == ARM_AM::ror && imm == 0)
01486     ShOp = ARM_AM::rrx;
01487 
01488   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01489     return MCDisassembler::Fail;
01490   if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
01491     return MCDisassembler::Fail;
01492   unsigned shift;
01493   if (U)
01494     shift = ARM_AM::getAM2Opc(ARM_AM::add, imm, ShOp);
01495   else
01496     shift = ARM_AM::getAM2Opc(ARM_AM::sub, imm, ShOp);
01497   Inst.addOperand(MCOperand::CreateImm(shift));
01498 
01499   return S;
01500 }
01501 
01502 static DecodeStatus
01503 DecodeAddrMode3Instruction(MCInst &Inst, unsigned Insn,
01504                            uint64_t Address, const void *Decoder) {
01505   DecodeStatus S = MCDisassembler::Success;
01506 
01507   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
01508   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
01509   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
01510   unsigned type = fieldFromInstruction(Insn, 22, 1);
01511   unsigned imm = fieldFromInstruction(Insn, 8, 4);
01512   unsigned U = ((~fieldFromInstruction(Insn, 23, 1)) & 1) << 8;
01513   unsigned pred = fieldFromInstruction(Insn, 28, 4);
01514   unsigned W = fieldFromInstruction(Insn, 21, 1);
01515   unsigned P = fieldFromInstruction(Insn, 24, 1);
01516   unsigned Rt2 = Rt + 1;
01517 
01518   bool writeback = (W == 1) | (P == 0);
01519 
01520   // For {LD,ST}RD, Rt must be even, else undefined.
01521   switch (Inst.getOpcode()) {
01522     case ARM::STRD:
01523     case ARM::STRD_PRE:
01524     case ARM::STRD_POST:
01525     case ARM::LDRD:
01526     case ARM::LDRD_PRE:
01527     case ARM::LDRD_POST:
01528       if (Rt & 0x1) S = MCDisassembler::SoftFail;
01529       break;
01530     default:
01531       break;
01532   }
01533   switch (Inst.getOpcode()) {
01534     case ARM::STRD:
01535     case ARM::STRD_PRE:
01536     case ARM::STRD_POST:
01537       if (P == 0 && W == 1)
01538         S = MCDisassembler::SoftFail;
01539       
01540       if (writeback && (Rn == 15 || Rn == Rt || Rn == Rt2))
01541         S = MCDisassembler::SoftFail;
01542       if (type && Rm == 15)
01543         S = MCDisassembler::SoftFail;
01544       if (Rt2 == 15)
01545         S = MCDisassembler::SoftFail;
01546       if (!type && fieldFromInstruction(Insn, 8, 4))
01547         S = MCDisassembler::SoftFail;
01548       break;
01549     case ARM::STRH:
01550     case ARM::STRH_PRE:
01551     case ARM::STRH_POST:
01552       if (Rt == 15)
01553         S = MCDisassembler::SoftFail;
01554       if (writeback && (Rn == 15 || Rn == Rt))
01555         S = MCDisassembler::SoftFail;
01556       if (!type && Rm == 15)
01557         S = MCDisassembler::SoftFail;
01558       break;
01559     case ARM::LDRD:
01560     case ARM::LDRD_PRE:
01561     case ARM::LDRD_POST:
01562       if (type && Rn == 15){
01563         if (Rt2 == 15)
01564           S = MCDisassembler::SoftFail;
01565         break;
01566       }
01567       if (P == 0 && W == 1)
01568         S = MCDisassembler::SoftFail;
01569       if (!type && (Rt2 == 15 || Rm == 15 || Rm == Rt || Rm == Rt2))
01570         S = MCDisassembler::SoftFail;
01571       if (!type && writeback && Rn == 15)
01572         S = MCDisassembler::SoftFail;
01573       if (writeback && (Rn == Rt || Rn == Rt2))
01574         S = MCDisassembler::SoftFail;
01575       break;
01576     case ARM::LDRH:
01577     case ARM::LDRH_PRE:
01578     case ARM::LDRH_POST:
01579       if (type && Rn == 15){
01580         if (Rt == 15)
01581           S = MCDisassembler::SoftFail;
01582         break;
01583       }
01584       if (Rt == 15)
01585         S = MCDisassembler::SoftFail;
01586       if (!type && Rm == 15)
01587         S = MCDisassembler::SoftFail;
01588       if (!type && writeback && (Rn == 15 || Rn == Rt))
01589         S = MCDisassembler::SoftFail;
01590       break;
01591     case ARM::LDRSH:
01592     case ARM::LDRSH_PRE:
01593     case ARM::LDRSH_POST:
01594     case ARM::LDRSB:
01595     case ARM::LDRSB_PRE:
01596     case ARM::LDRSB_POST:
01597       if (type && Rn == 15){
01598         if (Rt == 15)
01599           S = MCDisassembler::SoftFail;
01600         break;
01601       }
01602       if (type && (Rt == 15 || (writeback && Rn == Rt)))
01603         S = MCDisassembler::SoftFail;
01604       if (!type && (Rt == 15 || Rm == 15))
01605         S = MCDisassembler::SoftFail;
01606       if (!type && writeback && (Rn == 15 || Rn == Rt))
01607         S = MCDisassembler::SoftFail;
01608       break;
01609     default:
01610       break;
01611   }
01612 
01613   if (writeback) { // Writeback
01614     if (P)
01615       U |= ARMII::IndexModePre << 9;
01616     else
01617       U |= ARMII::IndexModePost << 9;
01618 
01619     // On stores, the writeback operand precedes Rt.
01620     switch (Inst.getOpcode()) {
01621     case ARM::STRD:
01622     case ARM::STRD_PRE:
01623     case ARM::STRD_POST:
01624     case ARM::STRH:
01625     case ARM::STRH_PRE:
01626     case ARM::STRH_POST:
01627       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01628         return MCDisassembler::Fail;
01629       break;
01630     default:
01631       break;
01632     }
01633   }
01634 
01635   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
01636     return MCDisassembler::Fail;
01637   switch (Inst.getOpcode()) {
01638     case ARM::STRD:
01639     case ARM::STRD_PRE:
01640     case ARM::STRD_POST:
01641     case ARM::LDRD:
01642     case ARM::LDRD_PRE:
01643     case ARM::LDRD_POST:
01644       if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
01645         return MCDisassembler::Fail;
01646       break;
01647     default:
01648       break;
01649   }
01650 
01651   if (writeback) {
01652     // On loads, the writeback operand comes after Rt.
01653     switch (Inst.getOpcode()) {
01654     case ARM::LDRD:
01655     case ARM::LDRD_PRE:
01656     case ARM::LDRD_POST:
01657     case ARM::LDRH:
01658     case ARM::LDRH_PRE:
01659     case ARM::LDRH_POST:
01660     case ARM::LDRSH:
01661     case ARM::LDRSH_PRE:
01662     case ARM::LDRSH_POST:
01663     case ARM::LDRSB:
01664     case ARM::LDRSB_PRE:
01665     case ARM::LDRSB_POST:
01666     case ARM::LDRHTr:
01667     case ARM::LDRSBTr:
01668       if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01669         return MCDisassembler::Fail;
01670       break;
01671     default:
01672       break;
01673     }
01674   }
01675 
01676   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01677     return MCDisassembler::Fail;
01678 
01679   if (type) {
01680     Inst.addOperand(MCOperand::CreateReg(0));
01681     Inst.addOperand(MCOperand::CreateImm(U | (imm << 4) | Rm));
01682   } else {
01683     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
01684     return MCDisassembler::Fail;
01685     Inst.addOperand(MCOperand::CreateImm(U));
01686   }
01687 
01688   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
01689     return MCDisassembler::Fail;
01690 
01691   return S;
01692 }
01693 
01694 static DecodeStatus DecodeRFEInstruction(MCInst &Inst, unsigned Insn,
01695                                  uint64_t Address, const void *Decoder) {
01696   DecodeStatus S = MCDisassembler::Success;
01697 
01698   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
01699   unsigned mode = fieldFromInstruction(Insn, 23, 2);
01700 
01701   switch (mode) {
01702     case 0:
01703       mode = ARM_AM::da;
01704       break;
01705     case 1:
01706       mode = ARM_AM::ia;
01707       break;
01708     case 2:
01709       mode = ARM_AM::db;
01710       break;
01711     case 3:
01712       mode = ARM_AM::ib;
01713       break;
01714   }
01715 
01716   Inst.addOperand(MCOperand::CreateImm(mode));
01717   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01718     return MCDisassembler::Fail;
01719 
01720   return S;
01721 }
01722 
01723 static DecodeStatus DecodeMemMultipleWritebackInstruction(MCInst &Inst,
01724                                   unsigned Insn,
01725                                   uint64_t Address, const void *Decoder) {
01726   DecodeStatus S = MCDisassembler::Success;
01727 
01728   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
01729   unsigned pred = fieldFromInstruction(Insn, 28, 4);
01730   unsigned reglist = fieldFromInstruction(Insn, 0, 16);
01731 
01732   if (pred == 0xF) {
01733     switch (Inst.getOpcode()) {
01734       case ARM::LDMDA:
01735         Inst.setOpcode(ARM::RFEDA);
01736         break;
01737       case ARM::LDMDA_UPD:
01738         Inst.setOpcode(ARM::RFEDA_UPD);
01739         break;
01740       case ARM::LDMDB:
01741         Inst.setOpcode(ARM::RFEDB);
01742         break;
01743       case ARM::LDMDB_UPD:
01744         Inst.setOpcode(ARM::RFEDB_UPD);
01745         break;
01746       case ARM::LDMIA:
01747         Inst.setOpcode(ARM::RFEIA);
01748         break;
01749       case ARM::LDMIA_UPD:
01750         Inst.setOpcode(ARM::RFEIA_UPD);
01751         break;
01752       case ARM::LDMIB:
01753         Inst.setOpcode(ARM::RFEIB);
01754         break;
01755       case ARM::LDMIB_UPD:
01756         Inst.setOpcode(ARM::RFEIB_UPD);
01757         break;
01758       case ARM::STMDA:
01759         Inst.setOpcode(ARM::SRSDA);
01760         break;
01761       case ARM::STMDA_UPD:
01762         Inst.setOpcode(ARM::SRSDA_UPD);
01763         break;
01764       case ARM::STMDB:
01765         Inst.setOpcode(ARM::SRSDB);
01766         break;
01767       case ARM::STMDB_UPD:
01768         Inst.setOpcode(ARM::SRSDB_UPD);
01769         break;
01770       case ARM::STMIA:
01771         Inst.setOpcode(ARM::SRSIA);
01772         break;
01773       case ARM::STMIA_UPD:
01774         Inst.setOpcode(ARM::SRSIA_UPD);
01775         break;
01776       case ARM::STMIB:
01777         Inst.setOpcode(ARM::SRSIB);
01778         break;
01779       case ARM::STMIB_UPD:
01780         Inst.setOpcode(ARM::SRSIB_UPD);
01781         break;
01782       default:
01783         if (!Check(S, MCDisassembler::Fail)) return MCDisassembler::Fail;
01784     }
01785 
01786     // For stores (which become SRS's, the only operand is the mode.
01787     if (fieldFromInstruction(Insn, 20, 1) == 0) {
01788       Inst.addOperand(
01789           MCOperand::CreateImm(fieldFromInstruction(Insn, 0, 4)));
01790       return S;
01791     }
01792 
01793     return DecodeRFEInstruction(Inst, Insn, Address, Decoder);
01794   }
01795 
01796   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01797     return MCDisassembler::Fail;
01798   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01799     return MCDisassembler::Fail; // Tied
01800   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
01801     return MCDisassembler::Fail;
01802   if (!Check(S, DecodeRegListOperand(Inst, reglist, Address, Decoder)))
01803     return MCDisassembler::Fail;
01804 
01805   return S;
01806 }
01807 
01808 static DecodeStatus DecodeCPSInstruction(MCInst &Inst, unsigned Insn,
01809                                  uint64_t Address, const void *Decoder) {
01810   unsigned imod = fieldFromInstruction(Insn, 18, 2);
01811   unsigned M = fieldFromInstruction(Insn, 17, 1);
01812   unsigned iflags = fieldFromInstruction(Insn, 6, 3);
01813   unsigned mode = fieldFromInstruction(Insn, 0, 5);
01814 
01815   DecodeStatus S = MCDisassembler::Success;
01816 
01817   // imod == '01' --> UNPREDICTABLE
01818   // NOTE: Even though this is technically UNPREDICTABLE, we choose to
01819   // return failure here.  The '01' imod value is unprintable, so there's
01820   // nothing useful we could do even if we returned UNPREDICTABLE.
01821 
01822   if (imod == 1) return MCDisassembler::Fail;
01823 
01824   if (imod && M) {
01825     Inst.setOpcode(ARM::CPS3p);
01826     Inst.addOperand(MCOperand::CreateImm(imod));
01827     Inst.addOperand(MCOperand::CreateImm(iflags));
01828     Inst.addOperand(MCOperand::CreateImm(mode));
01829   } else if (imod && !M) {
01830     Inst.setOpcode(ARM::CPS2p);
01831     Inst.addOperand(MCOperand::CreateImm(imod));
01832     Inst.addOperand(MCOperand::CreateImm(iflags));
01833     if (mode) S = MCDisassembler::SoftFail;
01834   } else if (!imod && M) {
01835     Inst.setOpcode(ARM::CPS1p);
01836     Inst.addOperand(MCOperand::CreateImm(mode));
01837     if (iflags) S = MCDisassembler::SoftFail;
01838   } else {
01839     // imod == '00' && M == '0' --> UNPREDICTABLE
01840     Inst.setOpcode(ARM::CPS1p);
01841     Inst.addOperand(MCOperand::CreateImm(mode));
01842     S = MCDisassembler::SoftFail;
01843   }
01844 
01845   return S;
01846 }
01847 
01848 static DecodeStatus DecodeT2CPSInstruction(MCInst &Inst, unsigned Insn,
01849                                  uint64_t Address, const void *Decoder) {
01850   unsigned imod = fieldFromInstruction(Insn, 9, 2);
01851   unsigned M = fieldFromInstruction(Insn, 8, 1);
01852   unsigned iflags = fieldFromInstruction(Insn, 5, 3);
01853   unsigned mode = fieldFromInstruction(Insn, 0, 5);
01854 
01855   DecodeStatus S = MCDisassembler::Success;
01856 
01857   // imod == '01' --> UNPREDICTABLE
01858   // NOTE: Even though this is technically UNPREDICTABLE, we choose to
01859   // return failure here.  The '01' imod value is unprintable, so there's
01860   // nothing useful we could do even if we returned UNPREDICTABLE.
01861 
01862   if (imod == 1) return MCDisassembler::Fail;
01863 
01864   if (imod && M) {
01865     Inst.setOpcode(ARM::t2CPS3p);
01866     Inst.addOperand(MCOperand::CreateImm(imod));
01867     Inst.addOperand(MCOperand::CreateImm(iflags));
01868     Inst.addOperand(MCOperand::CreateImm(mode));
01869   } else if (imod && !M) {
01870     Inst.setOpcode(ARM::t2CPS2p);
01871     Inst.addOperand(MCOperand::CreateImm(imod));
01872     Inst.addOperand(MCOperand::CreateImm(iflags));
01873     if (mode) S = MCDisassembler::SoftFail;
01874   } else if (!imod && M) {
01875     Inst.setOpcode(ARM::t2CPS1p);
01876     Inst.addOperand(MCOperand::CreateImm(mode));
01877     if (iflags) S = MCDisassembler::SoftFail;
01878   } else {
01879     // imod == '00' && M == '0' --> this is a HINT instruction
01880     int imm = fieldFromInstruction(Insn, 0, 8);
01881     // HINT are defined only for immediate in [0..4]
01882     if(imm > 4) return MCDisassembler::Fail;
01883     Inst.setOpcode(ARM::t2HINT);
01884     Inst.addOperand(MCOperand::CreateImm(imm));
01885   }
01886 
01887   return S;
01888 }
01889 
01890 static DecodeStatus DecodeT2MOVTWInstruction(MCInst &Inst, unsigned Insn,
01891                                  uint64_t Address, const void *Decoder) {
01892   DecodeStatus S = MCDisassembler::Success;
01893 
01894   unsigned Rd = fieldFromInstruction(Insn, 8, 4);
01895   unsigned imm = 0;
01896 
01897   imm |= (fieldFromInstruction(Insn, 0, 8) << 0);
01898   imm |= (fieldFromInstruction(Insn, 12, 3) << 8);
01899   imm |= (fieldFromInstruction(Insn, 16, 4) << 12);
01900   imm |= (fieldFromInstruction(Insn, 26, 1) << 11);
01901 
01902   if (Inst.getOpcode() == ARM::t2MOVTi16)
01903     if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
01904       return MCDisassembler::Fail;
01905   if (!Check(S, DecoderGPRRegisterClass(Inst, Rd, Address, Decoder)))
01906     return MCDisassembler::Fail;
01907 
01908   if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
01909     Inst.addOperand(MCOperand::CreateImm(imm));
01910 
01911   return S;
01912 }
01913 
01914 static DecodeStatus DecodeArmMOVTWInstruction(MCInst &Inst, unsigned Insn,
01915                                  uint64_t Address, const void *Decoder) {
01916   DecodeStatus S = MCDisassembler::Success;
01917 
01918   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
01919   unsigned pred = fieldFromInstruction(Insn, 28, 4);
01920   unsigned imm = 0;
01921 
01922   imm |= (fieldFromInstruction(Insn, 0, 12) << 0);
01923   imm |= (fieldFromInstruction(Insn, 16, 4) << 12);
01924 
01925   if (Inst.getOpcode() == ARM::MOVTi16)
01926     if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
01927       return MCDisassembler::Fail;
01928 
01929   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
01930     return MCDisassembler::Fail;
01931 
01932   if (!tryAddingSymbolicOperand(Address, imm, false, 4, Inst, Decoder))
01933     Inst.addOperand(MCOperand::CreateImm(imm));
01934 
01935   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
01936     return MCDisassembler::Fail;
01937 
01938   return S;
01939 }
01940 
01941 static DecodeStatus DecodeSMLAInstruction(MCInst &Inst, unsigned Insn,
01942                                  uint64_t Address, const void *Decoder) {
01943   DecodeStatus S = MCDisassembler::Success;
01944 
01945   unsigned Rd = fieldFromInstruction(Insn, 16, 4);
01946   unsigned Rn = fieldFromInstruction(Insn, 0, 4);
01947   unsigned Rm = fieldFromInstruction(Insn, 8, 4);
01948   unsigned Ra = fieldFromInstruction(Insn, 12, 4);
01949   unsigned pred = fieldFromInstruction(Insn, 28, 4);
01950 
01951   if (pred == 0xF)
01952     return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
01953 
01954   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
01955     return MCDisassembler::Fail;
01956   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
01957     return MCDisassembler::Fail;
01958   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
01959     return MCDisassembler::Fail;
01960   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Ra, Address, Decoder)))
01961     return MCDisassembler::Fail;
01962 
01963   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
01964     return MCDisassembler::Fail;
01965 
01966   return S;
01967 }
01968 
01969 static DecodeStatus DecodeAddrModeImm12Operand(MCInst &Inst, unsigned Val,
01970                            uint64_t Address, const void *Decoder) {
01971   DecodeStatus S = MCDisassembler::Success;
01972 
01973   unsigned add = fieldFromInstruction(Val, 12, 1);
01974   unsigned imm = fieldFromInstruction(Val, 0, 12);
01975   unsigned Rn = fieldFromInstruction(Val, 13, 4);
01976 
01977   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01978     return MCDisassembler::Fail;
01979 
01980   if (!add) imm *= -1;
01981   if (imm == 0 && !add) imm = INT32_MIN;
01982   Inst.addOperand(MCOperand::CreateImm(imm));
01983   if (Rn == 15)
01984     tryAddingPcLoadReferenceComment(Address, Address + imm + 8, Decoder);
01985 
01986   return S;
01987 }
01988 
01989 static DecodeStatus DecodeAddrMode5Operand(MCInst &Inst, unsigned Val,
01990                                    uint64_t Address, const void *Decoder) {
01991   DecodeStatus S = MCDisassembler::Success;
01992 
01993   unsigned Rn = fieldFromInstruction(Val, 9, 4);
01994   unsigned U = fieldFromInstruction(Val, 8, 1);
01995   unsigned imm = fieldFromInstruction(Val, 0, 8);
01996 
01997   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
01998     return MCDisassembler::Fail;
01999 
02000   if (U)
02001     Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::add, imm)));
02002   else
02003     Inst.addOperand(MCOperand::CreateImm(ARM_AM::getAM5Opc(ARM_AM::sub, imm)));
02004 
02005   return S;
02006 }
02007 
02008 static DecodeStatus DecodeAddrMode7Operand(MCInst &Inst, unsigned Val,
02009                                    uint64_t Address, const void *Decoder) {
02010   return DecodeGPRRegisterClass(Inst, Val, Address, Decoder);
02011 }
02012 
02013 static DecodeStatus
02014 DecodeT2BInstruction(MCInst &Inst, unsigned Insn,
02015                      uint64_t Address, const void *Decoder) {
02016   DecodeStatus Status = MCDisassembler::Success;
02017 
02018   // Note the J1 and J2 values are from the encoded instruction.  So here
02019   // change them to I1 and I2 values via as documented:
02020   // I1 = NOT(J1 EOR S);
02021   // I2 = NOT(J2 EOR S);
02022   // and build the imm32 with one trailing zero as documented:
02023   // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
02024   unsigned S = fieldFromInstruction(Insn, 26, 1);
02025   unsigned J1 = fieldFromInstruction(Insn, 13, 1);
02026   unsigned J2 = fieldFromInstruction(Insn, 11, 1);
02027   unsigned I1 = !(J1 ^ S);
02028   unsigned I2 = !(J2 ^ S);
02029   unsigned imm10 = fieldFromInstruction(Insn, 16, 10);
02030   unsigned imm11 = fieldFromInstruction(Insn, 0, 11);
02031   unsigned tmp = (S << 23) | (I1 << 22) | (I2 << 21) | (imm10 << 11) | imm11;
02032   int imm32 = SignExtend32<24>(tmp << 1);
02033   if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4,
02034                                 true, 4, Inst, Decoder))
02035     Inst.addOperand(MCOperand::CreateImm(imm32));
02036 
02037   return Status;
02038 }
02039 
02040 static DecodeStatus
02041 DecodeBranchImmInstruction(MCInst &Inst, unsigned Insn,
02042                            uint64_t Address, const void *Decoder) {
02043   DecodeStatus S = MCDisassembler::Success;
02044 
02045   unsigned pred = fieldFromInstruction(Insn, 28, 4);
02046   unsigned imm = fieldFromInstruction(Insn, 0, 24) << 2;
02047 
02048   if (pred == 0xF) {
02049     Inst.setOpcode(ARM::BLXi);
02050     imm |= fieldFromInstruction(Insn, 24, 1) << 1;
02051     if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<26>(imm) + 8,
02052                                   true, 4, Inst, Decoder))
02053     Inst.addOperand(MCOperand::CreateImm(SignExtend32<26>(imm)));
02054     return S;
02055   }
02056 
02057   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<26>(imm) + 8,
02058                                 true, 4, Inst, Decoder))
02059     Inst.addOperand(MCOperand::CreateImm(SignExtend32<26>(imm)));
02060   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
02061     return MCDisassembler::Fail;
02062 
02063   return S;
02064 }
02065 
02066 
02067 static DecodeStatus DecodeAddrMode6Operand(MCInst &Inst, unsigned Val,
02068                                    uint64_t Address, const void *Decoder) {
02069   DecodeStatus S = MCDisassembler::Success;
02070 
02071   unsigned Rm = fieldFromInstruction(Val, 0, 4);
02072   unsigned align = fieldFromInstruction(Val, 4, 2);
02073 
02074   if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
02075     return MCDisassembler::Fail;
02076   if (!align)
02077     Inst.addOperand(MCOperand::CreateImm(0));
02078   else
02079     Inst.addOperand(MCOperand::CreateImm(4 << align));
02080 
02081   return S;
02082 }
02083 
02084 static DecodeStatus DecodeVLDInstruction(MCInst &Inst, unsigned Insn,
02085                                    uint64_t Address, const void *Decoder) {
02086   DecodeStatus S = MCDisassembler::Success;
02087 
02088   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02089   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02090   unsigned wb = fieldFromInstruction(Insn, 16, 4);
02091   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
02092   Rn |= fieldFromInstruction(Insn, 4, 2) << 4;
02093   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02094 
02095   // First output register
02096   switch (Inst.getOpcode()) {
02097   case ARM::VLD1q16: case ARM::VLD1q32: case ARM::VLD1q64: case ARM::VLD1q8:
02098   case ARM::VLD1q16wb_fixed: case ARM::VLD1q16wb_register:
02099   case ARM::VLD1q32wb_fixed: case ARM::VLD1q32wb_register:
02100   case ARM::VLD1q64wb_fixed: case ARM::VLD1q64wb_register:
02101   case ARM::VLD1q8wb_fixed: case ARM::VLD1q8wb_register:
02102   case ARM::VLD2d16: case ARM::VLD2d32: case ARM::VLD2d8:
02103   case ARM::VLD2d16wb_fixed: case ARM::VLD2d16wb_register:
02104   case ARM::VLD2d32wb_fixed: case ARM::VLD2d32wb_register:
02105   case ARM::VLD2d8wb_fixed: case ARM::VLD2d8wb_register:
02106     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
02107       return MCDisassembler::Fail;
02108     break;
02109   case ARM::VLD2b16:
02110   case ARM::VLD2b32:
02111   case ARM::VLD2b8:
02112   case ARM::VLD2b16wb_fixed:
02113   case ARM::VLD2b16wb_register:
02114   case ARM::VLD2b32wb_fixed:
02115   case ARM::VLD2b32wb_register:
02116   case ARM::VLD2b8wb_fixed:
02117   case ARM::VLD2b8wb_register:
02118     if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
02119       return MCDisassembler::Fail;
02120     break;
02121   default:
02122     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02123       return MCDisassembler::Fail;
02124   }
02125 
02126   // Second output register
02127   switch (Inst.getOpcode()) {
02128     case ARM::VLD3d8:
02129     case ARM::VLD3d16:
02130     case ARM::VLD3d32:
02131     case ARM::VLD3d8_UPD:
02132     case ARM::VLD3d16_UPD:
02133     case ARM::VLD3d32_UPD:
02134     case ARM::VLD4d8:
02135     case ARM::VLD4d16:
02136     case ARM::VLD4d32:
02137     case ARM::VLD4d8_UPD:
02138     case ARM::VLD4d16_UPD:
02139     case ARM::VLD4d32_UPD:
02140       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
02141         return MCDisassembler::Fail;
02142       break;
02143     case ARM::VLD3q8:
02144     case ARM::VLD3q16:
02145     case ARM::VLD3q32:
02146     case ARM::VLD3q8_UPD:
02147     case ARM::VLD3q16_UPD:
02148     case ARM::VLD3q32_UPD:
02149     case ARM::VLD4q8:
02150     case ARM::VLD4q16:
02151     case ARM::VLD4q32:
02152     case ARM::VLD4q8_UPD:
02153     case ARM::VLD4q16_UPD:
02154     case ARM::VLD4q32_UPD:
02155       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
02156         return MCDisassembler::Fail;
02157     default:
02158       break;
02159   }
02160 
02161   // Third output register
02162   switch(Inst.getOpcode()) {
02163     case ARM::VLD3d8:
02164     case ARM::VLD3d16:
02165     case ARM::VLD3d32:
02166     case ARM::VLD3d8_UPD:
02167     case ARM::VLD3d16_UPD:
02168     case ARM::VLD3d32_UPD:
02169     case ARM::VLD4d8:
02170     case ARM::VLD4d16:
02171     case ARM::VLD4d32:
02172     case ARM::VLD4d8_UPD:
02173     case ARM::VLD4d16_UPD:
02174     case ARM::VLD4d32_UPD:
02175       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
02176         return MCDisassembler::Fail;
02177       break;
02178     case ARM::VLD3q8:
02179     case ARM::VLD3q16:
02180     case ARM::VLD3q32:
02181     case ARM::VLD3q8_UPD:
02182     case ARM::VLD3q16_UPD:
02183     case ARM::VLD3q32_UPD:
02184     case ARM::VLD4q8:
02185     case ARM::VLD4q16:
02186     case ARM::VLD4q32:
02187     case ARM::VLD4q8_UPD:
02188     case ARM::VLD4q16_UPD:
02189     case ARM::VLD4q32_UPD:
02190       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
02191         return MCDisassembler::Fail;
02192       break;
02193     default:
02194       break;
02195   }
02196 
02197   // Fourth output register
02198   switch (Inst.getOpcode()) {
02199     case ARM::VLD4d8:
02200     case ARM::VLD4d16:
02201     case ARM::VLD4d32:
02202     case ARM::VLD4d8_UPD:
02203     case ARM::VLD4d16_UPD:
02204     case ARM::VLD4d32_UPD:
02205       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
02206         return MCDisassembler::Fail;
02207       break;
02208     case ARM::VLD4q8:
02209     case ARM::VLD4q16:
02210     case ARM::VLD4q32:
02211     case ARM::VLD4q8_UPD:
02212     case ARM::VLD4q16_UPD:
02213     case ARM::VLD4q32_UPD:
02214       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
02215         return MCDisassembler::Fail;
02216       break;
02217     default:
02218       break;
02219   }
02220 
02221   // Writeback operand
02222   switch (Inst.getOpcode()) {
02223     case ARM::VLD1d8wb_fixed:
02224     case ARM::VLD1d16wb_fixed:
02225     case ARM::VLD1d32wb_fixed:
02226     case ARM::VLD1d64wb_fixed:
02227     case ARM::VLD1d8wb_register:
02228     case ARM::VLD1d16wb_register:
02229     case ARM::VLD1d32wb_register:
02230     case ARM::VLD1d64wb_register:
02231     case ARM::VLD1q8wb_fixed:
02232     case ARM::VLD1q16wb_fixed:
02233     case ARM::VLD1q32wb_fixed:
02234     case ARM::VLD1q64wb_fixed:
02235     case ARM::VLD1q8wb_register:
02236     case ARM::VLD1q16wb_register:
02237     case ARM::VLD1q32wb_register:
02238     case ARM::VLD1q64wb_register:
02239     case ARM::VLD1d8Twb_fixed:
02240     case ARM::VLD1d8Twb_register:
02241     case ARM::VLD1d16Twb_fixed:
02242     case ARM::VLD1d16Twb_register:
02243     case ARM::VLD1d32Twb_fixed:
02244     case ARM::VLD1d32Twb_register:
02245     case ARM::VLD1d64Twb_fixed:
02246     case ARM::VLD1d64Twb_register:
02247     case ARM::VLD1d8Qwb_fixed:
02248     case ARM::VLD1d8Qwb_register:
02249     case ARM::VLD1d16Qwb_fixed:
02250     case ARM::VLD1d16Qwb_register:
02251     case ARM::VLD1d32Qwb_fixed:
02252     case ARM::VLD1d32Qwb_register:
02253     case ARM::VLD1d64Qwb_fixed:
02254     case ARM::VLD1d64Qwb_register:
02255     case ARM::VLD2d8wb_fixed:
02256     case ARM::VLD2d16wb_fixed:
02257     case ARM::VLD2d32wb_fixed:
02258     case ARM::VLD2q8wb_fixed:
02259     case ARM::VLD2q16wb_fixed:
02260     case ARM::VLD2q32wb_fixed:
02261     case ARM::VLD2d8wb_register:
02262     case ARM::VLD2d16wb_register:
02263     case ARM::VLD2d32wb_register:
02264     case ARM::VLD2q8wb_register:
02265     case ARM::VLD2q16wb_register:
02266     case ARM::VLD2q32wb_register:
02267     case ARM::VLD2b8wb_fixed:
02268     case ARM::VLD2b16wb_fixed:
02269     case ARM::VLD2b32wb_fixed:
02270     case ARM::VLD2b8wb_register:
02271     case ARM::VLD2b16wb_register:
02272     case ARM::VLD2b32wb_register:
02273       Inst.addOperand(MCOperand::CreateImm(0));
02274       break;
02275     case ARM::VLD3d8_UPD:
02276     case ARM::VLD3d16_UPD:
02277     case ARM::VLD3d32_UPD:
02278     case ARM::VLD3q8_UPD:
02279     case ARM::VLD3q16_UPD:
02280     case ARM::VLD3q32_UPD:
02281     case ARM::VLD4d8_UPD:
02282     case ARM::VLD4d16_UPD:
02283     case ARM::VLD4d32_UPD:
02284     case ARM::VLD4q8_UPD:
02285     case ARM::VLD4q16_UPD:
02286     case ARM::VLD4q32_UPD:
02287       if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
02288         return MCDisassembler::Fail;
02289       break;
02290     default:
02291       break;
02292   }
02293 
02294   // AddrMode6 Base (register+alignment)
02295   if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
02296     return MCDisassembler::Fail;
02297 
02298   // AddrMode6 Offset (register)
02299   switch (Inst.getOpcode()) {
02300   default:
02301     // The below have been updated to have explicit am6offset split
02302     // between fixed and register offset. For those instructions not
02303     // yet updated, we need to add an additional reg0 operand for the
02304     // fixed variant.
02305     //
02306     // The fixed offset encodes as Rm == 0xd, so we check for that.
02307     if (Rm == 0xd) {
02308       Inst.addOperand(MCOperand::CreateReg(0));
02309       break;
02310     }
02311     // Fall through to handle the register offset variant.
02312   case ARM::VLD1d8wb_fixed:
02313   case ARM::VLD1d16wb_fixed:
02314   case ARM::VLD1d32wb_fixed:
02315   case ARM::VLD1d64wb_fixed:
02316   case ARM::VLD1d8Twb_fixed:
02317   case ARM::VLD1d16Twb_fixed:
02318   case ARM::VLD1d32Twb_fixed:
02319   case ARM::VLD1d64Twb_fixed:
02320   case ARM::VLD1d8Qwb_fixed:
02321   case ARM::VLD1d16Qwb_fixed:
02322   case ARM::VLD1d32Qwb_fixed:
02323   case ARM::VLD1d64Qwb_fixed:
02324   case ARM::VLD1d8wb_register:
02325   case ARM::VLD1d16wb_register:
02326   case ARM::VLD1d32wb_register:
02327   case ARM::VLD1d64wb_register:
02328   case ARM::VLD1q8wb_fixed:
02329   case ARM::VLD1q16wb_fixed:
02330   case ARM::VLD1q32wb_fixed:
02331   case ARM::VLD1q64wb_fixed:
02332   case ARM::VLD1q8wb_register:
02333   case ARM::VLD1q16wb_register:
02334   case ARM::VLD1q32wb_register:
02335   case ARM::VLD1q64wb_register:
02336     // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
02337     // variant encodes Rm == 0xf. Anything else is a register offset post-
02338     // increment and we need to add the register operand to the instruction.
02339     if (Rm != 0xD && Rm != 0xF &&
02340         !Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
02341       return MCDisassembler::Fail;
02342     break;
02343   case ARM::VLD2d8wb_fixed:
02344   case ARM::VLD2d16wb_fixed:
02345   case ARM::VLD2d32wb_fixed:
02346   case ARM::VLD2b8wb_fixed:
02347   case ARM::VLD2b16wb_fixed:
02348   case ARM::VLD2b32wb_fixed:
02349   case ARM::VLD2q8wb_fixed:
02350   case ARM::VLD2q16wb_fixed:
02351   case ARM::VLD2q32wb_fixed:
02352     break;
02353   }
02354 
02355   return S;
02356 }
02357 
02358 static DecodeStatus DecodeVST1Instruction(MCInst& Inst, unsigned Insn,
02359                                           uint64_t Addr, const void* Decoder) {
02360   unsigned type = fieldFromInstruction(Insn, 8, 4);
02361   unsigned align = fieldFromInstruction(Insn, 4, 2);
02362   if(type == 7 && (align & 2)) return MCDisassembler::Fail;
02363   if(type == 10 && align == 3) return MCDisassembler::Fail;
02364   if(type == 6 && (align & 2)) return MCDisassembler::Fail;
02365   
02366   return DecodeVSTInstruction(Inst, Insn, Addr, Decoder);
02367 }
02368 
02369 static DecodeStatus DecodeVST2Instruction(MCInst& Inst, unsigned Insn,
02370                                           uint64_t Addr, const void* Decoder) {
02371   unsigned size = fieldFromInstruction(Insn, 6, 2);
02372   if(size == 3) return MCDisassembler::Fail;
02373 
02374   unsigned type = fieldFromInstruction(Insn, 8, 4);
02375   unsigned align = fieldFromInstruction(Insn, 4, 2);
02376   if(type == 8 && align == 3) return MCDisassembler::Fail;
02377   if(type == 9 && align == 3) return MCDisassembler::Fail;
02378   
02379   return DecodeVSTInstruction(Inst, Insn, Addr, Decoder);
02380 }
02381 
02382 static DecodeStatus DecodeVST3Instruction(MCInst& Inst, unsigned Insn,
02383                                           uint64_t Addr, const void* Decoder) {
02384   unsigned size = fieldFromInstruction(Insn, 6, 2);
02385   if(size == 3) return MCDisassembler::Fail;
02386 
02387   unsigned align = fieldFromInstruction(Insn, 4, 2);
02388   if(align & 2) return MCDisassembler::Fail;
02389 
02390   return DecodeVSTInstruction(Inst, Insn, Addr, Decoder);
02391 }
02392 
02393 static DecodeStatus DecodeVST4Instruction(MCInst& Inst, unsigned Insn,
02394                                           uint64_t Addr, const void* Decoder) {
02395   unsigned size = fieldFromInstruction(Insn, 6, 2);
02396   if(size == 3) return MCDisassembler::Fail;
02397 
02398   return DecodeVSTInstruction(Inst, Insn, Addr, Decoder);
02399 }
02400 
02401 static DecodeStatus DecodeVSTInstruction(MCInst &Inst, unsigned Insn,
02402                                  uint64_t Address, const void *Decoder) {
02403   DecodeStatus S = MCDisassembler::Success;
02404 
02405   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02406   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02407   unsigned wb = fieldFromInstruction(Insn, 16, 4);
02408   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
02409   Rn |= fieldFromInstruction(Insn, 4, 2) << 4;
02410   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02411 
02412   // Writeback Operand
02413   switch (Inst.getOpcode()) {
02414     case ARM::VST1d8wb_fixed:
02415     case ARM::VST1d16wb_fixed:
02416     case ARM::VST1d32wb_fixed:
02417     case ARM::VST1d64wb_fixed:
02418     case ARM::VST1d8wb_register:
02419     case ARM::VST1d16wb_register:
02420     case ARM::VST1d32wb_register:
02421     case ARM::VST1d64wb_register:
02422     case ARM::VST1q8wb_fixed:
02423     case ARM::VST1q16wb_fixed:
02424     case ARM::VST1q32wb_fixed:
02425     case ARM::VST1q64wb_fixed:
02426     case ARM::VST1q8wb_register:
02427     case ARM::VST1q16wb_register:
02428     case ARM::VST1q32wb_register:
02429     case ARM::VST1q64wb_register:
02430     case ARM::VST1d8Twb_fixed:
02431     case ARM::VST1d16Twb_fixed:
02432     case ARM::VST1d32Twb_fixed:
02433     case ARM::VST1d64Twb_fixed:
02434     case ARM::VST1d8Twb_register:
02435     case ARM::VST1d16Twb_register:
02436     case ARM::VST1d32Twb_register:
02437     case ARM::VST1d64Twb_register:
02438     case ARM::VST1d8Qwb_fixed:
02439     case ARM::VST1d16Qwb_fixed:
02440     case ARM::VST1d32Qwb_fixed:
02441     case ARM::VST1d64Qwb_fixed:
02442     case ARM::VST1d8Qwb_register:
02443     case ARM::VST1d16Qwb_register:
02444     case ARM::VST1d32Qwb_register:
02445     case ARM::VST1d64Qwb_register:
02446     case ARM::VST2d8wb_fixed:
02447     case ARM::VST2d16wb_fixed:
02448     case ARM::VST2d32wb_fixed:
02449     case ARM::VST2d8wb_register:
02450     case ARM::VST2d16wb_register:
02451     case ARM::VST2d32wb_register:
02452     case ARM::VST2q8wb_fixed:
02453     case ARM::VST2q16wb_fixed:
02454     case ARM::VST2q32wb_fixed:
02455     case ARM::VST2q8wb_register:
02456     case ARM::VST2q16wb_register:
02457     case ARM::VST2q32wb_register:
02458     case ARM::VST2b8wb_fixed:
02459     case ARM::VST2b16wb_fixed:
02460     case ARM::VST2b32wb_fixed:
02461     case ARM::VST2b8wb_register:
02462     case ARM::VST2b16wb_register:
02463     case ARM::VST2b32wb_register:
02464       if (Rm == 0xF)
02465         return MCDisassembler::Fail;
02466       Inst.addOperand(MCOperand::CreateImm(0));
02467       break;
02468     case ARM::VST3d8_UPD:
02469     case ARM::VST3d16_UPD:
02470     case ARM::VST3d32_UPD:
02471     case ARM::VST3q8_UPD:
02472     case ARM::VST3q16_UPD:
02473     case ARM::VST3q32_UPD:
02474     case ARM::VST4d8_UPD:
02475     case ARM::VST4d16_UPD:
02476     case ARM::VST4d32_UPD:
02477     case ARM::VST4q8_UPD:
02478     case ARM::VST4q16_UPD:
02479     case ARM::VST4q32_UPD:
02480       if (!Check(S, DecodeGPRRegisterClass(Inst, wb, Address, Decoder)))
02481         return MCDisassembler::Fail;
02482       break;
02483     default:
02484       break;
02485   }
02486 
02487   // AddrMode6 Base (register+alignment)
02488   if (!Check(S, DecodeAddrMode6Operand(Inst, Rn, Address, Decoder)))
02489     return MCDisassembler::Fail;
02490 
02491   // AddrMode6 Offset (register)
02492   switch (Inst.getOpcode()) {
02493     default:
02494       if (Rm == 0xD)
02495         Inst.addOperand(MCOperand::CreateReg(0));
02496       else if (Rm != 0xF) {
02497         if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
02498           return MCDisassembler::Fail;
02499       }
02500       break;
02501     case ARM::VST1d8wb_fixed:
02502     case ARM::VST1d16wb_fixed:
02503     case ARM::VST1d32wb_fixed:
02504     case ARM::VST1d64wb_fixed:
02505     case ARM::VST1q8wb_fixed:
02506     case ARM::VST1q16wb_fixed:
02507     case ARM::VST1q32wb_fixed:
02508     case ARM::VST1q64wb_fixed:
02509     case ARM::VST1d8Twb_fixed:
02510     case ARM::VST1d16Twb_fixed:
02511     case ARM::VST1d32Twb_fixed:
02512     case ARM::VST1d64Twb_fixed:
02513     case ARM::VST1d8Qwb_fixed:
02514     case ARM::VST1d16Qwb_fixed:
02515     case ARM::VST1d32Qwb_fixed:
02516     case ARM::VST1d64Qwb_fixed:
02517     case ARM::VST2d8wb_fixed:
02518     case ARM::VST2d16wb_fixed:
02519     case ARM::VST2d32wb_fixed:
02520     case ARM::VST2q8wb_fixed:
02521     case ARM::VST2q16wb_fixed:
02522     case ARM::VST2q32wb_fixed:
02523     case ARM::VST2b8wb_fixed:
02524     case ARM::VST2b16wb_fixed:
02525     case ARM::VST2b32wb_fixed:
02526       break;
02527   }
02528 
02529 
02530   // First input register
02531   switch (Inst.getOpcode()) {
02532   case ARM::VST1q16:
02533   case ARM::VST1q32:
02534   case ARM::VST1q64:
02535   case ARM::VST1q8:
02536   case ARM::VST1q16wb_fixed:
02537   case ARM::VST1q16wb_register:
02538   case ARM::VST1q32wb_fixed:
02539   case ARM::VST1q32wb_register:
02540   case ARM::VST1q64wb_fixed:
02541   case ARM::VST1q64wb_register:
02542   case ARM::VST1q8wb_fixed:
02543   case ARM::VST1q8wb_register:
02544   case ARM::VST2d16:
02545   case ARM::VST2d32:
02546   case ARM::VST2d8:
02547   case ARM::VST2d16wb_fixed:
02548   case ARM::VST2d16wb_register:
02549   case ARM::VST2d32wb_fixed:
02550   case ARM::VST2d32wb_register:
02551   case ARM::VST2d8wb_fixed:
02552   case ARM::VST2d8wb_register:
02553     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
02554       return MCDisassembler::Fail;
02555     break;
02556   case ARM::VST2b16:
02557   case ARM::VST2b32:
02558   case ARM::VST2b8:
02559   case ARM::VST2b16wb_fixed:
02560   case ARM::VST2b16wb_register:
02561   case ARM::VST2b32wb_fixed:
02562   case ARM::VST2b32wb_register:
02563   case ARM::VST2b8wb_fixed:
02564   case ARM::VST2b8wb_register:
02565     if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
02566       return MCDisassembler::Fail;
02567     break;
02568   default:
02569     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02570       return MCDisassembler::Fail;
02571   }
02572 
02573   // Second input register
02574   switch (Inst.getOpcode()) {
02575     case ARM::VST3d8:
02576     case ARM::VST3d16:
02577     case ARM::VST3d32:
02578     case ARM::VST3d8_UPD:
02579     case ARM::VST3d16_UPD:
02580     case ARM::VST3d32_UPD:
02581     case ARM::VST4d8:
02582     case ARM::VST4d16:
02583     case ARM::VST4d32:
02584     case ARM::VST4d8_UPD:
02585     case ARM::VST4d16_UPD:
02586     case ARM::VST4d32_UPD:
02587       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
02588         return MCDisassembler::Fail;
02589       break;
02590     case ARM::VST3q8:
02591     case ARM::VST3q16:
02592     case ARM::VST3q32:
02593     case ARM::VST3q8_UPD:
02594     case ARM::VST3q16_UPD:
02595     case ARM::VST3q32_UPD:
02596     case ARM::VST4q8:
02597     case ARM::VST4q16:
02598     case ARM::VST4q32:
02599     case ARM::VST4q8_UPD:
02600     case ARM::VST4q16_UPD:
02601     case ARM::VST4q32_UPD:
02602       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
02603         return MCDisassembler::Fail;
02604       break;
02605     default:
02606       break;
02607   }
02608 
02609   // Third input register
02610   switch (Inst.getOpcode()) {
02611     case ARM::VST3d8:
02612     case ARM::VST3d16:
02613     case ARM::VST3d32:
02614     case ARM::VST3d8_UPD:
02615     case ARM::VST3d16_UPD:
02616     case ARM::VST3d32_UPD:
02617     case ARM::VST4d8:
02618     case ARM::VST4d16:
02619     case ARM::VST4d32:
02620     case ARM::VST4d8_UPD:
02621     case ARM::VST4d16_UPD:
02622     case ARM::VST4d32_UPD:
02623       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2)%32, Address, Decoder)))
02624         return MCDisassembler::Fail;
02625       break;
02626     case ARM::VST3q8:
02627     case ARM::VST3q16:
02628     case ARM::VST3q32:
02629     case ARM::VST3q8_UPD:
02630     case ARM::VST3q16_UPD:
02631     case ARM::VST3q32_UPD:
02632     case ARM::VST4q8:
02633     case ARM::VST4q16:
02634     case ARM::VST4q32:
02635     case ARM::VST4q8_UPD:
02636     case ARM::VST4q16_UPD:
02637     case ARM::VST4q32_UPD:
02638       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+4)%32, Address, Decoder)))
02639         return MCDisassembler::Fail;
02640       break;
02641     default:
02642       break;
02643   }
02644 
02645   // Fourth input register
02646   switch (Inst.getOpcode()) {
02647     case ARM::VST4d8:
02648     case ARM::VST4d16:
02649     case ARM::VST4d32:
02650     case ARM::VST4d8_UPD:
02651     case ARM::VST4d16_UPD:
02652     case ARM::VST4d32_UPD:
02653       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3)%32, Address, Decoder)))
02654         return MCDisassembler::Fail;
02655       break;
02656     case ARM::VST4q8:
02657     case ARM::VST4q16:
02658     case ARM::VST4q32:
02659     case ARM::VST4q8_UPD:
02660     case ARM::VST4q16_UPD:
02661     case ARM::VST4q32_UPD:
02662       if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+6)%32, Address, Decoder)))
02663         return MCDisassembler::Fail;
02664       break;
02665     default:
02666       break;
02667   }
02668 
02669   return S;
02670 }
02671 
02672 static DecodeStatus DecodeVLD1DupInstruction(MCInst &Inst, unsigned Insn,
02673                                     uint64_t Address, const void *Decoder) {
02674   DecodeStatus S = MCDisassembler::Success;
02675 
02676   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02677   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02678   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
02679   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02680   unsigned align = fieldFromInstruction(Insn, 4, 1);
02681   unsigned size = fieldFromInstruction(Insn, 6, 2);
02682 
02683   if (size == 0 && align == 1)
02684     return MCDisassembler::Fail;
02685   align *= (1 << size);
02686 
02687   switch (Inst.getOpcode()) {
02688   case ARM::VLD1DUPq16: case ARM::VLD1DUPq32: case ARM::VLD1DUPq8:
02689   case ARM::VLD1DUPq16wb_fixed: case ARM::VLD1DUPq16wb_register:
02690   case ARM::VLD1DUPq32wb_fixed: case ARM::VLD1DUPq32wb_register:
02691   case ARM::VLD1DUPq8wb_fixed: case ARM::VLD1DUPq8wb_register:
02692     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
02693       return MCDisassembler::Fail;
02694     break;
02695   default:
02696     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02697       return MCDisassembler::Fail;
02698     break;
02699   }
02700   if (Rm != 0xF) {
02701     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
02702       return MCDisassembler::Fail;
02703   }
02704 
02705   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
02706     return MCDisassembler::Fail;
02707   Inst.addOperand(MCOperand::CreateImm(align));
02708 
02709   // The fixed offset post-increment encodes Rm == 0xd. The no-writeback
02710   // variant encodes Rm == 0xf. Anything else is a register offset post-
02711   // increment and we need to add the register operand to the instruction.
02712   if (Rm != 0xD && Rm != 0xF &&
02713       !Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
02714     return MCDisassembler::Fail;
02715 
02716   return S;
02717 }
02718 
02719 static DecodeStatus DecodeVLD2DupInstruction(MCInst &Inst, unsigned Insn,
02720                                     uint64_t Address, const void *Decoder) {
02721   DecodeStatus S = MCDisassembler::Success;
02722 
02723   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02724   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02725   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
02726   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02727   unsigned align = fieldFromInstruction(Insn, 4, 1);
02728   unsigned size = 1 << fieldFromInstruction(Insn, 6, 2);
02729   align *= 2*size;
02730 
02731   switch (Inst.getOpcode()) {
02732   case ARM::VLD2DUPd16: case ARM::VLD2DUPd32: case ARM::VLD2DUPd8:
02733   case ARM::VLD2DUPd16wb_fixed: case ARM::VLD2DUPd16wb_register:
02734   case ARM::VLD2DUPd32wb_fixed: case ARM::VLD2DUPd32wb_register:
02735   case ARM::VLD2DUPd8wb_fixed: case ARM::VLD2DUPd8wb_register:
02736     if (!Check(S, DecodeDPairRegisterClass(Inst, Rd, Address, Decoder)))
02737       return MCDisassembler::Fail;
02738     break;
02739   case ARM::VLD2DUPd16x2: case ARM::VLD2DUPd32x2: case ARM::VLD2DUPd8x2:
02740   case ARM::VLD2DUPd16x2wb_fixed: case ARM::VLD2DUPd16x2wb_register:
02741   case ARM::VLD2DUPd32x2wb_fixed: case ARM::VLD2DUPd32x2wb_register:
02742   case ARM::VLD2DUPd8x2wb_fixed: case ARM::VLD2DUPd8x2wb_register:
02743     if (!Check(S, DecodeDPairSpacedRegisterClass(Inst, Rd, Address, Decoder)))
02744       return MCDisassembler::Fail;
02745     break;
02746   default:
02747     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02748       return MCDisassembler::Fail;
02749     break;
02750   }
02751 
02752   if (Rm != 0xF)
02753     Inst.addOperand(MCOperand::CreateImm(0));
02754 
02755   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
02756     return MCDisassembler::Fail;
02757   Inst.addOperand(MCOperand::CreateImm(align));
02758 
02759   if (Rm != 0xD && Rm != 0xF) {
02760     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
02761       return MCDisassembler::Fail;
02762   }
02763 
02764   return S;
02765 }
02766 
02767 static DecodeStatus DecodeVLD3DupInstruction(MCInst &Inst, unsigned Insn,
02768                                     uint64_t Address, const void *Decoder) {
02769   DecodeStatus S = MCDisassembler::Success;
02770 
02771   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02772   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02773   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
02774   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02775   unsigned inc = fieldFromInstruction(Insn, 5, 1) + 1;
02776 
02777   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02778     return MCDisassembler::Fail;
02779   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
02780     return MCDisassembler::Fail;
02781   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
02782     return MCDisassembler::Fail;
02783   if (Rm != 0xF) {
02784     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
02785       return MCDisassembler::Fail;
02786   }
02787 
02788   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
02789     return MCDisassembler::Fail;
02790   Inst.addOperand(MCOperand::CreateImm(0));
02791 
02792   if (Rm == 0xD)
02793     Inst.addOperand(MCOperand::CreateReg(0));
02794   else if (Rm != 0xF) {
02795     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
02796       return MCDisassembler::Fail;
02797   }
02798 
02799   return S;
02800 }
02801 
02802 static DecodeStatus DecodeVLD4DupInstruction(MCInst &Inst, unsigned Insn,
02803                                     uint64_t Address, const void *Decoder) {
02804   DecodeStatus S = MCDisassembler::Success;
02805 
02806   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02807   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02808   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
02809   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02810   unsigned size = fieldFromInstruction(Insn, 6, 2);
02811   unsigned inc = fieldFromInstruction(Insn, 5, 1) + 1;
02812   unsigned align = fieldFromInstruction(Insn, 4, 1);
02813 
02814   if (size == 0x3) {
02815     if (align == 0)
02816       return MCDisassembler::Fail;
02817     size = 4;
02818     align = 16;
02819   } else {
02820     if (size == 2) {
02821       size = 1 << size;
02822       align *= 8;
02823     } else {
02824       size = 1 << size;
02825       align *= 4*size;
02826     }
02827   }
02828 
02829   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02830     return MCDisassembler::Fail;
02831   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+inc)%32, Address, Decoder)))
02832     return MCDisassembler::Fail;
02833   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+2*inc)%32, Address, Decoder)))
02834     return MCDisassembler::Fail;
02835   if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+3*inc)%32, Address, Decoder)))
02836     return MCDisassembler::Fail;
02837   if (Rm != 0xF) {
02838     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
02839       return MCDisassembler::Fail;
02840   }
02841 
02842   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
02843     return MCDisassembler::Fail;
02844   Inst.addOperand(MCOperand::CreateImm(align));
02845 
02846   if (Rm == 0xD)
02847     Inst.addOperand(MCOperand::CreateReg(0));
02848   else if (Rm != 0xF) {
02849     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
02850       return MCDisassembler::Fail;
02851   }
02852 
02853   return S;
02854 }
02855 
02856 static DecodeStatus
02857 DecodeNEONModImmInstruction(MCInst &Inst, unsigned Insn,
02858                             uint64_t Address, const void *Decoder) {
02859   DecodeStatus S = MCDisassembler::Success;
02860 
02861   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02862   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02863   unsigned imm = fieldFromInstruction(Insn, 0, 4);
02864   imm |= fieldFromInstruction(Insn, 16, 3) << 4;
02865   imm |= fieldFromInstruction(Insn, 24, 1) << 7;
02866   imm |= fieldFromInstruction(Insn, 8, 4) << 8;
02867   imm |= fieldFromInstruction(Insn, 5, 1) << 12;
02868   unsigned Q = fieldFromInstruction(Insn, 6, 1);
02869 
02870   if (Q) {
02871     if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
02872     return MCDisassembler::Fail;
02873   } else {
02874     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02875     return MCDisassembler::Fail;
02876   }
02877 
02878   Inst.addOperand(MCOperand::CreateImm(imm));
02879 
02880   switch (Inst.getOpcode()) {
02881     case ARM::VORRiv4i16:
02882     case ARM::VORRiv2i32:
02883     case ARM::VBICiv4i16:
02884     case ARM::VBICiv2i32:
02885       if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02886         return MCDisassembler::Fail;
02887       break;
02888     case ARM::VORRiv8i16:
02889     case ARM::VORRiv4i32:
02890     case ARM::VBICiv8i16:
02891     case ARM::VBICiv4i32:
02892       if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
02893         return MCDisassembler::Fail;
02894       break;
02895     default:
02896       break;
02897   }
02898 
02899   return S;
02900 }
02901 
02902 static DecodeStatus DecodeVSHLMaxInstruction(MCInst &Inst, unsigned Insn,
02903                                         uint64_t Address, const void *Decoder) {
02904   DecodeStatus S = MCDisassembler::Success;
02905 
02906   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02907   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02908   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02909   Rm |= fieldFromInstruction(Insn, 5, 1) << 4;
02910   unsigned size = fieldFromInstruction(Insn, 18, 2);
02911 
02912   if (!Check(S, DecodeQPRRegisterClass(Inst, Rd, Address, Decoder)))
02913     return MCDisassembler::Fail;
02914   if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
02915     return MCDisassembler::Fail;
02916   Inst.addOperand(MCOperand::CreateImm(8 << size));
02917 
02918   return S;
02919 }
02920 
02921 static DecodeStatus DecodeShiftRight8Imm(MCInst &Inst, unsigned Val,
02922                                uint64_t Address, const void *Decoder) {
02923   Inst.addOperand(MCOperand::CreateImm(8 - Val));
02924   return MCDisassembler::Success;
02925 }
02926 
02927 static DecodeStatus DecodeShiftRight16Imm(MCInst &Inst, unsigned Val,
02928                                uint64_t Address, const void *Decoder) {
02929   Inst.addOperand(MCOperand::CreateImm(16 - Val));
02930   return MCDisassembler::Success;
02931 }
02932 
02933 static DecodeStatus DecodeShiftRight32Imm(MCInst &Inst, unsigned Val,
02934                                uint64_t Address, const void *Decoder) {
02935   Inst.addOperand(MCOperand::CreateImm(32 - Val));
02936   return MCDisassembler::Success;
02937 }
02938 
02939 static DecodeStatus DecodeShiftRight64Imm(MCInst &Inst, unsigned Val,
02940                                uint64_t Address, const void *Decoder) {
02941   Inst.addOperand(MCOperand::CreateImm(64 - Val));
02942   return MCDisassembler::Success;
02943 }
02944 
02945 static DecodeStatus DecodeTBLInstruction(MCInst &Inst, unsigned Insn,
02946                                uint64_t Address, const void *Decoder) {
02947   DecodeStatus S = MCDisassembler::Success;
02948 
02949   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
02950   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
02951   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
02952   Rn |= fieldFromInstruction(Insn, 7, 1) << 4;
02953   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
02954   Rm |= fieldFromInstruction(Insn, 5, 1) << 4;
02955   unsigned op = fieldFromInstruction(Insn, 6, 1);
02956 
02957   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02958     return MCDisassembler::Fail;
02959   if (op) {
02960     if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
02961     return MCDisassembler::Fail; // Writeback
02962   }
02963 
02964   switch (Inst.getOpcode()) {
02965   case ARM::VTBL2:
02966   case ARM::VTBX2:
02967     if (!Check(S, DecodeDPairRegisterClass(Inst, Rn, Address, Decoder)))
02968       return MCDisassembler::Fail;
02969     break;
02970   default:
02971     if (!Check(S, DecodeDPRRegisterClass(Inst, Rn, Address, Decoder)))
02972       return MCDisassembler::Fail;
02973   }
02974 
02975   if (!Check(S, DecodeDPRRegisterClass(Inst, Rm, Address, Decoder)))
02976     return MCDisassembler::Fail;
02977 
02978   return S;
02979 }
02980 
02981 static DecodeStatus DecodeThumbAddSpecialReg(MCInst &Inst, uint16_t Insn,
02982                                      uint64_t Address, const void *Decoder) {
02983   DecodeStatus S = MCDisassembler::Success;
02984 
02985   unsigned dst = fieldFromInstruction(Insn, 8, 3);
02986   unsigned imm = fieldFromInstruction(Insn, 0, 8);
02987 
02988   if (!Check(S, DecodetGPRRegisterClass(Inst, dst, Address, Decoder)))
02989     return MCDisassembler::Fail;
02990 
02991   switch(Inst.getOpcode()) {
02992     default:
02993       return MCDisassembler::Fail;
02994     case ARM::tADR:
02995       break; // tADR does not explicitly represent the PC as an operand.
02996     case ARM::tADDrSPi:
02997       Inst.addOperand(MCOperand::CreateReg(ARM::SP));
02998       break;
02999   }
03000 
03001   Inst.addOperand(MCOperand::CreateImm(imm));
03002   return S;
03003 }
03004 
03005 static DecodeStatus DecodeThumbBROperand(MCInst &Inst, unsigned Val,
03006                                  uint64_t Address, const void *Decoder) {
03007   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<12>(Val<<1) + 4,
03008                                 true, 2, Inst, Decoder))
03009     Inst.addOperand(MCOperand::CreateImm(SignExtend32<12>(Val << 1)));
03010   return MCDisassembler::Success;
03011 }
03012 
03013 static DecodeStatus DecodeT2BROperand(MCInst &Inst, unsigned Val,
03014                                  uint64_t Address, const void *Decoder) {
03015   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<21>(Val) + 4,
03016                                 true, 4, Inst, Decoder))
03017     Inst.addOperand(MCOperand::CreateImm(SignExtend32<21>(Val)));
03018   return MCDisassembler::Success;
03019 }
03020 
03021 static DecodeStatus DecodeThumbCmpBROperand(MCInst &Inst, unsigned Val,
03022                                  uint64_t Address, const void *Decoder) {
03023   if (!tryAddingSymbolicOperand(Address, Address + (Val<<1) + 4,
03024                                 true, 2, Inst, Decoder))
03025     Inst.addOperand(MCOperand::CreateImm(Val << 1));
03026   return MCDisassembler::Success;
03027 }
03028 
03029 static DecodeStatus DecodeThumbAddrModeRR(MCInst &Inst, unsigned Val,
03030                                  uint64_t Address, const void *Decoder) {
03031   DecodeStatus S = MCDisassembler::Success;
03032 
03033   unsigned Rn = fieldFromInstruction(Val, 0, 3);
03034   unsigned Rm = fieldFromInstruction(Val, 3, 3);
03035 
03036   if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
03037     return MCDisassembler::Fail;
03038   if (!Check(S, DecodetGPRRegisterClass(Inst, Rm, Address, Decoder)))
03039     return MCDisassembler::Fail;
03040 
03041   return S;
03042 }
03043 
03044 static DecodeStatus DecodeThumbAddrModeIS(MCInst &Inst, unsigned Val,
03045                                   uint64_t Address, const void *Decoder) {
03046   DecodeStatus S = MCDisassembler::Success;
03047 
03048   unsigned Rn = fieldFromInstruction(Val, 0, 3);
03049   unsigned imm = fieldFromInstruction(Val, 3, 5);
03050 
03051   if (!Check(S, DecodetGPRRegisterClass(Inst, Rn, Address, Decoder)))
03052     return MCDisassembler::Fail;
03053   Inst.addOperand(MCOperand::CreateImm(imm));
03054 
03055   return S;
03056 }
03057 
03058 static DecodeStatus DecodeThumbAddrModePC(MCInst &Inst, unsigned Val,
03059                                   uint64_t Address, const void *Decoder) {
03060   unsigned imm = Val << 2;
03061 
03062   Inst.addOperand(MCOperand::CreateImm(imm));
03063   tryAddingPcLoadReferenceComment(Address, (Address & ~2u) + imm + 4, Decoder);
03064 
03065   return MCDisassembler::Success;
03066 }
03067 
03068 static DecodeStatus DecodeThumbAddrModeSP(MCInst &Inst, unsigned Val,
03069                                   uint64_t Address, const void *Decoder) {
03070   Inst.addOperand(MCOperand::CreateReg(ARM::SP));
03071   Inst.addOperand(MCOperand::CreateImm(Val));
03072 
03073   return MCDisassembler::Success;
03074 }
03075 
03076 static DecodeStatus DecodeT2AddrModeSOReg(MCInst &Inst, unsigned Val,
03077                                   uint64_t Address, const void *Decoder) {
03078   DecodeStatus S = MCDisassembler::Success;
03079 
03080   unsigned Rn = fieldFromInstruction(Val, 6, 4);
03081   unsigned Rm = fieldFromInstruction(Val, 2, 4);
03082   unsigned imm = fieldFromInstruction(Val, 0, 2);
03083 
03084   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03085     return MCDisassembler::Fail;
03086   if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
03087     return MCDisassembler::Fail;
03088   Inst.addOperand(MCOperand::CreateImm(imm));
03089 
03090   return S;
03091 }
03092 
03093 static DecodeStatus DecodeT2LoadShift(MCInst &Inst, unsigned Insn,
03094                               uint64_t Address, const void *Decoder) {
03095   DecodeStatus S = MCDisassembler::Success;
03096 
03097   switch (Inst.getOpcode()) {
03098     case ARM::t2PLDs:
03099     case ARM::t2PLDWs:
03100     case ARM::t2PLIs:
03101       break;
03102     default: {
03103       unsigned Rt = fieldFromInstruction(Insn, 12, 4);
03104       if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
03105     return MCDisassembler::Fail;
03106     }
03107   }
03108 
03109   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03110   if (Rn == 0xF) {
03111     switch (Inst.getOpcode()) {
03112       case ARM::t2LDRBs:
03113         Inst.setOpcode(ARM::t2LDRBpci);
03114         break;
03115       case ARM::t2LDRHs:
03116         Inst.setOpcode(ARM::t2LDRHpci);
03117         break;
03118       case ARM::t2LDRSHs:
03119         Inst.setOpcode(ARM::t2LDRSHpci);
03120         break;
03121       case ARM::t2LDRSBs:
03122         Inst.setOpcode(ARM::t2LDRSBpci);
03123         break;
03124       case ARM::t2PLDs:
03125         Inst.setOpcode(ARM::t2PLDi12);
03126         Inst.addOperand(MCOperand::CreateReg(ARM::PC));
03127         break;
03128       default:
03129         return MCDisassembler::Fail;
03130     }
03131 
03132     int imm = fieldFromInstruction(Insn, 0, 12);
03133     if (!fieldFromInstruction(Insn, 23, 1)) imm *= -1;
03134     Inst.addOperand(MCOperand::CreateImm(imm));
03135 
03136     return S;
03137   }
03138 
03139   unsigned addrmode = fieldFromInstruction(Insn, 4, 2);
03140   addrmode |= fieldFromInstruction(Insn, 0, 4) << 2;
03141   addrmode |= fieldFromInstruction(Insn, 16, 4) << 6;
03142   if (!Check(S, DecodeT2AddrModeSOReg(Inst, addrmode, Address, Decoder)))
03143     return MCDisassembler::Fail;
03144 
03145   return S;
03146 }
03147 
03148 static DecodeStatus DecodeT2Imm8S4(MCInst &Inst, unsigned Val,
03149                            uint64_t Address, const void *Decoder) {
03150   if (Val == 0)
03151     Inst.addOperand(MCOperand::CreateImm(INT32_MIN));
03152   else {
03153     int imm = Val & 0xFF;
03154 
03155     if (!(Val & 0x100)) imm *= -1;
03156     Inst.addOperand(MCOperand::CreateImm(imm * 4));
03157   }
03158 
03159   return MCDisassembler::Success;
03160 }
03161 
03162 static DecodeStatus DecodeT2AddrModeImm8s4(MCInst &Inst, unsigned Val,
03163                                    uint64_t Address, const void *Decoder) {
03164   DecodeStatus S = MCDisassembler::Success;
03165 
03166   unsigned Rn = fieldFromInstruction(Val, 9, 4);
03167   unsigned imm = fieldFromInstruction(Val, 0, 9);
03168 
03169   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03170     return MCDisassembler::Fail;
03171   if (!Check(S, DecodeT2Imm8S4(Inst, imm, Address, Decoder)))
03172     return MCDisassembler::Fail;
03173 
03174   return S;
03175 }
03176 
03177 static DecodeStatus DecodeT2AddrModeImm0_1020s4(MCInst &Inst,unsigned Val,
03178                                    uint64_t Address, const void *Decoder) {
03179   DecodeStatus S = MCDisassembler::Success;
03180 
03181   unsigned Rn = fieldFromInstruction(Val, 8, 4);
03182   unsigned imm = fieldFromInstruction(Val, 0, 8);
03183 
03184   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
03185     return MCDisassembler::Fail;
03186 
03187   Inst.addOperand(MCOperand::CreateImm(imm));
03188 
03189   return S;
03190 }
03191 
03192 static DecodeStatus DecodeT2Imm8(MCInst &Inst, unsigned Val,
03193                          uint64_t Address, const void *Decoder) {
03194   int imm = Val & 0xFF;
03195   if (Val == 0)
03196     imm = INT32_MIN;
03197   else if (!(Val & 0x100))
03198     imm *= -1;
03199   Inst.addOperand(MCOperand::CreateImm(imm));
03200 
03201   return MCDisassembler::Success;
03202 }
03203 
03204 
03205 static DecodeStatus DecodeT2AddrModeImm8(MCInst &Inst, unsigned Val,
03206                                  uint64_t Address, const void *Decoder) {
03207   DecodeStatus S = MCDisassembler::Success;
03208 
03209   unsigned Rn = fieldFromInstruction(Val, 9, 4);
03210   unsigned imm = fieldFromInstruction(Val, 0, 9);
03211 
03212   // Some instructions always use an additive offset.
03213   switch (Inst.getOpcode()) {
03214     case ARM::t2LDRT:
03215     case ARM::t2LDRBT:
03216     case ARM::t2LDRHT:
03217     case ARM::t2LDRSBT:
03218     case ARM::t2LDRSHT:
03219     case ARM::t2STRT:
03220     case ARM::t2STRBT:
03221     case ARM::t2STRHT:
03222       imm |= 0x100;
03223       break;
03224     default:
03225       break;
03226   }
03227 
03228   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03229     return MCDisassembler::Fail;
03230   if (!Check(S, DecodeT2Imm8(Inst, imm, Address, Decoder)))
03231     return MCDisassembler::Fail;
03232 
03233   return S;
03234 }
03235 
03236 static DecodeStatus DecodeT2LdStPre(MCInst &Inst, unsigned Insn,
03237                                     uint64_t Address, const void *Decoder) {
03238   DecodeStatus S = MCDisassembler::Success;
03239 
03240   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
03241   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03242   unsigned addr = fieldFromInstruction(Insn, 0, 8);
03243   addr |= fieldFromInstruction(Insn, 9, 1) << 8;
03244   addr |= Rn << 9;
03245   unsigned load = fieldFromInstruction(Insn, 20, 1);
03246 
03247   if (!load) {
03248     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03249       return MCDisassembler::Fail;
03250   }
03251 
03252   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
03253     return MCDisassembler::Fail;
03254 
03255   if (load) {
03256     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03257       return MCDisassembler::Fail;
03258   }
03259 
03260   if (!Check(S, DecodeT2AddrModeImm8(Inst, addr, Address, Decoder)))
03261     return MCDisassembler::Fail;
03262 
03263   return S;
03264 }
03265 
03266 static DecodeStatus DecodeT2AddrModeImm12(MCInst &Inst, unsigned Val,
03267                                   uint64_t Address, const void *Decoder) {
03268   DecodeStatus S = MCDisassembler::Success;
03269 
03270   unsigned Rn = fieldFromInstruction(Val, 13, 4);
03271   unsigned imm = fieldFromInstruction(Val, 0, 12);
03272 
03273   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03274     return MCDisassembler::Fail;
03275   Inst.addOperand(MCOperand::CreateImm(imm));
03276 
03277   return S;
03278 }
03279 
03280 
03281 static DecodeStatus DecodeThumbAddSPImm(MCInst &Inst, uint16_t Insn,
03282                                 uint64_t Address, const void *Decoder) {
03283   unsigned imm = fieldFromInstruction(Insn, 0, 7);
03284 
03285   Inst.addOperand(MCOperand::CreateReg(ARM::SP));
03286   Inst.addOperand(MCOperand::CreateReg(ARM::SP));
03287   Inst.addOperand(MCOperand::CreateImm(imm));
03288 
03289   return MCDisassembler::Success;
03290 }
03291 
03292 static DecodeStatus DecodeThumbAddSPReg(MCInst &Inst, uint16_t Insn,
03293                                 uint64_t Address, const void *Decoder) {
03294   DecodeStatus S = MCDisassembler::Success;
03295 
03296   if (Inst.getOpcode() == ARM::tADDrSP) {
03297     unsigned Rdm = fieldFromInstruction(Insn, 0, 3);
03298     Rdm |= fieldFromInstruction(Insn, 7, 1) << 3;
03299 
03300     if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
03301     return MCDisassembler::Fail;
03302     Inst.addOperand(MCOperand::CreateReg(ARM::SP));
03303     if (!Check(S, DecodeGPRRegisterClass(Inst, Rdm, Address, Decoder)))
03304     return MCDisassembler::Fail;
03305   } else if (Inst.getOpcode() == ARM::tADDspr) {
03306     unsigned Rm = fieldFromInstruction(Insn, 3, 4);
03307 
03308     Inst.addOperand(MCOperand::CreateReg(ARM::SP));
03309     Inst.addOperand(MCOperand::CreateReg(ARM::SP));
03310     if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
03311     return MCDisassembler::Fail;
03312   }
03313 
03314   return S;
03315 }
03316 
03317 static DecodeStatus DecodeThumbCPS(MCInst &Inst, uint16_t Insn,
03318                            uint64_t Address, const void *Decoder) {
03319   unsigned imod = fieldFromInstruction(Insn, 4, 1) | 0x2;
03320   unsigned flags = fieldFromInstruction(Insn, 0, 3);
03321 
03322   Inst.addOperand(MCOperand::CreateImm(imod));
03323   Inst.addOperand(MCOperand::CreateImm(flags));
03324 
03325   return MCDisassembler::Success;
03326 }
03327 
03328 static DecodeStatus DecodePostIdxReg(MCInst &Inst, unsigned Insn,
03329                              uint64_t Address, const void *Decoder) {
03330   DecodeStatus S = MCDisassembler::Success;
03331   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03332   unsigned add = fieldFromInstruction(Insn, 4, 1);
03333 
03334   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rm, Address, Decoder)))
03335     return MCDisassembler::Fail;
03336   Inst.addOperand(MCOperand::CreateImm(add));
03337 
03338   return S;
03339 }
03340 
03341 static DecodeStatus DecodeThumbBLXOffset(MCInst &Inst, unsigned Val,
03342                                  uint64_t Address, const void *Decoder) {
03343   // Val is passed in as S:J1:J2:imm10H:imm10L:'0'
03344   // Note only one trailing zero not two.  Also the J1 and J2 values are from
03345   // the encoded instruction.  So here change to I1 and I2 values via:
03346   // I1 = NOT(J1 EOR S);
03347   // I2 = NOT(J2 EOR S);
03348   // and build the imm32 with two trailing zeros as documented:
03349   // imm32 = SignExtend(S:I1:I2:imm10H:imm10L:'00', 32);
03350   unsigned S = (Val >> 23) & 1;
03351   unsigned J1 = (Val >> 22) & 1;
03352   unsigned J2 = (Val >> 21) & 1;
03353   unsigned I1 = !(J1 ^ S);
03354   unsigned I2 = !(J2 ^ S);
03355   unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
03356   int imm32 = SignExtend32<25>(tmp << 1);
03357 
03358   if (!tryAddingSymbolicOperand(Address,
03359                                 (Address & ~2u) + imm32 + 4,
03360                                 true, 4, Inst, Decoder))
03361     Inst.addOperand(MCOperand::CreateImm(imm32));
03362   return MCDisassembler::Success;
03363 }
03364 
03365 static DecodeStatus DecodeCoprocessor(MCInst &Inst, unsigned Val,
03366                               uint64_t Address, const void *Decoder) {
03367   if (Val == 0xA || Val == 0xB)
03368     return MCDisassembler::Fail;
03369 
03370   Inst.addOperand(MCOperand::CreateImm(Val));
03371   return MCDisassembler::Success;
03372 }
03373 
03374 static DecodeStatus
03375 DecodeThumbTableBranch(MCInst &Inst, unsigned Insn,
03376                        uint64_t Address, const void *Decoder) {
03377   DecodeStatus S = MCDisassembler::Success;
03378 
03379   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03380   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03381 
03382   if (Rn == ARM::SP) S = MCDisassembler::SoftFail;
03383   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03384     return MCDisassembler::Fail;
03385   if (!Check(S, DecoderGPRRegisterClass(Inst, Rm, Address, Decoder)))
03386     return MCDisassembler::Fail;
03387   return S;
03388 }
03389 
03390 static DecodeStatus
03391 DecodeThumb2BCCInstruction(MCInst &Inst, unsigned Insn,
03392                            uint64_t Address, const void *Decoder) {
03393   DecodeStatus S = MCDisassembler::Success;
03394 
03395   unsigned pred = fieldFromInstruction(Insn, 22, 4);
03396   if (pred == 0xE || pred == 0xF) {
03397     unsigned opc = fieldFromInstruction(Insn, 4, 28);
03398     switch (opc) {
03399       default:
03400         return MCDisassembler::Fail;
03401       case 0xf3bf8f4:
03402         Inst.setOpcode(ARM::t2DSB);
03403         break;
03404       case 0xf3bf8f5:
03405         Inst.setOpcode(ARM::t2DMB);
03406         break;
03407       case 0xf3bf8f6:
03408         Inst.setOpcode(ARM::t2ISB);
03409         break;
03410     }
03411 
03412     unsigned imm = fieldFromInstruction(Insn, 0, 4);
03413     return DecodeMemBarrierOption(Inst, imm, Address, Decoder);
03414   }
03415 
03416   unsigned brtarget = fieldFromInstruction(Insn, 0, 11) << 1;
03417   brtarget |= fieldFromInstruction(Insn, 11, 1) << 19;
03418   brtarget |= fieldFromInstruction(Insn, 13, 1) << 18;
03419   brtarget |= fieldFromInstruction(Insn, 16, 6) << 12;
03420   brtarget |= fieldFromInstruction(Insn, 26, 1) << 20;
03421 
03422   if (!Check(S, DecodeT2BROperand(Inst, brtarget, Address, Decoder)))
03423     return MCDisassembler::Fail;
03424   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
03425     return MCDisassembler::Fail;
03426 
03427   return S;
03428 }
03429 
03430 // Decode a shifted immediate operand.  These basically consist
03431 // of an 8-bit value, and a 4-bit directive that specifies either
03432 // a splat operation or a rotation.
03433 static DecodeStatus DecodeT2SOImm(MCInst &Inst, unsigned Val,
03434                           uint64_t Address, const void *Decoder) {
03435   unsigned ctrl = fieldFromInstruction(Val, 10, 2);
03436   if (ctrl == 0) {
03437     unsigned byte = fieldFromInstruction(Val, 8, 2);
03438     unsigned imm = fieldFromInstruction(Val, 0, 8);
03439     switch (byte) {
03440       case 0:
03441         Inst.addOperand(MCOperand::CreateImm(imm));
03442         break;
03443       case 1:
03444         Inst.addOperand(MCOperand::CreateImm((imm << 16) | imm));
03445         break;
03446       case 2:
03447         Inst.addOperand(MCOperand::CreateImm((imm << 24) | (imm << 8)));
03448         break;
03449       case 3:
03450         Inst.addOperand(MCOperand::CreateImm((imm << 24) | (imm << 16) |
03451                                              (imm << 8)  |  imm));
03452         break;
03453     }
03454   } else {
03455     unsigned unrot = fieldFromInstruction(Val, 0, 7) | 0x80;
03456     unsigned rot = fieldFromInstruction(Val, 7, 5);
03457     unsigned imm = (unrot >> rot) | (unrot << ((32-rot)&31));
03458     Inst.addOperand(MCOperand::CreateImm(imm));
03459   }
03460 
03461   return MCDisassembler::Success;
03462 }
03463 
03464 static DecodeStatus
03465 DecodeThumbBCCTargetOperand(MCInst &Inst, unsigned Val,
03466                             uint64_t Address, const void *Decoder){
03467   if (!tryAddingSymbolicOperand(Address, Address + SignExtend32<9>(Val<<1) + 4,
03468                                 true, 2, Inst, Decoder))
03469     Inst.addOperand(MCOperand::CreateImm(SignExtend32<9>(Val << 1)));
03470   return MCDisassembler::Success;
03471 }
03472 
03473 static DecodeStatus DecodeThumbBLTargetOperand(MCInst &Inst, unsigned Val,
03474                                        uint64_t Address, const void *Decoder){
03475   // Val is passed in as S:J1:J2:imm10:imm11
03476   // Note no trailing zero after imm11.  Also the J1 and J2 values are from
03477   // the encoded instruction.  So here change to I1 and I2 values via:
03478   // I1 = NOT(J1 EOR S);
03479   // I2 = NOT(J2 EOR S);
03480   // and build the imm32 with one trailing zero as documented:
03481   // imm32 = SignExtend(S:I1:I2:imm10:imm11:'0', 32);
03482   unsigned S = (Val >> 23) & 1;
03483   unsigned J1 = (Val >> 22) & 1;
03484   unsigned J2 = (Val >> 21) & 1;
03485   unsigned I1 = !(J1 ^ S);
03486   unsigned I2 = !(J2 ^ S);
03487   unsigned tmp = (Val & ~0x600000) | (I1 << 22) | (I2 << 21);
03488   int imm32 = SignExtend32<25>(tmp << 1);
03489 
03490   if (!tryAddingSymbolicOperand(Address, Address + imm32 + 4,
03491                                 true, 4, Inst, Decoder))
03492     Inst.addOperand(MCOperand::CreateImm(imm32));
03493   return MCDisassembler::Success;
03494 }
03495 
03496 static DecodeStatus DecodeMemBarrierOption(MCInst &Inst, unsigned Val,
03497                                    uint64_t Address, const void *Decoder) {
03498   if (Val & ~0xf)
03499     return MCDisassembler::Fail;
03500 
03501   Inst.addOperand(MCOperand::CreateImm(Val));
03502   return MCDisassembler::Success;
03503 }
03504 
03505 static DecodeStatus DecodeMSRMask(MCInst &Inst, unsigned Val,
03506                           uint64_t Address, const void *Decoder) {
03507   if (!Val) return MCDisassembler::Fail;
03508   Inst.addOperand(MCOperand::CreateImm(Val));
03509   return MCDisassembler::Success;
03510 }
03511 
03512 static DecodeStatus DecodeDoubleRegLoad(MCInst &Inst, unsigned Insn,
03513                                         uint64_t Address, const void *Decoder) {
03514   DecodeStatus S = MCDisassembler::Success;
03515 
03516   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
03517   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03518   unsigned pred = fieldFromInstruction(Insn, 28, 4);
03519 
03520   if ((Rt & 1) || Rt == 0xE || Rn == 0xF) return MCDisassembler::Fail;
03521 
03522   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
03523     return MCDisassembler::Fail;
03524   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
03525     return MCDisassembler::Fail;
03526   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03527     return MCDisassembler::Fail;
03528   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
03529     return MCDisassembler::Fail;
03530 
03531   return S;
03532 }
03533 
03534 
03535 static DecodeStatus DecodeDoubleRegStore(MCInst &Inst, unsigned Insn,
03536                                          uint64_t Address, const void *Decoder){
03537   DecodeStatus S = MCDisassembler::Success;
03538 
03539   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
03540   unsigned Rt = fieldFromInstruction(Insn, 0, 4);
03541   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03542   unsigned pred = fieldFromInstruction(Insn, 28, 4);
03543 
03544   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rd, Address, Decoder)))
03545     return MCDisassembler::Fail;
03546 
03547   if ((Rt & 1) || Rt == 0xE || Rn == 0xF) return MCDisassembler::Fail;
03548   if (Rd == Rn || Rd == Rt || Rd == Rt+1) return MCDisassembler::Fail;
03549 
03550   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
03551     return MCDisassembler::Fail;
03552   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt+1, Address, Decoder)))
03553     return MCDisassembler::Fail;
03554   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03555     return MCDisassembler::Fail;
03556   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
03557     return MCDisassembler::Fail;
03558 
03559   return S;
03560 }
03561 
03562 static DecodeStatus DecodeLDRPreImm(MCInst &Inst, unsigned Insn,
03563                             uint64_t Address, const void *Decoder) {
03564   DecodeStatus S = MCDisassembler::Success;
03565 
03566   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03567   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
03568   unsigned imm = fieldFromInstruction(Insn, 0, 12);
03569   imm |= fieldFromInstruction(Insn, 16, 4) << 13;
03570   imm |= fieldFromInstruction(Insn, 23, 1) << 12;
03571   unsigned pred = fieldFromInstruction(Insn, 28, 4);
03572 
03573   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
03574 
03575   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
03576     return MCDisassembler::Fail;
03577   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03578     return MCDisassembler::Fail;
03579   if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
03580     return MCDisassembler::Fail;
03581   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
03582     return MCDisassembler::Fail;
03583 
03584   return S;
03585 }
03586 
03587 static DecodeStatus DecodeLDRPreReg(MCInst &Inst, unsigned Insn,
03588                             uint64_t Address, const void *Decoder) {
03589   DecodeStatus S = MCDisassembler::Success;
03590 
03591   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03592   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
03593   unsigned imm = fieldFromInstruction(Insn, 0, 12);
03594   imm |= fieldFromInstruction(Insn, 16, 4) << 13;
03595   imm |= fieldFromInstruction(Insn, 23, 1) << 12;
03596   unsigned pred = fieldFromInstruction(Insn, 28, 4);
03597   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03598 
03599   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
03600   if (Rm == 0xF) S = MCDisassembler::SoftFail;
03601 
03602   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
03603     return MCDisassembler::Fail;
03604   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03605     return MCDisassembler::Fail;
03606   if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
03607     return MCDisassembler::Fail;
03608   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
03609     return MCDisassembler::Fail;
03610 
03611   return S;
03612 }
03613 
03614 
03615 static DecodeStatus DecodeSTRPreImm(MCInst &Inst, unsigned Insn,
03616                             uint64_t Address, const void *Decoder) {
03617   DecodeStatus S = MCDisassembler::Success;
03618 
03619   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03620   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
03621   unsigned imm = fieldFromInstruction(Insn, 0, 12);
03622   imm |= fieldFromInstruction(Insn, 16, 4) << 13;
03623   imm |= fieldFromInstruction(Insn, 23, 1) << 12;
03624   unsigned pred = fieldFromInstruction(Insn, 28, 4);
03625 
03626   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
03627 
03628   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03629     return MCDisassembler::Fail;
03630   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
03631     return MCDisassembler::Fail;
03632   if (!Check(S, DecodeAddrModeImm12Operand(Inst, imm, Address, Decoder)))
03633     return MCDisassembler::Fail;
03634   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
03635     return MCDisassembler::Fail;
03636 
03637   return S;
03638 }
03639 
03640 static DecodeStatus DecodeSTRPreReg(MCInst &Inst, unsigned Insn,
03641                             uint64_t Address, const void *Decoder) {
03642   DecodeStatus S = MCDisassembler::Success;
03643 
03644   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03645   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
03646   unsigned imm = fieldFromInstruction(Insn, 0, 12);
03647   imm |= fieldFromInstruction(Insn, 16, 4) << 13;
03648   imm |= fieldFromInstruction(Insn, 23, 1) << 12;
03649   unsigned pred = fieldFromInstruction(Insn, 28, 4);
03650 
03651   if (Rn == 0xF || Rn == Rt) S = MCDisassembler::SoftFail;
03652 
03653   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03654     return MCDisassembler::Fail;
03655   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt, Address, Decoder)))
03656     return MCDisassembler::Fail;
03657   if (!Check(S, DecodeSORegMemOperand(Inst, imm, Address, Decoder)))
03658     return MCDisassembler::Fail;
03659   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
03660     return MCDisassembler::Fail;
03661 
03662   return S;
03663 }
03664 
03665 static DecodeStatus DecodeVLD1LN(MCInst &Inst, unsigned Insn,
03666                          uint64_t Address, const void *Decoder) {
03667   DecodeStatus S = MCDisassembler::Success;
03668 
03669   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03670   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03671   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
03672   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
03673   unsigned size = fieldFromInstruction(Insn, 10, 2);
03674 
03675   unsigned align = 0;
03676   unsigned index = 0;
03677   switch (size) {
03678     default:
03679       return MCDisassembler::Fail;
03680     case 0:
03681       if (fieldFromInstruction(Insn, 4, 1))
03682         return MCDisassembler::Fail; // UNDEFINED
03683       index = fieldFromInstruction(Insn, 5, 3);
03684       break;
03685     case 1:
03686       if (fieldFromInstruction(Insn, 5, 1))
03687         return MCDisassembler::Fail; // UNDEFINED
03688       index = fieldFromInstruction(Insn, 6, 2);
03689       if (fieldFromInstruction(Insn, 4, 1))
03690         align = 2;
03691       break;
03692     case 2:
03693       if (fieldFromInstruction(Insn, 6, 1))
03694         return MCDisassembler::Fail; // UNDEFINED
03695       index = fieldFromInstruction(Insn, 7, 1);
03696 
03697       switch (fieldFromInstruction(Insn, 4, 2)) {
03698         case 0 :
03699           align = 0; break;
03700         case 3:
03701           align = 4; break;
03702         default:
03703           return MCDisassembler::Fail;
03704       }
03705       break;
03706   }
03707 
03708   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03709     return MCDisassembler::Fail;
03710   if (Rm != 0xF) { // Writeback
03711     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03712       return MCDisassembler::Fail;
03713   }
03714   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03715     return MCDisassembler::Fail;
03716   Inst.addOperand(MCOperand::CreateImm(align));
03717   if (Rm != 0xF) {
03718     if (Rm != 0xD) {
03719       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
03720         return MCDisassembler::Fail;
03721     } else
03722       Inst.addOperand(MCOperand::CreateReg(0));
03723   }
03724 
03725   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03726     return MCDisassembler::Fail;
03727   Inst.addOperand(MCOperand::CreateImm(index));
03728 
03729   return S;
03730 }
03731 
03732 static DecodeStatus DecodeVST1LN(MCInst &Inst, unsigned Insn,
03733                          uint64_t Address, const void *Decoder) {
03734   DecodeStatus S = MCDisassembler::Success;
03735 
03736   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03737   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03738   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
03739   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
03740   unsigned size = fieldFromInstruction(Insn, 10, 2);
03741 
03742   unsigned align = 0;
03743   unsigned index = 0;
03744   switch (size) {
03745     default:
03746       return MCDisassembler::Fail;
03747     case 0:
03748       if (fieldFromInstruction(Insn, 4, 1))
03749         return MCDisassembler::Fail; // UNDEFINED
03750       index = fieldFromInstruction(Insn, 5, 3);
03751       break;
03752     case 1:
03753       if (fieldFromInstruction(Insn, 5, 1))
03754         return MCDisassembler::Fail; // UNDEFINED
03755       index = fieldFromInstruction(Insn, 6, 2);
03756       if (fieldFromInstruction(Insn, 4, 1))
03757         align = 2;
03758       break;
03759     case 2:
03760       if (fieldFromInstruction(Insn, 6, 1))
03761         return MCDisassembler::Fail; // UNDEFINED
03762       index = fieldFromInstruction(Insn, 7, 1);
03763 
03764       switch (fieldFromInstruction(Insn, 4, 2)) {
03765         case 0: 
03766           align = 0; break;
03767         case 3:
03768           align = 4; break;
03769         default:
03770           return MCDisassembler::Fail;
03771       }
03772       break;
03773   }
03774 
03775   if (Rm != 0xF) { // Writeback
03776     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03777     return MCDisassembler::Fail;
03778   }
03779   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03780     return MCDisassembler::Fail;
03781   Inst.addOperand(MCOperand::CreateImm(align));
03782   if (Rm != 0xF) {
03783     if (Rm != 0xD) {
03784       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
03785     return MCDisassembler::Fail;
03786     } else
03787       Inst.addOperand(MCOperand::CreateReg(0));
03788   }
03789 
03790   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03791     return MCDisassembler::Fail;
03792   Inst.addOperand(MCOperand::CreateImm(index));
03793 
03794   return S;
03795 }
03796 
03797 
03798 static DecodeStatus DecodeVLD2LN(MCInst &Inst, unsigned Insn,
03799                          uint64_t Address, const void *Decoder) {
03800   DecodeStatus S = MCDisassembler::Success;
03801 
03802   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03803   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03804   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
03805   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
03806   unsigned size = fieldFromInstruction(Insn, 10, 2);
03807 
03808   unsigned align = 0;
03809   unsigned index = 0;
03810   unsigned inc = 1;
03811   switch (size) {
03812     default:
03813       return MCDisassembler::Fail;
03814     case 0:
03815       index = fieldFromInstruction(Insn, 5, 3);
03816       if (fieldFromInstruction(Insn, 4, 1))
03817         align = 2;
03818       break;
03819     case 1:
03820       index = fieldFromInstruction(Insn, 6, 2);
03821       if (fieldFromInstruction(Insn, 4, 1))
03822         align = 4;
03823       if (fieldFromInstruction(Insn, 5, 1))
03824         inc = 2;
03825       break;
03826     case 2:
03827       if (fieldFromInstruction(Insn, 5, 1))
03828         return MCDisassembler::Fail; // UNDEFINED
03829       index = fieldFromInstruction(Insn, 7, 1);
03830       if (fieldFromInstruction(Insn, 4, 1) != 0)
03831         align = 8;
03832       if (fieldFromInstruction(Insn, 6, 1))
03833         inc = 2;
03834       break;
03835   }
03836 
03837   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03838     return MCDisassembler::Fail;
03839   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
03840     return MCDisassembler::Fail;
03841   if (Rm != 0xF) { // Writeback
03842     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03843       return MCDisassembler::Fail;
03844   }
03845   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03846     return MCDisassembler::Fail;
03847   Inst.addOperand(MCOperand::CreateImm(align));
03848   if (Rm != 0xF) {
03849     if (Rm != 0xD) {
03850       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
03851         return MCDisassembler::Fail;
03852     } else
03853       Inst.addOperand(MCOperand::CreateReg(0));
03854   }
03855 
03856   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03857     return MCDisassembler::Fail;
03858   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
03859     return MCDisassembler::Fail;
03860   Inst.addOperand(MCOperand::CreateImm(index));
03861 
03862   return S;
03863 }
03864 
03865 static DecodeStatus DecodeVST2LN(MCInst &Inst, unsigned Insn,
03866                          uint64_t Address, const void *Decoder) {
03867   DecodeStatus S = MCDisassembler::Success;
03868 
03869   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03870   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03871   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
03872   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
03873   unsigned size = fieldFromInstruction(Insn, 10, 2);
03874 
03875   unsigned align = 0;
03876   unsigned index = 0;
03877   unsigned inc = 1;
03878   switch (size) {
03879     default:
03880       return MCDisassembler::Fail;
03881     case 0:
03882       index = fieldFromInstruction(Insn, 5, 3);
03883       if (fieldFromInstruction(Insn, 4, 1))
03884         align = 2;
03885       break;
03886     case 1:
03887       index = fieldFromInstruction(Insn, 6, 2);
03888       if (fieldFromInstruction(Insn, 4, 1))
03889         align = 4;
03890       if (fieldFromInstruction(Insn, 5, 1))
03891         inc = 2;
03892       break;
03893     case 2:
03894       if (fieldFromInstruction(Insn, 5, 1))
03895         return MCDisassembler::Fail; // UNDEFINED
03896       index = fieldFromInstruction(Insn, 7, 1);
03897       if (fieldFromInstruction(Insn, 4, 1) != 0)
03898         align = 8;
03899       if (fieldFromInstruction(Insn, 6, 1))
03900         inc = 2;
03901       break;
03902   }
03903 
03904   if (Rm != 0xF) { // Writeback
03905     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03906       return MCDisassembler::Fail;
03907   }
03908   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03909     return MCDisassembler::Fail;
03910   Inst.addOperand(MCOperand::CreateImm(align));
03911   if (Rm != 0xF) {
03912     if (Rm != 0xD) {
03913       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
03914         return MCDisassembler::Fail;
03915     } else
03916       Inst.addOperand(MCOperand::CreateReg(0));
03917   }
03918 
03919   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03920     return MCDisassembler::Fail;
03921   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
03922     return MCDisassembler::Fail;
03923   Inst.addOperand(MCOperand::CreateImm(index));
03924 
03925   return S;
03926 }
03927 
03928 
03929 static DecodeStatus DecodeVLD3LN(MCInst &Inst, unsigned Insn,
03930                          uint64_t Address, const void *Decoder) {
03931   DecodeStatus S = MCDisassembler::Success;
03932 
03933   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
03934   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
03935   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
03936   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
03937   unsigned size = fieldFromInstruction(Insn, 10, 2);
03938 
03939   unsigned align = 0;
03940   unsigned index = 0;
03941   unsigned inc = 1;
03942   switch (size) {
03943     default:
03944       return MCDisassembler::Fail;
03945     case 0:
03946       if (fieldFromInstruction(Insn, 4, 1))
03947         return MCDisassembler::Fail; // UNDEFINED
03948       index = fieldFromInstruction(Insn, 5, 3);
03949       break;
03950     case 1:
03951       if (fieldFromInstruction(Insn, 4, 1))
03952         return MCDisassembler::Fail; // UNDEFINED
03953       index = fieldFromInstruction(Insn, 6, 2);
03954       if (fieldFromInstruction(Insn, 5, 1))
03955         inc = 2;
03956       break;
03957     case 2:
03958       if (fieldFromInstruction(Insn, 4, 2))
03959         return MCDisassembler::Fail; // UNDEFINED
03960       index = fieldFromInstruction(Insn, 7, 1);
03961       if (fieldFromInstruction(Insn, 6, 1))
03962         inc = 2;
03963       break;
03964   }
03965 
03966   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03967     return MCDisassembler::Fail;
03968   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
03969     return MCDisassembler::Fail;
03970   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
03971     return MCDisassembler::Fail;
03972 
03973   if (Rm != 0xF) { // Writeback
03974     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03975     return MCDisassembler::Fail;
03976   }
03977   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
03978     return MCDisassembler::Fail;
03979   Inst.addOperand(MCOperand::CreateImm(align));
03980   if (Rm != 0xF) {
03981     if (Rm != 0xD) {
03982       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
03983     return MCDisassembler::Fail;
03984     } else
03985       Inst.addOperand(MCOperand::CreateReg(0));
03986   }
03987 
03988   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
03989     return MCDisassembler::Fail;
03990   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
03991     return MCDisassembler::Fail;
03992   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
03993     return MCDisassembler::Fail;
03994   Inst.addOperand(MCOperand::CreateImm(index));
03995 
03996   return S;
03997 }
03998 
03999 static DecodeStatus DecodeVST3LN(MCInst &Inst, unsigned Insn,
04000                          uint64_t Address, const void *Decoder) {
04001   DecodeStatus S = MCDisassembler::Success;
04002 
04003   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
04004   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
04005   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
04006   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
04007   unsigned size = fieldFromInstruction(Insn, 10, 2);
04008 
04009   unsigned align = 0;
04010   unsigned index = 0;
04011   unsigned inc = 1;
04012   switch (size) {
04013     default:
04014       return MCDisassembler::Fail;
04015     case 0:
04016       if (fieldFromInstruction(Insn, 4, 1))
04017         return MCDisassembler::Fail; // UNDEFINED
04018       index = fieldFromInstruction(Insn, 5, 3);
04019       break;
04020     case 1:
04021       if (fieldFromInstruction(Insn, 4, 1))
04022         return MCDisassembler::Fail; // UNDEFINED
04023       index = fieldFromInstruction(Insn, 6, 2);
04024       if (fieldFromInstruction(Insn, 5, 1))
04025         inc = 2;
04026       break;
04027     case 2:
04028       if (fieldFromInstruction(Insn, 4, 2))
04029         return MCDisassembler::Fail; // UNDEFINED
04030       index = fieldFromInstruction(Insn, 7, 1);
04031       if (fieldFromInstruction(Insn, 6, 1))
04032         inc = 2;
04033       break;
04034   }
04035 
04036   if (Rm != 0xF) { // Writeback
04037     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
04038     return MCDisassembler::Fail;
04039   }
04040   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
04041     return MCDisassembler::Fail;
04042   Inst.addOperand(MCOperand::CreateImm(align));
04043   if (Rm != 0xF) {
04044     if (Rm != 0xD) {
04045       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
04046     return MCDisassembler::Fail;
04047     } else
04048       Inst.addOperand(MCOperand::CreateReg(0));
04049   }
04050 
04051   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
04052     return MCDisassembler::Fail;
04053   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
04054     return MCDisassembler::Fail;
04055   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
04056     return MCDisassembler::Fail;
04057   Inst.addOperand(MCOperand::CreateImm(index));
04058 
04059   return S;
04060 }
04061 
04062 
04063 static DecodeStatus DecodeVLD4LN(MCInst &Inst, unsigned Insn,
04064                          uint64_t Address, const void *Decoder) {
04065   DecodeStatus S = MCDisassembler::Success;
04066 
04067   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
04068   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
04069   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
04070   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
04071   unsigned size = fieldFromInstruction(Insn, 10, 2);
04072 
04073   unsigned align = 0;
04074   unsigned index = 0;
04075   unsigned inc = 1;
04076   switch (size) {
04077     default:
04078       return MCDisassembler::Fail;
04079     case 0:
04080       if (fieldFromInstruction(Insn, 4, 1))
04081         align = 4;
04082       index = fieldFromInstruction(Insn, 5, 3);
04083       break;
04084     case 1:
04085       if (fieldFromInstruction(Insn, 4, 1))
04086         align = 8;
04087       index = fieldFromInstruction(Insn, 6, 2);
04088       if (fieldFromInstruction(Insn, 5, 1))
04089         inc = 2;
04090       break;
04091     case 2:
04092       switch (fieldFromInstruction(Insn, 4, 2)) {
04093         case 0:
04094           align = 0; break;
04095         case 3:
04096           return MCDisassembler::Fail;
04097         default:
04098           align = 4 << fieldFromInstruction(Insn, 4, 2); break;
04099       }
04100 
04101       index = fieldFromInstruction(Insn, 7, 1);
04102       if (fieldFromInstruction(Insn, 6, 1))
04103         inc = 2;
04104       break;
04105   }
04106 
04107   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
04108     return MCDisassembler::Fail;
04109   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
04110     return MCDisassembler::Fail;
04111   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
04112     return MCDisassembler::Fail;
04113   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
04114     return MCDisassembler::Fail;
04115 
04116   if (Rm != 0xF) { // Writeback
04117     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
04118       return MCDisassembler::Fail;
04119   }
04120   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
04121     return MCDisassembler::Fail;
04122   Inst.addOperand(MCOperand::CreateImm(align));
04123   if (Rm != 0xF) {
04124     if (Rm != 0xD) {
04125       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
04126         return MCDisassembler::Fail;
04127     } else
04128       Inst.addOperand(MCOperand::CreateReg(0));
04129   }
04130 
04131   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
04132     return MCDisassembler::Fail;
04133   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
04134     return MCDisassembler::Fail;
04135   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
04136     return MCDisassembler::Fail;
04137   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
04138     return MCDisassembler::Fail;
04139   Inst.addOperand(MCOperand::CreateImm(index));
04140 
04141   return S;
04142 }
04143 
04144 static DecodeStatus DecodeVST4LN(MCInst &Inst, unsigned Insn,
04145                          uint64_t Address, const void *Decoder) {
04146   DecodeStatus S = MCDisassembler::Success;
04147 
04148   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
04149   unsigned Rm = fieldFromInstruction(Insn, 0, 4);
04150   unsigned Rd = fieldFromInstruction(Insn, 12, 4);
04151   Rd |= fieldFromInstruction(Insn, 22, 1) << 4;
04152   unsigned size = fieldFromInstruction(Insn, 10, 2);
04153 
04154   unsigned align = 0;
04155   unsigned index = 0;
04156   unsigned inc = 1;
04157   switch (size) {
04158     default:
04159       return MCDisassembler::Fail;
04160     case 0:
04161       if (fieldFromInstruction(Insn, 4, 1))
04162         align = 4;
04163       index = fieldFromInstruction(Insn, 5, 3);
04164       break;
04165     case 1:
04166       if (fieldFromInstruction(Insn, 4, 1))
04167         align = 8;
04168       index = fieldFromInstruction(Insn, 6, 2);
04169       if (fieldFromInstruction(Insn, 5, 1))
04170         inc = 2;
04171       break;
04172     case 2:
04173       switch (fieldFromInstruction(Insn, 4, 2)) {
04174         case 0:
04175           align = 0; break;
04176         case 3:
04177           return MCDisassembler::Fail;
04178         default:
04179           align = 4 << fieldFromInstruction(Insn, 4, 2); break;
04180       }
04181 
04182       index = fieldFromInstruction(Insn, 7, 1);
04183       if (fieldFromInstruction(Insn, 6, 1))
04184         inc = 2;
04185       break;
04186   }
04187 
04188   if (Rm != 0xF) { // Writeback
04189     if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
04190     return MCDisassembler::Fail;
04191   }
04192   if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
04193     return MCDisassembler::Fail;
04194   Inst.addOperand(MCOperand::CreateImm(align));
04195   if (Rm != 0xF) {
04196     if (Rm != 0xD) {
04197       if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
04198     return MCDisassembler::Fail;
04199     } else
04200       Inst.addOperand(MCOperand::CreateReg(0));
04201   }
04202 
04203   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
04204     return MCDisassembler::Fail;
04205   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+inc, Address, Decoder)))
04206     return MCDisassembler::Fail;
04207   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+2*inc, Address, Decoder)))
04208     return MCDisassembler::Fail;
04209   if (!Check(S, DecodeDPRRegisterClass(Inst, Rd+3*inc, Address, Decoder)))
04210     return MCDisassembler::Fail;
04211   Inst.addOperand(MCOperand::CreateImm(index));
04212 
04213   return S;
04214 }
04215 
04216 static DecodeStatus DecodeVMOVSRR(MCInst &Inst, unsigned Insn,
04217                                   uint64_t Address, const void *Decoder) {
04218   DecodeStatus S = MCDisassembler::Success;
04219   unsigned Rt  = fieldFromInstruction(Insn, 12, 4);
04220   unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
04221   unsigned Rm  = fieldFromInstruction(Insn,  5, 1);
04222   unsigned pred = fieldFromInstruction(Insn, 28, 4);
04223   Rm |= fieldFromInstruction(Insn, 0, 4) << 1;
04224 
04225   if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
04226     S = MCDisassembler::SoftFail;
04227 
04228   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
04229     return MCDisassembler::Fail;
04230   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
04231     return MCDisassembler::Fail;
04232   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
04233     return MCDisassembler::Fail;
04234   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
04235     return MCDisassembler::Fail;
04236   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
04237     return MCDisassembler::Fail;
04238 
04239   return S;
04240 }
04241 
04242 static DecodeStatus DecodeVMOVRRS(MCInst &Inst, unsigned Insn,
04243                                   uint64_t Address, const void *Decoder) {
04244   DecodeStatus S = MCDisassembler::Success;
04245   unsigned Rt  = fieldFromInstruction(Insn, 12, 4);
04246   unsigned Rt2 = fieldFromInstruction(Insn, 16, 4);
04247   unsigned Rm  = fieldFromInstruction(Insn,  5, 1);
04248   unsigned pred = fieldFromInstruction(Insn, 28, 4);
04249   Rm |= fieldFromInstruction(Insn, 0, 4) << 1;
04250 
04251   if (Rt == 0xF || Rt2 == 0xF || Rm == 0x1F)
04252     S = MCDisassembler::SoftFail;
04253 
04254   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt  , Address, Decoder)))
04255     return MCDisassembler::Fail;
04256   if (!Check(S, DecodeGPRRegisterClass(Inst, Rt2 , Address, Decoder)))
04257     return MCDisassembler::Fail;
04258   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm  , Address, Decoder)))
04259     return MCDisassembler::Fail;
04260   if (!Check(S, DecodeSPRRegisterClass(Inst, Rm+1, Address, Decoder)))
04261     return MCDisassembler::Fail;
04262   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
04263     return MCDisassembler::Fail;
04264 
04265   return S;
04266 }
04267 
04268 static DecodeStatus DecodeIT(MCInst &Inst, unsigned Insn,
04269                              uint64_t Address, const void *Decoder) {
04270   DecodeStatus S = MCDisassembler::Success;
04271   unsigned pred = fieldFromInstruction(Insn, 4, 4);
04272   unsigned mask = fieldFromInstruction(Insn, 0, 4);
04273 
04274   if (pred == 0xF) {
04275     pred = 0xE;
04276     S = MCDisassembler::SoftFail;
04277   }
04278 
04279   if (mask == 0x0) {
04280     mask |= 0x8;
04281     S = MCDisassembler::SoftFail;
04282   }
04283 
04284   Inst.addOperand(MCOperand::CreateImm(pred));
04285   Inst.addOperand(MCOperand::CreateImm(mask));
04286   return S;
04287 }
04288 
04289 static DecodeStatus
04290 DecodeT2LDRDPreInstruction(MCInst &Inst, unsigned Insn,
04291                            uint64_t Address, const void *Decoder) {
04292   DecodeStatus S = MCDisassembler::Success;
04293 
04294   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
04295   unsigned Rt2 = fieldFromInstruction(Insn, 8, 4);
04296   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
04297   unsigned addr = fieldFromInstruction(Insn, 0, 8);
04298   unsigned W = fieldFromInstruction(Insn, 21, 1);
04299   unsigned U = fieldFromInstruction(Insn, 23, 1);
04300   unsigned P = fieldFromInstruction(Insn, 24, 1);
04301   bool writeback = (W == 1) | (P == 0);
04302 
04303   addr |= (U << 8) | (Rn << 9);
04304 
04305   if (writeback && (Rn == Rt || Rn == Rt2))
04306     Check(S, MCDisassembler::SoftFail);
04307   if (Rt == Rt2)
04308     Check(S, MCDisassembler::SoftFail);
04309 
04310   // Rt
04311   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
04312     return MCDisassembler::Fail;
04313   // Rt2
04314   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
04315     return MCDisassembler::Fail;
04316   // Writeback operand
04317   if (!Check(S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
04318     return MCDisassembler::Fail;
04319   // addr
04320   if (!Check(S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
04321     return MCDisassembler::Fail;
04322 
04323   return S;
04324 }
04325 
04326 static DecodeStatus
04327 DecodeT2STRDPreInstruction(MCInst &Inst, unsigned Insn,
04328                            uint64_t Address, const void *Decoder) {
04329   DecodeStatus S = MCDisassembler::Success;
04330 
04331   unsigned Rt = fieldFromInstruction(Insn, 12, 4);
04332   unsigned Rt2 = fieldFromInstruction(Insn, 8, 4);
04333   unsigned Rn = fieldFromInstruction(Insn, 16, 4);
04334   unsigned addr = fieldFromInstruction(Insn, 0, 8);
04335   unsigned W = fieldFromInstruction(Insn, 21, 1);
04336   unsigned U = fieldFromInstruction(Insn, 23, 1);
04337   unsigned P = fieldFromInstruction(Insn, 24, 1);
04338   bool writeback = (W == 1) | (P == 0);
04339 
04340   addr |= (U << 8) | (Rn << 9);
04341 
04342   if (writeback && (Rn == Rt || Rn == Rt2))
04343     Check(S, MCDisassembler::SoftFail);
04344 
04345   // Writeback operand
04346   if (!Check(S, DecoderGPRRegisterClass(Inst, Rn, Address, Decoder)))
04347     return MCDisassembler::Fail;
04348   // Rt
04349   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt, Address, Decoder)))
04350     return MCDisassembler::Fail;
04351   // Rt2
04352   if (!Check(S, DecoderGPRRegisterClass(Inst, Rt2, Address, Decoder)))
04353     return MCDisassembler::Fail;
04354   // addr
04355   if (!Check(S, DecodeT2AddrModeImm8s4(Inst, addr, Address, Decoder)))
04356     return MCDisassembler::Fail;
04357 
04358   return S;
04359 }
04360 
04361 static DecodeStatus DecodeT2Adr(MCInst &Inst, uint32_t Insn,
04362                                 uint64_t Address, const void *Decoder) {
04363   unsigned sign1 = fieldFromInstruction(Insn, 21, 1);
04364   unsigned sign2 = fieldFromInstruction(Insn, 23, 1);
04365   if (sign1 != sign2) return MCDisassembler::Fail;
04366 
04367   unsigned Val = fieldFromInstruction(Insn, 0, 8);
04368   Val |= fieldFromInstruction(Insn, 12, 3) << 8;
04369   Val |= fieldFromInstruction(Insn, 26, 1) << 11;
04370   Val |= sign1 << 12;
04371   Inst.addOperand(MCOperand::CreateImm(SignExtend32<13>(Val)));
04372 
04373   return MCDisassembler::Success;
04374 }
04375 
04376 static DecodeStatus DecodeT2ShifterImmOperand(MCInst &Inst, uint32_t Val,
04377                                               uint64_t Address,
04378                                               const void *Decoder) {
04379   DecodeStatus S = MCDisassembler::Success;
04380 
04381   // Shift of "asr #32" is not allowed in Thumb2 mode.
04382   if (Val == 0x20) S = MCDisassembler::SoftFail;
04383   Inst.addOperand(MCOperand::CreateImm(Val));
04384   return S;
04385 }
04386 
04387 static DecodeStatus DecodeSwap(MCInst &Inst, unsigned Insn,
04388                                uint64_t Address, const void *Decoder) {
04389   unsigned Rt   = fieldFromInstruction(Insn, 12, 4);
04390   unsigned Rt2  = fieldFromInstruction(Insn, 0,  4);
04391   unsigned Rn   = fieldFromInstruction(Insn, 16, 4);
04392   unsigned pred = fieldFromInstruction(Insn, 28, 4);
04393 
04394   if (pred == 0xF)
04395     return DecodeCPSInstruction(Inst, Insn, Address, Decoder);
04396 
04397   DecodeStatus S = MCDisassembler::Success;
04398 
04399   if (Rt == Rn || Rn == Rt2)
04400     S = MCDisassembler::SoftFail;
04401 
04402   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
04403     return MCDisassembler::Fail;
04404   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
04405     return MCDisassembler::Fail;
04406   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
04407     return MCDisassembler::Fail;
04408   if (!Check(S, DecodePredicateOperand(Inst, pred, Address, Decoder)))
04409     return MCDisassembler::Fail;
04410 
04411   return S;
04412 }
04413 
04414 static DecodeStatus DecodeVCVTD(MCInst &Inst, unsigned Insn,
04415                                 uint64_t Address, const void *Decoder) {
04416   unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 0);
04417   Vd |= (fieldFromInstruction(Insn, 22, 1) << 4);
04418   unsigned Vm = (fieldFromInstruction(Insn, 0, 4) << 0);
04419   Vm |= (fieldFromInstruction(Insn, 5, 1) << 4);
04420   unsigned imm = fieldFromInstruction(Insn, 16, 6);
04421   unsigned cmode = fieldFromInstruction(Insn, 8, 4);
04422 
04423   DecodeStatus S = MCDisassembler::Success;
04424 
04425   // VMOVv2f32 is ambiguous with these decodings.
04426   if (!(imm & 0x38) && cmode == 0xF) {
04427     Inst.setOpcode(ARM::VMOVv2f32);
04428     return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
04429   }
04430 
04431   if (!(imm & 0x20)) Check(S, MCDisassembler::SoftFail);
04432 
04433   if (!Check(S, DecodeDPRRegisterClass(Inst, Vd, Address, Decoder)))
04434     return MCDisassembler::Fail;
04435   if (!Check(S, DecodeDPRRegisterClass(Inst, Vm, Address, Decoder)))
04436     return MCDisassembler::Fail;
04437   Inst.addOperand(MCOperand::CreateImm(64 - imm));
04438 
04439   return S;
04440 }
04441 
04442 static DecodeStatus DecodeVCVTQ(MCInst &Inst, unsigned Insn,
04443                                 uint64_t Address, const void *Decoder) {
04444   unsigned Vd = (fieldFromInstruction(Insn, 12, 4) << 0);
04445   Vd |= (fieldFromInstruction(Insn, 22, 1) << 4);
04446   unsigned Vm = (fieldFromInstruction(Insn, 0, 4) << 0);
04447   Vm |= (fieldFromInstruction(Insn, 5, 1) << 4);
04448   unsigned imm = fieldFromInstruction(Insn, 16, 6);
04449   unsigned cmode = fieldFromInstruction(Insn, 8, 4);
04450 
04451   DecodeStatus S = MCDisassembler::Success;
04452 
04453   // VMOVv4f32 is ambiguous with these decodings.
04454   if (!(imm & 0x38) && cmode == 0xF) {
04455     Inst.setOpcode(ARM::VMOVv4f32);
04456     return DecodeNEONModImmInstruction(Inst, Insn, Address, Decoder);
04457   }
04458 
04459   if (!(imm & 0x20)) Check(S, MCDisassembler::SoftFail);
04460 
04461   if (!Check(S, DecodeQPRRegisterClass(Inst, Vd, Address, Decoder)))
04462     return MCDisassembler::Fail;
04463   if (!Check(S, DecodeQPRRegisterClass(Inst, Vm, Address, Decoder)))
04464     return MCDisassembler::Fail;
04465   Inst.addOperand(MCOperand::CreateImm(64 - imm));
04466 
04467   return S;
04468 }
04469 
04470 static DecodeStatus DecodeImm0_4(MCInst &Inst, unsigned Insn, uint64_t Address,
04471                                  const void *Decoder)
04472 {
04473   unsigned Imm = fieldFromInstruction(Insn, 0, 3);
04474   if (Imm > 4) return MCDisassembler::Fail;
04475   Inst.addOperand(MCOperand::CreateImm(Imm));
04476   return MCDisassembler::Success;
04477 }
04478 
04479 static DecodeStatus DecodeLDR(MCInst &Inst, unsigned Val,
04480                                 uint64_t Address, const void *Decoder) {
04481   DecodeStatus S = MCDisassembler::Success;
04482 
04483   unsigned Rn = fieldFromInstruction(Val, 16, 4);
04484   unsigned Rt = fieldFromInstruction(Val, 12, 4);
04485   unsigned Rm = fieldFromInstruction(Val, 0, 4);
04486   Rm |= (fieldFromInstruction(Val, 23, 1) << 4);
04487   unsigned Cond = fieldFromInstruction(Val, 28, 4);
04488  
04489   if (fieldFromInstruction(Val, 8, 4) != 0 || Rn == Rt)
04490     S = MCDisassembler::SoftFail;
04491 
04492   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
04493     return MCDisassembler::Fail;
04494   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rn, Address, Decoder)))
04495     return MCDisassembler::Fail;
04496   if (!Check(S, DecodeAddrMode7Operand(Inst, Rn, Address, Decoder))) 
04497     return MCDisassembler::Fail;
04498   if (!Check(S, DecodePostIdxReg(Inst, Rm, Address, Decoder)))
04499     return MCDisassembler::Fail;
04500   if (!Check(S, DecodePredicateOperand(Inst, Cond, Address, Decoder)))
04501     return MCDisassembler::Fail;
04502 
04503   return S;
04504 }
04505 
04506 static DecodeStatus DecodeMRRC2(llvm::MCInst &Inst, unsigned Val,
04507                                 uint64_t Address, const void *Decoder) {
04508 
04509   DecodeStatus S = MCDisassembler::Success;
04510 
04511   unsigned CRm = fieldFromInstruction(Val, 0, 4);
04512   unsigned opc1 = fieldFromInstruction(Val, 4, 4);
04513   unsigned cop = fieldFromInstruction(Val, 8, 4);
04514   unsigned Rt = fieldFromInstruction(Val, 12, 4);
04515   unsigned Rt2 = fieldFromInstruction(Val, 16, 4);
04516 
04517   if ((cop & ~0x1) == 0xa)
04518     return MCDisassembler::Fail;
04519 
04520   if (Rt == Rt2)
04521     S = MCDisassembler::SoftFail;
04522 
04523   Inst.addOperand(MCOperand::CreateImm(cop));
04524   Inst.addOperand(MCOperand::CreateImm(opc1));
04525   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt, Address, Decoder)))
04526     return MCDisassembler::Fail;
04527   if (!Check(S, DecodeGPRnopcRegisterClass(Inst, Rt2, Address, Decoder)))
04528     return MCDisassembler::Fail;
04529   Inst.addOperand(MCOperand::CreateImm(CRm));
04530 
04531   return S;
04532 }
04533