Home | History | Annotate | Download | only in AsmParser
      1 //===-- ARMAsmParser.cpp - Parse ARM assembly to MCInst instructions ------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "MCTargetDesc/ARMBaseInfo.h"
     11 #include "MCTargetDesc/ARMAddressingModes.h"
     12 #include "MCTargetDesc/ARMMCExpr.h"
     13 #include "llvm/MC/MCParser/MCAsmLexer.h"
     14 #include "llvm/MC/MCParser/MCAsmParser.h"
     15 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
     16 #include "llvm/MC/MCAsmInfo.h"
     17 #include "llvm/MC/MCContext.h"
     18 #include "llvm/MC/MCStreamer.h"
     19 #include "llvm/MC/MCExpr.h"
     20 #include "llvm/MC/MCInst.h"
     21 #include "llvm/MC/MCInstrDesc.h"
     22 #include "llvm/MC/MCRegisterInfo.h"
     23 #include "llvm/MC/MCSubtargetInfo.h"
     24 #include "llvm/MC/MCTargetAsmParser.h"
     25 #include "llvm/Support/MathExtras.h"
     26 #include "llvm/Support/SourceMgr.h"
     27 #include "llvm/Support/TargetRegistry.h"
     28 #include "llvm/Support/raw_ostream.h"
     29 #include "llvm/ADT/BitVector.h"
     30 #include "llvm/ADT/OwningPtr.h"
     31 #include "llvm/ADT/STLExtras.h"
     32 #include "llvm/ADT/SmallVector.h"
     33 #include "llvm/ADT/StringExtras.h"
     34 #include "llvm/ADT/StringSwitch.h"
     35 #include "llvm/ADT/Twine.h"
     36 
     37 using namespace llvm;
     38 
     39 namespace {
     40 
     41 class ARMOperand;
     42 
     43 class ARMAsmParser : public MCTargetAsmParser {
     44   MCSubtargetInfo &STI;
     45   MCAsmParser &Parser;
     46 
     47   struct {
     48     ARMCC::CondCodes Cond;    // Condition for IT block.
     49     unsigned Mask:4;          // Condition mask for instructions.
     50                               // Starting at first 1 (from lsb).
     51                               //   '1'  condition as indicated in IT.
     52                               //   '0'  inverse of condition (else).
     53                               // Count of instructions in IT block is
     54                               // 4 - trailingzeroes(mask)
     55 
     56     bool FirstCond;           // Explicit flag for when we're parsing the
     57                               // First instruction in the IT block. It's
     58                               // implied in the mask, so needs special
     59                               // handling.
     60 
     61     unsigned CurPosition;     // Current position in parsing of IT
     62                               // block. In range [0,3]. Initialized
     63                               // according to count of instructions in block.
     64                               // ~0U if no active IT block.
     65   } ITState;
     66   bool inITBlock() { return ITState.CurPosition != ~0U;}
     67   void forwardITPosition() {
     68     if (!inITBlock()) return;
     69     // Move to the next instruction in the IT block, if there is one. If not,
     70     // mark the block as done.
     71     unsigned TZ = CountTrailingZeros_32(ITState.Mask);
     72     if (++ITState.CurPosition == 5 - TZ)
     73       ITState.CurPosition = ~0U; // Done with the IT block after this.
     74   }
     75 
     76 
     77   MCAsmParser &getParser() const { return Parser; }
     78   MCAsmLexer &getLexer() const { return Parser.getLexer(); }
     79 
     80   void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); }
     81   bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); }
     82 
     83   int tryParseRegister();
     84   bool tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &);
     85   int tryParseShiftRegister(SmallVectorImpl<MCParsedAsmOperand*> &);
     86   bool parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &);
     87   bool parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &);
     88   bool parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &, StringRef Mnemonic);
     89   bool parsePrefix(ARMMCExpr::VariantKind &RefKind);
     90   bool parseMemRegOffsetShift(ARM_AM::ShiftOpc &ShiftType,
     91                               unsigned &ShiftAmount);
     92   bool parseDirectiveWord(unsigned Size, SMLoc L);
     93   bool parseDirectiveThumb(SMLoc L);
     94   bool parseDirectiveThumbFunc(SMLoc L);
     95   bool parseDirectiveCode(SMLoc L);
     96   bool parseDirectiveSyntax(SMLoc L);
     97 
     98   StringRef splitMnemonic(StringRef Mnemonic, unsigned &PredicationCode,
     99                           bool &CarrySetting, unsigned &ProcessorIMod,
    100                           StringRef &ITMask);
    101   void getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
    102                              bool &CanAcceptPredicationCode);
    103 
    104   bool isThumb() const {
    105     // FIXME: Can tablegen auto-generate this?
    106     return (STI.getFeatureBits() & ARM::ModeThumb) != 0;
    107   }
    108   bool isThumbOne() const {
    109     return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2) == 0;
    110   }
    111   bool isThumbTwo() const {
    112     return isThumb() && (STI.getFeatureBits() & ARM::FeatureThumb2);
    113   }
    114   bool hasV6Ops() const {
    115     return STI.getFeatureBits() & ARM::HasV6Ops;
    116   }
    117   bool hasV7Ops() const {
    118     return STI.getFeatureBits() & ARM::HasV7Ops;
    119   }
    120   void SwitchMode() {
    121     unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(ARM::ModeThumb));
    122     setAvailableFeatures(FB);
    123   }
    124   bool isMClass() const {
    125     return STI.getFeatureBits() & ARM::FeatureMClass;
    126   }
    127 
    128   /// @name Auto-generated Match Functions
    129   /// {
    130 
    131 #define GET_ASSEMBLER_HEADER
    132 #include "ARMGenAsmMatcher.inc"
    133 
    134   /// }
    135 
    136   OperandMatchResultTy parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*>&);
    137   OperandMatchResultTy parseCoprocNumOperand(
    138     SmallVectorImpl<MCParsedAsmOperand*>&);
    139   OperandMatchResultTy parseCoprocRegOperand(
    140     SmallVectorImpl<MCParsedAsmOperand*>&);
    141   OperandMatchResultTy parseCoprocOptionOperand(
    142     SmallVectorImpl<MCParsedAsmOperand*>&);
    143   OperandMatchResultTy parseMemBarrierOptOperand(
    144     SmallVectorImpl<MCParsedAsmOperand*>&);
    145   OperandMatchResultTy parseProcIFlagsOperand(
    146     SmallVectorImpl<MCParsedAsmOperand*>&);
    147   OperandMatchResultTy parseMSRMaskOperand(
    148     SmallVectorImpl<MCParsedAsmOperand*>&);
    149   OperandMatchResultTy parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &O,
    150                                    StringRef Op, int Low, int High);
    151   OperandMatchResultTy parsePKHLSLImm(SmallVectorImpl<MCParsedAsmOperand*> &O) {
    152     return parsePKHImm(O, "lsl", 0, 31);
    153   }
    154   OperandMatchResultTy parsePKHASRImm(SmallVectorImpl<MCParsedAsmOperand*> &O) {
    155     return parsePKHImm(O, "asr", 1, 32);
    156   }
    157   OperandMatchResultTy parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*>&);
    158   OperandMatchResultTy parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*>&);
    159   OperandMatchResultTy parseRotImm(SmallVectorImpl<MCParsedAsmOperand*>&);
    160   OperandMatchResultTy parseBitfield(SmallVectorImpl<MCParsedAsmOperand*>&);
    161   OperandMatchResultTy parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*>&);
    162   OperandMatchResultTy parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*>&);
    163   OperandMatchResultTy parseFPImm(SmallVectorImpl<MCParsedAsmOperand*>&);
    164 
    165   // Asm Match Converter Methods
    166   bool cvtT2LdrdPre(MCInst &Inst, unsigned Opcode,
    167                     const SmallVectorImpl<MCParsedAsmOperand*> &);
    168   bool cvtT2StrdPre(MCInst &Inst, unsigned Opcode,
    169                     const SmallVectorImpl<MCParsedAsmOperand*> &);
    170   bool cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
    171                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    172   bool cvtStWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
    173                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    174   bool cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
    175                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    176   bool cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
    177                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    178   bool cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
    179                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    180   bool cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
    181                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    182   bool cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
    183                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    184   bool cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
    185                              const SmallVectorImpl<MCParsedAsmOperand*> &);
    186   bool cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
    187                              const SmallVectorImpl<MCParsedAsmOperand*> &);
    188   bool cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
    189                              const SmallVectorImpl<MCParsedAsmOperand*> &);
    190   bool cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
    191                              const SmallVectorImpl<MCParsedAsmOperand*> &);
    192   bool cvtLdrdPre(MCInst &Inst, unsigned Opcode,
    193                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    194   bool cvtStrdPre(MCInst &Inst, unsigned Opcode,
    195                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    196   bool cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
    197                                   const SmallVectorImpl<MCParsedAsmOperand*> &);
    198   bool cvtThumbMultiply(MCInst &Inst, unsigned Opcode,
    199                         const SmallVectorImpl<MCParsedAsmOperand*> &);
    200 
    201   bool validateInstruction(MCInst &Inst,
    202                            const SmallVectorImpl<MCParsedAsmOperand*> &Ops);
    203   void processInstruction(MCInst &Inst,
    204                           const SmallVectorImpl<MCParsedAsmOperand*> &Ops);
    205   bool shouldOmitCCOutOperand(StringRef Mnemonic,
    206                               SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    207 
    208 public:
    209   enum ARMMatchResultTy {
    210     Match_RequiresITBlock = FIRST_TARGET_MATCH_RESULT_TY,
    211     Match_RequiresNotITBlock,
    212     Match_RequiresV6,
    213     Match_RequiresThumb2
    214   };
    215 
    216   ARMAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
    217     : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
    218     MCAsmParserExtension::Initialize(_Parser);
    219 
    220     // Initialize the set of available features.
    221     setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
    222 
    223     // Not in an ITBlock to start with.
    224     ITState.CurPosition = ~0U;
    225   }
    226 
    227   // Implementation of the MCTargetAsmParser interface:
    228   bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
    229   bool ParseInstruction(StringRef Name, SMLoc NameLoc,
    230                         SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    231   bool ParseDirective(AsmToken DirectiveID);
    232 
    233   unsigned checkTargetMatchPredicate(MCInst &Inst);
    234 
    235   bool MatchAndEmitInstruction(SMLoc IDLoc,
    236                                SmallVectorImpl<MCParsedAsmOperand*> &Operands,
    237                                MCStreamer &Out);
    238 };
    239 } // end anonymous namespace
    240 
    241 namespace {
    242 
    243 /// ARMOperand - Instances of this class represent a parsed ARM machine
    244 /// instruction.
    245 class ARMOperand : public MCParsedAsmOperand {
    246   enum KindTy {
    247     k_CondCode,
    248     k_CCOut,
    249     k_ITCondMask,
    250     k_CoprocNum,
    251     k_CoprocReg,
    252     k_CoprocOption,
    253     k_Immediate,
    254     k_FPImmediate,
    255     k_MemBarrierOpt,
    256     k_Memory,
    257     k_PostIndexRegister,
    258     k_MSRMask,
    259     k_ProcIFlags,
    260     k_VectorIndex,
    261     k_Register,
    262     k_RegisterList,
    263     k_DPRRegisterList,
    264     k_SPRRegisterList,
    265     k_ShiftedRegister,
    266     k_ShiftedImmediate,
    267     k_ShifterImmediate,
    268     k_RotateImmediate,
    269     k_BitfieldDescriptor,
    270     k_Token
    271   } Kind;
    272 
    273   SMLoc StartLoc, EndLoc;
    274   SmallVector<unsigned, 8> Registers;
    275 
    276   union {
    277     struct {
    278       ARMCC::CondCodes Val;
    279     } CC;
    280 
    281     struct {
    282       unsigned Val;
    283     } Cop;
    284 
    285     struct {
    286       unsigned Val;
    287     } CoprocOption;
    288 
    289     struct {
    290       unsigned Mask:4;
    291     } ITMask;
    292 
    293     struct {
    294       ARM_MB::MemBOpt Val;
    295     } MBOpt;
    296 
    297     struct {
    298       ARM_PROC::IFlags Val;
    299     } IFlags;
    300 
    301     struct {
    302       unsigned Val;
    303     } MMask;
    304 
    305     struct {
    306       const char *Data;
    307       unsigned Length;
    308     } Tok;
    309 
    310     struct {
    311       unsigned RegNum;
    312     } Reg;
    313 
    314     struct {
    315       unsigned Val;
    316     } VectorIndex;
    317 
    318     struct {
    319       const MCExpr *Val;
    320     } Imm;
    321 
    322     struct {
    323       unsigned Val;       // encoded 8-bit representation
    324     } FPImm;
    325 
    326     /// Combined record for all forms of ARM address expressions.
    327     struct {
    328       unsigned BaseRegNum;
    329       // Offset is in OffsetReg or OffsetImm. If both are zero, no offset
    330       // was specified.
    331       const MCConstantExpr *OffsetImm;  // Offset immediate value
    332       unsigned OffsetRegNum;    // Offset register num, when OffsetImm == NULL
    333       ARM_AM::ShiftOpc ShiftType; // Shift type for OffsetReg
    334       unsigned ShiftImm;        // shift for OffsetReg.
    335       unsigned Alignment;       // 0 = no alignment specified
    336                                 // n = alignment in bytes (8, 16, or 32)
    337       unsigned isNegative : 1;  // Negated OffsetReg? (~'U' bit)
    338     } Memory;
    339 
    340     struct {
    341       unsigned RegNum;
    342       bool isAdd;
    343       ARM_AM::ShiftOpc ShiftTy;
    344       unsigned ShiftImm;
    345     } PostIdxReg;
    346 
    347     struct {
    348       bool isASR;
    349       unsigned Imm;
    350     } ShifterImm;
    351     struct {
    352       ARM_AM::ShiftOpc ShiftTy;
    353       unsigned SrcReg;
    354       unsigned ShiftReg;
    355       unsigned ShiftImm;
    356     } RegShiftedReg;
    357     struct {
    358       ARM_AM::ShiftOpc ShiftTy;
    359       unsigned SrcReg;
    360       unsigned ShiftImm;
    361     } RegShiftedImm;
    362     struct {
    363       unsigned Imm;
    364     } RotImm;
    365     struct {
    366       unsigned LSB;
    367       unsigned Width;
    368     } Bitfield;
    369   };
    370 
    371   ARMOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {}
    372 public:
    373   ARMOperand(const ARMOperand &o) : MCParsedAsmOperand() {
    374     Kind = o.Kind;
    375     StartLoc = o.StartLoc;
    376     EndLoc = o.EndLoc;
    377     switch (Kind) {
    378     case k_CondCode:
    379       CC = o.CC;
    380       break;
    381     case k_ITCondMask:
    382       ITMask = o.ITMask;
    383       break;
    384     case k_Token:
    385       Tok = o.Tok;
    386       break;
    387     case k_CCOut:
    388     case k_Register:
    389       Reg = o.Reg;
    390       break;
    391     case k_RegisterList:
    392     case k_DPRRegisterList:
    393     case k_SPRRegisterList:
    394       Registers = o.Registers;
    395       break;
    396     case k_CoprocNum:
    397     case k_CoprocReg:
    398       Cop = o.Cop;
    399       break;
    400     case k_CoprocOption:
    401       CoprocOption = o.CoprocOption;
    402       break;
    403     case k_Immediate:
    404       Imm = o.Imm;
    405       break;
    406     case k_FPImmediate:
    407       FPImm = o.FPImm;
    408       break;
    409     case k_MemBarrierOpt:
    410       MBOpt = o.MBOpt;
    411       break;
    412     case k_Memory:
    413       Memory = o.Memory;
    414       break;
    415     case k_PostIndexRegister:
    416       PostIdxReg = o.PostIdxReg;
    417       break;
    418     case k_MSRMask:
    419       MMask = o.MMask;
    420       break;
    421     case k_ProcIFlags:
    422       IFlags = o.IFlags;
    423       break;
    424     case k_ShifterImmediate:
    425       ShifterImm = o.ShifterImm;
    426       break;
    427     case k_ShiftedRegister:
    428       RegShiftedReg = o.RegShiftedReg;
    429       break;
    430     case k_ShiftedImmediate:
    431       RegShiftedImm = o.RegShiftedImm;
    432       break;
    433     case k_RotateImmediate:
    434       RotImm = o.RotImm;
    435       break;
    436     case k_BitfieldDescriptor:
    437       Bitfield = o.Bitfield;
    438       break;
    439     case k_VectorIndex:
    440       VectorIndex = o.VectorIndex;
    441       break;
    442     }
    443   }
    444 
    445   /// getStartLoc - Get the location of the first token of this operand.
    446   SMLoc getStartLoc() const { return StartLoc; }
    447   /// getEndLoc - Get the location of the last token of this operand.
    448   SMLoc getEndLoc() const { return EndLoc; }
    449 
    450   ARMCC::CondCodes getCondCode() const {
    451     assert(Kind == k_CondCode && "Invalid access!");
    452     return CC.Val;
    453   }
    454 
    455   unsigned getCoproc() const {
    456     assert((Kind == k_CoprocNum || Kind == k_CoprocReg) && "Invalid access!");
    457     return Cop.Val;
    458   }
    459 
    460   StringRef getToken() const {
    461     assert(Kind == k_Token && "Invalid access!");
    462     return StringRef(Tok.Data, Tok.Length);
    463   }
    464 
    465   unsigned getReg() const {
    466     assert((Kind == k_Register || Kind == k_CCOut) && "Invalid access!");
    467     return Reg.RegNum;
    468   }
    469 
    470   const SmallVectorImpl<unsigned> &getRegList() const {
    471     assert((Kind == k_RegisterList || Kind == k_DPRRegisterList ||
    472             Kind == k_SPRRegisterList) && "Invalid access!");
    473     return Registers;
    474   }
    475 
    476   const MCExpr *getImm() const {
    477     assert(Kind == k_Immediate && "Invalid access!");
    478     return Imm.Val;
    479   }
    480 
    481   unsigned getFPImm() const {
    482     assert(Kind == k_FPImmediate && "Invalid access!");
    483     return FPImm.Val;
    484   }
    485 
    486   unsigned getVectorIndex() const {
    487     assert(Kind == k_VectorIndex && "Invalid access!");
    488     return VectorIndex.Val;
    489   }
    490 
    491   ARM_MB::MemBOpt getMemBarrierOpt() const {
    492     assert(Kind == k_MemBarrierOpt && "Invalid access!");
    493     return MBOpt.Val;
    494   }
    495 
    496   ARM_PROC::IFlags getProcIFlags() const {
    497     assert(Kind == k_ProcIFlags && "Invalid access!");
    498     return IFlags.Val;
    499   }
    500 
    501   unsigned getMSRMask() const {
    502     assert(Kind == k_MSRMask && "Invalid access!");
    503     return MMask.Val;
    504   }
    505 
    506   bool isCoprocNum() const { return Kind == k_CoprocNum; }
    507   bool isCoprocReg() const { return Kind == k_CoprocReg; }
    508   bool isCoprocOption() const { return Kind == k_CoprocOption; }
    509   bool isCondCode() const { return Kind == k_CondCode; }
    510   bool isCCOut() const { return Kind == k_CCOut; }
    511   bool isITMask() const { return Kind == k_ITCondMask; }
    512   bool isITCondCode() const { return Kind == k_CondCode; }
    513   bool isImm() const { return Kind == k_Immediate; }
    514   bool isFPImm() const { return Kind == k_FPImmediate; }
    515   bool isImm8s4() const {
    516     if (Kind != k_Immediate)
    517       return false;
    518     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    519     if (!CE) return false;
    520     int64_t Value = CE->getValue();
    521     return ((Value & 3) == 0) && Value >= -1020 && Value <= 1020;
    522   }
    523   bool isImm0_1020s4() const {
    524     if (Kind != k_Immediate)
    525       return false;
    526     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    527     if (!CE) return false;
    528     int64_t Value = CE->getValue();
    529     return ((Value & 3) == 0) && Value >= 0 && Value <= 1020;
    530   }
    531   bool isImm0_508s4() const {
    532     if (Kind != k_Immediate)
    533       return false;
    534     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    535     if (!CE) return false;
    536     int64_t Value = CE->getValue();
    537     return ((Value & 3) == 0) && Value >= 0 && Value <= 508;
    538   }
    539   bool isImm0_255() const {
    540     if (Kind != k_Immediate)
    541       return false;
    542     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    543     if (!CE) return false;
    544     int64_t Value = CE->getValue();
    545     return Value >= 0 && Value < 256;
    546   }
    547   bool isImm0_7() const {
    548     if (Kind != k_Immediate)
    549       return false;
    550     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    551     if (!CE) return false;
    552     int64_t Value = CE->getValue();
    553     return Value >= 0 && Value < 8;
    554   }
    555   bool isImm0_15() const {
    556     if (Kind != k_Immediate)
    557       return false;
    558     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    559     if (!CE) return false;
    560     int64_t Value = CE->getValue();
    561     return Value >= 0 && Value < 16;
    562   }
    563   bool isImm0_31() const {
    564     if (Kind != k_Immediate)
    565       return false;
    566     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    567     if (!CE) return false;
    568     int64_t Value = CE->getValue();
    569     return Value >= 0 && Value < 32;
    570   }
    571   bool isImm1_16() const {
    572     if (Kind != k_Immediate)
    573       return false;
    574     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    575     if (!CE) return false;
    576     int64_t Value = CE->getValue();
    577     return Value > 0 && Value < 17;
    578   }
    579   bool isImm1_32() const {
    580     if (Kind != k_Immediate)
    581       return false;
    582     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    583     if (!CE) return false;
    584     int64_t Value = CE->getValue();
    585     return Value > 0 && Value < 33;
    586   }
    587   bool isImm0_65535() const {
    588     if (Kind != k_Immediate)
    589       return false;
    590     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    591     if (!CE) return false;
    592     int64_t Value = CE->getValue();
    593     return Value >= 0 && Value < 65536;
    594   }
    595   bool isImm0_65535Expr() const {
    596     if (Kind != k_Immediate)
    597       return false;
    598     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    599     // If it's not a constant expression, it'll generate a fixup and be
    600     // handled later.
    601     if (!CE) return true;
    602     int64_t Value = CE->getValue();
    603     return Value >= 0 && Value < 65536;
    604   }
    605   bool isImm24bit() const {
    606     if (Kind != k_Immediate)
    607       return false;
    608     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    609     if (!CE) return false;
    610     int64_t Value = CE->getValue();
    611     return Value >= 0 && Value <= 0xffffff;
    612   }
    613   bool isImmThumbSR() const {
    614     if (Kind != k_Immediate)
    615       return false;
    616     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    617     if (!CE) return false;
    618     int64_t Value = CE->getValue();
    619     return Value > 0 && Value < 33;
    620   }
    621   bool isPKHLSLImm() const {
    622     if (Kind != k_Immediate)
    623       return false;
    624     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    625     if (!CE) return false;
    626     int64_t Value = CE->getValue();
    627     return Value >= 0 && Value < 32;
    628   }
    629   bool isPKHASRImm() const {
    630     if (Kind != k_Immediate)
    631       return false;
    632     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    633     if (!CE) return false;
    634     int64_t Value = CE->getValue();
    635     return Value > 0 && Value <= 32;
    636   }
    637   bool isARMSOImm() const {
    638     if (Kind != k_Immediate)
    639       return false;
    640     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    641     if (!CE) return false;
    642     int64_t Value = CE->getValue();
    643     return ARM_AM::getSOImmVal(Value) != -1;
    644   }
    645   bool isT2SOImm() const {
    646     if (Kind != k_Immediate)
    647       return false;
    648     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    649     if (!CE) return false;
    650     int64_t Value = CE->getValue();
    651     return ARM_AM::getT2SOImmVal(Value) != -1;
    652   }
    653   bool isSetEndImm() const {
    654     if (Kind != k_Immediate)
    655       return false;
    656     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    657     if (!CE) return false;
    658     int64_t Value = CE->getValue();
    659     return Value == 1 || Value == 0;
    660   }
    661   bool isReg() const { return Kind == k_Register; }
    662   bool isRegList() const { return Kind == k_RegisterList; }
    663   bool isDPRRegList() const { return Kind == k_DPRRegisterList; }
    664   bool isSPRRegList() const { return Kind == k_SPRRegisterList; }
    665   bool isToken() const { return Kind == k_Token; }
    666   bool isMemBarrierOpt() const { return Kind == k_MemBarrierOpt; }
    667   bool isMemory() const { return Kind == k_Memory; }
    668   bool isShifterImm() const { return Kind == k_ShifterImmediate; }
    669   bool isRegShiftedReg() const { return Kind == k_ShiftedRegister; }
    670   bool isRegShiftedImm() const { return Kind == k_ShiftedImmediate; }
    671   bool isRotImm() const { return Kind == k_RotateImmediate; }
    672   bool isBitfield() const { return Kind == k_BitfieldDescriptor; }
    673   bool isPostIdxRegShifted() const { return Kind == k_PostIndexRegister; }
    674   bool isPostIdxReg() const {
    675     return Kind == k_PostIndexRegister && PostIdxReg.ShiftTy == ARM_AM::no_shift;
    676   }
    677   bool isMemNoOffset(bool alignOK = false) const {
    678     if (!isMemory())
    679       return false;
    680     // No offset of any kind.
    681     return Memory.OffsetRegNum == 0 && Memory.OffsetImm == 0 &&
    682      (alignOK || Memory.Alignment == 0);
    683   }
    684   bool isAlignedMemory() const {
    685     return isMemNoOffset(true);
    686   }
    687   bool isAddrMode2() const {
    688     if (!isMemory() || Memory.Alignment != 0) return false;
    689     // Check for register offset.
    690     if (Memory.OffsetRegNum) return true;
    691     // Immediate offset in range [-4095, 4095].
    692     if (!Memory.OffsetImm) return true;
    693     int64_t Val = Memory.OffsetImm->getValue();
    694     return Val > -4096 && Val < 4096;
    695   }
    696   bool isAM2OffsetImm() const {
    697     if (Kind != k_Immediate)
    698       return false;
    699     // Immediate offset in range [-4095, 4095].
    700     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    701     if (!CE) return false;
    702     int64_t Val = CE->getValue();
    703     return Val > -4096 && Val < 4096;
    704   }
    705   bool isAddrMode3() const {
    706     if (!isMemory() || Memory.Alignment != 0) return false;
    707     // No shifts are legal for AM3.
    708     if (Memory.ShiftType != ARM_AM::no_shift) return false;
    709     // Check for register offset.
    710     if (Memory.OffsetRegNum) return true;
    711     // Immediate offset in range [-255, 255].
    712     if (!Memory.OffsetImm) return true;
    713     int64_t Val = Memory.OffsetImm->getValue();
    714     return Val > -256 && Val < 256;
    715   }
    716   bool isAM3Offset() const {
    717     if (Kind != k_Immediate && Kind != k_PostIndexRegister)
    718       return false;
    719     if (Kind == k_PostIndexRegister)
    720       return PostIdxReg.ShiftTy == ARM_AM::no_shift;
    721     // Immediate offset in range [-255, 255].
    722     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    723     if (!CE) return false;
    724     int64_t Val = CE->getValue();
    725     // Special case, #-0 is INT32_MIN.
    726     return (Val > -256 && Val < 256) || Val == INT32_MIN;
    727   }
    728   bool isAddrMode5() const {
    729     if (!isMemory() || Memory.Alignment != 0) return false;
    730     // Check for register offset.
    731     if (Memory.OffsetRegNum) return false;
    732     // Immediate offset in range [-1020, 1020] and a multiple of 4.
    733     if (!Memory.OffsetImm) return true;
    734     int64_t Val = Memory.OffsetImm->getValue();
    735     return (Val >= -1020 && Val <= 1020 && ((Val & 3) == 0)) ||
    736            Val == INT32_MIN;
    737   }
    738   bool isMemTBB() const {
    739     if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
    740         Memory.ShiftType != ARM_AM::no_shift || Memory.Alignment != 0)
    741       return false;
    742     return true;
    743   }
    744   bool isMemTBH() const {
    745     if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
    746         Memory.ShiftType != ARM_AM::lsl || Memory.ShiftImm != 1 ||
    747         Memory.Alignment != 0 )
    748       return false;
    749     return true;
    750   }
    751   bool isMemRegOffset() const {
    752     if (!isMemory() || !Memory.OffsetRegNum || Memory.Alignment != 0)
    753       return false;
    754     return true;
    755   }
    756   bool isT2MemRegOffset() const {
    757     if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
    758         Memory.Alignment != 0)
    759       return false;
    760     // Only lsl #{0, 1, 2, 3} allowed.
    761     if (Memory.ShiftType == ARM_AM::no_shift)
    762       return true;
    763     if (Memory.ShiftType != ARM_AM::lsl || Memory.ShiftImm > 3)
    764       return false;
    765     return true;
    766   }
    767   bool isMemThumbRR() const {
    768     // Thumb reg+reg addressing is simple. Just two registers, a base and
    769     // an offset. No shifts, negations or any other complicating factors.
    770     if (!isMemory() || !Memory.OffsetRegNum || Memory.isNegative ||
    771         Memory.ShiftType != ARM_AM::no_shift || Memory.Alignment != 0)
    772       return false;
    773     return isARMLowRegister(Memory.BaseRegNum) &&
    774       (!Memory.OffsetRegNum || isARMLowRegister(Memory.OffsetRegNum));
    775   }
    776   bool isMemThumbRIs4() const {
    777     if (!isMemory() || Memory.OffsetRegNum != 0 ||
    778         !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0)
    779       return false;
    780     // Immediate offset, multiple of 4 in range [0, 124].
    781     if (!Memory.OffsetImm) return true;
    782     int64_t Val = Memory.OffsetImm->getValue();
    783     return Val >= 0 && Val <= 124 && (Val % 4) == 0;
    784   }
    785   bool isMemThumbRIs2() const {
    786     if (!isMemory() || Memory.OffsetRegNum != 0 ||
    787         !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0)
    788       return false;
    789     // Immediate offset, multiple of 4 in range [0, 62].
    790     if (!Memory.OffsetImm) return true;
    791     int64_t Val = Memory.OffsetImm->getValue();
    792     return Val >= 0 && Val <= 62 && (Val % 2) == 0;
    793   }
    794   bool isMemThumbRIs1() const {
    795     if (!isMemory() || Memory.OffsetRegNum != 0 ||
    796         !isARMLowRegister(Memory.BaseRegNum) || Memory.Alignment != 0)
    797       return false;
    798     // Immediate offset in range [0, 31].
    799     if (!Memory.OffsetImm) return true;
    800     int64_t Val = Memory.OffsetImm->getValue();
    801     return Val >= 0 && Val <= 31;
    802   }
    803   bool isMemThumbSPI() const {
    804     if (!isMemory() || Memory.OffsetRegNum != 0 ||
    805         Memory.BaseRegNum != ARM::SP || Memory.Alignment != 0)
    806       return false;
    807     // Immediate offset, multiple of 4 in range [0, 1020].
    808     if (!Memory.OffsetImm) return true;
    809     int64_t Val = Memory.OffsetImm->getValue();
    810     return Val >= 0 && Val <= 1020 && (Val % 4) == 0;
    811   }
    812   bool isMemImm8s4Offset() const {
    813     if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
    814       return false;
    815     // Immediate offset a multiple of 4 in range [-1020, 1020].
    816     if (!Memory.OffsetImm) return true;
    817     int64_t Val = Memory.OffsetImm->getValue();
    818     return Val >= -1020 && Val <= 1020 && (Val & 3) == 0;
    819   }
    820   bool isMemImm0_1020s4Offset() const {
    821     if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
    822       return false;
    823     // Immediate offset a multiple of 4 in range [0, 1020].
    824     if (!Memory.OffsetImm) return true;
    825     int64_t Val = Memory.OffsetImm->getValue();
    826     return Val >= 0 && Val <= 1020 && (Val & 3) == 0;
    827   }
    828   bool isMemImm8Offset() const {
    829     if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
    830       return false;
    831     // Immediate offset in range [-255, 255].
    832     if (!Memory.OffsetImm) return true;
    833     int64_t Val = Memory.OffsetImm->getValue();
    834     return (Val == INT32_MIN) || (Val > -256 && Val < 256);
    835   }
    836   bool isMemPosImm8Offset() const {
    837     if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
    838       return false;
    839     // Immediate offset in range [0, 255].
    840     if (!Memory.OffsetImm) return true;
    841     int64_t Val = Memory.OffsetImm->getValue();
    842     return Val >= 0 && Val < 256;
    843   }
    844   bool isMemNegImm8Offset() const {
    845     if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
    846       return false;
    847     // Immediate offset in range [-255, -1].
    848     if (!Memory.OffsetImm) return true;
    849     int64_t Val = Memory.OffsetImm->getValue();
    850     return Val > -256 && Val < 0;
    851   }
    852   bool isMemUImm12Offset() const {
    853     // If we have an immediate that's not a constant, treat it as a label
    854     // reference needing a fixup. If it is a constant, it's something else
    855     // and we reject it.
    856     if (Kind == k_Immediate && !isa<MCConstantExpr>(getImm()))
    857       return true;
    858 
    859     if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
    860       return false;
    861     // Immediate offset in range [0, 4095].
    862     if (!Memory.OffsetImm) return true;
    863     int64_t Val = Memory.OffsetImm->getValue();
    864     return (Val >= 0 && Val < 4096);
    865   }
    866   bool isMemImm12Offset() const {
    867     // If we have an immediate that's not a constant, treat it as a label
    868     // reference needing a fixup. If it is a constant, it's something else
    869     // and we reject it.
    870     if (Kind == k_Immediate && !isa<MCConstantExpr>(getImm()))
    871       return true;
    872 
    873     if (!isMemory() || Memory.OffsetRegNum != 0 || Memory.Alignment != 0)
    874       return false;
    875     // Immediate offset in range [-4095, 4095].
    876     if (!Memory.OffsetImm) return true;
    877     int64_t Val = Memory.OffsetImm->getValue();
    878     return (Val > -4096 && Val < 4096) || (Val == INT32_MIN);
    879   }
    880   bool isPostIdxImm8() const {
    881     if (Kind != k_Immediate)
    882       return false;
    883     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    884     if (!CE) return false;
    885     int64_t Val = CE->getValue();
    886     return (Val > -256 && Val < 256) || (Val == INT32_MIN);
    887   }
    888   bool isPostIdxImm8s4() const {
    889     if (Kind != k_Immediate)
    890       return false;
    891     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    892     if (!CE) return false;
    893     int64_t Val = CE->getValue();
    894     return ((Val & 3) == 0 && Val >= -1020 && Val <= 1020) ||
    895       (Val == INT32_MIN);
    896   }
    897 
    898   bool isMSRMask() const { return Kind == k_MSRMask; }
    899   bool isProcIFlags() const { return Kind == k_ProcIFlags; }
    900 
    901   bool isVectorIndex8() const {
    902     if (Kind != k_VectorIndex) return false;
    903     return VectorIndex.Val < 8;
    904   }
    905   bool isVectorIndex16() const {
    906     if (Kind != k_VectorIndex) return false;
    907     return VectorIndex.Val < 4;
    908   }
    909   bool isVectorIndex32() const {
    910     if (Kind != k_VectorIndex) return false;
    911     return VectorIndex.Val < 2;
    912   }
    913 
    914 
    915 
    916   void addExpr(MCInst &Inst, const MCExpr *Expr) const {
    917     // Add as immediates when possible.  Null MCExpr = 0.
    918     if (Expr == 0)
    919       Inst.addOperand(MCOperand::CreateImm(0));
    920     else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
    921       Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
    922     else
    923       Inst.addOperand(MCOperand::CreateExpr(Expr));
    924   }
    925 
    926   void addCondCodeOperands(MCInst &Inst, unsigned N) const {
    927     assert(N == 2 && "Invalid number of operands!");
    928     Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode())));
    929     unsigned RegNum = getCondCode() == ARMCC::AL ? 0: ARM::CPSR;
    930     Inst.addOperand(MCOperand::CreateReg(RegNum));
    931   }
    932 
    933   void addCoprocNumOperands(MCInst &Inst, unsigned N) const {
    934     assert(N == 1 && "Invalid number of operands!");
    935     Inst.addOperand(MCOperand::CreateImm(getCoproc()));
    936   }
    937 
    938   void addCoprocRegOperands(MCInst &Inst, unsigned N) const {
    939     assert(N == 1 && "Invalid number of operands!");
    940     Inst.addOperand(MCOperand::CreateImm(getCoproc()));
    941   }
    942 
    943   void addCoprocOptionOperands(MCInst &Inst, unsigned N) const {
    944     assert(N == 1 && "Invalid number of operands!");
    945     Inst.addOperand(MCOperand::CreateImm(CoprocOption.Val));
    946   }
    947 
    948   void addITMaskOperands(MCInst &Inst, unsigned N) const {
    949     assert(N == 1 && "Invalid number of operands!");
    950     Inst.addOperand(MCOperand::CreateImm(ITMask.Mask));
    951   }
    952 
    953   void addITCondCodeOperands(MCInst &Inst, unsigned N) const {
    954     assert(N == 1 && "Invalid number of operands!");
    955     Inst.addOperand(MCOperand::CreateImm(unsigned(getCondCode())));
    956   }
    957 
    958   void addCCOutOperands(MCInst &Inst, unsigned N) const {
    959     assert(N == 1 && "Invalid number of operands!");
    960     Inst.addOperand(MCOperand::CreateReg(getReg()));
    961   }
    962 
    963   void addRegOperands(MCInst &Inst, unsigned N) const {
    964     assert(N == 1 && "Invalid number of operands!");
    965     Inst.addOperand(MCOperand::CreateReg(getReg()));
    966   }
    967 
    968   void addRegShiftedRegOperands(MCInst &Inst, unsigned N) const {
    969     assert(N == 3 && "Invalid number of operands!");
    970     assert(isRegShiftedReg() && "addRegShiftedRegOperands() on non RegShiftedReg!");
    971     Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.SrcReg));
    972     Inst.addOperand(MCOperand::CreateReg(RegShiftedReg.ShiftReg));
    973     Inst.addOperand(MCOperand::CreateImm(
    974       ARM_AM::getSORegOpc(RegShiftedReg.ShiftTy, RegShiftedReg.ShiftImm)));
    975   }
    976 
    977   void addRegShiftedImmOperands(MCInst &Inst, unsigned N) const {
    978     assert(N == 2 && "Invalid number of operands!");
    979     assert(isRegShiftedImm() && "addRegShiftedImmOperands() on non RegShiftedImm!");
    980     Inst.addOperand(MCOperand::CreateReg(RegShiftedImm.SrcReg));
    981     Inst.addOperand(MCOperand::CreateImm(
    982       ARM_AM::getSORegOpc(RegShiftedImm.ShiftTy, RegShiftedImm.ShiftImm)));
    983   }
    984 
    985   void addShifterImmOperands(MCInst &Inst, unsigned N) const {
    986     assert(N == 1 && "Invalid number of operands!");
    987     Inst.addOperand(MCOperand::CreateImm((ShifterImm.isASR << 5) |
    988                                          ShifterImm.Imm));
    989   }
    990 
    991   void addRegListOperands(MCInst &Inst, unsigned N) const {
    992     assert(N == 1 && "Invalid number of operands!");
    993     const SmallVectorImpl<unsigned> &RegList = getRegList();
    994     for (SmallVectorImpl<unsigned>::const_iterator
    995            I = RegList.begin(), E = RegList.end(); I != E; ++I)
    996       Inst.addOperand(MCOperand::CreateReg(*I));
    997   }
    998 
    999   void addDPRRegListOperands(MCInst &Inst, unsigned N) const {
   1000     addRegListOperands(Inst, N);
   1001   }
   1002 
   1003   void addSPRRegListOperands(MCInst &Inst, unsigned N) const {
   1004     addRegListOperands(Inst, N);
   1005   }
   1006 
   1007   void addRotImmOperands(MCInst &Inst, unsigned N) const {
   1008     assert(N == 1 && "Invalid number of operands!");
   1009     // Encoded as val>>3. The printer handles display as 8, 16, 24.
   1010     Inst.addOperand(MCOperand::CreateImm(RotImm.Imm >> 3));
   1011   }
   1012 
   1013   void addBitfieldOperands(MCInst &Inst, unsigned N) const {
   1014     assert(N == 1 && "Invalid number of operands!");
   1015     // Munge the lsb/width into a bitfield mask.
   1016     unsigned lsb = Bitfield.LSB;
   1017     unsigned width = Bitfield.Width;
   1018     // Make a 32-bit mask w/ the referenced bits clear and all other bits set.
   1019     uint32_t Mask = ~(((uint32_t)0xffffffff >> lsb) << (32 - width) >>
   1020                       (32 - (lsb + width)));
   1021     Inst.addOperand(MCOperand::CreateImm(Mask));
   1022   }
   1023 
   1024   void addImmOperands(MCInst &Inst, unsigned N) const {
   1025     assert(N == 1 && "Invalid number of operands!");
   1026     addExpr(Inst, getImm());
   1027   }
   1028 
   1029   void addFPImmOperands(MCInst &Inst, unsigned N) const {
   1030     assert(N == 1 && "Invalid number of operands!");
   1031     Inst.addOperand(MCOperand::CreateImm(getFPImm()));
   1032   }
   1033 
   1034   void addImm8s4Operands(MCInst &Inst, unsigned N) const {
   1035     assert(N == 1 && "Invalid number of operands!");
   1036     // FIXME: We really want to scale the value here, but the LDRD/STRD
   1037     // instruction don't encode operands that way yet.
   1038     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1039     Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
   1040   }
   1041 
   1042   void addImm0_1020s4Operands(MCInst &Inst, unsigned N) const {
   1043     assert(N == 1 && "Invalid number of operands!");
   1044     // The immediate is scaled by four in the encoding and is stored
   1045     // in the MCInst as such. Lop off the low two bits here.
   1046     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1047     Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4));
   1048   }
   1049 
   1050   void addImm0_508s4Operands(MCInst &Inst, unsigned N) const {
   1051     assert(N == 1 && "Invalid number of operands!");
   1052     // The immediate is scaled by four in the encoding and is stored
   1053     // in the MCInst as such. Lop off the low two bits here.
   1054     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1055     Inst.addOperand(MCOperand::CreateImm(CE->getValue() / 4));
   1056   }
   1057 
   1058   void addImm0_255Operands(MCInst &Inst, unsigned N) const {
   1059     assert(N == 1 && "Invalid number of operands!");
   1060     addExpr(Inst, getImm());
   1061   }
   1062 
   1063   void addImm0_7Operands(MCInst &Inst, unsigned N) const {
   1064     assert(N == 1 && "Invalid number of operands!");
   1065     addExpr(Inst, getImm());
   1066   }
   1067 
   1068   void addImm0_15Operands(MCInst &Inst, unsigned N) const {
   1069     assert(N == 1 && "Invalid number of operands!");
   1070     addExpr(Inst, getImm());
   1071   }
   1072 
   1073   void addImm0_31Operands(MCInst &Inst, unsigned N) const {
   1074     assert(N == 1 && "Invalid number of operands!");
   1075     addExpr(Inst, getImm());
   1076   }
   1077 
   1078   void addImm1_16Operands(MCInst &Inst, unsigned N) const {
   1079     assert(N == 1 && "Invalid number of operands!");
   1080     // The constant encodes as the immediate-1, and we store in the instruction
   1081     // the bits as encoded, so subtract off one here.
   1082     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1083     Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1));
   1084   }
   1085 
   1086   void addImm1_32Operands(MCInst &Inst, unsigned N) const {
   1087     assert(N == 1 && "Invalid number of operands!");
   1088     // The constant encodes as the immediate-1, and we store in the instruction
   1089     // the bits as encoded, so subtract off one here.
   1090     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1091     Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1));
   1092   }
   1093 
   1094   void addImm0_65535Operands(MCInst &Inst, unsigned N) const {
   1095     assert(N == 1 && "Invalid number of operands!");
   1096     addExpr(Inst, getImm());
   1097   }
   1098 
   1099   void addImm0_65535ExprOperands(MCInst &Inst, unsigned N) const {
   1100     assert(N == 1 && "Invalid number of operands!");
   1101     addExpr(Inst, getImm());
   1102   }
   1103 
   1104   void addImm24bitOperands(MCInst &Inst, unsigned N) const {
   1105     assert(N == 1 && "Invalid number of operands!");
   1106     addExpr(Inst, getImm());
   1107   }
   1108 
   1109   void addImmThumbSROperands(MCInst &Inst, unsigned N) const {
   1110     assert(N == 1 && "Invalid number of operands!");
   1111     // The constant encodes as the immediate, except for 32, which encodes as
   1112     // zero.
   1113     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1114     unsigned Imm = CE->getValue();
   1115     Inst.addOperand(MCOperand::CreateImm((Imm == 32 ? 0 : Imm)));
   1116   }
   1117 
   1118   void addPKHLSLImmOperands(MCInst &Inst, unsigned N) const {
   1119     assert(N == 1 && "Invalid number of operands!");
   1120     addExpr(Inst, getImm());
   1121   }
   1122 
   1123   void addPKHASRImmOperands(MCInst &Inst, unsigned N) const {
   1124     assert(N == 1 && "Invalid number of operands!");
   1125     // An ASR value of 32 encodes as 0, so that's how we want to add it to
   1126     // the instruction as well.
   1127     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1128     int Val = CE->getValue();
   1129     Inst.addOperand(MCOperand::CreateImm(Val == 32 ? 0 : Val));
   1130   }
   1131 
   1132   void addARMSOImmOperands(MCInst &Inst, unsigned N) const {
   1133     assert(N == 1 && "Invalid number of operands!");
   1134     addExpr(Inst, getImm());
   1135   }
   1136 
   1137   void addT2SOImmOperands(MCInst &Inst, unsigned N) const {
   1138     assert(N == 1 && "Invalid number of operands!");
   1139     addExpr(Inst, getImm());
   1140   }
   1141 
   1142   void addSetEndImmOperands(MCInst &Inst, unsigned N) const {
   1143     assert(N == 1 && "Invalid number of operands!");
   1144     addExpr(Inst, getImm());
   1145   }
   1146 
   1147   void addMemBarrierOptOperands(MCInst &Inst, unsigned N) const {
   1148     assert(N == 1 && "Invalid number of operands!");
   1149     Inst.addOperand(MCOperand::CreateImm(unsigned(getMemBarrierOpt())));
   1150   }
   1151 
   1152   void addMemNoOffsetOperands(MCInst &Inst, unsigned N) const {
   1153     assert(N == 1 && "Invalid number of operands!");
   1154     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1155   }
   1156 
   1157   void addAlignedMemoryOperands(MCInst &Inst, unsigned N) const {
   1158     assert(N == 2 && "Invalid number of operands!");
   1159     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1160     Inst.addOperand(MCOperand::CreateImm(Memory.Alignment));
   1161   }
   1162 
   1163   void addAddrMode2Operands(MCInst &Inst, unsigned N) const {
   1164     assert(N == 3 && "Invalid number of operands!");
   1165     int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
   1166     if (!Memory.OffsetRegNum) {
   1167       ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
   1168       // Special case for #-0
   1169       if (Val == INT32_MIN) Val = 0;
   1170       if (Val < 0) Val = -Val;
   1171       Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift);
   1172     } else {
   1173       // For register offset, we encode the shift type and negation flag
   1174       // here.
   1175       Val = ARM_AM::getAM2Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add,
   1176                               Memory.ShiftImm, Memory.ShiftType);
   1177     }
   1178     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1179     Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
   1180     Inst.addOperand(MCOperand::CreateImm(Val));
   1181   }
   1182 
   1183   void addAM2OffsetImmOperands(MCInst &Inst, unsigned N) const {
   1184     assert(N == 2 && "Invalid number of operands!");
   1185     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1186     assert(CE && "non-constant AM2OffsetImm operand!");
   1187     int32_t Val = CE->getValue();
   1188     ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
   1189     // Special case for #-0
   1190     if (Val == INT32_MIN) Val = 0;
   1191     if (Val < 0) Val = -Val;
   1192     Val = ARM_AM::getAM2Opc(AddSub, Val, ARM_AM::no_shift);
   1193     Inst.addOperand(MCOperand::CreateReg(0));
   1194     Inst.addOperand(MCOperand::CreateImm(Val));
   1195   }
   1196 
   1197   void addAddrMode3Operands(MCInst &Inst, unsigned N) const {
   1198     assert(N == 3 && "Invalid number of operands!");
   1199     int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
   1200     if (!Memory.OffsetRegNum) {
   1201       ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
   1202       // Special case for #-0
   1203       if (Val == INT32_MIN) Val = 0;
   1204       if (Val < 0) Val = -Val;
   1205       Val = ARM_AM::getAM3Opc(AddSub, Val);
   1206     } else {
   1207       // For register offset, we encode the shift type and negation flag
   1208       // here.
   1209       Val = ARM_AM::getAM3Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add, 0);
   1210     }
   1211     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1212     Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
   1213     Inst.addOperand(MCOperand::CreateImm(Val));
   1214   }
   1215 
   1216   void addAM3OffsetOperands(MCInst &Inst, unsigned N) const {
   1217     assert(N == 2 && "Invalid number of operands!");
   1218     if (Kind == k_PostIndexRegister) {
   1219       int32_t Val =
   1220         ARM_AM::getAM3Opc(PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub, 0);
   1221       Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
   1222       Inst.addOperand(MCOperand::CreateImm(Val));
   1223       return;
   1224     }
   1225 
   1226     // Constant offset.
   1227     const MCConstantExpr *CE = static_cast<const MCConstantExpr*>(getImm());
   1228     int32_t Val = CE->getValue();
   1229     ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
   1230     // Special case for #-0
   1231     if (Val == INT32_MIN) Val = 0;
   1232     if (Val < 0) Val = -Val;
   1233     Val = ARM_AM::getAM3Opc(AddSub, Val);
   1234     Inst.addOperand(MCOperand::CreateReg(0));
   1235     Inst.addOperand(MCOperand::CreateImm(Val));
   1236   }
   1237 
   1238   void addAddrMode5Operands(MCInst &Inst, unsigned N) const {
   1239     assert(N == 2 && "Invalid number of operands!");
   1240     // The lower two bits are always zero and as such are not encoded.
   1241     int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() / 4 : 0;
   1242     ARM_AM::AddrOpc AddSub = Val < 0 ? ARM_AM::sub : ARM_AM::add;
   1243     // Special case for #-0
   1244     if (Val == INT32_MIN) Val = 0;
   1245     if (Val < 0) Val = -Val;
   1246     Val = ARM_AM::getAM5Opc(AddSub, Val);
   1247     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1248     Inst.addOperand(MCOperand::CreateImm(Val));
   1249   }
   1250 
   1251   void addMemImm8s4OffsetOperands(MCInst &Inst, unsigned N) const {
   1252     assert(N == 2 && "Invalid number of operands!");
   1253     int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
   1254     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1255     Inst.addOperand(MCOperand::CreateImm(Val));
   1256   }
   1257 
   1258   void addMemImm0_1020s4OffsetOperands(MCInst &Inst, unsigned N) const {
   1259     assert(N == 2 && "Invalid number of operands!");
   1260     // The lower two bits are always zero and as such are not encoded.
   1261     int32_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() / 4 : 0;
   1262     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1263     Inst.addOperand(MCOperand::CreateImm(Val));
   1264   }
   1265 
   1266   void addMemImm8OffsetOperands(MCInst &Inst, unsigned N) const {
   1267     assert(N == 2 && "Invalid number of operands!");
   1268     int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
   1269     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1270     Inst.addOperand(MCOperand::CreateImm(Val));
   1271   }
   1272 
   1273   void addMemPosImm8OffsetOperands(MCInst &Inst, unsigned N) const {
   1274     addMemImm8OffsetOperands(Inst, N);
   1275   }
   1276 
   1277   void addMemNegImm8OffsetOperands(MCInst &Inst, unsigned N) const {
   1278     addMemImm8OffsetOperands(Inst, N);
   1279   }
   1280 
   1281   void addMemUImm12OffsetOperands(MCInst &Inst, unsigned N) const {
   1282     assert(N == 2 && "Invalid number of operands!");
   1283     // If this is an immediate, it's a label reference.
   1284     if (Kind == k_Immediate) {
   1285       addExpr(Inst, getImm());
   1286       Inst.addOperand(MCOperand::CreateImm(0));
   1287       return;
   1288     }
   1289 
   1290     // Otherwise, it's a normal memory reg+offset.
   1291     int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
   1292     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1293     Inst.addOperand(MCOperand::CreateImm(Val));
   1294   }
   1295 
   1296   void addMemImm12OffsetOperands(MCInst &Inst, unsigned N) const {
   1297     assert(N == 2 && "Invalid number of operands!");
   1298     // If this is an immediate, it's a label reference.
   1299     if (Kind == k_Immediate) {
   1300       addExpr(Inst, getImm());
   1301       Inst.addOperand(MCOperand::CreateImm(0));
   1302       return;
   1303     }
   1304 
   1305     // Otherwise, it's a normal memory reg+offset.
   1306     int64_t Val = Memory.OffsetImm ? Memory.OffsetImm->getValue() : 0;
   1307     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1308     Inst.addOperand(MCOperand::CreateImm(Val));
   1309   }
   1310 
   1311   void addMemTBBOperands(MCInst &Inst, unsigned N) const {
   1312     assert(N == 2 && "Invalid number of operands!");
   1313     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1314     Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
   1315   }
   1316 
   1317   void addMemTBHOperands(MCInst &Inst, unsigned N) const {
   1318     assert(N == 2 && "Invalid number of operands!");
   1319     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1320     Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
   1321   }
   1322 
   1323   void addMemRegOffsetOperands(MCInst &Inst, unsigned N) const {
   1324     assert(N == 3 && "Invalid number of operands!");
   1325     unsigned Val = ARM_AM::getAM2Opc(Memory.isNegative ? ARM_AM::sub : ARM_AM::add,
   1326                                      Memory.ShiftImm, Memory.ShiftType);
   1327     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1328     Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
   1329     Inst.addOperand(MCOperand::CreateImm(Val));
   1330   }
   1331 
   1332   void addT2MemRegOffsetOperands(MCInst &Inst, unsigned N) const {
   1333     assert(N == 3 && "Invalid number of operands!");
   1334     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1335     Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
   1336     Inst.addOperand(MCOperand::CreateImm(Memory.ShiftImm));
   1337   }
   1338 
   1339   void addMemThumbRROperands(MCInst &Inst, unsigned N) const {
   1340     assert(N == 2 && "Invalid number of operands!");
   1341     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1342     Inst.addOperand(MCOperand::CreateReg(Memory.OffsetRegNum));
   1343   }
   1344 
   1345   void addMemThumbRIs4Operands(MCInst &Inst, unsigned N) const {
   1346     assert(N == 2 && "Invalid number of operands!");
   1347     int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 4) : 0;
   1348     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1349     Inst.addOperand(MCOperand::CreateImm(Val));
   1350   }
   1351 
   1352   void addMemThumbRIs2Operands(MCInst &Inst, unsigned N) const {
   1353     assert(N == 2 && "Invalid number of operands!");
   1354     int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 2) : 0;
   1355     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1356     Inst.addOperand(MCOperand::CreateImm(Val));
   1357   }
   1358 
   1359   void addMemThumbRIs1Operands(MCInst &Inst, unsigned N) const {
   1360     assert(N == 2 && "Invalid number of operands!");
   1361     int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue()) : 0;
   1362     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1363     Inst.addOperand(MCOperand::CreateImm(Val));
   1364   }
   1365 
   1366   void addMemThumbSPIOperands(MCInst &Inst, unsigned N) const {
   1367     assert(N == 2 && "Invalid number of operands!");
   1368     int64_t Val = Memory.OffsetImm ? (Memory.OffsetImm->getValue() / 4) : 0;
   1369     Inst.addOperand(MCOperand::CreateReg(Memory.BaseRegNum));
   1370     Inst.addOperand(MCOperand::CreateImm(Val));
   1371   }
   1372 
   1373   void addPostIdxImm8Operands(MCInst &Inst, unsigned N) const {
   1374     assert(N == 1 && "Invalid number of operands!");
   1375     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1376     assert(CE && "non-constant post-idx-imm8 operand!");
   1377     int Imm = CE->getValue();
   1378     bool isAdd = Imm >= 0;
   1379     if (Imm == INT32_MIN) Imm = 0;
   1380     Imm = (Imm < 0 ? -Imm : Imm) | (int)isAdd << 8;
   1381     Inst.addOperand(MCOperand::CreateImm(Imm));
   1382   }
   1383 
   1384   void addPostIdxImm8s4Operands(MCInst &Inst, unsigned N) const {
   1385     assert(N == 1 && "Invalid number of operands!");
   1386     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
   1387     assert(CE && "non-constant post-idx-imm8s4 operand!");
   1388     int Imm = CE->getValue();
   1389     bool isAdd = Imm >= 0;
   1390     if (Imm == INT32_MIN) Imm = 0;
   1391     // Immediate is scaled by 4.
   1392     Imm = ((Imm < 0 ? -Imm : Imm) / 4) | (int)isAdd << 8;
   1393     Inst.addOperand(MCOperand::CreateImm(Imm));
   1394   }
   1395 
   1396   void addPostIdxRegOperands(MCInst &Inst, unsigned N) const {
   1397     assert(N == 2 && "Invalid number of operands!");
   1398     Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
   1399     Inst.addOperand(MCOperand::CreateImm(PostIdxReg.isAdd));
   1400   }
   1401 
   1402   void addPostIdxRegShiftedOperands(MCInst &Inst, unsigned N) const {
   1403     assert(N == 2 && "Invalid number of operands!");
   1404     Inst.addOperand(MCOperand::CreateReg(PostIdxReg.RegNum));
   1405     // The sign, shift type, and shift amount are encoded in a single operand
   1406     // using the AM2 encoding helpers.
   1407     ARM_AM::AddrOpc opc = PostIdxReg.isAdd ? ARM_AM::add : ARM_AM::sub;
   1408     unsigned Imm = ARM_AM::getAM2Opc(opc, PostIdxReg.ShiftImm,
   1409                                      PostIdxReg.ShiftTy);
   1410     Inst.addOperand(MCOperand::CreateImm(Imm));
   1411   }
   1412 
   1413   void addMSRMaskOperands(MCInst &Inst, unsigned N) const {
   1414     assert(N == 1 && "Invalid number of operands!");
   1415     Inst.addOperand(MCOperand::CreateImm(unsigned(getMSRMask())));
   1416   }
   1417 
   1418   void addProcIFlagsOperands(MCInst &Inst, unsigned N) const {
   1419     assert(N == 1 && "Invalid number of operands!");
   1420     Inst.addOperand(MCOperand::CreateImm(unsigned(getProcIFlags())));
   1421   }
   1422 
   1423   void addVectorIndex8Operands(MCInst &Inst, unsigned N) const {
   1424     assert(N == 1 && "Invalid number of operands!");
   1425     Inst.addOperand(MCOperand::CreateImm(getVectorIndex()));
   1426   }
   1427 
   1428   void addVectorIndex16Operands(MCInst &Inst, unsigned N) const {
   1429     assert(N == 1 && "Invalid number of operands!");
   1430     Inst.addOperand(MCOperand::CreateImm(getVectorIndex()));
   1431   }
   1432 
   1433   void addVectorIndex32Operands(MCInst &Inst, unsigned N) const {
   1434     assert(N == 1 && "Invalid number of operands!");
   1435     Inst.addOperand(MCOperand::CreateImm(getVectorIndex()));
   1436   }
   1437 
   1438   virtual void print(raw_ostream &OS) const;
   1439 
   1440   static ARMOperand *CreateITMask(unsigned Mask, SMLoc S) {
   1441     ARMOperand *Op = new ARMOperand(k_ITCondMask);
   1442     Op->ITMask.Mask = Mask;
   1443     Op->StartLoc = S;
   1444     Op->EndLoc = S;
   1445     return Op;
   1446   }
   1447 
   1448   static ARMOperand *CreateCondCode(ARMCC::CondCodes CC, SMLoc S) {
   1449     ARMOperand *Op = new ARMOperand(k_CondCode);
   1450     Op->CC.Val = CC;
   1451     Op->StartLoc = S;
   1452     Op->EndLoc = S;
   1453     return Op;
   1454   }
   1455 
   1456   static ARMOperand *CreateCoprocNum(unsigned CopVal, SMLoc S) {
   1457     ARMOperand *Op = new ARMOperand(k_CoprocNum);
   1458     Op->Cop.Val = CopVal;
   1459     Op->StartLoc = S;
   1460     Op->EndLoc = S;
   1461     return Op;
   1462   }
   1463 
   1464   static ARMOperand *CreateCoprocReg(unsigned CopVal, SMLoc S) {
   1465     ARMOperand *Op = new ARMOperand(k_CoprocReg);
   1466     Op->Cop.Val = CopVal;
   1467     Op->StartLoc = S;
   1468     Op->EndLoc = S;
   1469     return Op;
   1470   }
   1471 
   1472   static ARMOperand *CreateCoprocOption(unsigned Val, SMLoc S, SMLoc E) {
   1473     ARMOperand *Op = new ARMOperand(k_CoprocOption);
   1474     Op->Cop.Val = Val;
   1475     Op->StartLoc = S;
   1476     Op->EndLoc = E;
   1477     return Op;
   1478   }
   1479 
   1480   static ARMOperand *CreateCCOut(unsigned RegNum, SMLoc S) {
   1481     ARMOperand *Op = new ARMOperand(k_CCOut);
   1482     Op->Reg.RegNum = RegNum;
   1483     Op->StartLoc = S;
   1484     Op->EndLoc = S;
   1485     return Op;
   1486   }
   1487 
   1488   static ARMOperand *CreateToken(StringRef Str, SMLoc S) {
   1489     ARMOperand *Op = new ARMOperand(k_Token);
   1490     Op->Tok.Data = Str.data();
   1491     Op->Tok.Length = Str.size();
   1492     Op->StartLoc = S;
   1493     Op->EndLoc = S;
   1494     return Op;
   1495   }
   1496 
   1497   static ARMOperand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) {
   1498     ARMOperand *Op = new ARMOperand(k_Register);
   1499     Op->Reg.RegNum = RegNum;
   1500     Op->StartLoc = S;
   1501     Op->EndLoc = E;
   1502     return Op;
   1503   }
   1504 
   1505   static ARMOperand *CreateShiftedRegister(ARM_AM::ShiftOpc ShTy,
   1506                                            unsigned SrcReg,
   1507                                            unsigned ShiftReg,
   1508                                            unsigned ShiftImm,
   1509                                            SMLoc S, SMLoc E) {
   1510     ARMOperand *Op = new ARMOperand(k_ShiftedRegister);
   1511     Op->RegShiftedReg.ShiftTy = ShTy;
   1512     Op->RegShiftedReg.SrcReg = SrcReg;
   1513     Op->RegShiftedReg.ShiftReg = ShiftReg;
   1514     Op->RegShiftedReg.ShiftImm = ShiftImm;
   1515     Op->StartLoc = S;
   1516     Op->EndLoc = E;
   1517     return Op;
   1518   }
   1519 
   1520   static ARMOperand *CreateShiftedImmediate(ARM_AM::ShiftOpc ShTy,
   1521                                             unsigned SrcReg,
   1522                                             unsigned ShiftImm,
   1523                                             SMLoc S, SMLoc E) {
   1524     ARMOperand *Op = new ARMOperand(k_ShiftedImmediate);
   1525     Op->RegShiftedImm.ShiftTy = ShTy;
   1526     Op->RegShiftedImm.SrcReg = SrcReg;
   1527     Op->RegShiftedImm.ShiftImm = ShiftImm;
   1528     Op->StartLoc = S;
   1529     Op->EndLoc = E;
   1530     return Op;
   1531   }
   1532 
   1533   static ARMOperand *CreateShifterImm(bool isASR, unsigned Imm,
   1534                                    SMLoc S, SMLoc E) {
   1535     ARMOperand *Op = new ARMOperand(k_ShifterImmediate);
   1536     Op->ShifterImm.isASR = isASR;
   1537     Op->ShifterImm.Imm = Imm;
   1538     Op->StartLoc = S;
   1539     Op->EndLoc = E;
   1540     return Op;
   1541   }
   1542 
   1543   static ARMOperand *CreateRotImm(unsigned Imm, SMLoc S, SMLoc E) {
   1544     ARMOperand *Op = new ARMOperand(k_RotateImmediate);
   1545     Op->RotImm.Imm = Imm;
   1546     Op->StartLoc = S;
   1547     Op->EndLoc = E;
   1548     return Op;
   1549   }
   1550 
   1551   static ARMOperand *CreateBitfield(unsigned LSB, unsigned Width,
   1552                                     SMLoc S, SMLoc E) {
   1553     ARMOperand *Op = new ARMOperand(k_BitfieldDescriptor);
   1554     Op->Bitfield.LSB = LSB;
   1555     Op->Bitfield.Width = Width;
   1556     Op->StartLoc = S;
   1557     Op->EndLoc = E;
   1558     return Op;
   1559   }
   1560 
   1561   static ARMOperand *
   1562   CreateRegList(const SmallVectorImpl<std::pair<unsigned, SMLoc> > &Regs,
   1563                 SMLoc StartLoc, SMLoc EndLoc) {
   1564     KindTy Kind = k_RegisterList;
   1565 
   1566     if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Regs.front().first))
   1567       Kind = k_DPRRegisterList;
   1568     else if (ARMMCRegisterClasses[ARM::SPRRegClassID].
   1569              contains(Regs.front().first))
   1570       Kind = k_SPRRegisterList;
   1571 
   1572     ARMOperand *Op = new ARMOperand(Kind);
   1573     for (SmallVectorImpl<std::pair<unsigned, SMLoc> >::const_iterator
   1574            I = Regs.begin(), E = Regs.end(); I != E; ++I)
   1575       Op->Registers.push_back(I->first);
   1576     array_pod_sort(Op->Registers.begin(), Op->Registers.end());
   1577     Op->StartLoc = StartLoc;
   1578     Op->EndLoc = EndLoc;
   1579     return Op;
   1580   }
   1581 
   1582   static ARMOperand *CreateVectorIndex(unsigned Idx, SMLoc S, SMLoc E,
   1583                                        MCContext &Ctx) {
   1584     ARMOperand *Op = new ARMOperand(k_VectorIndex);
   1585     Op->VectorIndex.Val = Idx;
   1586     Op->StartLoc = S;
   1587     Op->EndLoc = E;
   1588     return Op;
   1589   }
   1590 
   1591   static ARMOperand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) {
   1592     ARMOperand *Op = new ARMOperand(k_Immediate);
   1593     Op->Imm.Val = Val;
   1594     Op->StartLoc = S;
   1595     Op->EndLoc = E;
   1596     return Op;
   1597   }
   1598 
   1599   static ARMOperand *CreateFPImm(unsigned Val, SMLoc S, MCContext &Ctx) {
   1600     ARMOperand *Op = new ARMOperand(k_FPImmediate);
   1601     Op->FPImm.Val = Val;
   1602     Op->StartLoc = S;
   1603     Op->EndLoc = S;
   1604     return Op;
   1605   }
   1606 
   1607   static ARMOperand *CreateMem(unsigned BaseRegNum,
   1608                                const MCConstantExpr *OffsetImm,
   1609                                unsigned OffsetRegNum,
   1610                                ARM_AM::ShiftOpc ShiftType,
   1611                                unsigned ShiftImm,
   1612                                unsigned Alignment,
   1613                                bool isNegative,
   1614                                SMLoc S, SMLoc E) {
   1615     ARMOperand *Op = new ARMOperand(k_Memory);
   1616     Op->Memory.BaseRegNum = BaseRegNum;
   1617     Op->Memory.OffsetImm = OffsetImm;
   1618     Op->Memory.OffsetRegNum = OffsetRegNum;
   1619     Op->Memory.ShiftType = ShiftType;
   1620     Op->Memory.ShiftImm = ShiftImm;
   1621     Op->Memory.Alignment = Alignment;
   1622     Op->Memory.isNegative = isNegative;
   1623     Op->StartLoc = S;
   1624     Op->EndLoc = E;
   1625     return Op;
   1626   }
   1627 
   1628   static ARMOperand *CreatePostIdxReg(unsigned RegNum, bool isAdd,
   1629                                       ARM_AM::ShiftOpc ShiftTy,
   1630                                       unsigned ShiftImm,
   1631                                       SMLoc S, SMLoc E) {
   1632     ARMOperand *Op = new ARMOperand(k_PostIndexRegister);
   1633     Op->PostIdxReg.RegNum = RegNum;
   1634     Op->PostIdxReg.isAdd = isAdd;
   1635     Op->PostIdxReg.ShiftTy = ShiftTy;
   1636     Op->PostIdxReg.ShiftImm = ShiftImm;
   1637     Op->StartLoc = S;
   1638     Op->EndLoc = E;
   1639     return Op;
   1640   }
   1641 
   1642   static ARMOperand *CreateMemBarrierOpt(ARM_MB::MemBOpt Opt, SMLoc S) {
   1643     ARMOperand *Op = new ARMOperand(k_MemBarrierOpt);
   1644     Op->MBOpt.Val = Opt;
   1645     Op->StartLoc = S;
   1646     Op->EndLoc = S;
   1647     return Op;
   1648   }
   1649 
   1650   static ARMOperand *CreateProcIFlags(ARM_PROC::IFlags IFlags, SMLoc S) {
   1651     ARMOperand *Op = new ARMOperand(k_ProcIFlags);
   1652     Op->IFlags.Val = IFlags;
   1653     Op->StartLoc = S;
   1654     Op->EndLoc = S;
   1655     return Op;
   1656   }
   1657 
   1658   static ARMOperand *CreateMSRMask(unsigned MMask, SMLoc S) {
   1659     ARMOperand *Op = new ARMOperand(k_MSRMask);
   1660     Op->MMask.Val = MMask;
   1661     Op->StartLoc = S;
   1662     Op->EndLoc = S;
   1663     return Op;
   1664   }
   1665 };
   1666 
   1667 } // end anonymous namespace.
   1668 
   1669 void ARMOperand::print(raw_ostream &OS) const {
   1670   switch (Kind) {
   1671   case k_FPImmediate:
   1672     OS << "<fpimm " << getFPImm() << "(" << ARM_AM::getFPImmFloat(getFPImm())
   1673        << ") >";
   1674     break;
   1675   case k_CondCode:
   1676     OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">";
   1677     break;
   1678   case k_CCOut:
   1679     OS << "<ccout " << getReg() << ">";
   1680     break;
   1681   case k_ITCondMask: {
   1682     static char MaskStr[][6] = { "()", "(t)", "(e)", "(tt)", "(et)", "(te)",
   1683       "(ee)", "(ttt)", "(ett)", "(tet)", "(eet)", "(tte)", "(ete)",
   1684       "(tee)", "(eee)" };
   1685     assert((ITMask.Mask & 0xf) == ITMask.Mask);
   1686     OS << "<it-mask " << MaskStr[ITMask.Mask] << ">";
   1687     break;
   1688   }
   1689   case k_CoprocNum:
   1690     OS << "<coprocessor number: " << getCoproc() << ">";
   1691     break;
   1692   case k_CoprocReg:
   1693     OS << "<coprocessor register: " << getCoproc() << ">";
   1694     break;
   1695   case k_CoprocOption:
   1696     OS << "<coprocessor option: " << CoprocOption.Val << ">";
   1697     break;
   1698   case k_MSRMask:
   1699     OS << "<mask: " << getMSRMask() << ">";
   1700     break;
   1701   case k_Immediate:
   1702     getImm()->print(OS);
   1703     break;
   1704   case k_MemBarrierOpt:
   1705     OS << "<ARM_MB::" << MemBOptToString(getMemBarrierOpt()) << ">";
   1706     break;
   1707   case k_Memory:
   1708     OS << "<memory "
   1709        << " base:" << Memory.BaseRegNum;
   1710     OS << ">";
   1711     break;
   1712   case k_PostIndexRegister:
   1713     OS << "post-idx register " << (PostIdxReg.isAdd ? "" : "-")
   1714        << PostIdxReg.RegNum;
   1715     if (PostIdxReg.ShiftTy != ARM_AM::no_shift)
   1716       OS << ARM_AM::getShiftOpcStr(PostIdxReg.ShiftTy) << " "
   1717          << PostIdxReg.ShiftImm;
   1718     OS << ">";
   1719     break;
   1720   case k_ProcIFlags: {
   1721     OS << "<ARM_PROC::";
   1722     unsigned IFlags = getProcIFlags();
   1723     for (int i=2; i >= 0; --i)
   1724       if (IFlags & (1 << i))
   1725         OS << ARM_PROC::IFlagsToString(1 << i);
   1726     OS << ">";
   1727     break;
   1728   }
   1729   case k_Register:
   1730     OS << "<register " << getReg() << ">";
   1731     break;
   1732   case k_ShifterImmediate:
   1733     OS << "<shift " << (ShifterImm.isASR ? "asr" : "lsl")
   1734        << " #" << ShifterImm.Imm << ">";
   1735     break;
   1736   case k_ShiftedRegister:
   1737     OS << "<so_reg_reg "
   1738        << RegShiftedReg.SrcReg
   1739        << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedReg.ShiftImm))
   1740        << ", " << RegShiftedReg.ShiftReg << ", "
   1741        << ARM_AM::getSORegOffset(RegShiftedReg.ShiftImm)
   1742        << ">";
   1743     break;
   1744   case k_ShiftedImmediate:
   1745     OS << "<so_reg_imm "
   1746        << RegShiftedImm.SrcReg
   1747        << ARM_AM::getShiftOpcStr(ARM_AM::getSORegShOp(RegShiftedImm.ShiftImm))
   1748        << ", " << ARM_AM::getSORegOffset(RegShiftedImm.ShiftImm)
   1749        << ">";
   1750     break;
   1751   case k_RotateImmediate:
   1752     OS << "<ror " << " #" << (RotImm.Imm * 8) << ">";
   1753     break;
   1754   case k_BitfieldDescriptor:
   1755     OS << "<bitfield " << "lsb: " << Bitfield.LSB
   1756        << ", width: " << Bitfield.Width << ">";
   1757     break;
   1758   case k_RegisterList:
   1759   case k_DPRRegisterList:
   1760   case k_SPRRegisterList: {
   1761     OS << "<register_list ";
   1762 
   1763     const SmallVectorImpl<unsigned> &RegList = getRegList();
   1764     for (SmallVectorImpl<unsigned>::const_iterator
   1765            I = RegList.begin(), E = RegList.end(); I != E; ) {
   1766       OS << *I;
   1767       if (++I < E) OS << ", ";
   1768     }
   1769 
   1770     OS << ">";
   1771     break;
   1772   }
   1773   case k_Token:
   1774     OS << "'" << getToken() << "'";
   1775     break;
   1776   case k_VectorIndex:
   1777     OS << "<vectorindex " << getVectorIndex() << ">";
   1778     break;
   1779   }
   1780 }
   1781 
   1782 /// @name Auto-generated Match Functions
   1783 /// {
   1784 
   1785 static unsigned MatchRegisterName(StringRef Name);
   1786 
   1787 /// }
   1788 
   1789 bool ARMAsmParser::ParseRegister(unsigned &RegNo,
   1790                                  SMLoc &StartLoc, SMLoc &EndLoc) {
   1791   RegNo = tryParseRegister();
   1792 
   1793   return (RegNo == (unsigned)-1);
   1794 }
   1795 
   1796 /// Try to parse a register name.  The token must be an Identifier when called,
   1797 /// and if it is a register name the token is eaten and the register number is
   1798 /// returned.  Otherwise return -1.
   1799 ///
   1800 int ARMAsmParser::tryParseRegister() {
   1801   const AsmToken &Tok = Parser.getTok();
   1802   if (Tok.isNot(AsmToken::Identifier)) return -1;
   1803 
   1804   // FIXME: Validate register for the current architecture; we have to do
   1805   // validation later, so maybe there is no need for this here.
   1806   std::string upperCase = Tok.getString().str();
   1807   std::string lowerCase = LowercaseString(upperCase);
   1808   unsigned RegNum = MatchRegisterName(lowerCase);
   1809   if (!RegNum) {
   1810     RegNum = StringSwitch<unsigned>(lowerCase)
   1811       .Case("r13", ARM::SP)
   1812       .Case("r14", ARM::LR)
   1813       .Case("r15", ARM::PC)
   1814       .Case("ip", ARM::R12)
   1815       .Default(0);
   1816   }
   1817   if (!RegNum) return -1;
   1818 
   1819   Parser.Lex(); // Eat identifier token.
   1820 
   1821 #if 0
   1822   // Also check for an index operand. This is only legal for vector registers,
   1823   // but that'll get caught OK in operand matching, so we don't need to
   1824   // explicitly filter everything else out here.
   1825   if (Parser.getTok().is(AsmToken::LBrac)) {
   1826     SMLoc SIdx = Parser.getTok().getLoc();
   1827     Parser.Lex(); // Eat left bracket token.
   1828 
   1829     const MCExpr *ImmVal;
   1830     SMLoc ExprLoc = Parser.getTok().getLoc();
   1831     if (getParser().ParseExpression(ImmVal))
   1832       return MatchOperand_ParseFail;
   1833     const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(ImmVal);
   1834     if (!MCE) {
   1835       TokError("immediate value expected for vector index");
   1836       return MatchOperand_ParseFail;
   1837     }
   1838 
   1839     SMLoc E = Parser.getTok().getLoc();
   1840     if (Parser.getTok().isNot(AsmToken::RBrac)) {
   1841       Error(E, "']' expected");
   1842       return MatchOperand_ParseFail;
   1843     }
   1844 
   1845     Parser.Lex(); // Eat right bracket token.
   1846 
   1847     Operands.push_back(ARMOperand::CreateVectorIndex(MCE->getValue(),
   1848                                                      SIdx, E,
   1849                                                      getContext()));
   1850   }
   1851 #endif
   1852 
   1853   return RegNum;
   1854 }
   1855 
   1856 // Try to parse a shifter  (e.g., "lsl <amt>"). On success, return 0.
   1857 // If a recoverable error occurs, return 1. If an irrecoverable error
   1858 // occurs, return -1. An irrecoverable error is one where tokens have been
   1859 // consumed in the process of trying to parse the shifter (i.e., when it is
   1860 // indeed a shifter operand, but malformed).
   1861 int ARMAsmParser::tryParseShiftRegister(
   1862                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1863   SMLoc S = Parser.getTok().getLoc();
   1864   const AsmToken &Tok = Parser.getTok();
   1865   assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
   1866 
   1867   std::string upperCase = Tok.getString().str();
   1868   std::string lowerCase = LowercaseString(upperCase);
   1869   ARM_AM::ShiftOpc ShiftTy = StringSwitch<ARM_AM::ShiftOpc>(lowerCase)
   1870       .Case("lsl", ARM_AM::lsl)
   1871       .Case("lsr", ARM_AM::lsr)
   1872       .Case("asr", ARM_AM::asr)
   1873       .Case("ror", ARM_AM::ror)
   1874       .Case("rrx", ARM_AM::rrx)
   1875       .Default(ARM_AM::no_shift);
   1876 
   1877   if (ShiftTy == ARM_AM::no_shift)
   1878     return 1;
   1879 
   1880   Parser.Lex(); // Eat the operator.
   1881 
   1882   // The source register for the shift has already been added to the
   1883   // operand list, so we need to pop it off and combine it into the shifted
   1884   // register operand instead.
   1885   OwningPtr<ARMOperand> PrevOp((ARMOperand*)Operands.pop_back_val());
   1886   if (!PrevOp->isReg())
   1887     return Error(PrevOp->getStartLoc(), "shift must be of a register");
   1888   int SrcReg = PrevOp->getReg();
   1889   int64_t Imm = 0;
   1890   int ShiftReg = 0;
   1891   if (ShiftTy == ARM_AM::rrx) {
   1892     // RRX Doesn't have an explicit shift amount. The encoder expects
   1893     // the shift register to be the same as the source register. Seems odd,
   1894     // but OK.
   1895     ShiftReg = SrcReg;
   1896   } else {
   1897     // Figure out if this is shifted by a constant or a register (for non-RRX).
   1898     if (Parser.getTok().is(AsmToken::Hash)) {
   1899       Parser.Lex(); // Eat hash.
   1900       SMLoc ImmLoc = Parser.getTok().getLoc();
   1901       const MCExpr *ShiftExpr = 0;
   1902       if (getParser().ParseExpression(ShiftExpr)) {
   1903         Error(ImmLoc, "invalid immediate shift value");
   1904         return -1;
   1905       }
   1906       // The expression must be evaluatable as an immediate.
   1907       const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftExpr);
   1908       if (!CE) {
   1909         Error(ImmLoc, "invalid immediate shift value");
   1910         return -1;
   1911       }
   1912       // Range check the immediate.
   1913       // lsl, ror: 0 <= imm <= 31
   1914       // lsr, asr: 0 <= imm <= 32
   1915       Imm = CE->getValue();
   1916       if (Imm < 0 ||
   1917           ((ShiftTy == ARM_AM::lsl || ShiftTy == ARM_AM::ror) && Imm > 31) ||
   1918           ((ShiftTy == ARM_AM::lsr || ShiftTy == ARM_AM::asr) && Imm > 32)) {
   1919         Error(ImmLoc, "immediate shift value out of range");
   1920         return -1;
   1921       }
   1922     } else if (Parser.getTok().is(AsmToken::Identifier)) {
   1923       ShiftReg = tryParseRegister();
   1924       SMLoc L = Parser.getTok().getLoc();
   1925       if (ShiftReg == -1) {
   1926         Error (L, "expected immediate or register in shift operand");
   1927         return -1;
   1928       }
   1929     } else {
   1930       Error (Parser.getTok().getLoc(),
   1931                     "expected immediate or register in shift operand");
   1932       return -1;
   1933     }
   1934   }
   1935 
   1936   if (ShiftReg && ShiftTy != ARM_AM::rrx)
   1937     Operands.push_back(ARMOperand::CreateShiftedRegister(ShiftTy, SrcReg,
   1938                                                          ShiftReg, Imm,
   1939                                                S, Parser.getTok().getLoc()));
   1940   else
   1941     Operands.push_back(ARMOperand::CreateShiftedImmediate(ShiftTy, SrcReg, Imm,
   1942                                                S, Parser.getTok().getLoc()));
   1943 
   1944   return 0;
   1945 }
   1946 
   1947 
   1948 /// Try to parse a register name.  The token must be an Identifier when called.
   1949 /// If it's a register, an AsmOperand is created. Another AsmOperand is created
   1950 /// if there is a "writeback". 'true' if it's not a register.
   1951 ///
   1952 /// TODO this is likely to change to allow different register types and or to
   1953 /// parse for a specific register type.
   1954 bool ARMAsmParser::
   1955 tryParseRegisterWithWriteBack(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1956   SMLoc S = Parser.getTok().getLoc();
   1957   int RegNo = tryParseRegister();
   1958   if (RegNo == -1)
   1959     return true;
   1960 
   1961   Operands.push_back(ARMOperand::CreateReg(RegNo, S, Parser.getTok().getLoc()));
   1962 
   1963   const AsmToken &ExclaimTok = Parser.getTok();
   1964   if (ExclaimTok.is(AsmToken::Exclaim)) {
   1965     Operands.push_back(ARMOperand::CreateToken(ExclaimTok.getString(),
   1966                                                ExclaimTok.getLoc()));
   1967     Parser.Lex(); // Eat exclaim token
   1968     return false;
   1969   }
   1970 
   1971   // Also check for an index operand. This is only legal for vector registers,
   1972   // but that'll get caught OK in operand matching, so we don't need to
   1973   // explicitly filter everything else out here.
   1974   if (Parser.getTok().is(AsmToken::LBrac)) {
   1975     SMLoc SIdx = Parser.getTok().getLoc();
   1976     Parser.Lex(); // Eat left bracket token.
   1977 
   1978     const MCExpr *ImmVal;
   1979     SMLoc ExprLoc = Parser.getTok().getLoc();
   1980     if (getParser().ParseExpression(ImmVal))
   1981       return MatchOperand_ParseFail;
   1982     const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(ImmVal);
   1983     if (!MCE) {
   1984       TokError("immediate value expected for vector index");
   1985       return MatchOperand_ParseFail;
   1986     }
   1987 
   1988     SMLoc E = Parser.getTok().getLoc();
   1989     if (Parser.getTok().isNot(AsmToken::RBrac)) {
   1990       Error(E, "']' expected");
   1991       return MatchOperand_ParseFail;
   1992     }
   1993 
   1994     Parser.Lex(); // Eat right bracket token.
   1995 
   1996     Operands.push_back(ARMOperand::CreateVectorIndex(MCE->getValue(),
   1997                                                      SIdx, E,
   1998                                                      getContext()));
   1999   }
   2000 
   2001   return false;
   2002 }
   2003 
   2004 /// MatchCoprocessorOperandName - Try to parse an coprocessor related
   2005 /// instruction with a symbolic operand name. Example: "p1", "p7", "c3",
   2006 /// "c5", ...
   2007 static int MatchCoprocessorOperandName(StringRef Name, char CoprocOp) {
   2008   // Use the same layout as the tablegen'erated register name matcher. Ugly,
   2009   // but efficient.
   2010   switch (Name.size()) {
   2011   default: break;
   2012   case 2:
   2013     if (Name[0] != CoprocOp)
   2014       return -1;
   2015     switch (Name[1]) {
   2016     default:  return -1;
   2017     case '0': return 0;
   2018     case '1': return 1;
   2019     case '2': return 2;
   2020     case '3': return 3;
   2021     case '4': return 4;
   2022     case '5': return 5;
   2023     case '6': return 6;
   2024     case '7': return 7;
   2025     case '8': return 8;
   2026     case '9': return 9;
   2027     }
   2028     break;
   2029   case 3:
   2030     if (Name[0] != CoprocOp || Name[1] != '1')
   2031       return -1;
   2032     switch (Name[2]) {
   2033     default:  return -1;
   2034     case '0': return 10;
   2035     case '1': return 11;
   2036     case '2': return 12;
   2037     case '3': return 13;
   2038     case '4': return 14;
   2039     case '5': return 15;
   2040     }
   2041     break;
   2042   }
   2043 
   2044   return -1;
   2045 }
   2046 
   2047 /// parseITCondCode - Try to parse a condition code for an IT instruction.
   2048 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2049 parseITCondCode(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2050   SMLoc S = Parser.getTok().getLoc();
   2051   const AsmToken &Tok = Parser.getTok();
   2052   if (!Tok.is(AsmToken::Identifier))
   2053     return MatchOperand_NoMatch;
   2054   unsigned CC = StringSwitch<unsigned>(Tok.getString())
   2055     .Case("eq", ARMCC::EQ)
   2056     .Case("ne", ARMCC::NE)
   2057     .Case("hs", ARMCC::HS)
   2058     .Case("cs", ARMCC::HS)
   2059     .Case("lo", ARMCC::LO)
   2060     .Case("cc", ARMCC::LO)
   2061     .Case("mi", ARMCC::MI)
   2062     .Case("pl", ARMCC::PL)
   2063     .Case("vs", ARMCC::VS)
   2064     .Case("vc", ARMCC::VC)
   2065     .Case("hi", ARMCC::HI)
   2066     .Case("ls", ARMCC::LS)
   2067     .Case("ge", ARMCC::GE)
   2068     .Case("lt", ARMCC::LT)
   2069     .Case("gt", ARMCC::GT)
   2070     .Case("le", ARMCC::LE)
   2071     .Case("al", ARMCC::AL)
   2072     .Default(~0U);
   2073   if (CC == ~0U)
   2074     return MatchOperand_NoMatch;
   2075   Parser.Lex(); // Eat the token.
   2076 
   2077   Operands.push_back(ARMOperand::CreateCondCode(ARMCC::CondCodes(CC), S));
   2078 
   2079   return MatchOperand_Success;
   2080 }
   2081 
   2082 /// parseCoprocNumOperand - Try to parse an coprocessor number operand. The
   2083 /// token must be an Identifier when called, and if it is a coprocessor
   2084 /// number, the token is eaten and the operand is added to the operand list.
   2085 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2086 parseCoprocNumOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2087   SMLoc S = Parser.getTok().getLoc();
   2088   const AsmToken &Tok = Parser.getTok();
   2089   if (Tok.isNot(AsmToken::Identifier))
   2090     return MatchOperand_NoMatch;
   2091 
   2092   int Num = MatchCoprocessorOperandName(Tok.getString(), 'p');
   2093   if (Num == -1)
   2094     return MatchOperand_NoMatch;
   2095 
   2096   Parser.Lex(); // Eat identifier token.
   2097   Operands.push_back(ARMOperand::CreateCoprocNum(Num, S));
   2098   return MatchOperand_Success;
   2099 }
   2100 
   2101 /// parseCoprocRegOperand - Try to parse an coprocessor register operand. The
   2102 /// token must be an Identifier when called, and if it is a coprocessor
   2103 /// number, the token is eaten and the operand is added to the operand list.
   2104 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2105 parseCoprocRegOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2106   SMLoc S = Parser.getTok().getLoc();
   2107   const AsmToken &Tok = Parser.getTok();
   2108   if (Tok.isNot(AsmToken::Identifier))
   2109     return MatchOperand_NoMatch;
   2110 
   2111   int Reg = MatchCoprocessorOperandName(Tok.getString(), 'c');
   2112   if (Reg == -1)
   2113     return MatchOperand_NoMatch;
   2114 
   2115   Parser.Lex(); // Eat identifier token.
   2116   Operands.push_back(ARMOperand::CreateCoprocReg(Reg, S));
   2117   return MatchOperand_Success;
   2118 }
   2119 
   2120 /// parseCoprocOptionOperand - Try to parse an coprocessor option operand.
   2121 /// coproc_option : '{' imm0_255 '}'
   2122 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2123 parseCoprocOptionOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2124   SMLoc S = Parser.getTok().getLoc();
   2125 
   2126   // If this isn't a '{', this isn't a coprocessor immediate operand.
   2127   if (Parser.getTok().isNot(AsmToken::LCurly))
   2128     return MatchOperand_NoMatch;
   2129   Parser.Lex(); // Eat the '{'
   2130 
   2131   const MCExpr *Expr;
   2132   SMLoc Loc = Parser.getTok().getLoc();
   2133   if (getParser().ParseExpression(Expr)) {
   2134     Error(Loc, "illegal expression");
   2135     return MatchOperand_ParseFail;
   2136   }
   2137   const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr);
   2138   if (!CE || CE->getValue() < 0 || CE->getValue() > 255) {
   2139     Error(Loc, "coprocessor option must be an immediate in range [0, 255]");
   2140     return MatchOperand_ParseFail;
   2141   }
   2142   int Val = CE->getValue();
   2143 
   2144   // Check for and consume the closing '}'
   2145   if (Parser.getTok().isNot(AsmToken::RCurly))
   2146     return MatchOperand_ParseFail;
   2147   SMLoc E = Parser.getTok().getLoc();
   2148   Parser.Lex(); // Eat the '}'
   2149 
   2150   Operands.push_back(ARMOperand::CreateCoprocOption(Val, S, E));
   2151   return MatchOperand_Success;
   2152 }
   2153 
   2154 // For register list parsing, we need to map from raw GPR register numbering
   2155 // to the enumeration values. The enumeration values aren't sorted by
   2156 // register number due to our using "sp", "lr" and "pc" as canonical names.
   2157 static unsigned getNextRegister(unsigned Reg) {
   2158   // If this is a GPR, we need to do it manually, otherwise we can rely
   2159   // on the sort ordering of the enumeration since the other reg-classes
   2160   // are sane.
   2161   if (!ARMMCRegisterClasses[ARM::GPRRegClassID].contains(Reg))
   2162     return Reg + 1;
   2163   switch(Reg) {
   2164   default: assert(0 && "Invalid GPR number!");
   2165   case ARM::R0:  return ARM::R1;  case ARM::R1:  return ARM::R2;
   2166   case ARM::R2:  return ARM::R3;  case ARM::R3:  return ARM::R4;
   2167   case ARM::R4:  return ARM::R5;  case ARM::R5:  return ARM::R6;
   2168   case ARM::R6:  return ARM::R7;  case ARM::R7:  return ARM::R8;
   2169   case ARM::R8:  return ARM::R9;  case ARM::R9:  return ARM::R10;
   2170   case ARM::R10: return ARM::R11; case ARM::R11: return ARM::R12;
   2171   case ARM::R12: return ARM::SP;  case ARM::SP:  return ARM::LR;
   2172   case ARM::LR:  return ARM::PC;  case ARM::PC:  return ARM::R0;
   2173   }
   2174 }
   2175 
   2176 /// Parse a register list.
   2177 bool ARMAsmParser::
   2178 parseRegisterList(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2179   assert(Parser.getTok().is(AsmToken::LCurly) &&
   2180          "Token is not a Left Curly Brace");
   2181   SMLoc S = Parser.getTok().getLoc();
   2182   Parser.Lex(); // Eat '{' token.
   2183   SMLoc RegLoc = Parser.getTok().getLoc();
   2184 
   2185   // Check the first register in the list to see what register class
   2186   // this is a list of.
   2187   int Reg = tryParseRegister();
   2188   if (Reg == -1)
   2189     return Error(RegLoc, "register expected");
   2190 
   2191   MCRegisterClass *RC;
   2192   if (ARMMCRegisterClasses[ARM::GPRRegClassID].contains(Reg))
   2193     RC = &ARMMCRegisterClasses[ARM::GPRRegClassID];
   2194   else if (ARMMCRegisterClasses[ARM::DPRRegClassID].contains(Reg))
   2195     RC = &ARMMCRegisterClasses[ARM::DPRRegClassID];
   2196   else if (ARMMCRegisterClasses[ARM::SPRRegClassID].contains(Reg))
   2197     RC = &ARMMCRegisterClasses[ARM::SPRRegClassID];
   2198   else
   2199     return Error(RegLoc, "invalid register in register list");
   2200 
   2201   // The reglist instructions have at most 16 registers, so reserve
   2202   // space for that many.
   2203   SmallVector<std::pair<unsigned, SMLoc>, 16> Registers;
   2204   // Store the first register.
   2205   Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc));
   2206 
   2207   // This starts immediately after the first register token in the list,
   2208   // so we can see either a comma or a minus (range separator) as a legal
   2209   // next token.
   2210   while (Parser.getTok().is(AsmToken::Comma) ||
   2211          Parser.getTok().is(AsmToken::Minus)) {
   2212     if (Parser.getTok().is(AsmToken::Minus)) {
   2213       Parser.Lex(); // Eat the comma.
   2214       SMLoc EndLoc = Parser.getTok().getLoc();
   2215       int EndReg = tryParseRegister();
   2216       if (EndReg == -1)
   2217         return Error(EndLoc, "register expected");
   2218       // If the register is the same as the start reg, there's nothing
   2219       // more to do.
   2220       if (Reg == EndReg)
   2221         continue;
   2222       // The register must be in the same register class as the first.
   2223       if (!RC->contains(EndReg))
   2224         return Error(EndLoc, "invalid register in register list");
   2225       // Ranges must go from low to high.
   2226       if (getARMRegisterNumbering(Reg) > getARMRegisterNumbering(EndReg))
   2227         return Error(EndLoc, "bad range in register list");
   2228 
   2229       // Add all the registers in the range to the register list.
   2230       while (Reg != EndReg) {
   2231         Reg = getNextRegister(Reg);
   2232         Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc));
   2233       }
   2234       continue;
   2235     }
   2236     Parser.Lex(); // Eat the comma.
   2237     RegLoc = Parser.getTok().getLoc();
   2238     int OldReg = Reg;
   2239     Reg = tryParseRegister();
   2240     if (Reg == -1)
   2241       return Error(RegLoc, "register expected");
   2242     // The register must be in the same register class as the first.
   2243     if (!RC->contains(Reg))
   2244       return Error(RegLoc, "invalid register in register list");
   2245     // List must be monotonically increasing.
   2246     if (getARMRegisterNumbering(Reg) <= getARMRegisterNumbering(OldReg))
   2247       return Error(RegLoc, "register list not in ascending order");
   2248     // VFP register lists must also be contiguous.
   2249     // It's OK to use the enumeration values directly here rather, as the
   2250     // VFP register classes have the enum sorted properly.
   2251     if (RC != &ARMMCRegisterClasses[ARM::GPRRegClassID] &&
   2252         Reg != OldReg + 1)
   2253       return Error(RegLoc, "non-contiguous register range");
   2254     Registers.push_back(std::pair<unsigned, SMLoc>(Reg, RegLoc));
   2255   }
   2256 
   2257   SMLoc E = Parser.getTok().getLoc();
   2258   if (Parser.getTok().isNot(AsmToken::RCurly))
   2259     return Error(E, "'}' expected");
   2260   Parser.Lex(); // Eat '}' token.
   2261 
   2262   Operands.push_back(ARMOperand::CreateRegList(Registers, S, E));
   2263   return false;
   2264 }
   2265 
   2266 /// parseMemBarrierOptOperand - Try to parse DSB/DMB data barrier options.
   2267 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2268 parseMemBarrierOptOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2269   SMLoc S = Parser.getTok().getLoc();
   2270   const AsmToken &Tok = Parser.getTok();
   2271   assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
   2272   StringRef OptStr = Tok.getString();
   2273 
   2274   unsigned Opt = StringSwitch<unsigned>(OptStr.slice(0, OptStr.size()))
   2275     .Case("sy",    ARM_MB::SY)
   2276     .Case("st",    ARM_MB::ST)
   2277     .Case("sh",    ARM_MB::ISH)
   2278     .Case("ish",   ARM_MB::ISH)
   2279     .Case("shst",  ARM_MB::ISHST)
   2280     .Case("ishst", ARM_MB::ISHST)
   2281     .Case("nsh",   ARM_MB::NSH)
   2282     .Case("un",    ARM_MB::NSH)
   2283     .Case("nshst", ARM_MB::NSHST)
   2284     .Case("unst",  ARM_MB::NSHST)
   2285     .Case("osh",   ARM_MB::OSH)
   2286     .Case("oshst", ARM_MB::OSHST)
   2287     .Default(~0U);
   2288 
   2289   if (Opt == ~0U)
   2290     return MatchOperand_NoMatch;
   2291 
   2292   Parser.Lex(); // Eat identifier token.
   2293   Operands.push_back(ARMOperand::CreateMemBarrierOpt((ARM_MB::MemBOpt)Opt, S));
   2294   return MatchOperand_Success;
   2295 }
   2296 
   2297 /// parseProcIFlagsOperand - Try to parse iflags from CPS instruction.
   2298 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2299 parseProcIFlagsOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2300   SMLoc S = Parser.getTok().getLoc();
   2301   const AsmToken &Tok = Parser.getTok();
   2302   assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
   2303   StringRef IFlagsStr = Tok.getString();
   2304 
   2305   // An iflags string of "none" is interpreted to mean that none of the AIF
   2306   // bits are set.  Not a terribly useful instruction, but a valid encoding.
   2307   unsigned IFlags = 0;
   2308   if (IFlagsStr != "none") {
   2309         for (int i = 0, e = IFlagsStr.size(); i != e; ++i) {
   2310       unsigned Flag = StringSwitch<unsigned>(IFlagsStr.substr(i, 1))
   2311         .Case("a", ARM_PROC::A)
   2312         .Case("i", ARM_PROC::I)
   2313         .Case("f", ARM_PROC::F)
   2314         .Default(~0U);
   2315 
   2316       // If some specific iflag is already set, it means that some letter is
   2317       // present more than once, this is not acceptable.
   2318       if (Flag == ~0U || (IFlags & Flag))
   2319         return MatchOperand_NoMatch;
   2320 
   2321       IFlags |= Flag;
   2322     }
   2323   }
   2324 
   2325   Parser.Lex(); // Eat identifier token.
   2326   Operands.push_back(ARMOperand::CreateProcIFlags((ARM_PROC::IFlags)IFlags, S));
   2327   return MatchOperand_Success;
   2328 }
   2329 
   2330 /// parseMSRMaskOperand - Try to parse mask flags from MSR instruction.
   2331 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2332 parseMSRMaskOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2333   SMLoc S = Parser.getTok().getLoc();
   2334   const AsmToken &Tok = Parser.getTok();
   2335   assert(Tok.is(AsmToken::Identifier) && "Token is not an Identifier");
   2336   StringRef Mask = Tok.getString();
   2337 
   2338   if (isMClass()) {
   2339     // See ARMv6-M 10.1.1
   2340     unsigned FlagsVal = StringSwitch<unsigned>(Mask)
   2341       .Case("apsr", 0)
   2342       .Case("iapsr", 1)
   2343       .Case("eapsr", 2)
   2344       .Case("xpsr", 3)
   2345       .Case("ipsr", 5)
   2346       .Case("epsr", 6)
   2347       .Case("iepsr", 7)
   2348       .Case("msp", 8)
   2349       .Case("psp", 9)
   2350       .Case("primask", 16)
   2351       .Case("basepri", 17)
   2352       .Case("basepri_max", 18)
   2353       .Case("faultmask", 19)
   2354       .Case("control", 20)
   2355       .Default(~0U);
   2356 
   2357     if (FlagsVal == ~0U)
   2358       return MatchOperand_NoMatch;
   2359 
   2360     if (!hasV7Ops() && FlagsVal >= 17 && FlagsVal <= 19)
   2361       // basepri, basepri_max and faultmask only valid for V7m.
   2362       return MatchOperand_NoMatch;
   2363 
   2364     Parser.Lex(); // Eat identifier token.
   2365     Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S));
   2366     return MatchOperand_Success;
   2367   }
   2368 
   2369   // Split spec_reg from flag, example: CPSR_sxf => "CPSR" and "sxf"
   2370   size_t Start = 0, Next = Mask.find('_');
   2371   StringRef Flags = "";
   2372   std::string SpecReg = LowercaseString(Mask.slice(Start, Next));
   2373   if (Next != StringRef::npos)
   2374     Flags = Mask.slice(Next+1, Mask.size());
   2375 
   2376   // FlagsVal contains the complete mask:
   2377   // 3-0: Mask
   2378   // 4: Special Reg (cpsr, apsr => 0; spsr => 1)
   2379   unsigned FlagsVal = 0;
   2380 
   2381   if (SpecReg == "apsr") {
   2382     FlagsVal = StringSwitch<unsigned>(Flags)
   2383     .Case("nzcvq",  0x8) // same as CPSR_f
   2384     .Case("g",      0x4) // same as CPSR_s
   2385     .Case("nzcvqg", 0xc) // same as CPSR_fs
   2386     .Default(~0U);
   2387 
   2388     if (FlagsVal == ~0U) {
   2389       if (!Flags.empty())
   2390         return MatchOperand_NoMatch;
   2391       else
   2392         FlagsVal = 8; // No flag
   2393     }
   2394   } else if (SpecReg == "cpsr" || SpecReg == "spsr") {
   2395     if (Flags == "all") // cpsr_all is an alias for cpsr_fc
   2396       Flags = "fc";
   2397     for (int i = 0, e = Flags.size(); i != e; ++i) {
   2398       unsigned Flag = StringSwitch<unsigned>(Flags.substr(i, 1))
   2399       .Case("c", 1)
   2400       .Case("x", 2)
   2401       .Case("s", 4)
   2402       .Case("f", 8)
   2403       .Default(~0U);
   2404 
   2405       // If some specific flag is already set, it means that some letter is
   2406       // present more than once, this is not acceptable.
   2407       if (FlagsVal == ~0U || (FlagsVal & Flag))
   2408         return MatchOperand_NoMatch;
   2409       FlagsVal |= Flag;
   2410     }
   2411   } else // No match for special register.
   2412     return MatchOperand_NoMatch;
   2413 
   2414   // Special register without flags are equivalent to "fc" flags.
   2415   if (!FlagsVal)
   2416     FlagsVal = 0x9;
   2417 
   2418   // Bit 4: Special Reg (cpsr, apsr => 0; spsr => 1)
   2419   if (SpecReg == "spsr")
   2420     FlagsVal |= 16;
   2421 
   2422   Parser.Lex(); // Eat identifier token.
   2423   Operands.push_back(ARMOperand::CreateMSRMask(FlagsVal, S));
   2424   return MatchOperand_Success;
   2425 }
   2426 
   2427 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2428 parsePKHImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands, StringRef Op,
   2429             int Low, int High) {
   2430   const AsmToken &Tok = Parser.getTok();
   2431   if (Tok.isNot(AsmToken::Identifier)) {
   2432     Error(Parser.getTok().getLoc(), Op + " operand expected.");
   2433     return MatchOperand_ParseFail;
   2434   }
   2435   StringRef ShiftName = Tok.getString();
   2436   std::string LowerOp = LowercaseString(Op);
   2437   std::string UpperOp = UppercaseString(Op);
   2438   if (ShiftName != LowerOp && ShiftName != UpperOp) {
   2439     Error(Parser.getTok().getLoc(), Op + " operand expected.");
   2440     return MatchOperand_ParseFail;
   2441   }
   2442   Parser.Lex(); // Eat shift type token.
   2443 
   2444   // There must be a '#' and a shift amount.
   2445   if (Parser.getTok().isNot(AsmToken::Hash)) {
   2446     Error(Parser.getTok().getLoc(), "'#' expected");
   2447     return MatchOperand_ParseFail;
   2448   }
   2449   Parser.Lex(); // Eat hash token.
   2450 
   2451   const MCExpr *ShiftAmount;
   2452   SMLoc Loc = Parser.getTok().getLoc();
   2453   if (getParser().ParseExpression(ShiftAmount)) {
   2454     Error(Loc, "illegal expression");
   2455     return MatchOperand_ParseFail;
   2456   }
   2457   const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
   2458   if (!CE) {
   2459     Error(Loc, "constant expression expected");
   2460     return MatchOperand_ParseFail;
   2461   }
   2462   int Val = CE->getValue();
   2463   if (Val < Low || Val > High) {
   2464     Error(Loc, "immediate value out of range");
   2465     return MatchOperand_ParseFail;
   2466   }
   2467 
   2468   Operands.push_back(ARMOperand::CreateImm(CE, Loc, Parser.getTok().getLoc()));
   2469 
   2470   return MatchOperand_Success;
   2471 }
   2472 
   2473 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2474 parseSetEndImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2475   const AsmToken &Tok = Parser.getTok();
   2476   SMLoc S = Tok.getLoc();
   2477   if (Tok.isNot(AsmToken::Identifier)) {
   2478     Error(Tok.getLoc(), "'be' or 'le' operand expected");
   2479     return MatchOperand_ParseFail;
   2480   }
   2481   int Val = StringSwitch<int>(Tok.getString())
   2482     .Case("be", 1)
   2483     .Case("le", 0)
   2484     .Default(-1);
   2485   Parser.Lex(); // Eat the token.
   2486 
   2487   if (Val == -1) {
   2488     Error(Tok.getLoc(), "'be' or 'le' operand expected");
   2489     return MatchOperand_ParseFail;
   2490   }
   2491   Operands.push_back(ARMOperand::CreateImm(MCConstantExpr::Create(Val,
   2492                                                                   getContext()),
   2493                                            S, Parser.getTok().getLoc()));
   2494   return MatchOperand_Success;
   2495 }
   2496 
   2497 /// parseShifterImm - Parse the shifter immediate operand for SSAT/USAT
   2498 /// instructions. Legal values are:
   2499 ///     lsl #n  'n' in [0,31]
   2500 ///     asr #n  'n' in [1,32]
   2501 ///             n == 32 encoded as n == 0.
   2502 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2503 parseShifterImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2504   const AsmToken &Tok = Parser.getTok();
   2505   SMLoc S = Tok.getLoc();
   2506   if (Tok.isNot(AsmToken::Identifier)) {
   2507     Error(S, "shift operator 'asr' or 'lsl' expected");
   2508     return MatchOperand_ParseFail;
   2509   }
   2510   StringRef ShiftName = Tok.getString();
   2511   bool isASR;
   2512   if (ShiftName == "lsl" || ShiftName == "LSL")
   2513     isASR = false;
   2514   else if (ShiftName == "asr" || ShiftName == "ASR")
   2515     isASR = true;
   2516   else {
   2517     Error(S, "shift operator 'asr' or 'lsl' expected");
   2518     return MatchOperand_ParseFail;
   2519   }
   2520   Parser.Lex(); // Eat the operator.
   2521 
   2522   // A '#' and a shift amount.
   2523   if (Parser.getTok().isNot(AsmToken::Hash)) {
   2524     Error(Parser.getTok().getLoc(), "'#' expected");
   2525     return MatchOperand_ParseFail;
   2526   }
   2527   Parser.Lex(); // Eat hash token.
   2528 
   2529   const MCExpr *ShiftAmount;
   2530   SMLoc E = Parser.getTok().getLoc();
   2531   if (getParser().ParseExpression(ShiftAmount)) {
   2532     Error(E, "malformed shift expression");
   2533     return MatchOperand_ParseFail;
   2534   }
   2535   const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
   2536   if (!CE) {
   2537     Error(E, "shift amount must be an immediate");
   2538     return MatchOperand_ParseFail;
   2539   }
   2540 
   2541   int64_t Val = CE->getValue();
   2542   if (isASR) {
   2543     // Shift amount must be in [1,32]
   2544     if (Val < 1 || Val > 32) {
   2545       Error(E, "'asr' shift amount must be in range [1,32]");
   2546       return MatchOperand_ParseFail;
   2547     }
   2548     // asr #32 encoded as asr #0, but is not allowed in Thumb2 mode.
   2549     if (isThumb() && Val == 32) {
   2550       Error(E, "'asr #32' shift amount not allowed in Thumb mode");
   2551       return MatchOperand_ParseFail;
   2552     }
   2553     if (Val == 32) Val = 0;
   2554   } else {
   2555     // Shift amount must be in [1,32]
   2556     if (Val < 0 || Val > 31) {
   2557       Error(E, "'lsr' shift amount must be in range [0,31]");
   2558       return MatchOperand_ParseFail;
   2559     }
   2560   }
   2561 
   2562   E = Parser.getTok().getLoc();
   2563   Operands.push_back(ARMOperand::CreateShifterImm(isASR, Val, S, E));
   2564 
   2565   return MatchOperand_Success;
   2566 }
   2567 
   2568 /// parseRotImm - Parse the shifter immediate operand for SXTB/UXTB family
   2569 /// of instructions. Legal values are:
   2570 ///     ror #n  'n' in {0, 8, 16, 24}
   2571 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2572 parseRotImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2573   const AsmToken &Tok = Parser.getTok();
   2574   SMLoc S = Tok.getLoc();
   2575   if (Tok.isNot(AsmToken::Identifier))
   2576     return MatchOperand_NoMatch;
   2577   StringRef ShiftName = Tok.getString();
   2578   if (ShiftName != "ror" && ShiftName != "ROR")
   2579     return MatchOperand_NoMatch;
   2580   Parser.Lex(); // Eat the operator.
   2581 
   2582   // A '#' and a rotate amount.
   2583   if (Parser.getTok().isNot(AsmToken::Hash)) {
   2584     Error(Parser.getTok().getLoc(), "'#' expected");
   2585     return MatchOperand_ParseFail;
   2586   }
   2587   Parser.Lex(); // Eat hash token.
   2588 
   2589   const MCExpr *ShiftAmount;
   2590   SMLoc E = Parser.getTok().getLoc();
   2591   if (getParser().ParseExpression(ShiftAmount)) {
   2592     Error(E, "malformed rotate expression");
   2593     return MatchOperand_ParseFail;
   2594   }
   2595   const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ShiftAmount);
   2596   if (!CE) {
   2597     Error(E, "rotate amount must be an immediate");
   2598     return MatchOperand_ParseFail;
   2599   }
   2600 
   2601   int64_t Val = CE->getValue();
   2602   // Shift amount must be in {0, 8, 16, 24} (0 is undocumented extension)
   2603   // normally, zero is represented in asm by omitting the rotate operand
   2604   // entirely.
   2605   if (Val != 8 && Val != 16 && Val != 24 && Val != 0) {
   2606     Error(E, "'ror' rotate amount must be 8, 16, or 24");
   2607     return MatchOperand_ParseFail;
   2608   }
   2609 
   2610   E = Parser.getTok().getLoc();
   2611   Operands.push_back(ARMOperand::CreateRotImm(Val, S, E));
   2612 
   2613   return MatchOperand_Success;
   2614 }
   2615 
   2616 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2617 parseBitfield(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2618   SMLoc S = Parser.getTok().getLoc();
   2619   // The bitfield descriptor is really two operands, the LSB and the width.
   2620   if (Parser.getTok().isNot(AsmToken::Hash)) {
   2621     Error(Parser.getTok().getLoc(), "'#' expected");
   2622     return MatchOperand_ParseFail;
   2623   }
   2624   Parser.Lex(); // Eat hash token.
   2625 
   2626   const MCExpr *LSBExpr;
   2627   SMLoc E = Parser.getTok().getLoc();
   2628   if (getParser().ParseExpression(LSBExpr)) {
   2629     Error(E, "malformed immediate expression");
   2630     return MatchOperand_ParseFail;
   2631   }
   2632   const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(LSBExpr);
   2633   if (!CE) {
   2634     Error(E, "'lsb' operand must be an immediate");
   2635     return MatchOperand_ParseFail;
   2636   }
   2637 
   2638   int64_t LSB = CE->getValue();
   2639   // The LSB must be in the range [0,31]
   2640   if (LSB < 0 || LSB > 31) {
   2641     Error(E, "'lsb' operand must be in the range [0,31]");
   2642     return MatchOperand_ParseFail;
   2643   }
   2644   E = Parser.getTok().getLoc();
   2645 
   2646   // Expect another immediate operand.
   2647   if (Parser.getTok().isNot(AsmToken::Comma)) {
   2648     Error(Parser.getTok().getLoc(), "too few operands");
   2649     return MatchOperand_ParseFail;
   2650   }
   2651   Parser.Lex(); // Eat hash token.
   2652   if (Parser.getTok().isNot(AsmToken::Hash)) {
   2653     Error(Parser.getTok().getLoc(), "'#' expected");
   2654     return MatchOperand_ParseFail;
   2655   }
   2656   Parser.Lex(); // Eat hash token.
   2657 
   2658   const MCExpr *WidthExpr;
   2659   if (getParser().ParseExpression(WidthExpr)) {
   2660     Error(E, "malformed immediate expression");
   2661     return MatchOperand_ParseFail;
   2662   }
   2663   CE = dyn_cast<MCConstantExpr>(WidthExpr);
   2664   if (!CE) {
   2665     Error(E, "'width' operand must be an immediate");
   2666     return MatchOperand_ParseFail;
   2667   }
   2668 
   2669   int64_t Width = CE->getValue();
   2670   // The LSB must be in the range [1,32-lsb]
   2671   if (Width < 1 || Width > 32 - LSB) {
   2672     Error(E, "'width' operand must be in the range [1,32-lsb]");
   2673     return MatchOperand_ParseFail;
   2674   }
   2675   E = Parser.getTok().getLoc();
   2676 
   2677   Operands.push_back(ARMOperand::CreateBitfield(LSB, Width, S, E));
   2678 
   2679   return MatchOperand_Success;
   2680 }
   2681 
   2682 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2683 parsePostIdxReg(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2684   // Check for a post-index addressing register operand. Specifically:
   2685   // postidx_reg := '+' register {, shift}
   2686   //              | '-' register {, shift}
   2687   //              | register {, shift}
   2688 
   2689   // This method must return MatchOperand_NoMatch without consuming any tokens
   2690   // in the case where there is no match, as other alternatives take other
   2691   // parse methods.
   2692   AsmToken Tok = Parser.getTok();
   2693   SMLoc S = Tok.getLoc();
   2694   bool haveEaten = false;
   2695   bool isAdd = true;
   2696   int Reg = -1;
   2697   if (Tok.is(AsmToken::Plus)) {
   2698     Parser.Lex(); // Eat the '+' token.
   2699     haveEaten = true;
   2700   } else if (Tok.is(AsmToken::Minus)) {
   2701     Parser.Lex(); // Eat the '-' token.
   2702     isAdd = false;
   2703     haveEaten = true;
   2704   }
   2705   if (Parser.getTok().is(AsmToken::Identifier))
   2706     Reg = tryParseRegister();
   2707   if (Reg == -1) {
   2708     if (!haveEaten)
   2709       return MatchOperand_NoMatch;
   2710     Error(Parser.getTok().getLoc(), "register expected");
   2711     return MatchOperand_ParseFail;
   2712   }
   2713   SMLoc E = Parser.getTok().getLoc();
   2714 
   2715   ARM_AM::ShiftOpc ShiftTy = ARM_AM::no_shift;
   2716   unsigned ShiftImm = 0;
   2717   if (Parser.getTok().is(AsmToken::Comma)) {
   2718     Parser.Lex(); // Eat the ','.
   2719     if (parseMemRegOffsetShift(ShiftTy, ShiftImm))
   2720       return MatchOperand_ParseFail;
   2721   }
   2722 
   2723   Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ShiftTy,
   2724                                                   ShiftImm, S, E));
   2725 
   2726   return MatchOperand_Success;
   2727 }
   2728 
   2729 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   2730 parseAM3Offset(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2731   // Check for a post-index addressing register operand. Specifically:
   2732   // am3offset := '+' register
   2733   //              | '-' register
   2734   //              | register
   2735   //              | # imm
   2736   //              | # + imm
   2737   //              | # - imm
   2738 
   2739   // This method must return MatchOperand_NoMatch without consuming any tokens
   2740   // in the case where there is no match, as other alternatives take other
   2741   // parse methods.
   2742   AsmToken Tok = Parser.getTok();
   2743   SMLoc S = Tok.getLoc();
   2744 
   2745   // Do immediates first, as we always parse those if we have a '#'.
   2746   if (Parser.getTok().is(AsmToken::Hash)) {
   2747     Parser.Lex(); // Eat the '#'.
   2748     // Explicitly look for a '-', as we need to encode negative zero
   2749     // differently.
   2750     bool isNegative = Parser.getTok().is(AsmToken::Minus);
   2751     const MCExpr *Offset;
   2752     if (getParser().ParseExpression(Offset))
   2753       return MatchOperand_ParseFail;
   2754     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset);
   2755     if (!CE) {
   2756       Error(S, "constant expression expected");
   2757       return MatchOperand_ParseFail;
   2758     }
   2759     SMLoc E = Tok.getLoc();
   2760     // Negative zero is encoded as the flag value INT32_MIN.
   2761     int32_t Val = CE->getValue();
   2762     if (isNegative && Val == 0)
   2763       Val = INT32_MIN;
   2764 
   2765     Operands.push_back(
   2766       ARMOperand::CreateImm(MCConstantExpr::Create(Val, getContext()), S, E));
   2767 
   2768     return MatchOperand_Success;
   2769   }
   2770 
   2771 
   2772   bool haveEaten = false;
   2773   bool isAdd = true;
   2774   int Reg = -1;
   2775   if (Tok.is(AsmToken::Plus)) {
   2776     Parser.Lex(); // Eat the '+' token.
   2777     haveEaten = true;
   2778   } else if (Tok.is(AsmToken::Minus)) {
   2779     Parser.Lex(); // Eat the '-' token.
   2780     isAdd = false;
   2781     haveEaten = true;
   2782   }
   2783   if (Parser.getTok().is(AsmToken::Identifier))
   2784     Reg = tryParseRegister();
   2785   if (Reg == -1) {
   2786     if (!haveEaten)
   2787       return MatchOperand_NoMatch;
   2788     Error(Parser.getTok().getLoc(), "register expected");
   2789     return MatchOperand_ParseFail;
   2790   }
   2791   SMLoc E = Parser.getTok().getLoc();
   2792 
   2793   Operands.push_back(ARMOperand::CreatePostIdxReg(Reg, isAdd, ARM_AM::no_shift,
   2794                                                   0, S, E));
   2795 
   2796   return MatchOperand_Success;
   2797 }
   2798 
   2799 /// cvtT2LdrdPre - Convert parsed operands to MCInst.
   2800 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2801 /// when they refer multiple MIOperands inside a single one.
   2802 bool ARMAsmParser::
   2803 cvtT2LdrdPre(MCInst &Inst, unsigned Opcode,
   2804              const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2805   // Rt, Rt2
   2806   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2807   ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
   2808   // Create a writeback register dummy placeholder.
   2809   Inst.addOperand(MCOperand::CreateReg(0));
   2810   // addr
   2811   ((ARMOperand*)Operands[4])->addMemImm8s4OffsetOperands(Inst, 2);
   2812   // pred
   2813   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2814   return true;
   2815 }
   2816 
   2817 /// cvtT2StrdPre - Convert parsed operands to MCInst.
   2818 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2819 /// when they refer multiple MIOperands inside a single one.
   2820 bool ARMAsmParser::
   2821 cvtT2StrdPre(MCInst &Inst, unsigned Opcode,
   2822              const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2823   // Create a writeback register dummy placeholder.
   2824   Inst.addOperand(MCOperand::CreateReg(0));
   2825   // Rt, Rt2
   2826   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2827   ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
   2828   // addr
   2829   ((ARMOperand*)Operands[4])->addMemImm8s4OffsetOperands(Inst, 2);
   2830   // pred
   2831   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2832   return true;
   2833 }
   2834 
   2835 /// cvtLdWriteBackRegT2AddrModeImm8 - Convert parsed operands to MCInst.
   2836 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2837 /// when they refer multiple MIOperands inside a single one.
   2838 bool ARMAsmParser::
   2839 cvtLdWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
   2840                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2841   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2842 
   2843   // Create a writeback register dummy placeholder.
   2844   Inst.addOperand(MCOperand::CreateImm(0));
   2845 
   2846   ((ARMOperand*)Operands[3])->addMemImm8OffsetOperands(Inst, 2);
   2847   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2848   return true;
   2849 }
   2850 
   2851 /// cvtStWriteBackRegT2AddrModeImm8 - Convert parsed operands to MCInst.
   2852 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2853 /// when they refer multiple MIOperands inside a single one.
   2854 bool ARMAsmParser::
   2855 cvtStWriteBackRegT2AddrModeImm8(MCInst &Inst, unsigned Opcode,
   2856                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2857   // Create a writeback register dummy placeholder.
   2858   Inst.addOperand(MCOperand::CreateImm(0));
   2859   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2860   ((ARMOperand*)Operands[3])->addMemImm8OffsetOperands(Inst, 2);
   2861   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2862   return true;
   2863 }
   2864 
   2865 /// cvtLdWriteBackRegAddrMode2 - Convert parsed operands to MCInst.
   2866 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2867 /// when they refer multiple MIOperands inside a single one.
   2868 bool ARMAsmParser::
   2869 cvtLdWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
   2870                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2871   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2872 
   2873   // Create a writeback register dummy placeholder.
   2874   Inst.addOperand(MCOperand::CreateImm(0));
   2875 
   2876   ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3);
   2877   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2878   return true;
   2879 }
   2880 
   2881 /// cvtLdWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst.
   2882 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2883 /// when they refer multiple MIOperands inside a single one.
   2884 bool ARMAsmParser::
   2885 cvtLdWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
   2886                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2887   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2888 
   2889   // Create a writeback register dummy placeholder.
   2890   Inst.addOperand(MCOperand::CreateImm(0));
   2891 
   2892   ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2);
   2893   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2894   return true;
   2895 }
   2896 
   2897 
   2898 /// cvtStWriteBackRegAddrModeImm12 - Convert parsed operands to MCInst.
   2899 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2900 /// when they refer multiple MIOperands inside a single one.
   2901 bool ARMAsmParser::
   2902 cvtStWriteBackRegAddrModeImm12(MCInst &Inst, unsigned Opcode,
   2903                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2904   // Create a writeback register dummy placeholder.
   2905   Inst.addOperand(MCOperand::CreateImm(0));
   2906   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2907   ((ARMOperand*)Operands[3])->addMemImm12OffsetOperands(Inst, 2);
   2908   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2909   return true;
   2910 }
   2911 
   2912 /// cvtStWriteBackRegAddrMode2 - Convert parsed operands to MCInst.
   2913 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2914 /// when they refer multiple MIOperands inside a single one.
   2915 bool ARMAsmParser::
   2916 cvtStWriteBackRegAddrMode2(MCInst &Inst, unsigned Opcode,
   2917                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2918   // Create a writeback register dummy placeholder.
   2919   Inst.addOperand(MCOperand::CreateImm(0));
   2920   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2921   ((ARMOperand*)Operands[3])->addAddrMode2Operands(Inst, 3);
   2922   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2923   return true;
   2924 }
   2925 
   2926 /// cvtStWriteBackRegAddrMode3 - Convert parsed operands to MCInst.
   2927 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2928 /// when they refer multiple MIOperands inside a single one.
   2929 bool ARMAsmParser::
   2930 cvtStWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
   2931                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2932   // Create a writeback register dummy placeholder.
   2933   Inst.addOperand(MCOperand::CreateImm(0));
   2934   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2935   ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3);
   2936   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2937   return true;
   2938 }
   2939 
   2940 /// cvtLdExtTWriteBackImm - Convert parsed operands to MCInst.
   2941 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2942 /// when they refer multiple MIOperands inside a single one.
   2943 bool ARMAsmParser::
   2944 cvtLdExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
   2945                       const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2946   // Rt
   2947   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2948   // Create a writeback register dummy placeholder.
   2949   Inst.addOperand(MCOperand::CreateImm(0));
   2950   // addr
   2951   ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
   2952   // offset
   2953   ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1);
   2954   // pred
   2955   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2956   return true;
   2957 }
   2958 
   2959 /// cvtLdExtTWriteBackReg - Convert parsed operands to MCInst.
   2960 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2961 /// when they refer multiple MIOperands inside a single one.
   2962 bool ARMAsmParser::
   2963 cvtLdExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
   2964                       const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2965   // Rt
   2966   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2967   // Create a writeback register dummy placeholder.
   2968   Inst.addOperand(MCOperand::CreateImm(0));
   2969   // addr
   2970   ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
   2971   // offset
   2972   ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2);
   2973   // pred
   2974   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2975   return true;
   2976 }
   2977 
   2978 /// cvtStExtTWriteBackImm - Convert parsed operands to MCInst.
   2979 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2980 /// when they refer multiple MIOperands inside a single one.
   2981 bool ARMAsmParser::
   2982 cvtStExtTWriteBackImm(MCInst &Inst, unsigned Opcode,
   2983                       const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   2984   // Create a writeback register dummy placeholder.
   2985   Inst.addOperand(MCOperand::CreateImm(0));
   2986   // Rt
   2987   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   2988   // addr
   2989   ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
   2990   // offset
   2991   ((ARMOperand*)Operands[4])->addPostIdxImm8Operands(Inst, 1);
   2992   // pred
   2993   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   2994   return true;
   2995 }
   2996 
   2997 /// cvtStExtTWriteBackReg - Convert parsed operands to MCInst.
   2998 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   2999 /// when they refer multiple MIOperands inside a single one.
   3000 bool ARMAsmParser::
   3001 cvtStExtTWriteBackReg(MCInst &Inst, unsigned Opcode,
   3002                       const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3003   // Create a writeback register dummy placeholder.
   3004   Inst.addOperand(MCOperand::CreateImm(0));
   3005   // Rt
   3006   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   3007   // addr
   3008   ((ARMOperand*)Operands[3])->addMemNoOffsetOperands(Inst, 1);
   3009   // offset
   3010   ((ARMOperand*)Operands[4])->addPostIdxRegOperands(Inst, 2);
   3011   // pred
   3012   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   3013   return true;
   3014 }
   3015 
   3016 /// cvtLdrdPre - Convert parsed operands to MCInst.
   3017 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   3018 /// when they refer multiple MIOperands inside a single one.
   3019 bool ARMAsmParser::
   3020 cvtLdrdPre(MCInst &Inst, unsigned Opcode,
   3021            const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3022   // Rt, Rt2
   3023   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   3024   ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
   3025   // Create a writeback register dummy placeholder.
   3026   Inst.addOperand(MCOperand::CreateImm(0));
   3027   // addr
   3028   ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3);
   3029   // pred
   3030   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   3031   return true;
   3032 }
   3033 
   3034 /// cvtStrdPre - Convert parsed operands to MCInst.
   3035 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   3036 /// when they refer multiple MIOperands inside a single one.
   3037 bool ARMAsmParser::
   3038 cvtStrdPre(MCInst &Inst, unsigned Opcode,
   3039            const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3040   // Create a writeback register dummy placeholder.
   3041   Inst.addOperand(MCOperand::CreateImm(0));
   3042   // Rt, Rt2
   3043   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   3044   ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
   3045   // addr
   3046   ((ARMOperand*)Operands[4])->addAddrMode3Operands(Inst, 3);
   3047   // pred
   3048   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   3049   return true;
   3050 }
   3051 
   3052 /// cvtLdWriteBackRegAddrMode3 - Convert parsed operands to MCInst.
   3053 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   3054 /// when they refer multiple MIOperands inside a single one.
   3055 bool ARMAsmParser::
   3056 cvtLdWriteBackRegAddrMode3(MCInst &Inst, unsigned Opcode,
   3057                          const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3058   ((ARMOperand*)Operands[2])->addRegOperands(Inst, 1);
   3059   // Create a writeback register dummy placeholder.
   3060   Inst.addOperand(MCOperand::CreateImm(0));
   3061   ((ARMOperand*)Operands[3])->addAddrMode3Operands(Inst, 3);
   3062   ((ARMOperand*)Operands[1])->addCondCodeOperands(Inst, 2);
   3063   return true;
   3064 }
   3065 
   3066 /// cvtThumbMultiple- Convert parsed operands to MCInst.
   3067 /// Needed here because the Asm Gen Matcher can't handle properly tied operands
   3068 /// when they refer multiple MIOperands inside a single one.
   3069 bool ARMAsmParser::
   3070 cvtThumbMultiply(MCInst &Inst, unsigned Opcode,
   3071            const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3072   // The second source operand must be the same register as the destination
   3073   // operand.
   3074   if (Operands.size() == 6 &&
   3075       (((ARMOperand*)Operands[3])->getReg() !=
   3076        ((ARMOperand*)Operands[5])->getReg()) &&
   3077       (((ARMOperand*)Operands[3])->getReg() !=
   3078        ((ARMOperand*)Operands[4])->getReg())) {
   3079     Error(Operands[3]->getStartLoc(),
   3080           "destination register must match source register");
   3081     return false;
   3082   }
   3083   ((ARMOperand*)Operands[3])->addRegOperands(Inst, 1);
   3084   ((ARMOperand*)Operands[1])->addCCOutOperands(Inst, 1);
   3085   ((ARMOperand*)Operands[4])->addRegOperands(Inst, 1);
   3086   // If we have a three-operand form, use that, else the second source operand
   3087   // is just the destination operand again.
   3088   if (Operands.size() == 6)
   3089     ((ARMOperand*)Operands[5])->addRegOperands(Inst, 1);
   3090   else
   3091     Inst.addOperand(Inst.getOperand(0));
   3092   ((ARMOperand*)Operands[2])->addCondCodeOperands(Inst, 2);
   3093 
   3094   return true;
   3095 }
   3096 
   3097 /// Parse an ARM memory expression, return false if successful else return true
   3098 /// or an error.  The first token must be a '[' when called.
   3099 bool ARMAsmParser::
   3100 parseMemory(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3101   SMLoc S, E;
   3102   assert(Parser.getTok().is(AsmToken::LBrac) &&
   3103          "Token is not a Left Bracket");
   3104   S = Parser.getTok().getLoc();
   3105   Parser.Lex(); // Eat left bracket token.
   3106 
   3107   const AsmToken &BaseRegTok = Parser.getTok();
   3108   int BaseRegNum = tryParseRegister();
   3109   if (BaseRegNum == -1)
   3110     return Error(BaseRegTok.getLoc(), "register expected");
   3111 
   3112   // The next token must either be a comma or a closing bracket.
   3113   const AsmToken &Tok = Parser.getTok();
   3114   if (!Tok.is(AsmToken::Comma) && !Tok.is(AsmToken::RBrac))
   3115     return Error(Tok.getLoc(), "malformed memory operand");
   3116 
   3117   if (Tok.is(AsmToken::RBrac)) {
   3118     E = Tok.getLoc();
   3119     Parser.Lex(); // Eat right bracket token.
   3120 
   3121     Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0, ARM_AM::no_shift,
   3122                                              0, 0, false, S, E));
   3123 
   3124     // If there's a pre-indexing writeback marker, '!', just add it as a token
   3125     // operand. It's rather odd, but syntactically valid.
   3126     if (Parser.getTok().is(AsmToken::Exclaim)) {
   3127       Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
   3128       Parser.Lex(); // Eat the '!'.
   3129     }
   3130 
   3131     return false;
   3132   }
   3133 
   3134   assert(Tok.is(AsmToken::Comma) && "Lost comma in memory operand?!");
   3135   Parser.Lex(); // Eat the comma.
   3136 
   3137   // If we have a ':', it's an alignment specifier.
   3138   if (Parser.getTok().is(AsmToken::Colon)) {
   3139     Parser.Lex(); // Eat the ':'.
   3140     E = Parser.getTok().getLoc();
   3141 
   3142     const MCExpr *Expr;
   3143     if (getParser().ParseExpression(Expr))
   3144      return true;
   3145 
   3146     // The expression has to be a constant. Memory references with relocations
   3147     // don't come through here, as they use the <label> forms of the relevant
   3148     // instructions.
   3149     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr);
   3150     if (!CE)
   3151       return Error (E, "constant expression expected");
   3152 
   3153     unsigned Align = 0;
   3154     switch (CE->getValue()) {
   3155     default:
   3156       return Error(E, "alignment specifier must be 64, 128, or 256 bits");
   3157     case 64:  Align = 8; break;
   3158     case 128: Align = 16; break;
   3159     case 256: Align = 32; break;
   3160     }
   3161 
   3162     // Now we should have the closing ']'
   3163     E = Parser.getTok().getLoc();
   3164     if (Parser.getTok().isNot(AsmToken::RBrac))
   3165       return Error(E, "']' expected");
   3166     Parser.Lex(); // Eat right bracket token.
   3167 
   3168     // Don't worry about range checking the value here. That's handled by
   3169     // the is*() predicates.
   3170     Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, 0,
   3171                                              ARM_AM::no_shift, 0, Align,
   3172                                              false, S, E));
   3173 
   3174     // If there's a pre-indexing writeback marker, '!', just add it as a token
   3175     // operand.
   3176     if (Parser.getTok().is(AsmToken::Exclaim)) {
   3177       Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
   3178       Parser.Lex(); // Eat the '!'.
   3179     }
   3180 
   3181     return false;
   3182   }
   3183 
   3184   // If we have a '#', it's an immediate offset, else assume it's a register
   3185   // offset.
   3186   if (Parser.getTok().is(AsmToken::Hash)) {
   3187     Parser.Lex(); // Eat the '#'.
   3188     E = Parser.getTok().getLoc();
   3189 
   3190     bool isNegative = getParser().getTok().is(AsmToken::Minus);
   3191     const MCExpr *Offset;
   3192     if (getParser().ParseExpression(Offset))
   3193      return true;
   3194 
   3195     // The expression has to be a constant. Memory references with relocations
   3196     // don't come through here, as they use the <label> forms of the relevant
   3197     // instructions.
   3198     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Offset);
   3199     if (!CE)
   3200       return Error (E, "constant expression expected");
   3201 
   3202     // If the constant was #-0, represent it as INT32_MIN.
   3203     int32_t Val = CE->getValue();
   3204     if (isNegative && Val == 0)
   3205       CE = MCConstantExpr::Create(INT32_MIN, getContext());
   3206 
   3207     // Now we should have the closing ']'
   3208     E = Parser.getTok().getLoc();
   3209     if (Parser.getTok().isNot(AsmToken::RBrac))
   3210       return Error(E, "']' expected");
   3211     Parser.Lex(); // Eat right bracket token.
   3212 
   3213     // Don't worry about range checking the value here. That's handled by
   3214     // the is*() predicates.
   3215     Operands.push_back(ARMOperand::CreateMem(BaseRegNum, CE, 0,
   3216                                              ARM_AM::no_shift, 0, 0,
   3217                                              false, S, E));
   3218 
   3219     // If there's a pre-indexing writeback marker, '!', just add it as a token
   3220     // operand.
   3221     if (Parser.getTok().is(AsmToken::Exclaim)) {
   3222       Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
   3223       Parser.Lex(); // Eat the '!'.
   3224     }
   3225 
   3226     return false;
   3227   }
   3228 
   3229   // The register offset is optionally preceded by a '+' or '-'
   3230   bool isNegative = false;
   3231   if (Parser.getTok().is(AsmToken::Minus)) {
   3232     isNegative = true;
   3233     Parser.Lex(); // Eat the '-'.
   3234   } else if (Parser.getTok().is(AsmToken::Plus)) {
   3235     // Nothing to do.
   3236     Parser.Lex(); // Eat the '+'.
   3237   }
   3238 
   3239   E = Parser.getTok().getLoc();
   3240   int OffsetRegNum = tryParseRegister();
   3241   if (OffsetRegNum == -1)
   3242     return Error(E, "register expected");
   3243 
   3244   // If there's a shift operator, handle it.
   3245   ARM_AM::ShiftOpc ShiftType = ARM_AM::no_shift;
   3246   unsigned ShiftImm = 0;
   3247   if (Parser.getTok().is(AsmToken::Comma)) {
   3248     Parser.Lex(); // Eat the ','.
   3249     if (parseMemRegOffsetShift(ShiftType, ShiftImm))
   3250       return true;
   3251   }
   3252 
   3253   // Now we should have the closing ']'
   3254   E = Parser.getTok().getLoc();
   3255   if (Parser.getTok().isNot(AsmToken::RBrac))
   3256     return Error(E, "']' expected");
   3257   Parser.Lex(); // Eat right bracket token.
   3258 
   3259   Operands.push_back(ARMOperand::CreateMem(BaseRegNum, 0, OffsetRegNum,
   3260                                            ShiftType, ShiftImm, 0, isNegative,
   3261                                            S, E));
   3262 
   3263   // If there's a pre-indexing writeback marker, '!', just add it as a token
   3264   // operand.
   3265   if (Parser.getTok().is(AsmToken::Exclaim)) {
   3266     Operands.push_back(ARMOperand::CreateToken("!",Parser.getTok().getLoc()));
   3267     Parser.Lex(); // Eat the '!'.
   3268   }
   3269 
   3270   return false;
   3271 }
   3272 
   3273 /// parseMemRegOffsetShift - one of these two:
   3274 ///   ( lsl | lsr | asr | ror ) , # shift_amount
   3275 ///   rrx
   3276 /// return true if it parses a shift otherwise it returns false.
   3277 bool ARMAsmParser::parseMemRegOffsetShift(ARM_AM::ShiftOpc &St,
   3278                                           unsigned &Amount) {
   3279   SMLoc Loc = Parser.getTok().getLoc();
   3280   const AsmToken &Tok = Parser.getTok();
   3281   if (Tok.isNot(AsmToken::Identifier))
   3282     return true;
   3283   StringRef ShiftName = Tok.getString();
   3284   if (ShiftName == "lsl" || ShiftName == "LSL")
   3285     St = ARM_AM::lsl;
   3286   else if (ShiftName == "lsr" || ShiftName == "LSR")
   3287     St = ARM_AM::lsr;
   3288   else if (ShiftName == "asr" || ShiftName == "ASR")
   3289     St = ARM_AM::asr;
   3290   else if (ShiftName == "ror" || ShiftName == "ROR")
   3291     St = ARM_AM::ror;
   3292   else if (ShiftName == "rrx" || ShiftName == "RRX")
   3293     St = ARM_AM::rrx;
   3294   else
   3295     return Error(Loc, "illegal shift operator");
   3296   Parser.Lex(); // Eat shift type token.
   3297 
   3298   // rrx stands alone.
   3299   Amount = 0;
   3300   if (St != ARM_AM::rrx) {
   3301     Loc = Parser.getTok().getLoc();
   3302     // A '#' and a shift amount.
   3303     const AsmToken &HashTok = Parser.getTok();
   3304     if (HashTok.isNot(AsmToken::Hash))
   3305       return Error(HashTok.getLoc(), "'#' expected");
   3306     Parser.Lex(); // Eat hash token.
   3307 
   3308     const MCExpr *Expr;
   3309     if (getParser().ParseExpression(Expr))
   3310       return true;
   3311     // Range check the immediate.
   3312     // lsl, ror: 0 <= imm <= 31
   3313     // lsr, asr: 0 <= imm <= 32
   3314     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr);
   3315     if (!CE)
   3316       return Error(Loc, "shift amount must be an immediate");
   3317     int64_t Imm = CE->getValue();
   3318     if (Imm < 0 ||
   3319         ((St == ARM_AM::lsl || St == ARM_AM::ror) && Imm > 31) ||
   3320         ((St == ARM_AM::lsr || St == ARM_AM::asr) && Imm > 32))
   3321       return Error(Loc, "immediate shift value out of range");
   3322     Amount = Imm;
   3323   }
   3324 
   3325   return false;
   3326 }
   3327 
   3328 /// parseFPImm - A floating point immediate expression operand.
   3329 ARMAsmParser::OperandMatchResultTy ARMAsmParser::
   3330 parseFPImm(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3331   SMLoc S = Parser.getTok().getLoc();
   3332 
   3333   if (Parser.getTok().isNot(AsmToken::Hash))
   3334     return MatchOperand_NoMatch;
   3335   Parser.Lex(); // Eat the '#'.
   3336 
   3337   // Handle negation, as that still comes through as a separate token.
   3338   bool isNegative = false;
   3339   if (Parser.getTok().is(AsmToken::Minus)) {
   3340     isNegative = true;
   3341     Parser.Lex();
   3342   }
   3343   const AsmToken &Tok = Parser.getTok();
   3344   if (Tok.is(AsmToken::Real)) {
   3345     APFloat RealVal(APFloat::IEEEdouble, Tok.getString());
   3346     uint64_t IntVal = RealVal.bitcastToAPInt().getZExtValue();
   3347     // If we had a '-' in front, toggle the sign bit.
   3348     IntVal ^= (uint64_t)isNegative << 63;
   3349     int Val = ARM_AM::getFP64Imm(APInt(64, IntVal));
   3350     Parser.Lex(); // Eat the token.
   3351     if (Val == -1) {
   3352       TokError("floating point value out of range");
   3353       return MatchOperand_ParseFail;
   3354     }
   3355     Operands.push_back(ARMOperand::CreateFPImm(Val, S, getContext()));
   3356     return MatchOperand_Success;
   3357   }
   3358   if (Tok.is(AsmToken::Integer)) {
   3359     int64_t Val = Tok.getIntVal();
   3360     Parser.Lex(); // Eat the token.
   3361     if (Val > 255 || Val < 0) {
   3362       TokError("encoded floating point value out of range");
   3363       return MatchOperand_ParseFail;
   3364     }
   3365     Operands.push_back(ARMOperand::CreateFPImm(Val, S, getContext()));
   3366     return MatchOperand_Success;
   3367   }
   3368 
   3369   TokError("invalid floating point immediate");
   3370   return MatchOperand_ParseFail;
   3371 }
   3372 /// Parse a arm instruction operand.  For now this parses the operand regardless
   3373 /// of the mnemonic.
   3374 bool ARMAsmParser::parseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
   3375                                 StringRef Mnemonic) {
   3376   SMLoc S, E;
   3377 
   3378   // Check if the current operand has a custom associated parser, if so, try to
   3379   // custom parse the operand, or fallback to the general approach.
   3380   OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic);
   3381   if (ResTy == MatchOperand_Success)
   3382     return false;
   3383   // If there wasn't a custom match, try the generic matcher below. Otherwise,
   3384   // there was a match, but an error occurred, in which case, just return that
   3385   // the operand parsing failed.
   3386   if (ResTy == MatchOperand_ParseFail)
   3387     return true;
   3388 
   3389   switch (getLexer().getKind()) {
   3390   default:
   3391     Error(Parser.getTok().getLoc(), "unexpected token in operand");
   3392     return true;
   3393   case AsmToken::Identifier: {
   3394     // If this is VMRS, check for the apsr_nzcv operand.
   3395     if (!tryParseRegisterWithWriteBack(Operands))
   3396       return false;
   3397     int Res = tryParseShiftRegister(Operands);
   3398     if (Res == 0) // success
   3399       return false;
   3400     else if (Res == -1) // irrecoverable error
   3401       return true;
   3402     if (Mnemonic == "vmrs" && Parser.getTok().getString() == "apsr_nzcv") {
   3403       S = Parser.getTok().getLoc();
   3404       Parser.Lex();
   3405       Operands.push_back(ARMOperand::CreateToken("apsr_nzcv", S));
   3406       return false;
   3407     }
   3408 
   3409     // Fall though for the Identifier case that is not a register or a
   3410     // special name.
   3411   }
   3412   case AsmToken::Integer: // things like 1f and 2b as a branch targets
   3413   case AsmToken::Dot: {   // . as a branch target
   3414     // This was not a register so parse other operands that start with an
   3415     // identifier (like labels) as expressions and create them as immediates.
   3416     const MCExpr *IdVal;
   3417     S = Parser.getTok().getLoc();
   3418     if (getParser().ParseExpression(IdVal))
   3419       return true;
   3420     E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
   3421     Operands.push_back(ARMOperand::CreateImm(IdVal, S, E));
   3422     return false;
   3423   }
   3424   case AsmToken::LBrac:
   3425     return parseMemory(Operands);
   3426   case AsmToken::LCurly:
   3427     return parseRegisterList(Operands);
   3428   case AsmToken::Hash: {
   3429     // #42 -> immediate.
   3430     // TODO: ":lower16:" and ":upper16:" modifiers after # before immediate
   3431     S = Parser.getTok().getLoc();
   3432     Parser.Lex();
   3433     bool isNegative = Parser.getTok().is(AsmToken::Minus);
   3434     const MCExpr *ImmVal;
   3435     if (getParser().ParseExpression(ImmVal))
   3436       return true;
   3437     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ImmVal);
   3438     if (!CE) {
   3439       Error(S, "constant expression expected");
   3440       return MatchOperand_ParseFail;
   3441     }
   3442     int32_t Val = CE->getValue();
   3443     if (isNegative && Val == 0)
   3444       ImmVal = MCConstantExpr::Create(INT32_MIN, getContext());
   3445     E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
   3446     Operands.push_back(ARMOperand::CreateImm(ImmVal, S, E));
   3447     return false;
   3448   }
   3449   case AsmToken::Colon: {
   3450     // ":lower16:" and ":upper16:" expression prefixes
   3451     // FIXME: Check it's an expression prefix,
   3452     // e.g. (FOO - :lower16:BAR) isn't legal.
   3453     ARMMCExpr::VariantKind RefKind;
   3454     if (parsePrefix(RefKind))
   3455       return true;
   3456 
   3457     const MCExpr *SubExprVal;
   3458     if (getParser().ParseExpression(SubExprVal))
   3459       return true;
   3460 
   3461     const MCExpr *ExprVal = ARMMCExpr::Create(RefKind, SubExprVal,
   3462                                                    getContext());
   3463     E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
   3464     Operands.push_back(ARMOperand::CreateImm(ExprVal, S, E));
   3465     return false;
   3466   }
   3467   }
   3468 }
   3469 
   3470 // parsePrefix - Parse ARM 16-bit relocations expression prefix, i.e.
   3471 //  :lower16: and :upper16:.
   3472 bool ARMAsmParser::parsePrefix(ARMMCExpr::VariantKind &RefKind) {
   3473   RefKind = ARMMCExpr::VK_ARM_None;
   3474 
   3475   // :lower16: and :upper16: modifiers
   3476   assert(getLexer().is(AsmToken::Colon) && "expected a :");
   3477   Parser.Lex(); // Eat ':'
   3478 
   3479   if (getLexer().isNot(AsmToken::Identifier)) {
   3480     Error(Parser.getTok().getLoc(), "expected prefix identifier in operand");
   3481     return true;
   3482   }
   3483 
   3484   StringRef IDVal = Parser.getTok().getIdentifier();
   3485   if (IDVal == "lower16") {
   3486     RefKind = ARMMCExpr::VK_ARM_LO16;
   3487   } else if (IDVal == "upper16") {
   3488     RefKind = ARMMCExpr::VK_ARM_HI16;
   3489   } else {
   3490     Error(Parser.getTok().getLoc(), "unexpected prefix in operand");
   3491     return true;
   3492   }
   3493   Parser.Lex();
   3494 
   3495   if (getLexer().isNot(AsmToken::Colon)) {
   3496     Error(Parser.getTok().getLoc(), "unexpected token after prefix");
   3497     return true;
   3498   }
   3499   Parser.Lex(); // Eat the last ':'
   3500   return false;
   3501 }
   3502 
   3503 /// \brief Given a mnemonic, split out possible predication code and carry
   3504 /// setting letters to form a canonical mnemonic and flags.
   3505 //
   3506 // FIXME: Would be nice to autogen this.
   3507 // FIXME: This is a bit of a maze of special cases.
   3508 StringRef ARMAsmParser::splitMnemonic(StringRef Mnemonic,
   3509                                       unsigned &PredicationCode,
   3510                                       bool &CarrySetting,
   3511                                       unsigned &ProcessorIMod,
   3512                                       StringRef &ITMask) {
   3513   PredicationCode = ARMCC::AL;
   3514   CarrySetting = false;
   3515   ProcessorIMod = 0;
   3516 
   3517   // Ignore some mnemonics we know aren't predicated forms.
   3518   //
   3519   // FIXME: Would be nice to autogen this.
   3520   if ((Mnemonic == "movs" && isThumb()) ||
   3521       Mnemonic == "teq"   || Mnemonic == "vceq"   || Mnemonic == "svc"   ||
   3522       Mnemonic == "mls"   || Mnemonic == "smmls"  || Mnemonic == "vcls"  ||
   3523       Mnemonic == "vmls"  || Mnemonic == "vnmls"  || Mnemonic == "vacge" ||
   3524       Mnemonic == "vcge"  || Mnemonic == "vclt"   || Mnemonic == "vacgt" ||
   3525       Mnemonic == "vcgt"  || Mnemonic == "vcle"   || Mnemonic == "smlal" ||
   3526       Mnemonic == "umaal" || Mnemonic == "umlal"  || Mnemonic == "vabal" ||
   3527       Mnemonic == "vmlal" || Mnemonic == "vpadal" || Mnemonic == "vqdmlal")
   3528     return Mnemonic;
   3529 
   3530   // First, split out any predication code. Ignore mnemonics we know aren't
   3531   // predicated but do have a carry-set and so weren't caught above.
   3532   if (Mnemonic != "adcs" && Mnemonic != "bics" && Mnemonic != "movs" &&
   3533       Mnemonic != "muls" && Mnemonic != "smlals" && Mnemonic != "smulls" &&
   3534       Mnemonic != "umlals" && Mnemonic != "umulls" && Mnemonic != "lsls" &&
   3535       Mnemonic != "sbcs" && Mnemonic != "rscs") {
   3536     unsigned CC = StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2))
   3537       .Case("eq", ARMCC::EQ)
   3538       .Case("ne", ARMCC::NE)
   3539       .Case("hs", ARMCC::HS)
   3540       .Case("cs", ARMCC::HS)
   3541       .Case("lo", ARMCC::LO)
   3542       .Case("cc", ARMCC::LO)
   3543       .Case("mi", ARMCC::MI)
   3544       .Case("pl", ARMCC::PL)
   3545       .Case("vs", ARMCC::VS)
   3546       .Case("vc", ARMCC::VC)
   3547       .Case("hi", ARMCC::HI)
   3548       .Case("ls", ARMCC::LS)
   3549       .Case("ge", ARMCC::GE)
   3550       .Case("lt", ARMCC::LT)
   3551       .Case("gt", ARMCC::GT)
   3552       .Case("le", ARMCC::LE)
   3553       .Case("al", ARMCC::AL)
   3554       .Default(~0U);
   3555     if (CC != ~0U) {
   3556       Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 2);
   3557       PredicationCode = CC;
   3558     }
   3559   }
   3560 
   3561   // Next, determine if we have a carry setting bit. We explicitly ignore all
   3562   // the instructions we know end in 's'.
   3563   if (Mnemonic.endswith("s") &&
   3564       !(Mnemonic == "cps" || Mnemonic == "mls" ||
   3565         Mnemonic == "mrs" || Mnemonic == "smmls" || Mnemonic == "vabs" ||
   3566         Mnemonic == "vcls" || Mnemonic == "vmls" || Mnemonic == "vmrs" ||
   3567         Mnemonic == "vnmls" || Mnemonic == "vqabs" || Mnemonic == "vrecps" ||
   3568         Mnemonic == "vrsqrts" || Mnemonic == "srs" ||
   3569         (Mnemonic == "movs" && isThumb()))) {
   3570     Mnemonic = Mnemonic.slice(0, Mnemonic.size() - 1);
   3571     CarrySetting = true;
   3572   }
   3573 
   3574   // The "cps" instruction can have a interrupt mode operand which is glued into
   3575   // the mnemonic. Check if this is the case, split it and parse the imod op
   3576   if (Mnemonic.startswith("cps")) {
   3577     // Split out any imod code.
   3578     unsigned IMod =
   3579       StringSwitch<unsigned>(Mnemonic.substr(Mnemonic.size()-2, 2))
   3580       .Case("ie", ARM_PROC::IE)
   3581       .Case("id", ARM_PROC::ID)
   3582       .Default(~0U);
   3583     if (IMod != ~0U) {
   3584       Mnemonic = Mnemonic.slice(0, Mnemonic.size()-2);
   3585       ProcessorIMod = IMod;
   3586     }
   3587   }
   3588 
   3589   // The "it" instruction has the condition mask on the end of the mnemonic.
   3590   if (Mnemonic.startswith("it")) {
   3591     ITMask = Mnemonic.slice(2, Mnemonic.size());
   3592     Mnemonic = Mnemonic.slice(0, 2);
   3593   }
   3594 
   3595   return Mnemonic;
   3596 }
   3597 
   3598 /// \brief Given a canonical mnemonic, determine if the instruction ever allows
   3599 /// inclusion of carry set or predication code operands.
   3600 //
   3601 // FIXME: It would be nice to autogen this.
   3602 void ARMAsmParser::
   3603 getMnemonicAcceptInfo(StringRef Mnemonic, bool &CanAcceptCarrySet,
   3604                       bool &CanAcceptPredicationCode) {
   3605   if (Mnemonic == "and" || Mnemonic == "lsl" || Mnemonic == "lsr" ||
   3606       Mnemonic == "rrx" || Mnemonic == "ror" || Mnemonic == "sub" ||
   3607       Mnemonic == "add" || Mnemonic == "adc" ||
   3608       Mnemonic == "mul" || Mnemonic == "bic" || Mnemonic == "asr" ||
   3609       Mnemonic == "orr" || Mnemonic == "mvn" ||
   3610       Mnemonic == "rsb" || Mnemonic == "rsc" || Mnemonic == "orn" ||
   3611       Mnemonic == "sbc" || Mnemonic == "eor" || Mnemonic == "neg" ||
   3612       (!isThumb() && (Mnemonic == "smull" || Mnemonic == "mov" ||
   3613                       Mnemonic == "mla" || Mnemonic == "smlal" ||
   3614                       Mnemonic == "umlal" || Mnemonic == "umull"))) {
   3615     CanAcceptCarrySet = true;
   3616   } else
   3617     CanAcceptCarrySet = false;
   3618 
   3619   if (Mnemonic == "cbnz" || Mnemonic == "setend" || Mnemonic == "dmb" ||
   3620       Mnemonic == "cps" || Mnemonic == "mcr2" || Mnemonic == "it" ||
   3621       Mnemonic == "mcrr2" || Mnemonic == "cbz" || Mnemonic == "cdp2" ||
   3622       Mnemonic == "trap" || Mnemonic == "mrc2" || Mnemonic == "mrrc2" ||
   3623       Mnemonic == "dsb" || Mnemonic == "isb" || Mnemonic == "setend" ||
   3624       (Mnemonic == "clrex" && !isThumb()) ||
   3625       (Mnemonic == "nop" && isThumbOne()) ||
   3626       ((Mnemonic == "pld" || Mnemonic == "pli" || Mnemonic == "pldw" ||
   3627         Mnemonic == "ldc2" || Mnemonic == "ldc2l" ||
   3628         Mnemonic == "stc2" || Mnemonic == "stc2l") && !isThumb()) ||
   3629       ((Mnemonic.startswith("rfe") || Mnemonic.startswith("srs")) &&
   3630        !isThumb()) ||
   3631       Mnemonic.startswith("cps") || (Mnemonic == "movs" && isThumbOne())) {
   3632     CanAcceptPredicationCode = false;
   3633   } else
   3634     CanAcceptPredicationCode = true;
   3635 
   3636   if (isThumb()) {
   3637     if (Mnemonic == "bkpt" || Mnemonic == "mcr" || Mnemonic == "mcrr" ||
   3638         Mnemonic == "mrc" || Mnemonic == "mrrc" || Mnemonic == "cdp")
   3639       CanAcceptPredicationCode = false;
   3640   }
   3641 }
   3642 
   3643 bool ARMAsmParser::shouldOmitCCOutOperand(StringRef Mnemonic,
   3644                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3645   // FIXME: This is all horribly hacky. We really need a better way to deal
   3646   // with optional operands like this in the matcher table.
   3647 
   3648   // The 'mov' mnemonic is special. One variant has a cc_out operand, while
   3649   // another does not. Specifically, the MOVW instruction does not. So we
   3650   // special case it here and remove the defaulted (non-setting) cc_out
   3651   // operand if that's the instruction we're trying to match.
   3652   //
   3653   // We do this as post-processing of the explicit operands rather than just
   3654   // conditionally adding the cc_out in the first place because we need
   3655   // to check the type of the parsed immediate operand.
   3656   if (Mnemonic == "mov" && Operands.size() > 4 && !isThumb() &&
   3657       !static_cast<ARMOperand*>(Operands[4])->isARMSOImm() &&
   3658       static_cast<ARMOperand*>(Operands[4])->isImm0_65535Expr() &&
   3659       static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
   3660     return true;
   3661 
   3662   // Register-register 'add' for thumb does not have a cc_out operand
   3663   // when there are only two register operands.
   3664   if (isThumb() && Mnemonic == "add" && Operands.size() == 5 &&
   3665       static_cast<ARMOperand*>(Operands[3])->isReg() &&
   3666       static_cast<ARMOperand*>(Operands[4])->isReg() &&
   3667       static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
   3668     return true;
   3669   // Register-register 'add' for thumb does not have a cc_out operand
   3670   // when it's an ADD Rdm, SP, {Rdm|#imm0_255} instruction. We do
   3671   // have to check the immediate range here since Thumb2 has a variant
   3672   // that can handle a different range and has a cc_out operand.
   3673   if (((isThumb() && Mnemonic == "add") ||
   3674        (isThumbTwo() && Mnemonic == "sub")) &&
   3675       Operands.size() == 6 &&
   3676       static_cast<ARMOperand*>(Operands[3])->isReg() &&
   3677       static_cast<ARMOperand*>(Operands[4])->isReg() &&
   3678       static_cast<ARMOperand*>(Operands[4])->getReg() == ARM::SP &&
   3679       static_cast<ARMOperand*>(Operands[1])->getReg() == 0 &&
   3680       (static_cast<ARMOperand*>(Operands[5])->isReg() ||
   3681        static_cast<ARMOperand*>(Operands[5])->isImm0_1020s4()))
   3682     return true;
   3683   // For Thumb2, add/sub immediate does not have a cc_out operand for the
   3684   // imm0_4095 variant. That's the least-preferred variant when
   3685   // selecting via the generic "add" mnemonic, so to know that we
   3686   // should remove the cc_out operand, we have to explicitly check that
   3687   // it's not one of the other variants. Ugh.
   3688   if (isThumbTwo() && (Mnemonic == "add" || Mnemonic == "sub") &&
   3689       Operands.size() == 6 &&
   3690       static_cast<ARMOperand*>(Operands[3])->isReg() &&
   3691       static_cast<ARMOperand*>(Operands[4])->isReg() &&
   3692       static_cast<ARMOperand*>(Operands[5])->isImm()) {
   3693     // Nest conditions rather than one big 'if' statement for readability.
   3694     //
   3695     // If either register is a high reg, it's either one of the SP
   3696     // variants (handled above) or a 32-bit encoding, so we just
   3697     // check against T3.
   3698     if ((!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) ||
   3699          !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg())) &&
   3700         static_cast<ARMOperand*>(Operands[5])->isT2SOImm())
   3701       return false;
   3702     // If both registers are low, we're in an IT block, and the immediate is
   3703     // in range, we should use encoding T1 instead, which has a cc_out.
   3704     if (inITBlock() &&
   3705         isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) &&
   3706         isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) &&
   3707         static_cast<ARMOperand*>(Operands[5])->isImm0_7())
   3708       return false;
   3709 
   3710     // Otherwise, we use encoding T4, which does not have a cc_out
   3711     // operand.
   3712     return true;
   3713   }
   3714 
   3715   // The thumb2 multiply instruction doesn't have a CCOut register, so
   3716   // if we have a "mul" mnemonic in Thumb mode, check if we'll be able to
   3717   // use the 16-bit encoding or not.
   3718   if (isThumbTwo() && Mnemonic == "mul" && Operands.size() == 6 &&
   3719       static_cast<ARMOperand*>(Operands[1])->getReg() == 0 &&
   3720       static_cast<ARMOperand*>(Operands[3])->isReg() &&
   3721       static_cast<ARMOperand*>(Operands[4])->isReg() &&
   3722       static_cast<ARMOperand*>(Operands[5])->isReg() &&
   3723       // If the registers aren't low regs, the destination reg isn't the
   3724       // same as one of the source regs, or the cc_out operand is zero
   3725       // outside of an IT block, we have to use the 32-bit encoding, so
   3726       // remove the cc_out operand.
   3727       (!isARMLowRegister(static_cast<ARMOperand*>(Operands[3])->getReg()) ||
   3728        !isARMLowRegister(static_cast<ARMOperand*>(Operands[4])->getReg()) ||
   3729        !inITBlock() ||
   3730        (static_cast<ARMOperand*>(Operands[3])->getReg() !=
   3731         static_cast<ARMOperand*>(Operands[5])->getReg() &&
   3732         static_cast<ARMOperand*>(Operands[3])->getReg() !=
   3733         static_cast<ARMOperand*>(Operands[4])->getReg())))
   3734     return true;
   3735 
   3736 
   3737 
   3738   // Register-register 'add/sub' for thumb does not have a cc_out operand
   3739   // when it's an ADD/SUB SP, #imm. Be lenient on count since there's also
   3740   // the "add/sub SP, SP, #imm" version. If the follow-up operands aren't
   3741   // right, this will result in better diagnostics (which operand is off)
   3742   // anyway.
   3743   if (isThumb() && (Mnemonic == "add" || Mnemonic == "sub") &&
   3744       (Operands.size() == 5 || Operands.size() == 6) &&
   3745       static_cast<ARMOperand*>(Operands[3])->isReg() &&
   3746       static_cast<ARMOperand*>(Operands[3])->getReg() == ARM::SP &&
   3747       static_cast<ARMOperand*>(Operands[1])->getReg() == 0)
   3748     return true;
   3749 
   3750   return false;
   3751 }
   3752 
   3753 /// Parse an arm instruction mnemonic followed by its operands.
   3754 bool ARMAsmParser::ParseInstruction(StringRef Name, SMLoc NameLoc,
   3755                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   3756   // Create the leading tokens for the mnemonic, split by '.' characters.
   3757   size_t Start = 0, Next = Name.find('.');
   3758   StringRef Mnemonic = Name.slice(Start, Next);
   3759 
   3760   // Split out the predication code and carry setting flag from the mnemonic.
   3761   unsigned PredicationCode;
   3762   unsigned ProcessorIMod;
   3763   bool CarrySetting;
   3764   StringRef ITMask;
   3765   Mnemonic = splitMnemonic(Mnemonic, PredicationCode, CarrySetting,
   3766                            ProcessorIMod, ITMask);
   3767 
   3768   // In Thumb1, only the branch (B) instruction can be predicated.
   3769   if (isThumbOne() && PredicationCode != ARMCC::AL && Mnemonic != "b") {
   3770     Parser.EatToEndOfStatement();
   3771     return Error(NameLoc, "conditional execution not supported in Thumb1");
   3772   }
   3773 
   3774   Operands.push_back(ARMOperand::CreateToken(Mnemonic, NameLoc));
   3775 
   3776   // Handle the IT instruction ITMask. Convert it to a bitmask. This
   3777   // is the mask as it will be for the IT encoding if the conditional
   3778   // encoding has a '1' as it's bit0 (i.e. 't' ==> '1'). In the case
   3779   // where the conditional bit0 is zero, the instruction post-processing
   3780   // will adjust the mask accordingly.
   3781   if (Mnemonic == "it") {
   3782     SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + 2);
   3783     if (ITMask.size() > 3) {
   3784       Parser.EatToEndOfStatement();
   3785       return Error(Loc, "too many conditions on IT instruction");
   3786     }
   3787     unsigned Mask = 8;
   3788     for (unsigned i = ITMask.size(); i != 0; --i) {
   3789       char pos = ITMask[i - 1];
   3790       if (pos != 't' && pos != 'e') {
   3791         Parser.EatToEndOfStatement();
   3792         return Error(Loc, "illegal IT block condition mask '" + ITMask + "'");
   3793       }
   3794       Mask >>= 1;
   3795       if (ITMask[i - 1] == 't')
   3796         Mask |= 8;
   3797     }
   3798     Operands.push_back(ARMOperand::CreateITMask(Mask, Loc));
   3799   }
   3800 
   3801   // FIXME: This is all a pretty gross hack. We should automatically handle
   3802   // optional operands like this via tblgen.
   3803 
   3804   // Next, add the CCOut and ConditionCode operands, if needed.
   3805   //
   3806   // For mnemonics which can ever incorporate a carry setting bit or predication
   3807   // code, our matching model involves us always generating CCOut and
   3808   // ConditionCode operands to match the mnemonic "as written" and then we let
   3809   // the matcher deal with finding the right instruction or generating an
   3810   // appropriate error.
   3811   bool CanAcceptCarrySet, CanAcceptPredicationCode;
   3812   getMnemonicAcceptInfo(Mnemonic, CanAcceptCarrySet, CanAcceptPredicationCode);
   3813 
   3814   // If we had a carry-set on an instruction that can't do that, issue an
   3815   // error.
   3816   if (!CanAcceptCarrySet && CarrySetting) {
   3817     Parser.EatToEndOfStatement();
   3818     return Error(NameLoc, "instruction '" + Mnemonic +
   3819                  "' can not set flags, but 's' suffix specified");
   3820   }
   3821   // If we had a predication code on an instruction that can't do that, issue an
   3822   // error.
   3823   if (!CanAcceptPredicationCode && PredicationCode != ARMCC::AL) {
   3824     Parser.EatToEndOfStatement();
   3825     return Error(NameLoc, "instruction '" + Mnemonic +
   3826                  "' is not predicable, but condition code specified");
   3827   }
   3828 
   3829   // Add the carry setting operand, if necessary.
   3830   if (CanAcceptCarrySet) {
   3831     SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size());
   3832     Operands.push_back(ARMOperand::CreateCCOut(CarrySetting ? ARM::CPSR : 0,
   3833                                                Loc));
   3834   }
   3835 
   3836   // Add the predication code operand, if necessary.
   3837   if (CanAcceptPredicationCode) {
   3838     SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Mnemonic.size() +
   3839                                       CarrySetting);
   3840     Operands.push_back(ARMOperand::CreateCondCode(
   3841                          ARMCC::CondCodes(PredicationCode), Loc));
   3842   }
   3843 
   3844   // Add the processor imod operand, if necessary.
   3845   if (ProcessorIMod) {
   3846     Operands.push_back(ARMOperand::CreateImm(
   3847           MCConstantExpr::Create(ProcessorIMod, getContext()),
   3848                                  NameLoc, NameLoc));
   3849   }
   3850 
   3851   // Add the remaining tokens in the mnemonic.
   3852   while (Next != StringRef::npos) {
   3853     Start = Next;
   3854     Next = Name.find('.', Start + 1);
   3855     StringRef ExtraToken = Name.slice(Start, Next);
   3856 
   3857     // For now, we're only parsing Thumb1 (for the most part), so
   3858     // just ignore ".n" qualifiers. We'll use them to restrict
   3859     // matching when we do Thumb2.
   3860     if (ExtraToken != ".n") {
   3861       SMLoc Loc = SMLoc::getFromPointer(NameLoc.getPointer() + Start);
   3862       Operands.push_back(ARMOperand::CreateToken(ExtraToken, Loc));
   3863     }
   3864   }
   3865 
   3866   // Read the remaining operands.
   3867   if (getLexer().isNot(AsmToken::EndOfStatement)) {
   3868     // Read the first operand.
   3869     if (parseOperand(Operands, Mnemonic)) {
   3870       Parser.EatToEndOfStatement();
   3871       return true;
   3872     }
   3873 
   3874     while (getLexer().is(AsmToken::Comma)) {
   3875       Parser.Lex();  // Eat the comma.
   3876 
   3877       // Parse and remember the operand.
   3878       if (parseOperand(Operands, Mnemonic)) {
   3879         Parser.EatToEndOfStatement();
   3880         return true;
   3881       }
   3882     }
   3883   }
   3884 
   3885   if (getLexer().isNot(AsmToken::EndOfStatement)) {
   3886     SMLoc Loc = getLexer().getLoc();
   3887     Parser.EatToEndOfStatement();
   3888     return Error(Loc, "unexpected token in argument list");
   3889   }
   3890 
   3891   Parser.Lex(); // Consume the EndOfStatement
   3892 
   3893   // Some instructions, mostly Thumb, have forms for the same mnemonic that
   3894   // do and don't have a cc_out optional-def operand. With some spot-checks
   3895   // of the operand list, we can figure out which variant we're trying to
   3896   // parse and adjust accordingly before actually matching. We shouldn't ever
   3897   // try to remove a cc_out operand that was explicitly set on the the
   3898   // mnemonic, of course (CarrySetting == true). Reason number #317 the
   3899   // table driven matcher doesn't fit well with the ARM instruction set.
   3900   if (!CarrySetting && shouldOmitCCOutOperand(Mnemonic, Operands)) {
   3901     ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]);
   3902     Operands.erase(Operands.begin() + 1);
   3903     delete Op;
   3904   }
   3905 
   3906   // ARM mode 'blx' need special handling, as the register operand version
   3907   // is predicable, but the label operand version is not. So, we can't rely
   3908   // on the Mnemonic based checking to correctly figure out when to put
   3909   // a k_CondCode operand in the list. If we're trying to match the label
   3910   // version, remove the k_CondCode operand here.
   3911   if (!isThumb() && Mnemonic == "blx" && Operands.size() == 3 &&
   3912       static_cast<ARMOperand*>(Operands[2])->isImm()) {
   3913     ARMOperand *Op = static_cast<ARMOperand*>(Operands[1]);
   3914     Operands.erase(Operands.begin() + 1);
   3915     delete Op;
   3916   }
   3917 
   3918   // The vector-compare-to-zero instructions have a literal token "#0" at
   3919   // the end that comes to here as an immediate operand. Convert it to a
   3920   // token to play nicely with the matcher.
   3921   if ((Mnemonic == "vceq" || Mnemonic == "vcge" || Mnemonic == "vcgt" ||
   3922       Mnemonic == "vcle" || Mnemonic == "vclt") && Operands.size() == 6 &&
   3923       static_cast<ARMOperand*>(Operands[5])->isImm()) {
   3924     ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]);
   3925     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
   3926     if (CE && CE->getValue() == 0) {
   3927       Operands.erase(Operands.begin() + 5);
   3928       Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
   3929       delete Op;
   3930     }
   3931   }
   3932   // VCMP{E} does the same thing, but with a different operand count.
   3933   if ((Mnemonic == "vcmp" || Mnemonic == "vcmpe") && Operands.size() == 5 &&
   3934       static_cast<ARMOperand*>(Operands[4])->isImm()) {
   3935     ARMOperand *Op = static_cast<ARMOperand*>(Operands[4]);
   3936     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
   3937     if (CE && CE->getValue() == 0) {
   3938       Operands.erase(Operands.begin() + 4);
   3939       Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
   3940       delete Op;
   3941     }
   3942   }
   3943   // Similarly, the Thumb1 "RSB" instruction has a literal "#0" on the
   3944   // end. Convert it to a token here.
   3945   if (Mnemonic == "rsb" && isThumb() && Operands.size() == 6 &&
   3946       static_cast<ARMOperand*>(Operands[5])->isImm()) {
   3947     ARMOperand *Op = static_cast<ARMOperand*>(Operands[5]);
   3948     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Op->getImm());
   3949     if (CE && CE->getValue() == 0) {
   3950       Operands.erase(Operands.begin() + 5);
   3951       Operands.push_back(ARMOperand::CreateToken("#0", Op->getStartLoc()));
   3952       delete Op;
   3953     }
   3954   }
   3955 
   3956   return false;
   3957 }
   3958 
   3959 // Validate context-sensitive operand constraints.
   3960 
   3961 // return 'true' if register list contains non-low GPR registers,
   3962 // 'false' otherwise. If Reg is in the register list or is HiReg, set
   3963 // 'containsReg' to true.
   3964 static bool checkLowRegisterList(MCInst Inst, unsigned OpNo, unsigned Reg,
   3965                                  unsigned HiReg, bool &containsReg) {
   3966   containsReg = false;
   3967   for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) {
   3968     unsigned OpReg = Inst.getOperand(i).getReg();
   3969     if (OpReg == Reg)
   3970       containsReg = true;
   3971     // Anything other than a low register isn't legal here.
   3972     if (!isARMLowRegister(OpReg) && (!HiReg || OpReg != HiReg))
   3973       return true;
   3974   }
   3975   return false;
   3976 }
   3977 
   3978 // Check if the specified regisgter is in the register list of the inst,
   3979 // starting at the indicated operand number.
   3980 static bool listContainsReg(MCInst &Inst, unsigned OpNo, unsigned Reg) {
   3981   for (unsigned i = OpNo; i < Inst.getNumOperands(); ++i) {
   3982     unsigned OpReg = Inst.getOperand(i).getReg();
   3983     if (OpReg == Reg)
   3984       return true;
   3985   }
   3986   return false;
   3987 }
   3988 
   3989 // FIXME: We would really prefer to have MCInstrInfo (the wrapper around
   3990 // the ARMInsts array) instead. Getting that here requires awkward
   3991 // API changes, though. Better way?
   3992 namespace llvm {
   3993 extern MCInstrDesc ARMInsts[];
   3994 }
   3995 static MCInstrDesc &getInstDesc(unsigned Opcode) {
   3996   return ARMInsts[Opcode];
   3997 }
   3998 
   3999 // FIXME: We would really like to be able to tablegen'erate this.
   4000 bool ARMAsmParser::
   4001 validateInstruction(MCInst &Inst,
   4002                     const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   4003   MCInstrDesc &MCID = getInstDesc(Inst.getOpcode());
   4004   SMLoc Loc = Operands[0]->getStartLoc();
   4005   // Check the IT block state first.
   4006   // NOTE: In Thumb mode, the BKPT instruction has the interesting property of
   4007   // being allowed in IT blocks, but not being predicable.  It just always
   4008   // executes.
   4009   if (inITBlock() && Inst.getOpcode() != ARM::tBKPT) {
   4010     unsigned bit = 1;
   4011     if (ITState.FirstCond)
   4012       ITState.FirstCond = false;
   4013     else
   4014       bit = (ITState.Mask >> (5 - ITState.CurPosition)) & 1;
   4015     // The instruction must be predicable.
   4016     if (!MCID.isPredicable())
   4017       return Error(Loc, "instructions in IT block must be predicable");
   4018     unsigned Cond = Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm();
   4019     unsigned ITCond = bit ? ITState.Cond :
   4020       ARMCC::getOppositeCondition(ITState.Cond);
   4021     if (Cond != ITCond) {
   4022       // Find the condition code Operand to get its SMLoc information.
   4023       SMLoc CondLoc;
   4024       for (unsigned i = 1; i < Operands.size(); ++i)
   4025         if (static_cast<ARMOperand*>(Operands[i])->isCondCode())
   4026           CondLoc = Operands[i]->getStartLoc();
   4027       return Error(CondLoc, "incorrect condition in IT block; got '" +
   4028                    StringRef(ARMCondCodeToString(ARMCC::CondCodes(Cond))) +
   4029                    "', but expected '" +
   4030                    ARMCondCodeToString(ARMCC::CondCodes(ITCond)) + "'");
   4031     }
   4032   // Check for non-'al' condition codes outside of the IT block.
   4033   } else if (isThumbTwo() && MCID.isPredicable() &&
   4034              Inst.getOperand(MCID.findFirstPredOperandIdx()).getImm() !=
   4035              ARMCC::AL && Inst.getOpcode() != ARM::tB &&
   4036              Inst.getOpcode() != ARM::t2B)
   4037     return Error(Loc, "predicated instructions must be in IT block");
   4038 
   4039   switch (Inst.getOpcode()) {
   4040   case ARM::LDRD:
   4041   case ARM::LDRD_PRE:
   4042   case ARM::LDRD_POST:
   4043   case ARM::LDREXD: {
   4044     // Rt2 must be Rt + 1.
   4045     unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg());
   4046     unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg());
   4047     if (Rt2 != Rt + 1)
   4048       return Error(Operands[3]->getStartLoc(),
   4049                    "destination operands must be sequential");
   4050     return false;
   4051   }
   4052   case ARM::STRD: {
   4053     // Rt2 must be Rt + 1.
   4054     unsigned Rt = getARMRegisterNumbering(Inst.getOperand(0).getReg());
   4055     unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(1).getReg());
   4056     if (Rt2 != Rt + 1)
   4057       return Error(Operands[3]->getStartLoc(),
   4058                    "source operands must be sequential");
   4059     return false;
   4060   }
   4061   case ARM::STRD_PRE:
   4062   case ARM::STRD_POST:
   4063   case ARM::STREXD: {
   4064     // Rt2 must be Rt + 1.
   4065     unsigned Rt = getARMRegisterNumbering(Inst.getOperand(1).getReg());
   4066     unsigned Rt2 = getARMRegisterNumbering(Inst.getOperand(2).getReg());
   4067     if (Rt2 != Rt + 1)
   4068       return Error(Operands[3]->getStartLoc(),
   4069                    "source operands must be sequential");
   4070     return false;
   4071   }
   4072   case ARM::SBFX:
   4073   case ARM::UBFX: {
   4074     // width must be in range [1, 32-lsb]
   4075     unsigned lsb = Inst.getOperand(2).getImm();
   4076     unsigned widthm1 = Inst.getOperand(3).getImm();
   4077     if (widthm1 >= 32 - lsb)
   4078       return Error(Operands[5]->getStartLoc(),
   4079                    "bitfield width must be in range [1,32-lsb]");
   4080     return false;
   4081   }
   4082   case ARM::tLDMIA: {
   4083     // If we're parsing Thumb2, the .w variant is available and handles
   4084     // most cases that are normally illegal for a Thumb1 LDM
   4085     // instruction. We'll make the transformation in processInstruction()
   4086     // if necessary.
   4087     //
   4088     // Thumb LDM instructions are writeback iff the base register is not
   4089     // in the register list.
   4090     unsigned Rn = Inst.getOperand(0).getReg();
   4091     bool hasWritebackToken =
   4092       (static_cast<ARMOperand*>(Operands[3])->isToken() &&
   4093        static_cast<ARMOperand*>(Operands[3])->getToken() == "!");
   4094     bool listContainsBase;
   4095     if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) && !isThumbTwo())
   4096       return Error(Operands[3 + hasWritebackToken]->getStartLoc(),
   4097                    "registers must be in range r0-r7");
   4098     // If we should have writeback, then there should be a '!' token.
   4099     if (!listContainsBase && !hasWritebackToken && !isThumbTwo())
   4100       return Error(Operands[2]->getStartLoc(),
   4101                    "writeback operator '!' expected");
   4102     // If we should not have writeback, there must not be a '!'. This is
   4103     // true even for the 32-bit wide encodings.
   4104     if (listContainsBase && hasWritebackToken)
   4105       return Error(Operands[3]->getStartLoc(),
   4106                    "writeback operator '!' not allowed when base register "
   4107                    "in register list");
   4108 
   4109     break;
   4110   }
   4111   case ARM::t2LDMIA_UPD: {
   4112     if (listContainsReg(Inst, 3, Inst.getOperand(0).getReg()))
   4113       return Error(Operands[4]->getStartLoc(),
   4114                    "writeback operator '!' not allowed when base register "
   4115                    "in register list");
   4116     break;
   4117   }
   4118   case ARM::tPOP: {
   4119     bool listContainsBase;
   4120     if (checkLowRegisterList(Inst, 3, 0, ARM::PC, listContainsBase))
   4121       return Error(Operands[2]->getStartLoc(),
   4122                    "registers must be in range r0-r7 or pc");
   4123     break;
   4124   }
   4125   case ARM::tPUSH: {
   4126     bool listContainsBase;
   4127     if (checkLowRegisterList(Inst, 3, 0, ARM::LR, listContainsBase))
   4128       return Error(Operands[2]->getStartLoc(),
   4129                    "registers must be in range r0-r7 or lr");
   4130     break;
   4131   }
   4132   case ARM::tSTMIA_UPD: {
   4133     bool listContainsBase;
   4134     if (checkLowRegisterList(Inst, 4, 0, 0, listContainsBase) && !isThumbTwo())
   4135       return Error(Operands[4]->getStartLoc(),
   4136                    "registers must be in range r0-r7");
   4137     break;
   4138   }
   4139   }
   4140 
   4141   return false;
   4142 }
   4143 
   4144 void ARMAsmParser::
   4145 processInstruction(MCInst &Inst,
   4146                    const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   4147   switch (Inst.getOpcode()) {
   4148   case ARM::LDMIA_UPD:
   4149     // If this is a load of a single register via a 'pop', then we should use
   4150     // a post-indexed LDR instruction instead, per the ARM ARM.
   4151     if (static_cast<ARMOperand*>(Operands[0])->getToken() == "pop" &&
   4152         Inst.getNumOperands() == 5) {
   4153       MCInst TmpInst;
   4154       TmpInst.setOpcode(ARM::LDR_POST_IMM);
   4155       TmpInst.addOperand(Inst.getOperand(4)); // Rt
   4156       TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
   4157       TmpInst.addOperand(Inst.getOperand(1)); // Rn
   4158       TmpInst.addOperand(MCOperand::CreateReg(0));  // am2offset
   4159       TmpInst.addOperand(MCOperand::CreateImm(4));
   4160       TmpInst.addOperand(Inst.getOperand(2)); // CondCode
   4161       TmpInst.addOperand(Inst.getOperand(3));
   4162       Inst = TmpInst;
   4163     }
   4164     break;
   4165   case ARM::STMDB_UPD:
   4166     // If this is a store of a single register via a 'push', then we should use
   4167     // a pre-indexed STR instruction instead, per the ARM ARM.
   4168     if (static_cast<ARMOperand*>(Operands[0])->getToken() == "push" &&
   4169         Inst.getNumOperands() == 5) {
   4170       MCInst TmpInst;
   4171       TmpInst.setOpcode(ARM::STR_PRE_IMM);
   4172       TmpInst.addOperand(Inst.getOperand(0)); // Rn_wb
   4173       TmpInst.addOperand(Inst.getOperand(4)); // Rt
   4174       TmpInst.addOperand(Inst.getOperand(1)); // addrmode_imm12
   4175       TmpInst.addOperand(MCOperand::CreateImm(-4));
   4176       TmpInst.addOperand(Inst.getOperand(2)); // CondCode
   4177       TmpInst.addOperand(Inst.getOperand(3));
   4178       Inst = TmpInst;
   4179     }
   4180     break;
   4181   case ARM::tADDi8:
   4182     // If the immediate is in the range 0-7, we want tADDi3 iff Rd was
   4183     // explicitly specified. From the ARM ARM: "Encoding T1 is preferred
   4184     // to encoding T2 if <Rd> is specified and encoding T2 is preferred
   4185     // to encoding T1 if <Rd> is omitted."
   4186     if (Inst.getOperand(3).getImm() < 8 && Operands.size() == 6)
   4187       Inst.setOpcode(ARM::tADDi3);
   4188     break;
   4189   case ARM::tSUBi8:
   4190     // If the immediate is in the range 0-7, we want tADDi3 iff Rd was
   4191     // explicitly specified. From the ARM ARM: "Encoding T1 is preferred
   4192     // to encoding T2 if <Rd> is specified and encoding T2 is preferred
   4193     // to encoding T1 if <Rd> is omitted."
   4194     if (Inst.getOperand(3).getImm() < 8 && Operands.size() == 6)
   4195       Inst.setOpcode(ARM::tSUBi3);
   4196     break;
   4197   case ARM::tB:
   4198     // A Thumb conditional branch outside of an IT block is a tBcc.
   4199     if (Inst.getOperand(1).getImm() != ARMCC::AL && !inITBlock())
   4200       Inst.setOpcode(ARM::tBcc);
   4201     break;
   4202   case ARM::t2B:
   4203     // A Thumb2 conditional branch outside of an IT block is a t2Bcc.
   4204     if (Inst.getOperand(1).getImm() != ARMCC::AL && !inITBlock())
   4205       Inst.setOpcode(ARM::t2Bcc);
   4206     break;
   4207   case ARM::t2Bcc:
   4208     // If the conditional is AL or we're in an IT block, we really want t2B.
   4209     if (Inst.getOperand(1).getImm() == ARMCC::AL || inITBlock())
   4210       Inst.setOpcode(ARM::t2B);
   4211     break;
   4212   case ARM::tBcc:
   4213     // If the conditional is AL, we really want tB.
   4214     if (Inst.getOperand(1).getImm() == ARMCC::AL)
   4215       Inst.setOpcode(ARM::tB);
   4216     break;
   4217   case ARM::tLDMIA: {
   4218     // If the register list contains any high registers, or if the writeback
   4219     // doesn't match what tLDMIA can do, we need to use the 32-bit encoding
   4220     // instead if we're in Thumb2. Otherwise, this should have generated
   4221     // an error in validateInstruction().
   4222     unsigned Rn = Inst.getOperand(0).getReg();
   4223     bool hasWritebackToken =
   4224       (static_cast<ARMOperand*>(Operands[3])->isToken() &&
   4225        static_cast<ARMOperand*>(Operands[3])->getToken() == "!");
   4226     bool listContainsBase;
   4227     if (checkLowRegisterList(Inst, 3, Rn, 0, listContainsBase) ||
   4228         (!listContainsBase && !hasWritebackToken) ||
   4229         (listContainsBase && hasWritebackToken)) {
   4230       // 16-bit encoding isn't sufficient. Switch to the 32-bit version.
   4231       assert (isThumbTwo());
   4232       Inst.setOpcode(hasWritebackToken ? ARM::t2LDMIA_UPD : ARM::t2LDMIA);
   4233       // If we're switching to the updating version, we need to insert
   4234       // the writeback tied operand.
   4235       if (hasWritebackToken)
   4236         Inst.insert(Inst.begin(),
   4237                     MCOperand::CreateReg(Inst.getOperand(0).getReg()));
   4238     }
   4239     break;
   4240   }
   4241   case ARM::tSTMIA_UPD: {
   4242     // If the register list contains any high registers, we need to use
   4243     // the 32-bit encoding instead if we're in Thumb2. Otherwise, this
   4244     // should have generated an error in validateInstruction().
   4245     unsigned Rn = Inst.getOperand(0).getReg();
   4246     bool listContainsBase;
   4247     if (checkLowRegisterList(Inst, 4, Rn, 0, listContainsBase)) {
   4248       // 16-bit encoding isn't sufficient. Switch to the 32-bit version.
   4249       assert (isThumbTwo());
   4250       Inst.setOpcode(ARM::t2STMIA_UPD);
   4251     }
   4252     break;
   4253   }
   4254   case ARM::t2MOVi: {
   4255     // If we can use the 16-bit encoding and the user didn't explicitly
   4256     // request the 32-bit variant, transform it here.
   4257     if (isARMLowRegister(Inst.getOperand(0).getReg()) &&
   4258         Inst.getOperand(1).getImm() <= 255 &&
   4259         ((!inITBlock() && Inst.getOperand(2).getImm() == ARMCC::AL &&
   4260          Inst.getOperand(4).getReg() == ARM::CPSR) ||
   4261         (inITBlock() && Inst.getOperand(4).getReg() == 0)) &&
   4262         (!static_cast<ARMOperand*>(Operands[2])->isToken() ||
   4263          static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) {
   4264       // The operands aren't in the same order for tMOVi8...
   4265       MCInst TmpInst;
   4266       TmpInst.setOpcode(ARM::tMOVi8);
   4267       TmpInst.addOperand(Inst.getOperand(0));
   4268       TmpInst.addOperand(Inst.getOperand(4));
   4269       TmpInst.addOperand(Inst.getOperand(1));
   4270       TmpInst.addOperand(Inst.getOperand(2));
   4271       TmpInst.addOperand(Inst.getOperand(3));
   4272       Inst = TmpInst;
   4273     }
   4274     break;
   4275   }
   4276   case ARM::t2MOVr: {
   4277     // If we can use the 16-bit encoding and the user didn't explicitly
   4278     // request the 32-bit variant, transform it here.
   4279     if (isARMLowRegister(Inst.getOperand(0).getReg()) &&
   4280         isARMLowRegister(Inst.getOperand(1).getReg()) &&
   4281         Inst.getOperand(2).getImm() == ARMCC::AL &&
   4282         Inst.getOperand(4).getReg() == ARM::CPSR &&
   4283         (!static_cast<ARMOperand*>(Operands[2])->isToken() ||
   4284          static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) {
   4285       // The operands aren't the same for tMOV[S]r... (no cc_out)
   4286       MCInst TmpInst;
   4287       TmpInst.setOpcode(Inst.getOperand(4).getReg() ? ARM::tMOVSr : ARM::tMOVr);
   4288       TmpInst.addOperand(Inst.getOperand(0));
   4289       TmpInst.addOperand(Inst.getOperand(1));
   4290       TmpInst.addOperand(Inst.getOperand(2));
   4291       TmpInst.addOperand(Inst.getOperand(3));
   4292       Inst = TmpInst;
   4293     }
   4294     break;
   4295   }
   4296   case ARM::t2SXTH:
   4297   case ARM::t2SXTB:
   4298   case ARM::t2UXTH:
   4299   case ARM::t2UXTB: {
   4300     // If we can use the 16-bit encoding and the user didn't explicitly
   4301     // request the 32-bit variant, transform it here.
   4302     if (isARMLowRegister(Inst.getOperand(0).getReg()) &&
   4303         isARMLowRegister(Inst.getOperand(1).getReg()) &&
   4304         Inst.getOperand(2).getImm() == 0 &&
   4305         (!static_cast<ARMOperand*>(Operands[2])->isToken() ||
   4306          static_cast<ARMOperand*>(Operands[2])->getToken() != ".w")) {
   4307       unsigned NewOpc;
   4308       switch (Inst.getOpcode()) {
   4309       default: llvm_unreachable("Illegal opcode!");
   4310       case ARM::t2SXTH: NewOpc = ARM::tSXTH; break;
   4311       case ARM::t2SXTB: NewOpc = ARM::tSXTB; break;
   4312       case ARM::t2UXTH: NewOpc = ARM::tUXTH; break;
   4313       case ARM::t2UXTB: NewOpc = ARM::tUXTB; break;
   4314       }
   4315       // The operands aren't the same for thumb1 (no rotate operand).
   4316       MCInst TmpInst;
   4317       TmpInst.setOpcode(NewOpc);
   4318       TmpInst.addOperand(Inst.getOperand(0));
   4319       TmpInst.addOperand(Inst.getOperand(1));
   4320       TmpInst.addOperand(Inst.getOperand(3));
   4321       TmpInst.addOperand(Inst.getOperand(4));
   4322       Inst = TmpInst;
   4323     }
   4324     break;
   4325   }
   4326   case ARM::t2IT: {
   4327     // The mask bits for all but the first condition are represented as
   4328     // the low bit of the condition code value implies 't'. We currently
   4329     // always have 1 implies 't', so XOR toggle the bits if the low bit
   4330     // of the condition code is zero. The encoding also expects the low
   4331     // bit of the condition to be encoded as bit 4 of the mask operand,
   4332     // so mask that in if needed
   4333     MCOperand &MO = Inst.getOperand(1);
   4334     unsigned Mask = MO.getImm();
   4335     unsigned OrigMask = Mask;
   4336     unsigned TZ = CountTrailingZeros_32(Mask);
   4337     if ((Inst.getOperand(0).getImm() & 1) == 0) {
   4338       assert(Mask && TZ <= 3 && "illegal IT mask value!");
   4339       for (unsigned i = 3; i != TZ; --i)
   4340         Mask ^= 1 << i;
   4341     } else
   4342       Mask |= 0x10;
   4343     MO.setImm(Mask);
   4344 
   4345     // Set up the IT block state according to the IT instruction we just
   4346     // matched.
   4347     assert(!inITBlock() && "nested IT blocks?!");
   4348     ITState.Cond = ARMCC::CondCodes(Inst.getOperand(0).getImm());
   4349     ITState.Mask = OrigMask; // Use the original mask, not the updated one.
   4350     ITState.CurPosition = 0;
   4351     ITState.FirstCond = true;
   4352     break;
   4353   }
   4354   }
   4355 }
   4356 
   4357 unsigned ARMAsmParser::checkTargetMatchPredicate(MCInst &Inst) {
   4358   // 16-bit thumb arithmetic instructions either require or preclude the 'S'
   4359   // suffix depending on whether they're in an IT block or not.
   4360   unsigned Opc = Inst.getOpcode();
   4361   MCInstrDesc &MCID = getInstDesc(Opc);
   4362   if (MCID.TSFlags & ARMII::ThumbArithFlagSetting) {
   4363     assert(MCID.hasOptionalDef() &&
   4364            "optionally flag setting instruction missing optional def operand");
   4365     assert(MCID.NumOperands == Inst.getNumOperands() &&
   4366            "operand count mismatch!");
   4367     // Find the optional-def operand (cc_out).
   4368     unsigned OpNo;
   4369     for (OpNo = 0;
   4370          !MCID.OpInfo[OpNo].isOptionalDef() && OpNo < MCID.NumOperands;
   4371          ++OpNo)
   4372       ;
   4373     // If we're parsing Thumb1, reject it completely.
   4374     if (isThumbOne() && Inst.getOperand(OpNo).getReg() != ARM::CPSR)
   4375       return Match_MnemonicFail;
   4376     // If we're parsing Thumb2, which form is legal depends on whether we're
   4377     // in an IT block.
   4378     if (isThumbTwo() && Inst.getOperand(OpNo).getReg() != ARM::CPSR &&
   4379         !inITBlock())
   4380       return Match_RequiresITBlock;
   4381     if (isThumbTwo() && Inst.getOperand(OpNo).getReg() == ARM::CPSR &&
   4382         inITBlock())
   4383       return Match_RequiresNotITBlock;
   4384   }
   4385   // Some high-register supporting Thumb1 encodings only allow both registers
   4386   // to be from r0-r7 when in Thumb2.
   4387   else if (Opc == ARM::tADDhirr && isThumbOne() &&
   4388            isARMLowRegister(Inst.getOperand(1).getReg()) &&
   4389            isARMLowRegister(Inst.getOperand(2).getReg()))
   4390     return Match_RequiresThumb2;
   4391   // Others only require ARMv6 or later.
   4392   else if (Opc == ARM::tMOVr && isThumbOne() && !hasV6Ops() &&
   4393            isARMLowRegister(Inst.getOperand(0).getReg()) &&
   4394            isARMLowRegister(Inst.getOperand(1).getReg()))
   4395     return Match_RequiresV6;
   4396   return Match_Success;
   4397 }
   4398 
   4399 bool ARMAsmParser::
   4400 MatchAndEmitInstruction(SMLoc IDLoc,
   4401                         SmallVectorImpl<MCParsedAsmOperand*> &Operands,
   4402                         MCStreamer &Out) {
   4403   MCInst Inst;
   4404   unsigned ErrorInfo;
   4405   unsigned MatchResult;
   4406   MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo);
   4407   switch (MatchResult) {
   4408   default: break;
   4409   case Match_Success:
   4410     // Context sensitive operand constraints aren't handled by the matcher,
   4411     // so check them here.
   4412     if (validateInstruction(Inst, Operands)) {
   4413       // Still progress the IT block, otherwise one wrong condition causes
   4414       // nasty cascading errors.
   4415       forwardITPosition();
   4416       return true;
   4417     }
   4418 
   4419     // Some instructions need post-processing to, for example, tweak which
   4420     // encoding is selected.
   4421     processInstruction(Inst, Operands);
   4422 
   4423     // Only move forward at the very end so that everything in validate
   4424     // and process gets a consistent answer about whether we're in an IT
   4425     // block.
   4426     forwardITPosition();
   4427 
   4428     Out.EmitInstruction(Inst);
   4429     return false;
   4430   case Match_MissingFeature:
   4431     Error(IDLoc, "instruction requires a CPU feature not currently enabled");
   4432     return true;
   4433   case Match_InvalidOperand: {
   4434     SMLoc ErrorLoc = IDLoc;
   4435     if (ErrorInfo != ~0U) {
   4436       if (ErrorInfo >= Operands.size())
   4437         return Error(IDLoc, "too few operands for instruction");
   4438 
   4439       ErrorLoc = ((ARMOperand*)Operands[ErrorInfo])->getStartLoc();
   4440       if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc;
   4441     }
   4442 
   4443     return Error(ErrorLoc, "invalid operand for instruction");
   4444   }
   4445   case Match_MnemonicFail:
   4446     return Error(IDLoc, "invalid instruction");
   4447   case Match_ConversionFail:
   4448     // The converter function will have already emited a diagnostic.
   4449     return true;
   4450   case Match_RequiresNotITBlock:
   4451     return Error(IDLoc, "flag setting instruction only valid outside IT block");
   4452   case Match_RequiresITBlock:
   4453     return Error(IDLoc, "instruction only valid inside IT block");
   4454   case Match_RequiresV6:
   4455     return Error(IDLoc, "instruction variant requires ARMv6 or later");
   4456   case Match_RequiresThumb2:
   4457     return Error(IDLoc, "instruction variant requires Thumb2");
   4458   }
   4459 
   4460   llvm_unreachable("Implement any new match types added!");
   4461   return true;
   4462 }
   4463 
   4464 /// parseDirective parses the arm specific directives
   4465 bool ARMAsmParser::ParseDirective(AsmToken DirectiveID) {
   4466   StringRef IDVal = DirectiveID.getIdentifier();
   4467   if (IDVal == ".word")
   4468     return parseDirectiveWord(4, DirectiveID.getLoc());
   4469   else if (IDVal == ".thumb")
   4470     return parseDirectiveThumb(DirectiveID.getLoc());
   4471   else if (IDVal == ".thumb_func")
   4472     return parseDirectiveThumbFunc(DirectiveID.getLoc());
   4473   else if (IDVal == ".code")
   4474     return parseDirectiveCode(DirectiveID.getLoc());
   4475   else if (IDVal == ".syntax")
   4476     return parseDirectiveSyntax(DirectiveID.getLoc());
   4477   return true;
   4478 }
   4479 
   4480 /// parseDirectiveWord
   4481 ///  ::= .word [ expression (, expression)* ]
   4482 bool ARMAsmParser::parseDirectiveWord(unsigned Size, SMLoc L) {
   4483   if (getLexer().isNot(AsmToken::EndOfStatement)) {
   4484     for (;;) {
   4485       const MCExpr *Value;
   4486       if (getParser().ParseExpression(Value))
   4487         return true;
   4488 
   4489       getParser().getStreamer().EmitValue(Value, Size, 0/*addrspace*/);
   4490 
   4491       if (getLexer().is(AsmToken::EndOfStatement))
   4492         break;
   4493 
   4494       // FIXME: Improve diagnostic.
   4495       if (getLexer().isNot(AsmToken::Comma))
   4496         return Error(L, "unexpected token in directive");
   4497       Parser.Lex();
   4498     }
   4499   }
   4500 
   4501   Parser.Lex();
   4502   return false;
   4503 }
   4504 
   4505 /// parseDirectiveThumb
   4506 ///  ::= .thumb
   4507 bool ARMAsmParser::parseDirectiveThumb(SMLoc L) {
   4508   if (getLexer().isNot(AsmToken::EndOfStatement))
   4509     return Error(L, "unexpected token in directive");
   4510   Parser.Lex();
   4511 
   4512   // TODO: set thumb mode
   4513   // TODO: tell the MC streamer the mode
   4514   // getParser().getStreamer().Emit???();
   4515   return false;
   4516 }
   4517 
   4518 /// parseDirectiveThumbFunc
   4519 ///  ::= .thumbfunc symbol_name
   4520 bool ARMAsmParser::parseDirectiveThumbFunc(SMLoc L) {
   4521   const MCAsmInfo &MAI = getParser().getStreamer().getContext().getAsmInfo();
   4522   bool isMachO = MAI.hasSubsectionsViaSymbols();
   4523   StringRef Name;
   4524 
   4525   // Darwin asm has function name after .thumb_func direction
   4526   // ELF doesn't
   4527   if (isMachO) {
   4528     const AsmToken &Tok = Parser.getTok();
   4529     if (Tok.isNot(AsmToken::Identifier) && Tok.isNot(AsmToken::String))
   4530       return Error(L, "unexpected token in .thumb_func directive");
   4531     Name = Tok.getString();
   4532     Parser.Lex(); // Consume the identifier token.
   4533   }
   4534 
   4535   if (getLexer().isNot(AsmToken::EndOfStatement))
   4536     return Error(L, "unexpected token in directive");
   4537   Parser.Lex();
   4538 
   4539   // FIXME: assuming function name will be the line following .thumb_func
   4540   if (!isMachO) {
   4541     Name = Parser.getTok().getString();
   4542   }
   4543 
   4544   // Mark symbol as a thumb symbol.
   4545   MCSymbol *Func = getParser().getContext().GetOrCreateSymbol(Name);
   4546   getParser().getStreamer().EmitThumbFunc(Func);
   4547   return false;
   4548 }
   4549 
   4550 /// parseDirectiveSyntax
   4551 ///  ::= .syntax unified | divided
   4552 bool ARMAsmParser::parseDirectiveSyntax(SMLoc L) {
   4553   const AsmToken &Tok = Parser.getTok();
   4554   if (Tok.isNot(AsmToken::Identifier))
   4555     return Error(L, "unexpected token in .syntax directive");
   4556   StringRef Mode = Tok.getString();
   4557   if (Mode == "unified" || Mode == "UNIFIED")
   4558     Parser.Lex();
   4559   else if (Mode == "divided" || Mode == "DIVIDED")
   4560     return Error(L, "'.syntax divided' arm asssembly not supported");
   4561   else
   4562     return Error(L, "unrecognized syntax mode in .syntax directive");
   4563 
   4564   if (getLexer().isNot(AsmToken::EndOfStatement))
   4565     return Error(Parser.getTok().getLoc(), "unexpected token in directive");
   4566   Parser.Lex();
   4567 
   4568   // TODO tell the MC streamer the mode
   4569   // getParser().getStreamer().Emit???();
   4570   return false;
   4571 }
   4572 
   4573 /// parseDirectiveCode
   4574 ///  ::= .code 16 | 32
   4575 bool ARMAsmParser::parseDirectiveCode(SMLoc L) {
   4576   const AsmToken &Tok = Parser.getTok();
   4577   if (Tok.isNot(AsmToken::Integer))
   4578     return Error(L, "unexpected token in .code directive");
   4579   int64_t Val = Parser.getTok().getIntVal();
   4580   if (Val == 16)
   4581     Parser.Lex();
   4582   else if (Val == 32)
   4583     Parser.Lex();
   4584   else
   4585     return Error(L, "invalid operand to .code directive");
   4586 
   4587   if (getLexer().isNot(AsmToken::EndOfStatement))
   4588     return Error(Parser.getTok().getLoc(), "unexpected token in directive");
   4589   Parser.Lex();
   4590 
   4591   if (Val == 16) {
   4592     if (!isThumb())
   4593       SwitchMode();
   4594     getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16);
   4595   } else {
   4596     if (isThumb())
   4597       SwitchMode();
   4598     getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32);
   4599   }
   4600 
   4601   return false;
   4602 }
   4603 
   4604 extern "C" void LLVMInitializeARMAsmLexer();
   4605 
   4606 /// Force static initialization.
   4607 extern "C" void LLVMInitializeARMAsmParser() {
   4608   RegisterMCAsmParser<ARMAsmParser> X(TheARMTarget);
   4609   RegisterMCAsmParser<ARMAsmParser> Y(TheThumbTarget);
   4610   LLVMInitializeARMAsmLexer();
   4611 }
   4612 
   4613 #define GET_REGISTER_MATCHER
   4614 #define GET_MATCHER_IMPLEMENTATION
   4615 #include "ARMGenAsmMatcher.inc"
   4616