Home | History | Annotate | Download | only in AsmParser
      1 //==- AArch64AsmParser.cpp - Parse AArch64 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 // This file contains the (GNU-style) assembly parser for the AArch64
     11 // architecture.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 
     16 #include "MCTargetDesc/AArch64MCTargetDesc.h"
     17 #include "MCTargetDesc/AArch64MCExpr.h"
     18 #include "Utils/AArch64BaseInfo.h"
     19 #include "llvm/ADT/APFloat.h"
     20 #include "llvm/ADT/APInt.h"
     21 #include "llvm/ADT/StringSwitch.h"
     22 #include "llvm/ADT/STLExtras.h"
     23 #include "llvm/MC/MCContext.h"
     24 #include "llvm/MC/MCInst.h"
     25 #include "llvm/MC/MCSubtargetInfo.h"
     26 #include "llvm/MC/MCTargetAsmParser.h"
     27 #include "llvm/MC/MCExpr.h"
     28 #include "llvm/MC/MCRegisterInfo.h"
     29 #include "llvm/MC/MCStreamer.h"
     30 #include "llvm/MC/MCParser/MCAsmLexer.h"
     31 #include "llvm/MC/MCParser/MCAsmParser.h"
     32 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
     33 #include "llvm/Support/ErrorHandling.h"
     34 #include "llvm/Support/raw_ostream.h"
     35 #include "llvm/Support/TargetRegistry.h"
     36 
     37 using namespace llvm;
     38 
     39 namespace {
     40 
     41 class AArch64Operand;
     42 
     43 class AArch64AsmParser : public MCTargetAsmParser {
     44   MCSubtargetInfo &STI;
     45   MCAsmParser &Parser;
     46 
     47 #define GET_ASSEMBLER_HEADER
     48 #include "AArch64GenAsmMatcher.inc"
     49 
     50 public:
     51   enum AArch64MatchResultTy {
     52     Match_FirstAArch64 = FIRST_TARGET_MATCH_RESULT_TY,
     53 #define GET_OPERAND_DIAGNOSTIC_TYPES
     54 #include "AArch64GenAsmMatcher.inc"
     55   };
     56 
     57   AArch64AsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser)
     58     : MCTargetAsmParser(), STI(_STI), Parser(_Parser) {
     59     MCAsmParserExtension::Initialize(_Parser);
     60 
     61     // Initialize the set of available features.
     62     setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
     63   }
     64 
     65   // These are the public interface of the MCTargetAsmParser
     66   bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
     67   bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
     68                         SMLoc NameLoc,
     69                         SmallVectorImpl<MCParsedAsmOperand*> &Operands);
     70 
     71   bool ParseDirective(AsmToken DirectiveID);
     72   bool ParseDirectiveTLSDescCall(SMLoc L);
     73   bool ParseDirectiveWord(unsigned Size, SMLoc L);
     74 
     75   bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
     76                                SmallVectorImpl<MCParsedAsmOperand*> &Operands,
     77                                MCStreamer&Out, unsigned &ErrorInfo,
     78                                bool MatchingInlineAsm);
     79 
     80   // The rest of the sub-parsers have more freedom over interface: they return
     81   // an OperandMatchResultTy because it's less ambiguous than true/false or
     82   // -1/0/1 even if it is more verbose
     83   OperandMatchResultTy
     84   ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
     85                StringRef Mnemonic);
     86 
     87   OperandMatchResultTy ParseImmediate(const MCExpr *&ExprVal);
     88 
     89   OperandMatchResultTy ParseRelocPrefix(AArch64MCExpr::VariantKind &RefKind);
     90 
     91   OperandMatchResultTy
     92   ParseNEONLane(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
     93                 uint32_t NumLanes);
     94 
     95   OperandMatchResultTy
     96   ParseRegister(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
     97                 uint32_t &NumLanes);
     98 
     99   OperandMatchResultTy
    100   ParseImmWithLSLOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    101 
    102   OperandMatchResultTy
    103   ParseCondCodeOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    104 
    105   OperandMatchResultTy
    106   ParseCRxOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    107 
    108   OperandMatchResultTy
    109   ParseFPImmOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    110 
    111   template<typename SomeNamedImmMapper> OperandMatchResultTy
    112   ParseNamedImmOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
    113     return ParseNamedImmOperand(SomeNamedImmMapper(), Operands);
    114   }
    115 
    116   OperandMatchResultTy
    117   ParseNamedImmOperand(const NamedImmMapper &Mapper,
    118                        SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    119 
    120   OperandMatchResultTy
    121   ParseLSXAddressOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    122 
    123   OperandMatchResultTy
    124   ParseShiftExtend(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    125 
    126   OperandMatchResultTy
    127   ParseSysRegOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    128 
    129   bool validateInstruction(MCInst &Inst,
    130                           const SmallVectorImpl<MCParsedAsmOperand*> &Operands);
    131 
    132   /// Scan the next token (which had better be an identifier) and determine
    133   /// whether it represents a general-purpose or vector register. It returns
    134   /// true if an identifier was found and populates its reference arguments. It
    135   /// does not consume the token.
    136   bool
    137   IdentifyRegister(unsigned &RegNum, SMLoc &RegEndLoc, StringRef &LayoutSpec,
    138                    SMLoc &LayoutLoc) const;
    139 
    140 };
    141 
    142 }
    143 
    144 namespace {
    145 
    146 /// Instances of this class represent a parsed AArch64 machine instruction.
    147 class AArch64Operand : public MCParsedAsmOperand {
    148 private:
    149   enum KindTy {
    150     k_ImmWithLSL,     // #uimm {, LSL #amt }
    151     k_CondCode,       // eq/ne/...
    152     k_FPImmediate,    // Limited-precision floating-point imm
    153     k_Immediate,      // Including expressions referencing symbols
    154     k_Register,
    155     k_ShiftExtend,
    156     k_SysReg,         // The register operand of MRS and MSR instructions
    157     k_Token,          // The mnemonic; other raw tokens the auto-generated
    158     k_WrappedRegister // Load/store exclusive permit a wrapped register.
    159   } Kind;
    160 
    161   SMLoc StartLoc, EndLoc;
    162 
    163   struct ImmWithLSLOp {
    164     const MCExpr *Val;
    165     unsigned ShiftAmount;
    166     bool ImplicitAmount;
    167   };
    168 
    169   struct CondCodeOp {
    170     A64CC::CondCodes Code;
    171   };
    172 
    173   struct FPImmOp {
    174     double Val;
    175   };
    176 
    177   struct ImmOp {
    178     const MCExpr *Val;
    179   };
    180 
    181   struct RegOp {
    182     unsigned RegNum;
    183   };
    184 
    185   struct ShiftExtendOp {
    186     A64SE::ShiftExtSpecifiers ShiftType;
    187     unsigned Amount;
    188     bool ImplicitAmount;
    189   };
    190 
    191   struct SysRegOp {
    192     const char *Data;
    193     unsigned Length;
    194   };
    195 
    196   struct TokOp {
    197     const char *Data;
    198     unsigned Length;
    199   };
    200 
    201   union {
    202     struct ImmWithLSLOp ImmWithLSL;
    203     struct CondCodeOp CondCode;
    204     struct FPImmOp FPImm;
    205     struct ImmOp Imm;
    206     struct RegOp Reg;
    207     struct ShiftExtendOp ShiftExtend;
    208     struct SysRegOp SysReg;
    209     struct TokOp Tok;
    210   };
    211 
    212   AArch64Operand(KindTy K, SMLoc S, SMLoc E)
    213     : MCParsedAsmOperand(), Kind(K), StartLoc(S), EndLoc(E) {}
    214 
    215 public:
    216   AArch64Operand(const AArch64Operand &o) : MCParsedAsmOperand() {
    217   }
    218 
    219   SMLoc getStartLoc() const { return StartLoc; }
    220   SMLoc getEndLoc() const { return EndLoc; }
    221   void print(raw_ostream&) const;
    222   void dump() const;
    223 
    224   StringRef getToken() const {
    225     assert(Kind == k_Token && "Invalid access!");
    226     return StringRef(Tok.Data, Tok.Length);
    227   }
    228 
    229   unsigned getReg() const {
    230     assert((Kind == k_Register || Kind == k_WrappedRegister)
    231            && "Invalid access!");
    232     return Reg.RegNum;
    233   }
    234 
    235   const MCExpr *getImm() const {
    236     assert(Kind == k_Immediate && "Invalid access!");
    237     return Imm.Val;
    238   }
    239 
    240   A64CC::CondCodes getCondCode() const {
    241     assert(Kind == k_CondCode && "Invalid access!");
    242     return CondCode.Code;
    243   }
    244 
    245   static bool isNonConstantExpr(const MCExpr *E,
    246                                 AArch64MCExpr::VariantKind &Variant) {
    247     if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(E)) {
    248       Variant = A64E->getKind();
    249       return true;
    250     } else if (!isa<MCConstantExpr>(E)) {
    251       Variant = AArch64MCExpr::VK_AARCH64_None;
    252       return true;
    253     }
    254 
    255     return false;
    256   }
    257 
    258   bool isCondCode() const { return Kind == k_CondCode; }
    259   bool isToken() const { return Kind == k_Token; }
    260   bool isReg() const { return Kind == k_Register; }
    261   bool isImm() const { return Kind == k_Immediate; }
    262   bool isMem() const { return false; }
    263   bool isFPImm() const { return Kind == k_FPImmediate; }
    264   bool isShiftOrExtend() const { return Kind == k_ShiftExtend; }
    265   bool isSysReg() const { return Kind == k_SysReg; }
    266   bool isImmWithLSL() const { return Kind == k_ImmWithLSL; }
    267   bool isWrappedReg() const { return Kind == k_WrappedRegister; }
    268 
    269   bool isAddSubImmLSL0() const {
    270     if (!isImmWithLSL()) return false;
    271     if (ImmWithLSL.ShiftAmount != 0) return false;
    272 
    273     AArch64MCExpr::VariantKind Variant;
    274     if (isNonConstantExpr(ImmWithLSL.Val, Variant)) {
    275       return Variant == AArch64MCExpr::VK_AARCH64_LO12
    276           || Variant == AArch64MCExpr::VK_AARCH64_DTPREL_LO12
    277           || Variant == AArch64MCExpr::VK_AARCH64_DTPREL_LO12_NC
    278           || Variant == AArch64MCExpr::VK_AARCH64_TPREL_LO12
    279           || Variant == AArch64MCExpr::VK_AARCH64_TPREL_LO12_NC
    280           || Variant == AArch64MCExpr::VK_AARCH64_TLSDESC_LO12;
    281     }
    282 
    283     // Otherwise it should be a real immediate in range:
    284     const MCConstantExpr *CE = cast<MCConstantExpr>(ImmWithLSL.Val);
    285     return CE->getValue() >= 0 && CE->getValue() <= 0xfff;
    286   }
    287 
    288   bool isAddSubImmLSL12() const {
    289     if (!isImmWithLSL()) return false;
    290     if (ImmWithLSL.ShiftAmount != 12) return false;
    291 
    292     AArch64MCExpr::VariantKind Variant;
    293     if (isNonConstantExpr(ImmWithLSL.Val, Variant)) {
    294       return Variant == AArch64MCExpr::VK_AARCH64_DTPREL_HI12
    295           || Variant == AArch64MCExpr::VK_AARCH64_TPREL_HI12;
    296     }
    297 
    298     // Otherwise it should be a real immediate in range:
    299     const MCConstantExpr *CE = cast<MCConstantExpr>(ImmWithLSL.Val);
    300     return CE->getValue() >= 0 && CE->getValue() <= 0xfff;
    301   }
    302 
    303   template<unsigned MemSize, unsigned RmSize> bool isAddrRegExtend() const {
    304     if (!isShiftOrExtend()) return false;
    305 
    306     A64SE::ShiftExtSpecifiers Ext = ShiftExtend.ShiftType;
    307     if (RmSize == 32 && !(Ext == A64SE::UXTW || Ext == A64SE::SXTW))
    308       return false;
    309 
    310     if (RmSize == 64 && !(Ext == A64SE::LSL || Ext == A64SE::SXTX))
    311       return false;
    312 
    313     return ShiftExtend.Amount == Log2_32(MemSize) || ShiftExtend.Amount == 0;
    314   }
    315 
    316   bool isAdrpLabel() const {
    317     if (!isImm()) return false;
    318 
    319     AArch64MCExpr::VariantKind Variant;
    320     if (isNonConstantExpr(getImm(), Variant)) {
    321       return Variant == AArch64MCExpr::VK_AARCH64_None
    322         || Variant == AArch64MCExpr::VK_AARCH64_GOT
    323         || Variant == AArch64MCExpr::VK_AARCH64_GOTTPREL
    324         || Variant == AArch64MCExpr::VK_AARCH64_TLSDESC;
    325     }
    326 
    327     return isLabel<21, 4096>();
    328   }
    329 
    330   template<unsigned RegWidth>  bool isBitfieldWidth() const {
    331     if (!isImm()) return false;
    332 
    333     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    334     if (!CE) return false;
    335 
    336     return CE->getValue() >= 1 && CE->getValue() <= RegWidth;
    337   }
    338 
    339   template<int RegWidth>
    340   bool isCVTFixedPos() const {
    341     if (!isImm()) return false;
    342 
    343     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    344     if (!CE) return false;
    345 
    346     return CE->getValue() >= 1 && CE->getValue() <= RegWidth;
    347   }
    348 
    349   bool isFMOVImm() const {
    350     if (!isFPImm()) return false;
    351 
    352     APFloat RealVal(FPImm.Val);
    353     uint32_t ImmVal;
    354     return A64Imms::isFPImm(RealVal, ImmVal);
    355   }
    356 
    357   bool isFPZero() const {
    358     if (!isFPImm()) return false;
    359 
    360     APFloat RealVal(FPImm.Val);
    361     return RealVal.isPosZero();
    362   }
    363 
    364   template<unsigned field_width, unsigned scale>
    365   bool isLabel() const {
    366     if (!isImm()) return false;
    367 
    368     if (dyn_cast<MCSymbolRefExpr>(Imm.Val)) {
    369       return true;
    370     } else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Imm.Val)) {
    371       int64_t Val = CE->getValue();
    372       int64_t Min = - (scale * (1LL << (field_width - 1)));
    373       int64_t Max = scale * ((1LL << (field_width - 1)) - 1);
    374       return (Val % scale) == 0 && Val >= Min && Val <= Max;
    375     }
    376 
    377     // N.b. this disallows explicit relocation specifications via an
    378     // AArch64MCExpr. Users needing that behaviour
    379     return false;
    380   }
    381 
    382   bool isLane1() const {
    383     if (!isImm()) return false;
    384 
    385     // Because it's come through custom assembly parsing, it must always be a
    386     // constant expression.
    387     return cast<MCConstantExpr>(getImm())->getValue() == 1;
    388   }
    389 
    390   bool isLoadLitLabel() const {
    391     if (!isImm()) return false;
    392 
    393     AArch64MCExpr::VariantKind Variant;
    394     if (isNonConstantExpr(getImm(), Variant)) {
    395       return Variant == AArch64MCExpr::VK_AARCH64_None
    396           || Variant == AArch64MCExpr::VK_AARCH64_GOTTPREL;
    397     }
    398 
    399     return isLabel<19, 4>();
    400   }
    401 
    402   template<unsigned RegWidth> bool isLogicalImm() const {
    403     if (!isImm()) return false;
    404 
    405     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Imm.Val);
    406     if (!CE) return false;
    407 
    408     uint32_t Bits;
    409     return A64Imms::isLogicalImm(RegWidth, CE->getValue(), Bits);
    410   }
    411 
    412   template<unsigned RegWidth> bool isLogicalImmMOV() const {
    413     if (!isLogicalImm<RegWidth>()) return false;
    414 
    415     const MCConstantExpr *CE = cast<MCConstantExpr>(Imm.Val);
    416 
    417     // The move alias for ORR is only valid if the immediate cannot be
    418     // represented with a move (immediate) instruction; they take priority.
    419     int UImm16, Shift;
    420     return !A64Imms::isMOVZImm(RegWidth, CE->getValue(), UImm16, Shift)
    421       && !A64Imms::isMOVNImm(RegWidth, CE->getValue(), UImm16, Shift);
    422   }
    423 
    424   template<int MemSize>
    425   bool isOffsetUImm12() const {
    426     if (!isImm()) return false;
    427 
    428     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    429 
    430     // Assume they know what they're doing for now if they've given us a
    431     // non-constant expression. In principle we could check for ridiculous
    432     // things that can't possibly work or relocations that would almost
    433     // certainly break resulting code.
    434     if (!CE)
    435       return true;
    436 
    437     int64_t Val = CE->getValue();
    438 
    439     // Must be a multiple of the access size in bytes.
    440     if ((Val & (MemSize - 1)) != 0) return false;
    441 
    442     // Must be 12-bit unsigned
    443     return Val >= 0 && Val <= 0xfff * MemSize;
    444   }
    445 
    446   template<A64SE::ShiftExtSpecifiers SHKind, bool is64Bit>
    447   bool isShift() const {
    448     if (!isShiftOrExtend()) return false;
    449 
    450     if (ShiftExtend.ShiftType != SHKind)
    451       return false;
    452 
    453     return is64Bit ? ShiftExtend.Amount <= 63 : ShiftExtend.Amount <= 31;
    454   }
    455 
    456   bool isMOVN32Imm() const {
    457     static AArch64MCExpr::VariantKind PermittedModifiers[] = {
    458       AArch64MCExpr::VK_AARCH64_SABS_G0,
    459       AArch64MCExpr::VK_AARCH64_SABS_G1,
    460       AArch64MCExpr::VK_AARCH64_DTPREL_G1,
    461       AArch64MCExpr::VK_AARCH64_DTPREL_G0,
    462       AArch64MCExpr::VK_AARCH64_GOTTPREL_G1,
    463       AArch64MCExpr::VK_AARCH64_TPREL_G1,
    464       AArch64MCExpr::VK_AARCH64_TPREL_G0,
    465     };
    466     unsigned NumModifiers = llvm::array_lengthof(PermittedModifiers);
    467 
    468     return isMoveWideImm(32, PermittedModifiers, NumModifiers);
    469   }
    470 
    471   bool isMOVN64Imm() const {
    472     static AArch64MCExpr::VariantKind PermittedModifiers[] = {
    473       AArch64MCExpr::VK_AARCH64_SABS_G0,
    474       AArch64MCExpr::VK_AARCH64_SABS_G1,
    475       AArch64MCExpr::VK_AARCH64_SABS_G2,
    476       AArch64MCExpr::VK_AARCH64_DTPREL_G2,
    477       AArch64MCExpr::VK_AARCH64_DTPREL_G1,
    478       AArch64MCExpr::VK_AARCH64_DTPREL_G0,
    479       AArch64MCExpr::VK_AARCH64_GOTTPREL_G1,
    480       AArch64MCExpr::VK_AARCH64_TPREL_G2,
    481       AArch64MCExpr::VK_AARCH64_TPREL_G1,
    482       AArch64MCExpr::VK_AARCH64_TPREL_G0,
    483     };
    484     unsigned NumModifiers = llvm::array_lengthof(PermittedModifiers);
    485 
    486     return isMoveWideImm(64, PermittedModifiers, NumModifiers);
    487   }
    488 
    489 
    490   bool isMOVZ32Imm() const {
    491     static AArch64MCExpr::VariantKind PermittedModifiers[] = {
    492       AArch64MCExpr::VK_AARCH64_ABS_G0,
    493       AArch64MCExpr::VK_AARCH64_ABS_G1,
    494       AArch64MCExpr::VK_AARCH64_SABS_G0,
    495       AArch64MCExpr::VK_AARCH64_SABS_G1,
    496       AArch64MCExpr::VK_AARCH64_DTPREL_G1,
    497       AArch64MCExpr::VK_AARCH64_DTPREL_G0,
    498       AArch64MCExpr::VK_AARCH64_GOTTPREL_G1,
    499       AArch64MCExpr::VK_AARCH64_TPREL_G1,
    500       AArch64MCExpr::VK_AARCH64_TPREL_G0,
    501     };
    502     unsigned NumModifiers = llvm::array_lengthof(PermittedModifiers);
    503 
    504     return isMoveWideImm(32, PermittedModifiers, NumModifiers);
    505   }
    506 
    507   bool isMOVZ64Imm() const {
    508     static AArch64MCExpr::VariantKind PermittedModifiers[] = {
    509       AArch64MCExpr::VK_AARCH64_ABS_G0,
    510       AArch64MCExpr::VK_AARCH64_ABS_G1,
    511       AArch64MCExpr::VK_AARCH64_ABS_G2,
    512       AArch64MCExpr::VK_AARCH64_ABS_G3,
    513       AArch64MCExpr::VK_AARCH64_SABS_G0,
    514       AArch64MCExpr::VK_AARCH64_SABS_G1,
    515       AArch64MCExpr::VK_AARCH64_SABS_G2,
    516       AArch64MCExpr::VK_AARCH64_DTPREL_G2,
    517       AArch64MCExpr::VK_AARCH64_DTPREL_G1,
    518       AArch64MCExpr::VK_AARCH64_DTPREL_G0,
    519       AArch64MCExpr::VK_AARCH64_GOTTPREL_G1,
    520       AArch64MCExpr::VK_AARCH64_TPREL_G2,
    521       AArch64MCExpr::VK_AARCH64_TPREL_G1,
    522       AArch64MCExpr::VK_AARCH64_TPREL_G0,
    523     };
    524     unsigned NumModifiers = llvm::array_lengthof(PermittedModifiers);
    525 
    526     return isMoveWideImm(64, PermittedModifiers, NumModifiers);
    527   }
    528 
    529   bool isMOVK32Imm() const {
    530     static AArch64MCExpr::VariantKind PermittedModifiers[] = {
    531       AArch64MCExpr::VK_AARCH64_ABS_G0_NC,
    532       AArch64MCExpr::VK_AARCH64_ABS_G1_NC,
    533       AArch64MCExpr::VK_AARCH64_DTPREL_G1_NC,
    534       AArch64MCExpr::VK_AARCH64_DTPREL_G0_NC,
    535       AArch64MCExpr::VK_AARCH64_GOTTPREL_G0_NC,
    536       AArch64MCExpr::VK_AARCH64_TPREL_G1_NC,
    537       AArch64MCExpr::VK_AARCH64_TPREL_G0_NC,
    538     };
    539     unsigned NumModifiers = llvm::array_lengthof(PermittedModifiers);
    540 
    541     return isMoveWideImm(32, PermittedModifiers, NumModifiers);
    542   }
    543 
    544   bool isMOVK64Imm() const {
    545     static AArch64MCExpr::VariantKind PermittedModifiers[] = {
    546       AArch64MCExpr::VK_AARCH64_ABS_G0_NC,
    547       AArch64MCExpr::VK_AARCH64_ABS_G1_NC,
    548       AArch64MCExpr::VK_AARCH64_ABS_G2_NC,
    549       AArch64MCExpr::VK_AARCH64_ABS_G3,
    550       AArch64MCExpr::VK_AARCH64_DTPREL_G1_NC,
    551       AArch64MCExpr::VK_AARCH64_DTPREL_G0_NC,
    552       AArch64MCExpr::VK_AARCH64_GOTTPREL_G0_NC,
    553       AArch64MCExpr::VK_AARCH64_TPREL_G1_NC,
    554       AArch64MCExpr::VK_AARCH64_TPREL_G0_NC,
    555     };
    556     unsigned NumModifiers = llvm::array_lengthof(PermittedModifiers);
    557 
    558     return isMoveWideImm(64, PermittedModifiers, NumModifiers);
    559   }
    560 
    561   bool isMoveWideImm(unsigned RegWidth,
    562                      AArch64MCExpr::VariantKind *PermittedModifiers,
    563                      unsigned NumModifiers) const {
    564     if (!isImmWithLSL()) return false;
    565 
    566     if (ImmWithLSL.ShiftAmount % 16 != 0) return false;
    567     if (ImmWithLSL.ShiftAmount >= RegWidth) return false;
    568 
    569     AArch64MCExpr::VariantKind Modifier;
    570     if (isNonConstantExpr(ImmWithLSL.Val, Modifier)) {
    571       // E.g. "#:abs_g0:sym, lsl #16" makes no sense.
    572       if (!ImmWithLSL.ImplicitAmount) return false;
    573 
    574       for (unsigned i = 0; i < NumModifiers; ++i)
    575         if (PermittedModifiers[i] == Modifier) return true;
    576 
    577       return false;
    578     }
    579 
    580     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ImmWithLSL.Val);
    581     return CE && CE->getValue() >= 0  && CE->getValue() <= 0xffff;
    582   }
    583 
    584   template<int RegWidth, bool (*isValidImm)(int, uint64_t, int&, int&)>
    585   bool isMoveWideMovAlias() const {
    586     if (!isImm()) return false;
    587 
    588     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    589     if (!CE) return false;
    590 
    591     int UImm16, Shift;
    592     uint64_t Value = CE->getValue();
    593 
    594     // If this is a 32-bit instruction then all bits above 32 should be the
    595     // same: either of these is fine because signed/unsigned values should be
    596     // permitted.
    597     if (RegWidth == 32) {
    598       if ((Value >> 32) != 0 && (Value >> 32) != 0xffffffff)
    599         return false;
    600 
    601       Value &= 0xffffffffULL;
    602     }
    603 
    604     return isValidImm(RegWidth, Value, UImm16, Shift);
    605   }
    606 
    607   bool isMSRWithReg() const {
    608     if (!isSysReg()) return false;
    609 
    610     bool IsKnownRegister;
    611     StringRef Name(SysReg.Data, SysReg.Length);
    612     A64SysReg::MSRMapper().fromString(Name, IsKnownRegister);
    613 
    614     return IsKnownRegister;
    615   }
    616 
    617   bool isMSRPState() const {
    618     if (!isSysReg()) return false;
    619 
    620     bool IsKnownRegister;
    621     StringRef Name(SysReg.Data, SysReg.Length);
    622     A64PState::PStateMapper().fromString(Name, IsKnownRegister);
    623 
    624     return IsKnownRegister;
    625   }
    626 
    627   bool isMRS() const {
    628     if (!isSysReg()) return false;
    629 
    630     // First check against specific MSR-only (write-only) registers
    631     bool IsKnownRegister;
    632     StringRef Name(SysReg.Data, SysReg.Length);
    633     A64SysReg::MRSMapper().fromString(Name, IsKnownRegister);
    634 
    635     return IsKnownRegister;
    636   }
    637 
    638   bool isPRFM() const {
    639     if (!isImm()) return false;
    640 
    641     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    642 
    643     if (!CE)
    644       return false;
    645 
    646     return CE->getValue() >= 0 && CE->getValue() <= 31;
    647   }
    648 
    649   template<A64SE::ShiftExtSpecifiers SHKind> bool isRegExtend() const {
    650     if (!isShiftOrExtend()) return false;
    651 
    652     if (ShiftExtend.ShiftType != SHKind)
    653       return false;
    654 
    655     return ShiftExtend.Amount <= 4;
    656   }
    657 
    658   bool isRegExtendLSL() const {
    659     if (!isShiftOrExtend()) return false;
    660 
    661     if (ShiftExtend.ShiftType != A64SE::LSL)
    662       return false;
    663 
    664     return !ShiftExtend.ImplicitAmount && ShiftExtend.Amount <= 4;
    665   }
    666 
    667   template<int MemSize>  bool isSImm7Scaled() const {
    668     if (!isImm()) return false;
    669 
    670     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    671     if (!CE) return false;
    672 
    673     int64_t Val = CE->getValue();
    674     if (Val % MemSize != 0) return false;
    675 
    676     Val /= MemSize;
    677 
    678     return Val >= -64 && Val < 64;
    679   }
    680 
    681   template<int BitWidth>
    682   bool isSImm() const {
    683     if (!isImm()) return false;
    684 
    685     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    686     if (!CE) return false;
    687 
    688     return CE->getValue() >= -(1LL << (BitWidth - 1))
    689       && CE->getValue() < (1LL << (BitWidth - 1));
    690   }
    691 
    692   template<int bitWidth>
    693   bool isUImm() const {
    694     if (!isImm()) return false;
    695 
    696     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
    697     if (!CE) return false;
    698 
    699     return CE->getValue() >= 0 && CE->getValue() < (1LL << bitWidth);
    700   }
    701 
    702   bool isUImm() const {
    703     if (!isImm()) return false;
    704 
    705     return isa<MCConstantExpr>(getImm());
    706   }
    707 
    708   static AArch64Operand *CreateImmWithLSL(const MCExpr *Val,
    709                                           unsigned ShiftAmount,
    710                                           bool ImplicitAmount,
    711                                           SMLoc S, SMLoc E) {
    712     AArch64Operand *Op = new AArch64Operand(k_ImmWithLSL, S, E);
    713     Op->ImmWithLSL.Val = Val;
    714     Op->ImmWithLSL.ShiftAmount = ShiftAmount;
    715     Op->ImmWithLSL.ImplicitAmount = ImplicitAmount;
    716     return Op;
    717   }
    718 
    719   static AArch64Operand *CreateCondCode(A64CC::CondCodes Code,
    720                                         SMLoc S, SMLoc E) {
    721     AArch64Operand *Op = new AArch64Operand(k_CondCode, S, E);
    722     Op->CondCode.Code = Code;
    723     return Op;
    724   }
    725 
    726   static AArch64Operand *CreateFPImm(double Val,
    727                                      SMLoc S, SMLoc E) {
    728     AArch64Operand *Op = new AArch64Operand(k_FPImmediate, S, E);
    729     Op->FPImm.Val = Val;
    730     return Op;
    731   }
    732 
    733   static AArch64Operand *CreateImm(const MCExpr *Val, SMLoc S, SMLoc E) {
    734     AArch64Operand *Op = new AArch64Operand(k_Immediate, S, E);
    735     Op->Imm.Val = Val;
    736     return Op;
    737   }
    738 
    739   static AArch64Operand *CreateReg(unsigned RegNum, SMLoc S, SMLoc E) {
    740     AArch64Operand *Op = new AArch64Operand(k_Register, S, E);
    741     Op->Reg.RegNum = RegNum;
    742     return Op;
    743   }
    744 
    745   static AArch64Operand *CreateWrappedReg(unsigned RegNum, SMLoc S, SMLoc E) {
    746     AArch64Operand *Op = new AArch64Operand(k_WrappedRegister, S, E);
    747     Op->Reg.RegNum = RegNum;
    748     return Op;
    749   }
    750 
    751   static AArch64Operand *CreateShiftExtend(A64SE::ShiftExtSpecifiers ShiftTyp,
    752                                            unsigned Amount,
    753                                            bool ImplicitAmount,
    754                                            SMLoc S, SMLoc E) {
    755     AArch64Operand *Op = new AArch64Operand(k_ShiftExtend, S, E);
    756     Op->ShiftExtend.ShiftType = ShiftTyp;
    757     Op->ShiftExtend.Amount = Amount;
    758     Op->ShiftExtend.ImplicitAmount = ImplicitAmount;
    759     return Op;
    760   }
    761 
    762   static AArch64Operand *CreateSysReg(StringRef Str, SMLoc S) {
    763     AArch64Operand *Op = new AArch64Operand(k_SysReg, S, S);
    764     Op->Tok.Data = Str.data();
    765     Op->Tok.Length = Str.size();
    766     return Op;
    767   }
    768 
    769   static AArch64Operand *CreateToken(StringRef Str, SMLoc S) {
    770     AArch64Operand *Op = new AArch64Operand(k_Token, S, S);
    771     Op->Tok.Data = Str.data();
    772     Op->Tok.Length = Str.size();
    773     return Op;
    774   }
    775 
    776 
    777   void addExpr(MCInst &Inst, const MCExpr *Expr) const {
    778     // Add as immediates when possible.
    779     if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
    780       Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
    781     else
    782       Inst.addOperand(MCOperand::CreateExpr(Expr));
    783   }
    784 
    785   template<unsigned RegWidth>
    786   void addBFILSBOperands(MCInst &Inst, unsigned N) const {
    787     assert(N == 1 && "Invalid number of operands!");
    788     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
    789     unsigned EncodedVal = (RegWidth - CE->getValue()) % RegWidth;
    790     Inst.addOperand(MCOperand::CreateImm(EncodedVal));
    791   }
    792 
    793   void addBFIWidthOperands(MCInst &Inst, unsigned N) const {
    794     assert(N == 1 && "Invalid number of operands!");
    795     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
    796     Inst.addOperand(MCOperand::CreateImm(CE->getValue() - 1));
    797   }
    798 
    799   void addBFXWidthOperands(MCInst &Inst, unsigned N) const {
    800     assert(N == 1 && "Invalid number of operands!");
    801 
    802     uint64_t LSB = Inst.getOperand(Inst.getNumOperands()-1).getImm();
    803     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
    804 
    805     Inst.addOperand(MCOperand::CreateImm(LSB + CE->getValue() - 1));
    806   }
    807 
    808   void addCondCodeOperands(MCInst &Inst, unsigned N) const {
    809     assert(N == 1 && "Invalid number of operands!");
    810     Inst.addOperand(MCOperand::CreateImm(getCondCode()));
    811   }
    812 
    813   void addCVTFixedPosOperands(MCInst &Inst, unsigned N) const {
    814     assert(N == 1 && "Invalid number of operands!");
    815 
    816     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
    817     Inst.addOperand(MCOperand::CreateImm(64 - CE->getValue()));
    818   }
    819 
    820   void addFMOVImmOperands(MCInst &Inst, unsigned N) const {
    821     assert(N == 1 && "Invalid number of operands!");
    822 
    823     APFloat RealVal(FPImm.Val);
    824     uint32_t ImmVal;
    825     A64Imms::isFPImm(RealVal, ImmVal);
    826 
    827     Inst.addOperand(MCOperand::CreateImm(ImmVal));
    828   }
    829 
    830   void addFPZeroOperands(MCInst &Inst, unsigned N) const {
    831     assert(N == 1 && "Invalid number of operands");
    832     Inst.addOperand(MCOperand::CreateImm(0));
    833   }
    834 
    835   void addInvCondCodeOperands(MCInst &Inst, unsigned N) const {
    836     assert(N == 1 && "Invalid number of operands!");
    837     unsigned Encoded = A64InvertCondCode(getCondCode());
    838     Inst.addOperand(MCOperand::CreateImm(Encoded));
    839   }
    840 
    841   void addRegOperands(MCInst &Inst, unsigned N) const {
    842     assert(N == 1 && "Invalid number of operands!");
    843     Inst.addOperand(MCOperand::CreateReg(getReg()));
    844   }
    845 
    846   void addImmOperands(MCInst &Inst, unsigned N) const {
    847     assert(N == 1 && "Invalid number of operands!");
    848     addExpr(Inst, getImm());
    849   }
    850 
    851   template<int MemSize>
    852   void addSImm7ScaledOperands(MCInst &Inst, unsigned N) const {
    853     assert(N == 1 && "Invalid number of operands!");
    854 
    855     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
    856     uint64_t Val = CE->getValue() / MemSize;
    857     Inst.addOperand(MCOperand::CreateImm(Val  & 0x7f));
    858   }
    859 
    860   template<int BitWidth>
    861   void addSImmOperands(MCInst &Inst, unsigned N) const {
    862     assert(N == 1 && "Invalid number of operands!");
    863 
    864     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
    865     uint64_t Val = CE->getValue();
    866     Inst.addOperand(MCOperand::CreateImm(Val  & ((1ULL << BitWidth) - 1)));
    867   }
    868 
    869   void addImmWithLSLOperands(MCInst &Inst, unsigned N) const {
    870     assert (N == 1 && "Invalid number of operands!");
    871 
    872     addExpr(Inst, ImmWithLSL.Val);
    873   }
    874 
    875   template<unsigned field_width, unsigned scale>
    876   void addLabelOperands(MCInst &Inst, unsigned N) const {
    877     assert(N == 1 && "Invalid number of operands!");
    878 
    879     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Imm.Val);
    880 
    881     if (!CE) {
    882       addExpr(Inst, Imm.Val);
    883       return;
    884     }
    885 
    886     int64_t Val = CE->getValue();
    887     assert(Val % scale == 0 && "Unaligned immediate in instruction");
    888     Val /= scale;
    889 
    890     Inst.addOperand(MCOperand::CreateImm(Val & ((1LL << field_width) - 1)));
    891   }
    892 
    893   template<int MemSize>
    894   void addOffsetUImm12Operands(MCInst &Inst, unsigned N) const {
    895     assert(N == 1 && "Invalid number of operands!");
    896 
    897     if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm())) {
    898       Inst.addOperand(MCOperand::CreateImm(CE->getValue() / MemSize));
    899     } else {
    900       Inst.addOperand(MCOperand::CreateExpr(getImm()));
    901     }
    902   }
    903 
    904   template<unsigned RegWidth>
    905   void addLogicalImmOperands(MCInst &Inst, unsigned N) const {
    906     assert(N == 1 && "Invalid number of operands");
    907     const MCConstantExpr *CE = cast<MCConstantExpr>(Imm.Val);
    908 
    909     uint32_t Bits;
    910     A64Imms::isLogicalImm(RegWidth, CE->getValue(), Bits);
    911 
    912     Inst.addOperand(MCOperand::CreateImm(Bits));
    913   }
    914 
    915   void addMRSOperands(MCInst &Inst, unsigned N) const {
    916     assert(N == 1 && "Invalid number of operands!");
    917 
    918     bool Valid;
    919     StringRef Name(SysReg.Data, SysReg.Length);
    920     uint32_t Bits = A64SysReg::MRSMapper().fromString(Name, Valid);
    921 
    922     Inst.addOperand(MCOperand::CreateImm(Bits));
    923   }
    924 
    925   void addMSRWithRegOperands(MCInst &Inst, unsigned N) const {
    926     assert(N == 1 && "Invalid number of operands!");
    927 
    928     bool Valid;
    929     StringRef Name(SysReg.Data, SysReg.Length);
    930     uint32_t Bits = A64SysReg::MSRMapper().fromString(Name, Valid);
    931 
    932     Inst.addOperand(MCOperand::CreateImm(Bits));
    933   }
    934 
    935   void addMSRPStateOperands(MCInst &Inst, unsigned N) const {
    936     assert(N == 1 && "Invalid number of operands!");
    937 
    938     bool Valid;
    939     StringRef Name(SysReg.Data, SysReg.Length);
    940     uint32_t Bits = A64PState::PStateMapper().fromString(Name, Valid);
    941 
    942     Inst.addOperand(MCOperand::CreateImm(Bits));
    943   }
    944 
    945   void addMoveWideImmOperands(MCInst &Inst, unsigned N) const {
    946     assert(N == 2 && "Invalid number of operands!");
    947 
    948     addExpr(Inst, ImmWithLSL.Val);
    949 
    950     AArch64MCExpr::VariantKind Variant;
    951     if (!isNonConstantExpr(ImmWithLSL.Val, Variant)) {
    952       Inst.addOperand(MCOperand::CreateImm(ImmWithLSL.ShiftAmount / 16));
    953       return;
    954     }
    955 
    956     // We know it's relocated
    957     switch (Variant) {
    958     case AArch64MCExpr::VK_AARCH64_ABS_G0:
    959     case AArch64MCExpr::VK_AARCH64_ABS_G0_NC:
    960     case AArch64MCExpr::VK_AARCH64_SABS_G0:
    961     case AArch64MCExpr::VK_AARCH64_DTPREL_G0:
    962     case AArch64MCExpr::VK_AARCH64_DTPREL_G0_NC:
    963     case AArch64MCExpr::VK_AARCH64_GOTTPREL_G0_NC:
    964     case AArch64MCExpr::VK_AARCH64_TPREL_G0:
    965     case AArch64MCExpr::VK_AARCH64_TPREL_G0_NC:
    966       Inst.addOperand(MCOperand::CreateImm(0));
    967       break;
    968     case AArch64MCExpr::VK_AARCH64_ABS_G1:
    969     case AArch64MCExpr::VK_AARCH64_ABS_G1_NC:
    970     case AArch64MCExpr::VK_AARCH64_SABS_G1:
    971     case AArch64MCExpr::VK_AARCH64_DTPREL_G1:
    972     case AArch64MCExpr::VK_AARCH64_DTPREL_G1_NC:
    973     case AArch64MCExpr::VK_AARCH64_GOTTPREL_G1:
    974     case AArch64MCExpr::VK_AARCH64_TPREL_G1:
    975     case AArch64MCExpr::VK_AARCH64_TPREL_G1_NC:
    976       Inst.addOperand(MCOperand::CreateImm(1));
    977       break;
    978     case AArch64MCExpr::VK_AARCH64_ABS_G2:
    979     case AArch64MCExpr::VK_AARCH64_ABS_G2_NC:
    980     case AArch64MCExpr::VK_AARCH64_SABS_G2:
    981     case AArch64MCExpr::VK_AARCH64_DTPREL_G2:
    982     case AArch64MCExpr::VK_AARCH64_TPREL_G2:
    983       Inst.addOperand(MCOperand::CreateImm(2));
    984       break;
    985     case AArch64MCExpr::VK_AARCH64_ABS_G3:
    986       Inst.addOperand(MCOperand::CreateImm(3));
    987       break;
    988     default: llvm_unreachable("Inappropriate move wide relocation");
    989     }
    990   }
    991 
    992   template<int RegWidth, bool isValidImm(int, uint64_t, int&, int&)>
    993   void addMoveWideMovAliasOperands(MCInst &Inst, unsigned N) const {
    994     assert(N == 2 && "Invalid number of operands!");
    995     int UImm16, Shift;
    996 
    997     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
    998     uint64_t Value = CE->getValue();
    999 
   1000     if (RegWidth == 32) {
   1001       Value &= 0xffffffffULL;
   1002     }
   1003 
   1004     bool Valid = isValidImm(RegWidth, Value, UImm16, Shift);
   1005     (void)Valid;
   1006     assert(Valid && "Invalid immediates should have been weeded out by now");
   1007 
   1008     Inst.addOperand(MCOperand::CreateImm(UImm16));
   1009     Inst.addOperand(MCOperand::CreateImm(Shift));
   1010   }
   1011 
   1012   void addPRFMOperands(MCInst &Inst, unsigned N) const {
   1013     assert(N == 1 && "Invalid number of operands!");
   1014 
   1015     const MCConstantExpr *CE = cast<MCConstantExpr>(getImm());
   1016     assert(CE->getValue() >= 0 && CE->getValue() <= 31
   1017            && "PRFM operand should be 5-bits");
   1018 
   1019     Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
   1020   }
   1021 
   1022   // For Add-sub (extended register) operands.
   1023   void addRegExtendOperands(MCInst &Inst, unsigned N) const {
   1024     assert(N == 1 && "Invalid number of operands!");
   1025 
   1026     Inst.addOperand(MCOperand::CreateImm(ShiftExtend.Amount));
   1027   }
   1028 
   1029   // For the extend in load-store (register offset) instructions.
   1030   template<unsigned MemSize>
   1031   void addAddrRegExtendOperands(MCInst &Inst, unsigned N) const {
   1032     addAddrRegExtendOperands(Inst, N, MemSize);
   1033   }
   1034 
   1035   void addAddrRegExtendOperands(MCInst &Inst, unsigned N,
   1036                                 unsigned MemSize) const {
   1037     assert(N == 1 && "Invalid number of operands!");
   1038 
   1039     // First bit of Option is set in instruction classes, the high two bits are
   1040     // as follows:
   1041     unsigned OptionHi = 0;
   1042     switch (ShiftExtend.ShiftType) {
   1043     case A64SE::UXTW:
   1044     case A64SE::LSL:
   1045       OptionHi = 1;
   1046       break;
   1047     case A64SE::SXTW:
   1048     case A64SE::SXTX:
   1049       OptionHi = 3;
   1050       break;
   1051     default:
   1052       llvm_unreachable("Invalid extend type for register offset");
   1053     }
   1054 
   1055     unsigned S = 0;
   1056     if (MemSize == 1 && !ShiftExtend.ImplicitAmount)
   1057       S = 1;
   1058     else if (MemSize != 1 && ShiftExtend.Amount != 0)
   1059       S = 1;
   1060 
   1061     Inst.addOperand(MCOperand::CreateImm((OptionHi << 1) | S));
   1062   }
   1063   void addShiftOperands(MCInst &Inst, unsigned N) const {
   1064     assert(N == 1 && "Invalid number of operands!");
   1065 
   1066     Inst.addOperand(MCOperand::CreateImm(ShiftExtend.Amount));
   1067   }
   1068 };
   1069 
   1070 } // end anonymous namespace.
   1071 
   1072 AArch64AsmParser::OperandMatchResultTy
   1073 AArch64AsmParser::ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
   1074                                StringRef Mnemonic) {
   1075 
   1076   // See if the operand has a custom parser
   1077   OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic);
   1078 
   1079   // It could either succeed, fail or just not care.
   1080   if (ResTy != MatchOperand_NoMatch)
   1081     return ResTy;
   1082 
   1083   switch (getLexer().getKind()) {
   1084   default:
   1085     Error(Parser.getTok().getLoc(), "unexpected token in operand");
   1086     return MatchOperand_ParseFail;
   1087   case AsmToken::Identifier: {
   1088     // It might be in the LSL/UXTB family ...
   1089     OperandMatchResultTy GotShift = ParseShiftExtend(Operands);
   1090 
   1091     // We can only continue if no tokens were eaten.
   1092     if (GotShift != MatchOperand_NoMatch)
   1093       return GotShift;
   1094 
   1095     // ... or it might be a register ...
   1096     uint32_t NumLanes = 0;
   1097     OperandMatchResultTy GotReg = ParseRegister(Operands, NumLanes);
   1098     assert(GotReg != MatchOperand_ParseFail
   1099            && "register parsing shouldn't partially succeed");
   1100 
   1101     if (GotReg == MatchOperand_Success) {
   1102       if (Parser.getTok().is(AsmToken::LBrac))
   1103         return ParseNEONLane(Operands, NumLanes);
   1104       else
   1105         return MatchOperand_Success;
   1106     }
   1107 
   1108     // ... or it might be a symbolish thing
   1109   }
   1110     // Fall through
   1111   case AsmToken::LParen:  // E.g. (strcmp-4)
   1112   case AsmToken::Integer: // 1f, 2b labels
   1113   case AsmToken::String:  // quoted labels
   1114   case AsmToken::Dot:     // . is Current location
   1115   case AsmToken::Dollar:  // $ is PC
   1116   case AsmToken::Colon: {
   1117     SMLoc StartLoc  = Parser.getTok().getLoc();
   1118     SMLoc EndLoc;
   1119     const MCExpr *ImmVal = 0;
   1120 
   1121     if (ParseImmediate(ImmVal) != MatchOperand_Success)
   1122       return MatchOperand_ParseFail;
   1123 
   1124     EndLoc = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
   1125     Operands.push_back(AArch64Operand::CreateImm(ImmVal, StartLoc, EndLoc));
   1126     return MatchOperand_Success;
   1127   }
   1128   case AsmToken::Hash: {   // Immediates
   1129     SMLoc StartLoc = Parser.getTok().getLoc();
   1130     SMLoc EndLoc;
   1131     const MCExpr *ImmVal = 0;
   1132     Parser.Lex();
   1133 
   1134     if (ParseImmediate(ImmVal) != MatchOperand_Success)
   1135       return MatchOperand_ParseFail;
   1136 
   1137     EndLoc = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
   1138     Operands.push_back(AArch64Operand::CreateImm(ImmVal, StartLoc, EndLoc));
   1139     return MatchOperand_Success;
   1140   }
   1141   case AsmToken::LBrac: {
   1142     SMLoc Loc = Parser.getTok().getLoc();
   1143     Operands.push_back(AArch64Operand::CreateToken("[", Loc));
   1144     Parser.Lex(); // Eat '['
   1145 
   1146     // There's no comma after a '[', so we can parse the next operand
   1147     // immediately.
   1148     return ParseOperand(Operands, Mnemonic);
   1149   }
   1150   // The following will likely be useful later, but not in very early cases
   1151   case AsmToken::LCurly:  // Weird SIMD lists
   1152     llvm_unreachable("Don't know how to deal with '{' in operand");
   1153     return MatchOperand_ParseFail;
   1154   }
   1155 }
   1156 
   1157 AArch64AsmParser::OperandMatchResultTy
   1158 AArch64AsmParser::ParseImmediate(const MCExpr *&ExprVal) {
   1159   if (getLexer().is(AsmToken::Colon)) {
   1160     AArch64MCExpr::VariantKind RefKind;
   1161 
   1162     OperandMatchResultTy ResTy = ParseRelocPrefix(RefKind);
   1163     if (ResTy != MatchOperand_Success)
   1164       return ResTy;
   1165 
   1166     const MCExpr *SubExprVal;
   1167     if (getParser().parseExpression(SubExprVal))
   1168       return MatchOperand_ParseFail;
   1169 
   1170     ExprVal = AArch64MCExpr::Create(RefKind, SubExprVal, getContext());
   1171     return MatchOperand_Success;
   1172   }
   1173 
   1174   // No weird AArch64MCExpr prefix
   1175   return getParser().parseExpression(ExprVal)
   1176     ? MatchOperand_ParseFail : MatchOperand_Success;
   1177 }
   1178 
   1179 // A lane attached to a NEON register. "[N]", which should yield three tokens:
   1180 // '[', N, ']'. A hash is not allowed to precede the immediate here.
   1181 AArch64AsmParser::OperandMatchResultTy
   1182 AArch64AsmParser::ParseNEONLane(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
   1183                                 uint32_t NumLanes) {
   1184   SMLoc Loc = Parser.getTok().getLoc();
   1185 
   1186   assert(Parser.getTok().is(AsmToken::LBrac) && "inappropriate operand");
   1187   Operands.push_back(AArch64Operand::CreateToken("[", Loc));
   1188   Parser.Lex(); // Eat '['
   1189 
   1190   if (Parser.getTok().isNot(AsmToken::Integer)) {
   1191     Error(Parser.getTok().getLoc(), "expected lane number");
   1192     return MatchOperand_ParseFail;
   1193   }
   1194 
   1195   if (Parser.getTok().getIntVal() >= NumLanes) {
   1196     Error(Parser.getTok().getLoc(), "lane number incompatible with layout");
   1197     return MatchOperand_ParseFail;
   1198   }
   1199 
   1200   const MCExpr *Lane = MCConstantExpr::Create(Parser.getTok().getIntVal(),
   1201                                               getContext());
   1202   SMLoc S = Parser.getTok().getLoc();
   1203   Parser.Lex(); // Eat actual lane
   1204   SMLoc E = Parser.getTok().getLoc();
   1205   Operands.push_back(AArch64Operand::CreateImm(Lane, S, E));
   1206 
   1207 
   1208   if (Parser.getTok().isNot(AsmToken::RBrac)) {
   1209     Error(Parser.getTok().getLoc(), "expected ']' after lane");
   1210     return MatchOperand_ParseFail;
   1211   }
   1212 
   1213   Operands.push_back(AArch64Operand::CreateToken("]", Loc));
   1214   Parser.Lex(); // Eat ']'
   1215 
   1216   return MatchOperand_Success;
   1217 }
   1218 
   1219 AArch64AsmParser::OperandMatchResultTy
   1220 AArch64AsmParser::ParseRelocPrefix(AArch64MCExpr::VariantKind &RefKind) {
   1221   assert(getLexer().is(AsmToken::Colon) && "expected a ':'");
   1222   Parser.Lex();
   1223 
   1224   if (getLexer().isNot(AsmToken::Identifier)) {
   1225     Error(Parser.getTok().getLoc(),
   1226           "expected relocation specifier in operand after ':'");
   1227     return MatchOperand_ParseFail;
   1228   }
   1229 
   1230   std::string LowerCase = Parser.getTok().getIdentifier().lower();
   1231   RefKind = StringSwitch<AArch64MCExpr::VariantKind>(LowerCase)
   1232     .Case("got",              AArch64MCExpr::VK_AARCH64_GOT)
   1233     .Case("got_lo12",         AArch64MCExpr::VK_AARCH64_GOT_LO12)
   1234     .Case("lo12",             AArch64MCExpr::VK_AARCH64_LO12)
   1235     .Case("abs_g0",           AArch64MCExpr::VK_AARCH64_ABS_G0)
   1236     .Case("abs_g0_nc",        AArch64MCExpr::VK_AARCH64_ABS_G0_NC)
   1237     .Case("abs_g1",           AArch64MCExpr::VK_AARCH64_ABS_G1)
   1238     .Case("abs_g1_nc",        AArch64MCExpr::VK_AARCH64_ABS_G1_NC)
   1239     .Case("abs_g2",           AArch64MCExpr::VK_AARCH64_ABS_G2)
   1240     .Case("abs_g2_nc",        AArch64MCExpr::VK_AARCH64_ABS_G2_NC)
   1241     .Case("abs_g3",           AArch64MCExpr::VK_AARCH64_ABS_G3)
   1242     .Case("abs_g0_s",         AArch64MCExpr::VK_AARCH64_SABS_G0)
   1243     .Case("abs_g1_s",         AArch64MCExpr::VK_AARCH64_SABS_G1)
   1244     .Case("abs_g2_s",         AArch64MCExpr::VK_AARCH64_SABS_G2)
   1245     .Case("dtprel_g2",        AArch64MCExpr::VK_AARCH64_DTPREL_G2)
   1246     .Case("dtprel_g1",        AArch64MCExpr::VK_AARCH64_DTPREL_G1)
   1247     .Case("dtprel_g1_nc",     AArch64MCExpr::VK_AARCH64_DTPREL_G1_NC)
   1248     .Case("dtprel_g0",        AArch64MCExpr::VK_AARCH64_DTPREL_G0)
   1249     .Case("dtprel_g0_nc",     AArch64MCExpr::VK_AARCH64_DTPREL_G0_NC)
   1250     .Case("dtprel_hi12",      AArch64MCExpr::VK_AARCH64_DTPREL_HI12)
   1251     .Case("dtprel_lo12",      AArch64MCExpr::VK_AARCH64_DTPREL_LO12)
   1252     .Case("dtprel_lo12_nc",   AArch64MCExpr::VK_AARCH64_DTPREL_LO12_NC)
   1253     .Case("gottprel_g1",      AArch64MCExpr::VK_AARCH64_GOTTPREL_G1)
   1254     .Case("gottprel_g0_nc",   AArch64MCExpr::VK_AARCH64_GOTTPREL_G0_NC)
   1255     .Case("gottprel",         AArch64MCExpr::VK_AARCH64_GOTTPREL)
   1256     .Case("gottprel_lo12",    AArch64MCExpr::VK_AARCH64_GOTTPREL_LO12)
   1257     .Case("tprel_g2",         AArch64MCExpr::VK_AARCH64_TPREL_G2)
   1258     .Case("tprel_g1",         AArch64MCExpr::VK_AARCH64_TPREL_G1)
   1259     .Case("tprel_g1_nc",      AArch64MCExpr::VK_AARCH64_TPREL_G1_NC)
   1260     .Case("tprel_g0",         AArch64MCExpr::VK_AARCH64_TPREL_G0)
   1261     .Case("tprel_g0_nc",      AArch64MCExpr::VK_AARCH64_TPREL_G0_NC)
   1262     .Case("tprel_hi12",       AArch64MCExpr::VK_AARCH64_TPREL_HI12)
   1263     .Case("tprel_lo12",       AArch64MCExpr::VK_AARCH64_TPREL_LO12)
   1264     .Case("tprel_lo12_nc",    AArch64MCExpr::VK_AARCH64_TPREL_LO12_NC)
   1265     .Case("tlsdesc",          AArch64MCExpr::VK_AARCH64_TLSDESC)
   1266     .Case("tlsdesc_lo12",     AArch64MCExpr::VK_AARCH64_TLSDESC_LO12)
   1267     .Default(AArch64MCExpr::VK_AARCH64_None);
   1268 
   1269   if (RefKind == AArch64MCExpr::VK_AARCH64_None) {
   1270     Error(Parser.getTok().getLoc(),
   1271           "expected relocation specifier in operand after ':'");
   1272     return MatchOperand_ParseFail;
   1273   }
   1274   Parser.Lex(); // Eat identifier
   1275 
   1276   if (getLexer().isNot(AsmToken::Colon)) {
   1277     Error(Parser.getTok().getLoc(),
   1278           "expected ':' after relocation specifier");
   1279     return MatchOperand_ParseFail;
   1280   }
   1281   Parser.Lex();
   1282   return MatchOperand_Success;
   1283 }
   1284 
   1285 AArch64AsmParser::OperandMatchResultTy
   1286 AArch64AsmParser::ParseImmWithLSLOperand(
   1287                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1288   // FIXME?: I want to live in a world where immediates must start with
   1289   // #. Please don't dash my hopes (well, do if you have a good reason).
   1290   if (Parser.getTok().isNot(AsmToken::Hash)) return MatchOperand_NoMatch;
   1291 
   1292   SMLoc S = Parser.getTok().getLoc();
   1293   Parser.Lex(); // Eat '#'
   1294 
   1295   const MCExpr *Imm;
   1296   if (ParseImmediate(Imm) != MatchOperand_Success)
   1297     return MatchOperand_ParseFail;
   1298   else if (Parser.getTok().isNot(AsmToken::Comma)) {
   1299     SMLoc E = Parser.getTok().getLoc();
   1300     Operands.push_back(AArch64Operand::CreateImmWithLSL(Imm, 0, true, S, E));
   1301     return MatchOperand_Success;
   1302   }
   1303 
   1304   // Eat ','
   1305   Parser.Lex();
   1306 
   1307   // The optional operand must be "lsl #N" where N is non-negative.
   1308   if (Parser.getTok().is(AsmToken::Identifier)
   1309       && Parser.getTok().getIdentifier().lower() == "lsl") {
   1310     Parser.Lex();
   1311 
   1312     if (Parser.getTok().is(AsmToken::Hash)) {
   1313       Parser.Lex();
   1314 
   1315       if (Parser.getTok().isNot(AsmToken::Integer)) {
   1316         Error(Parser.getTok().getLoc(), "only 'lsl #+N' valid after immediate");
   1317         return MatchOperand_ParseFail;
   1318       }
   1319     }
   1320   }
   1321 
   1322   int64_t ShiftAmount = Parser.getTok().getIntVal();
   1323 
   1324   if (ShiftAmount < 0) {
   1325     Error(Parser.getTok().getLoc(), "positive shift amount required");
   1326     return MatchOperand_ParseFail;
   1327   }
   1328   Parser.Lex(); // Eat the number
   1329 
   1330   SMLoc E = Parser.getTok().getLoc();
   1331   Operands.push_back(AArch64Operand::CreateImmWithLSL(Imm, ShiftAmount,
   1332                                                       false, S, E));
   1333   return MatchOperand_Success;
   1334 }
   1335 
   1336 
   1337 AArch64AsmParser::OperandMatchResultTy
   1338 AArch64AsmParser::ParseCondCodeOperand(
   1339                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1340   if (Parser.getTok().isNot(AsmToken::Identifier))
   1341     return MatchOperand_NoMatch;
   1342 
   1343   StringRef Tok = Parser.getTok().getIdentifier();
   1344   A64CC::CondCodes CondCode = A64StringToCondCode(Tok);
   1345 
   1346   if (CondCode == A64CC::Invalid)
   1347     return MatchOperand_NoMatch;
   1348 
   1349   SMLoc S = Parser.getTok().getLoc();
   1350   Parser.Lex(); // Eat condition code
   1351   SMLoc E = Parser.getTok().getLoc();
   1352 
   1353   Operands.push_back(AArch64Operand::CreateCondCode(CondCode, S, E));
   1354   return MatchOperand_Success;
   1355 }
   1356 
   1357 AArch64AsmParser::OperandMatchResultTy
   1358 AArch64AsmParser::ParseCRxOperand(
   1359                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1360   SMLoc S = Parser.getTok().getLoc();
   1361   if (Parser.getTok().isNot(AsmToken::Identifier)) {
   1362     Error(S, "Expected cN operand where 0 <= N <= 15");
   1363     return MatchOperand_ParseFail;
   1364   }
   1365 
   1366   std::string LowerTok = Parser.getTok().getIdentifier().lower();
   1367   StringRef Tok(LowerTok);
   1368   if (Tok[0] != 'c') {
   1369     Error(S, "Expected cN operand where 0 <= N <= 15");
   1370     return MatchOperand_ParseFail;
   1371   }
   1372 
   1373   uint32_t CRNum;
   1374   bool BadNum = Tok.drop_front().getAsInteger(10, CRNum);
   1375   if (BadNum || CRNum > 15) {
   1376     Error(S, "Expected cN operand where 0 <= N <= 15");
   1377     return MatchOperand_ParseFail;
   1378   }
   1379 
   1380   const MCExpr *CRImm = MCConstantExpr::Create(CRNum, getContext());
   1381 
   1382   Parser.Lex();
   1383   SMLoc E = Parser.getTok().getLoc();
   1384 
   1385   Operands.push_back(AArch64Operand::CreateImm(CRImm, S, E));
   1386   return MatchOperand_Success;
   1387 }
   1388 
   1389 AArch64AsmParser::OperandMatchResultTy
   1390 AArch64AsmParser::ParseFPImmOperand(
   1391                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1392 
   1393   // FIXME?: I want to live in a world where immediates must start with
   1394   // #. Please don't dash my hopes (well, do if you have a good reason).
   1395   if (Parser.getTok().isNot(AsmToken::Hash)) return MatchOperand_NoMatch;
   1396 
   1397   SMLoc S = Parser.getTok().getLoc();
   1398   Parser.Lex(); // Eat '#'
   1399 
   1400   bool Negative = false;
   1401   if (Parser.getTok().is(AsmToken::Minus)) {
   1402     Negative = true;
   1403     Parser.Lex(); // Eat '-'
   1404   } else if (Parser.getTok().is(AsmToken::Plus)) {
   1405     Parser.Lex(); // Eat '+'
   1406   }
   1407 
   1408   if (Parser.getTok().isNot(AsmToken::Real)) {
   1409     Error(S, "Expected floating-point immediate");
   1410     return MatchOperand_ParseFail;
   1411   }
   1412 
   1413   APFloat RealVal(APFloat::IEEEdouble, Parser.getTok().getString());
   1414   if (Negative) RealVal.changeSign();
   1415   double DblVal = RealVal.convertToDouble();
   1416 
   1417   Parser.Lex(); // Eat real number
   1418   SMLoc E = Parser.getTok().getLoc();
   1419 
   1420   Operands.push_back(AArch64Operand::CreateFPImm(DblVal, S, E));
   1421   return MatchOperand_Success;
   1422 }
   1423 
   1424 
   1425 // Automatically generated
   1426 static unsigned MatchRegisterName(StringRef Name);
   1427 
   1428 bool
   1429 AArch64AsmParser::IdentifyRegister(unsigned &RegNum, SMLoc &RegEndLoc,
   1430                                    StringRef &Layout,
   1431                                    SMLoc &LayoutLoc) const {
   1432   const AsmToken &Tok = Parser.getTok();
   1433 
   1434   if (Tok.isNot(AsmToken::Identifier))
   1435     return false;
   1436 
   1437   std::string LowerReg = Tok.getString().lower();
   1438   size_t DotPos = LowerReg.find('.');
   1439 
   1440   RegNum = MatchRegisterName(LowerReg.substr(0, DotPos));
   1441   if (RegNum == AArch64::NoRegister) {
   1442     RegNum = StringSwitch<unsigned>(LowerReg.substr(0, DotPos))
   1443       .Case("ip0", AArch64::X16)
   1444       .Case("ip1", AArch64::X17)
   1445       .Case("fp", AArch64::X29)
   1446       .Case("lr", AArch64::X30)
   1447       .Default(AArch64::NoRegister);
   1448   }
   1449   if (RegNum == AArch64::NoRegister)
   1450     return false;
   1451 
   1452   SMLoc S = Tok.getLoc();
   1453   RegEndLoc = SMLoc::getFromPointer(S.getPointer() + DotPos);
   1454 
   1455   if (DotPos == StringRef::npos) {
   1456     Layout = StringRef();
   1457   } else {
   1458     // Everything afterwards needs to be a literal token, expected to be
   1459     // '.2d','.b' etc for vector registers.
   1460 
   1461     // This StringSwitch validates the input and (perhaps more importantly)
   1462     // gives us a permanent string to use in the token (a pointer into LowerReg
   1463     // would go out of scope when we return).
   1464     LayoutLoc = SMLoc::getFromPointer(S.getPointer() + DotPos + 1);
   1465     std::string LayoutText = LowerReg.substr(DotPos, StringRef::npos);
   1466     Layout = StringSwitch<const char *>(LayoutText)
   1467       .Case(".d", ".d").Case(".1d", ".1d").Case(".2d", ".2d")
   1468       .Case(".s", ".s").Case(".2s", ".2s").Case(".4s", ".4s")
   1469       .Case(".h", ".h").Case(".4h", ".4h").Case(".8h", ".8h")
   1470       .Case(".b", ".b").Case(".8b", ".8b").Case(".16b", ".16b")
   1471       .Default("");
   1472 
   1473     if (Layout.size() == 0) {
   1474       // Malformed register
   1475       return false;
   1476     }
   1477   }
   1478 
   1479   return true;
   1480 }
   1481 
   1482 AArch64AsmParser::OperandMatchResultTy
   1483 AArch64AsmParser::ParseRegister(SmallVectorImpl<MCParsedAsmOperand*> &Operands,
   1484                                 uint32_t &NumLanes) {
   1485   unsigned RegNum;
   1486   StringRef Layout;
   1487   SMLoc RegEndLoc, LayoutLoc;
   1488   SMLoc S = Parser.getTok().getLoc();
   1489 
   1490   if (!IdentifyRegister(RegNum, RegEndLoc, Layout, LayoutLoc))
   1491     return MatchOperand_NoMatch;
   1492 
   1493   Operands.push_back(AArch64Operand::CreateReg(RegNum, S, RegEndLoc));
   1494 
   1495   if (Layout.size() != 0) {
   1496     unsigned long long TmpLanes = 0;
   1497     llvm::getAsUnsignedInteger(Layout.substr(1), 10, TmpLanes);
   1498     if (TmpLanes != 0) {
   1499       NumLanes = TmpLanes;
   1500     } else {
   1501       // If the number of lanes isn't specified explicitly, a valid instruction
   1502       // will have an element specifier and be capable of acting on the entire
   1503       // vector register.
   1504       switch (Layout.back()) {
   1505       default: llvm_unreachable("Invalid layout specifier");
   1506       case 'b': NumLanes = 16; break;
   1507       case 'h': NumLanes = 8; break;
   1508       case 's': NumLanes = 4; break;
   1509       case 'd': NumLanes = 2; break;
   1510       }
   1511     }
   1512 
   1513     Operands.push_back(AArch64Operand::CreateToken(Layout, LayoutLoc));
   1514   }
   1515 
   1516   Parser.Lex();
   1517   return MatchOperand_Success;
   1518 }
   1519 
   1520 bool
   1521 AArch64AsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
   1522                                 SMLoc &EndLoc) {
   1523   // This callback is used for things like DWARF frame directives in
   1524   // assembly. They don't care about things like NEON layouts or lanes, they
   1525   // just want to be able to produce the DWARF register number.
   1526   StringRef LayoutSpec;
   1527   SMLoc RegEndLoc, LayoutLoc;
   1528   StartLoc = Parser.getTok().getLoc();
   1529 
   1530   if (!IdentifyRegister(RegNo, RegEndLoc, LayoutSpec, LayoutLoc))
   1531     return true;
   1532 
   1533   Parser.Lex();
   1534   EndLoc = Parser.getTok().getLoc();
   1535 
   1536   return false;
   1537 }
   1538 
   1539 AArch64AsmParser::OperandMatchResultTy
   1540 AArch64AsmParser::ParseNamedImmOperand(const NamedImmMapper &Mapper,
   1541                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1542   // Since these operands occur in very limited circumstances, without
   1543   // alternatives, we actually signal an error if there is no match. If relaxing
   1544   // this, beware of unintended consequences: an immediate will be accepted
   1545   // during matching, no matter how it gets into the AArch64Operand.
   1546   const AsmToken &Tok = Parser.getTok();
   1547   SMLoc S = Tok.getLoc();
   1548 
   1549   if (Tok.is(AsmToken::Identifier)) {
   1550     bool ValidName;
   1551     uint32_t Code = Mapper.fromString(Tok.getString().lower(), ValidName);
   1552 
   1553     if (!ValidName) {
   1554       Error(S, "operand specifier not recognised");
   1555       return MatchOperand_ParseFail;
   1556     }
   1557 
   1558     Parser.Lex(); // We're done with the identifier. Eat it
   1559 
   1560     SMLoc E = Parser.getTok().getLoc();
   1561     const MCExpr *Imm = MCConstantExpr::Create(Code, getContext());
   1562     Operands.push_back(AArch64Operand::CreateImm(Imm, S, E));
   1563     return MatchOperand_Success;
   1564   } else if (Tok.is(AsmToken::Hash)) {
   1565     Parser.Lex();
   1566 
   1567     const MCExpr *ImmVal;
   1568     if (ParseImmediate(ImmVal) != MatchOperand_Success)
   1569       return MatchOperand_ParseFail;
   1570 
   1571     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(ImmVal);
   1572     if (!CE || CE->getValue() < 0 || !Mapper.validImm(CE->getValue())) {
   1573       Error(S, "Invalid immediate for instruction");
   1574       return MatchOperand_ParseFail;
   1575     }
   1576 
   1577     SMLoc E = Parser.getTok().getLoc();
   1578     Operands.push_back(AArch64Operand::CreateImm(ImmVal, S, E));
   1579     return MatchOperand_Success;
   1580   }
   1581 
   1582   Error(S, "unexpected operand for instruction");
   1583   return MatchOperand_ParseFail;
   1584 }
   1585 
   1586 AArch64AsmParser::OperandMatchResultTy
   1587 AArch64AsmParser::ParseSysRegOperand(
   1588                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1589   const AsmToken &Tok = Parser.getTok();
   1590 
   1591   // Any MSR/MRS operand will be an identifier, and we want to store it as some
   1592   // kind of string: SPSel is valid for two different forms of MSR with two
   1593   // different encodings. There's no collision at the moment, but the potential
   1594   // is there.
   1595   if (!Tok.is(AsmToken::Identifier)) {
   1596     return MatchOperand_NoMatch;
   1597   }
   1598 
   1599   SMLoc S = Tok.getLoc();
   1600   Operands.push_back(AArch64Operand::CreateSysReg(Tok.getString(), S));
   1601   Parser.Lex(); // Eat identifier
   1602 
   1603   return MatchOperand_Success;
   1604 }
   1605 
   1606 AArch64AsmParser::OperandMatchResultTy
   1607 AArch64AsmParser::ParseLSXAddressOperand(
   1608                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1609   SMLoc S = Parser.getTok().getLoc();
   1610 
   1611   unsigned RegNum;
   1612   SMLoc RegEndLoc, LayoutLoc;
   1613   StringRef Layout;
   1614   if(!IdentifyRegister(RegNum, RegEndLoc, Layout, LayoutLoc)
   1615      || !AArch64MCRegisterClasses[AArch64::GPR64xspRegClassID].contains(RegNum)
   1616      || Layout.size() != 0) {
   1617     // Check Layout.size because we don't want to let "x3.4s" or similar
   1618     // through.
   1619     return MatchOperand_NoMatch;
   1620   }
   1621   Parser.Lex(); // Eat register
   1622 
   1623   if (Parser.getTok().is(AsmToken::RBrac)) {
   1624     // We're done
   1625     SMLoc E = Parser.getTok().getLoc();
   1626     Operands.push_back(AArch64Operand::CreateWrappedReg(RegNum, S, E));
   1627     return MatchOperand_Success;
   1628   }
   1629 
   1630   // Otherwise, only ", #0" is valid
   1631 
   1632   if (Parser.getTok().isNot(AsmToken::Comma)) {
   1633     Error(Parser.getTok().getLoc(), "expected ',' or ']' after register");
   1634     return MatchOperand_ParseFail;
   1635   }
   1636   Parser.Lex(); // Eat ','
   1637 
   1638   if (Parser.getTok().isNot(AsmToken::Hash)) {
   1639     Error(Parser.getTok().getLoc(), "expected '#0'");
   1640     return MatchOperand_ParseFail;
   1641   }
   1642   Parser.Lex(); // Eat '#'
   1643 
   1644   if (Parser.getTok().isNot(AsmToken::Integer)
   1645       || Parser.getTok().getIntVal() != 0 ) {
   1646     Error(Parser.getTok().getLoc(), "expected '#0'");
   1647     return MatchOperand_ParseFail;
   1648   }
   1649   Parser.Lex(); // Eat '0'
   1650 
   1651   SMLoc E = Parser.getTok().getLoc();
   1652   Operands.push_back(AArch64Operand::CreateWrappedReg(RegNum, S, E));
   1653   return MatchOperand_Success;
   1654 }
   1655 
   1656 AArch64AsmParser::OperandMatchResultTy
   1657 AArch64AsmParser::ParseShiftExtend(
   1658                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1659   StringRef IDVal = Parser.getTok().getIdentifier();
   1660   std::string LowerID = IDVal.lower();
   1661 
   1662   A64SE::ShiftExtSpecifiers Spec =
   1663     StringSwitch<A64SE::ShiftExtSpecifiers>(LowerID)
   1664       .Case("lsl", A64SE::LSL)
   1665       .Case("lsr", A64SE::LSR)
   1666       .Case("asr", A64SE::ASR)
   1667       .Case("ror", A64SE::ROR)
   1668       .Case("uxtb", A64SE::UXTB)
   1669       .Case("uxth", A64SE::UXTH)
   1670       .Case("uxtw", A64SE::UXTW)
   1671       .Case("uxtx", A64SE::UXTX)
   1672       .Case("sxtb", A64SE::SXTB)
   1673       .Case("sxth", A64SE::SXTH)
   1674       .Case("sxtw", A64SE::SXTW)
   1675       .Case("sxtx", A64SE::SXTX)
   1676       .Default(A64SE::Invalid);
   1677 
   1678   if (Spec == A64SE::Invalid)
   1679     return MatchOperand_NoMatch;
   1680 
   1681   // Eat the shift
   1682   SMLoc S, E;
   1683   S = Parser.getTok().getLoc();
   1684   Parser.Lex();
   1685 
   1686   if (Spec != A64SE::LSL && Spec != A64SE::LSR &&
   1687       Spec != A64SE::ASR && Spec != A64SE::ROR) {
   1688     // The shift amount can be omitted for the extending versions, but not real
   1689     // shifts:
   1690     //     add x0, x0, x0, uxtb
   1691     // is valid, and equivalent to
   1692     //     add x0, x0, x0, uxtb #0
   1693 
   1694     if (Parser.getTok().is(AsmToken::Comma) ||
   1695         Parser.getTok().is(AsmToken::EndOfStatement) ||
   1696         Parser.getTok().is(AsmToken::RBrac)) {
   1697       Operands.push_back(AArch64Operand::CreateShiftExtend(Spec, 0, true,
   1698                                                            S, E));
   1699       return MatchOperand_Success;
   1700     }
   1701   }
   1702 
   1703   // Eat # at beginning of immediate
   1704   if (!Parser.getTok().is(AsmToken::Hash)) {
   1705     Error(Parser.getTok().getLoc(),
   1706           "expected #imm after shift specifier");
   1707     return MatchOperand_ParseFail;
   1708   }
   1709   Parser.Lex();
   1710 
   1711   // Make sure we do actually have a number
   1712   if (!Parser.getTok().is(AsmToken::Integer)) {
   1713     Error(Parser.getTok().getLoc(),
   1714           "expected integer shift amount");
   1715     return MatchOperand_ParseFail;
   1716   }
   1717   unsigned Amount = Parser.getTok().getIntVal();
   1718   Parser.Lex();
   1719   E = Parser.getTok().getLoc();
   1720 
   1721   Operands.push_back(AArch64Operand::CreateShiftExtend(Spec, Amount, false,
   1722                                                        S, E));
   1723 
   1724   return MatchOperand_Success;
   1725 }
   1726 
   1727 // FIXME: We would really like to be able to tablegen'erate this.
   1728 bool AArch64AsmParser::
   1729 validateInstruction(MCInst &Inst,
   1730                     const SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1731   switch (Inst.getOpcode()) {
   1732   case AArch64::BFIwwii:
   1733   case AArch64::BFIxxii:
   1734   case AArch64::SBFIZwwii:
   1735   case AArch64::SBFIZxxii:
   1736   case AArch64::UBFIZwwii:
   1737   case AArch64::UBFIZxxii:  {
   1738     unsigned ImmOps = Inst.getNumOperands() - 2;
   1739     int64_t ImmR = Inst.getOperand(ImmOps).getImm();
   1740     int64_t ImmS = Inst.getOperand(ImmOps+1).getImm();
   1741 
   1742     if (ImmR != 0 && ImmS >= ImmR) {
   1743       return Error(Operands[4]->getStartLoc(),
   1744                    "requested insert overflows register");
   1745     }
   1746     return false;
   1747   }
   1748   case AArch64::BFXILwwii:
   1749   case AArch64::BFXILxxii:
   1750   case AArch64::SBFXwwii:
   1751   case AArch64::SBFXxxii:
   1752   case AArch64::UBFXwwii:
   1753   case AArch64::UBFXxxii: {
   1754     unsigned ImmOps = Inst.getNumOperands() - 2;
   1755     int64_t ImmR = Inst.getOperand(ImmOps).getImm();
   1756     int64_t ImmS = Inst.getOperand(ImmOps+1).getImm();
   1757     int64_t RegWidth = 0;
   1758     switch (Inst.getOpcode()) {
   1759     case AArch64::SBFXxxii: case AArch64::UBFXxxii: case AArch64::BFXILxxii:
   1760       RegWidth = 64;
   1761       break;
   1762     case AArch64::SBFXwwii: case AArch64::UBFXwwii: case AArch64::BFXILwwii:
   1763       RegWidth = 32;
   1764       break;
   1765     }
   1766 
   1767     if (ImmS >= RegWidth || ImmS < ImmR) {
   1768       return Error(Operands[4]->getStartLoc(),
   1769                    "requested extract overflows register");
   1770     }
   1771     return false;
   1772   }
   1773   case AArch64::ICix: {
   1774     int64_t ImmVal = Inst.getOperand(0).getImm();
   1775     A64IC::ICValues ICOp = static_cast<A64IC::ICValues>(ImmVal);
   1776     if (!A64IC::NeedsRegister(ICOp)) {
   1777       return Error(Operands[1]->getStartLoc(),
   1778                    "specified IC op does not use a register");
   1779     }
   1780     return false;
   1781   }
   1782   case AArch64::ICi: {
   1783     int64_t ImmVal = Inst.getOperand(0).getImm();
   1784     A64IC::ICValues ICOp = static_cast<A64IC::ICValues>(ImmVal);
   1785     if (A64IC::NeedsRegister(ICOp)) {
   1786       return Error(Operands[1]->getStartLoc(),
   1787                    "specified IC op requires a register");
   1788     }
   1789     return false;
   1790   }
   1791   case AArch64::TLBIix: {
   1792     int64_t ImmVal = Inst.getOperand(0).getImm();
   1793     A64TLBI::TLBIValues TLBIOp = static_cast<A64TLBI::TLBIValues>(ImmVal);
   1794     if (!A64TLBI::NeedsRegister(TLBIOp)) {
   1795       return Error(Operands[1]->getStartLoc(),
   1796                    "specified TLBI op does not use a register");
   1797     }
   1798     return false;
   1799   }
   1800   case AArch64::TLBIi: {
   1801     int64_t ImmVal = Inst.getOperand(0).getImm();
   1802     A64TLBI::TLBIValues TLBIOp = static_cast<A64TLBI::TLBIValues>(ImmVal);
   1803     if (A64TLBI::NeedsRegister(TLBIOp)) {
   1804       return Error(Operands[1]->getStartLoc(),
   1805                    "specified TLBI op requires a register");
   1806     }
   1807     return false;
   1808   }
   1809   }
   1810 
   1811   return false;
   1812 }
   1813 
   1814 
   1815 // Parses the instruction *together with* all operands, appending each parsed
   1816 // operand to the "Operands" list
   1817 bool AArch64AsmParser::ParseInstruction(ParseInstructionInfo &Info,
   1818                                         StringRef Name, SMLoc NameLoc,
   1819                                SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
   1820   size_t CondCodePos = Name.find('.');
   1821 
   1822   StringRef Mnemonic = Name.substr(0, CondCodePos);
   1823   Operands.push_back(AArch64Operand::CreateToken(Mnemonic, NameLoc));
   1824 
   1825   if (CondCodePos != StringRef::npos) {
   1826     // We have a condition code
   1827     SMLoc S = SMLoc::getFromPointer(NameLoc.getPointer() + CondCodePos + 1);
   1828     StringRef CondStr = Name.substr(CondCodePos + 1, StringRef::npos);
   1829     A64CC::CondCodes Code;
   1830 
   1831     Code = A64StringToCondCode(CondStr);
   1832 
   1833     if (Code == A64CC::Invalid) {
   1834       Error(S, "invalid condition code");
   1835       Parser.eatToEndOfStatement();
   1836       return true;
   1837     }
   1838 
   1839     SMLoc DotL = SMLoc::getFromPointer(NameLoc.getPointer() + CondCodePos);
   1840 
   1841     Operands.push_back(AArch64Operand::CreateToken(".",  DotL));
   1842     SMLoc E = SMLoc::getFromPointer(NameLoc.getPointer() + CondCodePos + 3);
   1843     Operands.push_back(AArch64Operand::CreateCondCode(Code, S, E));
   1844   }
   1845 
   1846   // Now we parse the operands of this instruction
   1847   if (getLexer().isNot(AsmToken::EndOfStatement)) {
   1848     // Read the first operand.
   1849     if (ParseOperand(Operands, Mnemonic)) {
   1850       Parser.eatToEndOfStatement();
   1851       return true;
   1852     }
   1853 
   1854     while (getLexer().is(AsmToken::Comma)) {
   1855       Parser.Lex();  // Eat the comma.
   1856 
   1857       // Parse and remember the operand.
   1858       if (ParseOperand(Operands, Mnemonic)) {
   1859         Parser.eatToEndOfStatement();
   1860         return true;
   1861       }
   1862 
   1863 
   1864       // After successfully parsing some operands there are two special cases to
   1865       // consider (i.e. notional operands not separated by commas). Both are due
   1866       // to memory specifiers:
   1867       //  + An RBrac will end an address for load/store/prefetch
   1868       //  + An '!' will indicate a pre-indexed operation.
   1869       //
   1870       // It's someone else's responsibility to make sure these tokens are sane
   1871       // in the given context!
   1872       if (Parser.getTok().is(AsmToken::RBrac)) {
   1873         SMLoc Loc = Parser.getTok().getLoc();
   1874         Operands.push_back(AArch64Operand::CreateToken("]", Loc));
   1875         Parser.Lex();
   1876       }
   1877 
   1878       if (Parser.getTok().is(AsmToken::Exclaim)) {
   1879         SMLoc Loc = Parser.getTok().getLoc();
   1880         Operands.push_back(AArch64Operand::CreateToken("!", Loc));
   1881         Parser.Lex();
   1882       }
   1883     }
   1884   }
   1885 
   1886   if (getLexer().isNot(AsmToken::EndOfStatement)) {
   1887     SMLoc Loc = getLexer().getLoc();
   1888     Parser.eatToEndOfStatement();
   1889     return Error(Loc, "expected comma before next operand");
   1890   }
   1891 
   1892   // Eat the EndOfStatement
   1893   Parser.Lex();
   1894 
   1895   return false;
   1896 }
   1897 
   1898 bool AArch64AsmParser::ParseDirective(AsmToken DirectiveID) {
   1899   StringRef IDVal = DirectiveID.getIdentifier();
   1900   if (IDVal == ".hword")
   1901     return ParseDirectiveWord(2, DirectiveID.getLoc());
   1902   else if (IDVal == ".word")
   1903     return ParseDirectiveWord(4, DirectiveID.getLoc());
   1904   else if (IDVal == ".xword")
   1905     return ParseDirectiveWord(8, DirectiveID.getLoc());
   1906   else if (IDVal == ".tlsdesccall")
   1907     return ParseDirectiveTLSDescCall(DirectiveID.getLoc());
   1908 
   1909   return true;
   1910 }
   1911 
   1912 /// parseDirectiveWord
   1913 ///  ::= .word [ expression (, expression)* ]
   1914 bool AArch64AsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
   1915   if (getLexer().isNot(AsmToken::EndOfStatement)) {
   1916     for (;;) {
   1917       const MCExpr *Value;
   1918       if (getParser().parseExpression(Value))
   1919         return true;
   1920 
   1921       getParser().getStreamer().EmitValue(Value, Size, 0/*addrspace*/);
   1922 
   1923       if (getLexer().is(AsmToken::EndOfStatement))
   1924         break;
   1925 
   1926       // FIXME: Improve diagnostic.
   1927       if (getLexer().isNot(AsmToken::Comma))
   1928         return Error(L, "unexpected token in directive");
   1929       Parser.Lex();
   1930     }
   1931   }
   1932 
   1933   Parser.Lex();
   1934   return false;
   1935 }
   1936 
   1937 // parseDirectiveTLSDescCall:
   1938 //   ::= .tlsdesccall symbol
   1939 bool AArch64AsmParser::ParseDirectiveTLSDescCall(SMLoc L) {
   1940   StringRef Name;
   1941   if (getParser().parseIdentifier(Name))
   1942     return Error(L, "expected symbol after directive");
   1943 
   1944   MCSymbol *Sym = getContext().GetOrCreateSymbol(Name);
   1945   const MCSymbolRefExpr *Expr = MCSymbolRefExpr::Create(Sym, getContext());
   1946 
   1947   MCInst Inst;
   1948   Inst.setOpcode(AArch64::TLSDESCCALL);
   1949   Inst.addOperand(MCOperand::CreateExpr(Expr));
   1950 
   1951   getParser().getStreamer().EmitInstruction(Inst);
   1952   return false;
   1953 }
   1954 
   1955 
   1956 bool AArch64AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
   1957                                  SmallVectorImpl<MCParsedAsmOperand*> &Operands,
   1958                                  MCStreamer &Out, unsigned &ErrorInfo,
   1959                                  bool MatchingInlineAsm) {
   1960   MCInst Inst;
   1961   unsigned MatchResult;
   1962   MatchResult = MatchInstructionImpl(Operands, Inst, ErrorInfo,
   1963                                      MatchingInlineAsm);
   1964 
   1965   if (ErrorInfo != ~0U && ErrorInfo >= Operands.size())
   1966     return Error(IDLoc, "too few operands for instruction");
   1967 
   1968   switch (MatchResult) {
   1969   default: break;
   1970   case Match_Success:
   1971     if (validateInstruction(Inst, Operands))
   1972       return true;
   1973 
   1974     Out.EmitInstruction(Inst);
   1975     return false;
   1976   case Match_MissingFeature:
   1977     Error(IDLoc, "instruction requires a CPU feature not currently enabled");
   1978     return true;
   1979   case Match_InvalidOperand: {
   1980     SMLoc ErrorLoc = IDLoc;
   1981     if (ErrorInfo != ~0U) {
   1982       ErrorLoc = ((AArch64Operand*)Operands[ErrorInfo])->getStartLoc();
   1983       if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc;
   1984     }
   1985 
   1986     return Error(ErrorLoc, "invalid operand for instruction");
   1987   }
   1988   case Match_MnemonicFail:
   1989     return Error(IDLoc, "invalid instruction");
   1990 
   1991   case Match_AddSubRegExtendSmall:
   1992     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   1993       "expected '[su]xt[bhw]' or 'lsl' with optional integer in range [0, 4]");
   1994   case Match_AddSubRegExtendLarge:
   1995     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   1996       "expected 'sxtx' 'uxtx' or 'lsl' with optional integer in range [0, 4]");
   1997   case Match_AddSubRegShift32:
   1998     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   1999        "expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 31]");
   2000   case Match_AddSubRegShift64:
   2001     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2002        "expected 'lsl', 'lsr' or 'asr' with optional integer in range [0, 63]");
   2003   case Match_AddSubSecondSource:
   2004       return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2005           "expected compatible register, symbol or integer in range [0, 4095]");
   2006   case Match_CVTFixedPos32:
   2007     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2008                  "expected integer in range [1, 32]");
   2009   case Match_CVTFixedPos64:
   2010     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2011                  "expected integer in range [1, 64]");
   2012   case Match_CondCode:
   2013     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2014                  "expected AArch64 condition code");
   2015   case Match_FPImm:
   2016     // Any situation which allows a nontrivial floating-point constant also
   2017     // allows a register.
   2018     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2019                  "expected compatible register or floating-point constant");
   2020   case Match_FPZero:
   2021     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2022                  "expected floating-point constant #0.0");
   2023   case Match_Label:
   2024     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2025                  "expected label or encodable integer pc offset");
   2026   case Match_Lane1:
   2027     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2028                  "expected lane specifier '[1]'");
   2029   case Match_LoadStoreExtend32_1:
   2030     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2031                  "expected 'uxtw' or 'sxtw' with optional shift of #0");
   2032   case Match_LoadStoreExtend32_2:
   2033     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2034                  "expected 'uxtw' or 'sxtw' with optional shift of #0 or #1");
   2035   case Match_LoadStoreExtend32_4:
   2036     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2037                  "expected 'uxtw' or 'sxtw' with optional shift of #0 or #2");
   2038   case Match_LoadStoreExtend32_8:
   2039     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2040                  "expected 'uxtw' or 'sxtw' with optional shift of #0 or #3");
   2041   case Match_LoadStoreExtend32_16:
   2042     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2043                  "expected 'lsl' or 'sxtw' with optional shift of #0 or #4");
   2044   case Match_LoadStoreExtend64_1:
   2045     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2046                  "expected 'lsl' or 'sxtx' with optional shift of #0");
   2047   case Match_LoadStoreExtend64_2:
   2048     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2049                  "expected 'lsl' or 'sxtx' with optional shift of #0 or #1");
   2050   case Match_LoadStoreExtend64_4:
   2051     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2052                  "expected 'lsl' or 'sxtx' with optional shift of #0 or #2");
   2053   case Match_LoadStoreExtend64_8:
   2054     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2055                  "expected 'lsl' or 'sxtx' with optional shift of #0 or #3");
   2056   case Match_LoadStoreExtend64_16:
   2057     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2058                  "expected 'lsl' or 'sxtx' with optional shift of #0 or #4");
   2059   case Match_LoadStoreSImm7_4:
   2060     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2061                  "expected integer multiple of 4 in range [-256, 252]");
   2062   case Match_LoadStoreSImm7_8:
   2063     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2064                  "expected integer multiple of 8 in range [-512, 508]");
   2065   case Match_LoadStoreSImm7_16:
   2066     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2067                  "expected integer multiple of 16 in range [-1024, 1016]");
   2068   case Match_LoadStoreSImm9:
   2069     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2070                  "expected integer in range [-256, 255]");
   2071   case Match_LoadStoreUImm12_1:
   2072     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2073                  "expected symbolic reference or integer in range [0, 4095]");
   2074   case Match_LoadStoreUImm12_2:
   2075     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2076                  "expected symbolic reference or integer in range [0, 8190]");
   2077   case Match_LoadStoreUImm12_4:
   2078     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2079                  "expected symbolic reference or integer in range [0, 16380]");
   2080   case Match_LoadStoreUImm12_8:
   2081     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2082                  "expected symbolic reference or integer in range [0, 32760]");
   2083   case Match_LoadStoreUImm12_16:
   2084     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2085                  "expected symbolic reference or integer in range [0, 65520]");
   2086   case Match_LogicalSecondSource:
   2087     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2088                  "expected compatible register or logical immediate");
   2089   case Match_MOVWUImm16:
   2090     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2091                  "expected relocated symbol or integer in range [0, 65535]");
   2092   case Match_MRS:
   2093     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2094                  "expected readable system register");
   2095   case Match_MSR:
   2096     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2097                  "expected writable system register or pstate");
   2098   case Match_NamedImm_at:
   2099     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2100                 "expected symbolic 'at' operand: s1e[0-3][rw] or s12e[01][rw]");
   2101   case Match_NamedImm_dbarrier:
   2102     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2103              "expected integer in range [0, 15] or symbolic barrier operand");
   2104   case Match_NamedImm_dc:
   2105     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2106                  "expected symbolic 'dc' operand");
   2107   case Match_NamedImm_ic:
   2108     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2109                  "expected 'ic' operand: 'ialluis', 'iallu' or 'ivau'");
   2110   case Match_NamedImm_isb:
   2111     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2112                  "expected integer in range [0, 15] or 'sy'");
   2113   case Match_NamedImm_prefetch:
   2114     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2115                  "expected prefetch hint: p(ld|st|i)l[123](strm|keep)");
   2116   case Match_NamedImm_tlbi:
   2117     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2118                  "expected translation buffer invalidation operand");
   2119   case Match_UImm16:
   2120     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2121                  "expected integer in range [0, 65535]");
   2122   case Match_UImm3:
   2123     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2124                  "expected integer in range [0, 7]");
   2125   case Match_UImm4:
   2126     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2127                  "expected integer in range [0, 15]");
   2128   case Match_UImm5:
   2129     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2130                  "expected integer in range [0, 31]");
   2131   case Match_UImm6:
   2132     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2133                  "expected integer in range [0, 63]");
   2134   case Match_UImm7:
   2135     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2136                  "expected integer in range [0, 127]");
   2137   case Match_Width32:
   2138     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2139                  "expected integer in range [<lsb>, 31]");
   2140   case Match_Width64:
   2141     return Error(((AArch64Operand*)Operands[ErrorInfo])->getStartLoc(),
   2142                  "expected integer in range [<lsb>, 63]");
   2143   }
   2144 
   2145   llvm_unreachable("Implement any new match types added!");
   2146   return true;
   2147 }
   2148 
   2149 void AArch64Operand::print(raw_ostream &OS) const {
   2150   switch (Kind) {
   2151   case k_CondCode:
   2152     OS << "<CondCode: " << CondCode.Code << ">";
   2153     break;
   2154   case k_FPImmediate:
   2155     OS << "<fpimm: " << FPImm.Val << ">";
   2156     break;
   2157   case k_ImmWithLSL:
   2158     OS << "<immwithlsl: imm=" << ImmWithLSL.Val
   2159        << ", shift=" << ImmWithLSL.ShiftAmount << ">";
   2160     break;
   2161   case k_Immediate:
   2162     getImm()->print(OS);
   2163     break;
   2164   case k_Register:
   2165     OS << "<register " << getReg() << '>';
   2166     break;
   2167   case k_Token:
   2168     OS << '\'' << getToken() << '\'';
   2169     break;
   2170   case k_ShiftExtend:
   2171     OS << "<shift: type=" << ShiftExtend.ShiftType
   2172        << ", amount=" << ShiftExtend.Amount << ">";
   2173     break;
   2174   case k_SysReg: {
   2175     StringRef Name(SysReg.Data, SysReg.Length);
   2176     OS << "<sysreg: " << Name << '>';
   2177     break;
   2178   }
   2179   default:
   2180     llvm_unreachable("No idea how to print this kind of operand");
   2181     break;
   2182   }
   2183 }
   2184 
   2185 void AArch64Operand::dump() const {
   2186   print(errs());
   2187 }
   2188 
   2189 
   2190 /// Force static initialization.
   2191 extern "C" void LLVMInitializeAArch64AsmParser() {
   2192   RegisterMCAsmParser<AArch64AsmParser> X(TheAArch64Target);
   2193 }
   2194 
   2195 #define GET_REGISTER_MATCHER
   2196 #define GET_MATCHER_IMPLEMENTATION
   2197 #include "AArch64GenAsmMatcher.inc"
   2198