Home | History | Annotate | Download | only in AsmParser
      1 //===-- X86AsmParser.cpp - Parse X86 assembly to MCInst instructions ------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #include "MCTargetDesc/X86BaseInfo.h"
     11 #include "X86AsmInstrumentation.h"
     12 #include "X86AsmParserCommon.h"
     13 #include "X86Operand.h"
     14 #include "llvm/ADT/APFloat.h"
     15 #include "llvm/ADT/STLExtras.h"
     16 #include "llvm/ADT/SmallString.h"
     17 #include "llvm/ADT/SmallVector.h"
     18 #include "llvm/ADT/StringSwitch.h"
     19 #include "llvm/ADT/Twine.h"
     20 #include "llvm/MC/MCContext.h"
     21 #include "llvm/MC/MCExpr.h"
     22 #include "llvm/MC/MCInst.h"
     23 #include "llvm/MC/MCInstrInfo.h"
     24 #include "llvm/MC/MCParser/MCAsmLexer.h"
     25 #include "llvm/MC/MCParser/MCAsmParser.h"
     26 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
     27 #include "llvm/MC/MCRegisterInfo.h"
     28 #include "llvm/MC/MCStreamer.h"
     29 #include "llvm/MC/MCSubtargetInfo.h"
     30 #include "llvm/MC/MCSymbol.h"
     31 #include "llvm/MC/MCTargetAsmParser.h"
     32 #include "llvm/Support/SourceMgr.h"
     33 #include "llvm/Support/TargetRegistry.h"
     34 #include "llvm/Support/raw_ostream.h"
     35 #include <memory>
     36 
     37 using namespace llvm;
     38 
     39 namespace {
     40 
     41 static const char OpPrecedence[] = {
     42   0, // IC_OR
     43   1, // IC_AND
     44   2, // IC_LSHIFT
     45   2, // IC_RSHIFT
     46   3, // IC_PLUS
     47   3, // IC_MINUS
     48   4, // IC_MULTIPLY
     49   4, // IC_DIVIDE
     50   5, // IC_RPAREN
     51   6, // IC_LPAREN
     52   0, // IC_IMM
     53   0  // IC_REGISTER
     54 };
     55 
     56 class X86AsmParser : public MCTargetAsmParser {
     57   MCSubtargetInfo &STI;
     58   MCAsmParser &Parser;
     59   const MCInstrInfo &MII;
     60   ParseInstructionInfo *InstInfo;
     61   std::unique_ptr<X86AsmInstrumentation> Instrumentation;
     62 private:
     63   SMLoc consumeToken() {
     64     SMLoc Result = Parser.getTok().getLoc();
     65     Parser.Lex();
     66     return Result;
     67   }
     68 
     69   enum InfixCalculatorTok {
     70     IC_OR = 0,
     71     IC_AND,
     72     IC_LSHIFT,
     73     IC_RSHIFT,
     74     IC_PLUS,
     75     IC_MINUS,
     76     IC_MULTIPLY,
     77     IC_DIVIDE,
     78     IC_RPAREN,
     79     IC_LPAREN,
     80     IC_IMM,
     81     IC_REGISTER
     82   };
     83 
     84   class InfixCalculator {
     85     typedef std::pair< InfixCalculatorTok, int64_t > ICToken;
     86     SmallVector<InfixCalculatorTok, 4> InfixOperatorStack;
     87     SmallVector<ICToken, 4> PostfixStack;
     88 
     89   public:
     90     int64_t popOperand() {
     91       assert (!PostfixStack.empty() && "Poped an empty stack!");
     92       ICToken Op = PostfixStack.pop_back_val();
     93       assert ((Op.first == IC_IMM || Op.first == IC_REGISTER)
     94               && "Expected and immediate or register!");
     95       return Op.second;
     96     }
     97     void pushOperand(InfixCalculatorTok Op, int64_t Val = 0) {
     98       assert ((Op == IC_IMM || Op == IC_REGISTER) &&
     99               "Unexpected operand!");
    100       PostfixStack.push_back(std::make_pair(Op, Val));
    101     }
    102 
    103     void popOperator() { InfixOperatorStack.pop_back(); }
    104     void pushOperator(InfixCalculatorTok Op) {
    105       // Push the new operator if the stack is empty.
    106       if (InfixOperatorStack.empty()) {
    107         InfixOperatorStack.push_back(Op);
    108         return;
    109       }
    110 
    111       // Push the new operator if it has a higher precedence than the operator
    112       // on the top of the stack or the operator on the top of the stack is a
    113       // left parentheses.
    114       unsigned Idx = InfixOperatorStack.size() - 1;
    115       InfixCalculatorTok StackOp = InfixOperatorStack[Idx];
    116       if (OpPrecedence[Op] > OpPrecedence[StackOp] || StackOp == IC_LPAREN) {
    117         InfixOperatorStack.push_back(Op);
    118         return;
    119       }
    120 
    121       // The operator on the top of the stack has higher precedence than the
    122       // new operator.
    123       unsigned ParenCount = 0;
    124       while (1) {
    125         // Nothing to process.
    126         if (InfixOperatorStack.empty())
    127           break;
    128 
    129         Idx = InfixOperatorStack.size() - 1;
    130         StackOp = InfixOperatorStack[Idx];
    131         if (!(OpPrecedence[StackOp] >= OpPrecedence[Op] || ParenCount))
    132           break;
    133 
    134         // If we have an even parentheses count and we see a left parentheses,
    135         // then stop processing.
    136         if (!ParenCount && StackOp == IC_LPAREN)
    137           break;
    138 
    139         if (StackOp == IC_RPAREN) {
    140           ++ParenCount;
    141           InfixOperatorStack.pop_back();
    142         } else if (StackOp == IC_LPAREN) {
    143           --ParenCount;
    144           InfixOperatorStack.pop_back();
    145         } else {
    146           InfixOperatorStack.pop_back();
    147           PostfixStack.push_back(std::make_pair(StackOp, 0));
    148         }
    149       }
    150       // Push the new operator.
    151       InfixOperatorStack.push_back(Op);
    152     }
    153     int64_t execute() {
    154       // Push any remaining operators onto the postfix stack.
    155       while (!InfixOperatorStack.empty()) {
    156         InfixCalculatorTok StackOp = InfixOperatorStack.pop_back_val();
    157         if (StackOp != IC_LPAREN && StackOp != IC_RPAREN)
    158           PostfixStack.push_back(std::make_pair(StackOp, 0));
    159       }
    160 
    161       if (PostfixStack.empty())
    162         return 0;
    163 
    164       SmallVector<ICToken, 16> OperandStack;
    165       for (unsigned i = 0, e = PostfixStack.size(); i != e; ++i) {
    166         ICToken Op = PostfixStack[i];
    167         if (Op.first == IC_IMM || Op.first == IC_REGISTER) {
    168           OperandStack.push_back(Op);
    169         } else {
    170           assert (OperandStack.size() > 1 && "Too few operands.");
    171           int64_t Val;
    172           ICToken Op2 = OperandStack.pop_back_val();
    173           ICToken Op1 = OperandStack.pop_back_val();
    174           switch (Op.first) {
    175           default:
    176             report_fatal_error("Unexpected operator!");
    177             break;
    178           case IC_PLUS:
    179             Val = Op1.second + Op2.second;
    180             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    181             break;
    182           case IC_MINUS:
    183             Val = Op1.second - Op2.second;
    184             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    185             break;
    186           case IC_MULTIPLY:
    187             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
    188                     "Multiply operation with an immediate and a register!");
    189             Val = Op1.second * Op2.second;
    190             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    191             break;
    192           case IC_DIVIDE:
    193             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
    194                     "Divide operation with an immediate and a register!");
    195             assert (Op2.second != 0 && "Division by zero!");
    196             Val = Op1.second / Op2.second;
    197             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    198             break;
    199           case IC_OR:
    200             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
    201                     "Or operation with an immediate and a register!");
    202             Val = Op1.second | Op2.second;
    203             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    204             break;
    205           case IC_AND:
    206             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
    207                     "And operation with an immediate and a register!");
    208             Val = Op1.second & Op2.second;
    209             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    210             break;
    211           case IC_LSHIFT:
    212             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
    213                     "Left shift operation with an immediate and a register!");
    214             Val = Op1.second << Op2.second;
    215             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    216             break;
    217           case IC_RSHIFT:
    218             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
    219                     "Right shift operation with an immediate and a register!");
    220             Val = Op1.second >> Op2.second;
    221             OperandStack.push_back(std::make_pair(IC_IMM, Val));
    222             break;
    223           }
    224         }
    225       }
    226       assert (OperandStack.size() == 1 && "Expected a single result.");
    227       return OperandStack.pop_back_val().second;
    228     }
    229   };
    230 
    231   enum IntelExprState {
    232     IES_OR,
    233     IES_AND,
    234     IES_LSHIFT,
    235     IES_RSHIFT,
    236     IES_PLUS,
    237     IES_MINUS,
    238     IES_NOT,
    239     IES_MULTIPLY,
    240     IES_DIVIDE,
    241     IES_LBRAC,
    242     IES_RBRAC,
    243     IES_LPAREN,
    244     IES_RPAREN,
    245     IES_REGISTER,
    246     IES_INTEGER,
    247     IES_IDENTIFIER,
    248     IES_ERROR
    249   };
    250 
    251   class IntelExprStateMachine {
    252     IntelExprState State, PrevState;
    253     unsigned BaseReg, IndexReg, TmpReg, Scale;
    254     int64_t Imm;
    255     const MCExpr *Sym;
    256     StringRef SymName;
    257     bool StopOnLBrac, AddImmPrefix;
    258     InfixCalculator IC;
    259     InlineAsmIdentifierInfo Info;
    260   public:
    261     IntelExprStateMachine(int64_t imm, bool stoponlbrac, bool addimmprefix) :
    262       State(IES_PLUS), PrevState(IES_ERROR), BaseReg(0), IndexReg(0), TmpReg(0),
    263       Scale(1), Imm(imm), Sym(nullptr), StopOnLBrac(stoponlbrac),
    264       AddImmPrefix(addimmprefix) { Info.clear(); }
    265 
    266     unsigned getBaseReg() { return BaseReg; }
    267     unsigned getIndexReg() { return IndexReg; }
    268     unsigned getScale() { return Scale; }
    269     const MCExpr *getSym() { return Sym; }
    270     StringRef getSymName() { return SymName; }
    271     int64_t getImm() { return Imm + IC.execute(); }
    272     bool isValidEndState() {
    273       return State == IES_RBRAC || State == IES_INTEGER;
    274     }
    275     bool getStopOnLBrac() { return StopOnLBrac; }
    276     bool getAddImmPrefix() { return AddImmPrefix; }
    277     bool hadError() { return State == IES_ERROR; }
    278 
    279     InlineAsmIdentifierInfo &getIdentifierInfo() {
    280       return Info;
    281     }
    282 
    283     void onOr() {
    284       IntelExprState CurrState = State;
    285       switch (State) {
    286       default:
    287         State = IES_ERROR;
    288         break;
    289       case IES_INTEGER:
    290       case IES_RPAREN:
    291       case IES_REGISTER:
    292         State = IES_OR;
    293         IC.pushOperator(IC_OR);
    294         break;
    295       }
    296       PrevState = CurrState;
    297     }
    298     void onAnd() {
    299       IntelExprState CurrState = State;
    300       switch (State) {
    301       default:
    302         State = IES_ERROR;
    303         break;
    304       case IES_INTEGER:
    305       case IES_RPAREN:
    306       case IES_REGISTER:
    307         State = IES_AND;
    308         IC.pushOperator(IC_AND);
    309         break;
    310       }
    311       PrevState = CurrState;
    312     }
    313     void onLShift() {
    314       IntelExprState CurrState = State;
    315       switch (State) {
    316       default:
    317         State = IES_ERROR;
    318         break;
    319       case IES_INTEGER:
    320       case IES_RPAREN:
    321       case IES_REGISTER:
    322         State = IES_LSHIFT;
    323         IC.pushOperator(IC_LSHIFT);
    324         break;
    325       }
    326       PrevState = CurrState;
    327     }
    328     void onRShift() {
    329       IntelExprState CurrState = State;
    330       switch (State) {
    331       default:
    332         State = IES_ERROR;
    333         break;
    334       case IES_INTEGER:
    335       case IES_RPAREN:
    336       case IES_REGISTER:
    337         State = IES_RSHIFT;
    338         IC.pushOperator(IC_RSHIFT);
    339         break;
    340       }
    341       PrevState = CurrState;
    342     }
    343     void onPlus() {
    344       IntelExprState CurrState = State;
    345       switch (State) {
    346       default:
    347         State = IES_ERROR;
    348         break;
    349       case IES_INTEGER:
    350       case IES_RPAREN:
    351       case IES_REGISTER:
    352         State = IES_PLUS;
    353         IC.pushOperator(IC_PLUS);
    354         if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) {
    355           // If we already have a BaseReg, then assume this is the IndexReg with
    356           // a scale of 1.
    357           if (!BaseReg) {
    358             BaseReg = TmpReg;
    359           } else {
    360             assert (!IndexReg && "BaseReg/IndexReg already set!");
    361             IndexReg = TmpReg;
    362             Scale = 1;
    363           }
    364         }
    365         break;
    366       }
    367       PrevState = CurrState;
    368     }
    369     void onMinus() {
    370       IntelExprState CurrState = State;
    371       switch (State) {
    372       default:
    373         State = IES_ERROR;
    374         break;
    375       case IES_PLUS:
    376       case IES_NOT:
    377       case IES_MULTIPLY:
    378       case IES_DIVIDE:
    379       case IES_LPAREN:
    380       case IES_RPAREN:
    381       case IES_LBRAC:
    382       case IES_RBRAC:
    383       case IES_INTEGER:
    384       case IES_REGISTER:
    385         State = IES_MINUS;
    386         // Only push the minus operator if it is not a unary operator.
    387         if (!(CurrState == IES_PLUS || CurrState == IES_MINUS ||
    388               CurrState == IES_MULTIPLY || CurrState == IES_DIVIDE ||
    389               CurrState == IES_LPAREN || CurrState == IES_LBRAC))
    390           IC.pushOperator(IC_MINUS);
    391         if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) {
    392           // If we already have a BaseReg, then assume this is the IndexReg with
    393           // a scale of 1.
    394           if (!BaseReg) {
    395             BaseReg = TmpReg;
    396           } else {
    397             assert (!IndexReg && "BaseReg/IndexReg already set!");
    398             IndexReg = TmpReg;
    399             Scale = 1;
    400           }
    401         }
    402         break;
    403       }
    404       PrevState = CurrState;
    405     }
    406     void onNot() {
    407       IntelExprState CurrState = State;
    408       switch (State) {
    409       default:
    410         State = IES_ERROR;
    411         break;
    412       case IES_PLUS:
    413       case IES_NOT:
    414         State = IES_NOT;
    415         break;
    416       }
    417       PrevState = CurrState;
    418     }
    419     void onRegister(unsigned Reg) {
    420       IntelExprState CurrState = State;
    421       switch (State) {
    422       default:
    423         State = IES_ERROR;
    424         break;
    425       case IES_PLUS:
    426       case IES_LPAREN:
    427         State = IES_REGISTER;
    428         TmpReg = Reg;
    429         IC.pushOperand(IC_REGISTER);
    430         break;
    431       case IES_MULTIPLY:
    432         // Index Register - Scale * Register
    433         if (PrevState == IES_INTEGER) {
    434           assert (!IndexReg && "IndexReg already set!");
    435           State = IES_REGISTER;
    436           IndexReg = Reg;
    437           // Get the scale and replace the 'Scale * Register' with '0'.
    438           Scale = IC.popOperand();
    439           IC.pushOperand(IC_IMM);
    440           IC.popOperator();
    441         } else {
    442           State = IES_ERROR;
    443         }
    444         break;
    445       }
    446       PrevState = CurrState;
    447     }
    448     void onIdentifierExpr(const MCExpr *SymRef, StringRef SymRefName) {
    449       PrevState = State;
    450       switch (State) {
    451       default:
    452         State = IES_ERROR;
    453         break;
    454       case IES_PLUS:
    455       case IES_MINUS:
    456       case IES_NOT:
    457         State = IES_INTEGER;
    458         Sym = SymRef;
    459         SymName = SymRefName;
    460         IC.pushOperand(IC_IMM);
    461         break;
    462       }
    463     }
    464     bool onInteger(int64_t TmpInt, StringRef &ErrMsg) {
    465       IntelExprState CurrState = State;
    466       switch (State) {
    467       default:
    468         State = IES_ERROR;
    469         break;
    470       case IES_PLUS:
    471       case IES_MINUS:
    472       case IES_NOT:
    473       case IES_OR:
    474       case IES_AND:
    475       case IES_LSHIFT:
    476       case IES_RSHIFT:
    477       case IES_DIVIDE:
    478       case IES_MULTIPLY:
    479       case IES_LPAREN:
    480         State = IES_INTEGER;
    481         if (PrevState == IES_REGISTER && CurrState == IES_MULTIPLY) {
    482           // Index Register - Register * Scale
    483           assert (!IndexReg && "IndexReg already set!");
    484           IndexReg = TmpReg;
    485           Scale = TmpInt;
    486           if(Scale != 1 && Scale != 2 && Scale != 4 && Scale != 8) {
    487             ErrMsg = "scale factor in address must be 1, 2, 4 or 8";
    488             return true;
    489           }
    490           // Get the scale and replace the 'Register * Scale' with '0'.
    491           IC.popOperator();
    492         } else if ((PrevState == IES_PLUS || PrevState == IES_MINUS ||
    493                     PrevState == IES_OR || PrevState == IES_AND ||
    494                     PrevState == IES_LSHIFT || PrevState == IES_RSHIFT ||
    495                     PrevState == IES_MULTIPLY || PrevState == IES_DIVIDE ||
    496                     PrevState == IES_LPAREN || PrevState == IES_LBRAC ||
    497                     PrevState == IES_NOT) &&
    498                    CurrState == IES_MINUS) {
    499           // Unary minus.  No need to pop the minus operand because it was never
    500           // pushed.
    501           IC.pushOperand(IC_IMM, -TmpInt); // Push -Imm.
    502         } else if ((PrevState == IES_PLUS || PrevState == IES_MINUS ||
    503                     PrevState == IES_OR || PrevState == IES_AND ||
    504                     PrevState == IES_LSHIFT || PrevState == IES_RSHIFT ||
    505                     PrevState == IES_MULTIPLY || PrevState == IES_DIVIDE ||
    506                     PrevState == IES_LPAREN || PrevState == IES_LBRAC ||
    507                     PrevState == IES_NOT) &&
    508                    CurrState == IES_NOT) {
    509           // Unary not.  No need to pop the not operand because it was never
    510           // pushed.
    511           IC.pushOperand(IC_IMM, ~TmpInt); // Push ~Imm.
    512         } else {
    513           IC.pushOperand(IC_IMM, TmpInt);
    514         }
    515         break;
    516       }
    517       PrevState = CurrState;
    518       return false;
    519     }
    520     void onStar() {
    521       PrevState = State;
    522       switch (State) {
    523       default:
    524         State = IES_ERROR;
    525         break;
    526       case IES_INTEGER:
    527       case IES_REGISTER:
    528       case IES_RPAREN:
    529         State = IES_MULTIPLY;
    530         IC.pushOperator(IC_MULTIPLY);
    531         break;
    532       }
    533     }
    534     void onDivide() {
    535       PrevState = State;
    536       switch (State) {
    537       default:
    538         State = IES_ERROR;
    539         break;
    540       case IES_INTEGER:
    541       case IES_RPAREN:
    542         State = IES_DIVIDE;
    543         IC.pushOperator(IC_DIVIDE);
    544         break;
    545       }
    546     }
    547     void onLBrac() {
    548       PrevState = State;
    549       switch (State) {
    550       default:
    551         State = IES_ERROR;
    552         break;
    553       case IES_RBRAC:
    554         State = IES_PLUS;
    555         IC.pushOperator(IC_PLUS);
    556         break;
    557       }
    558     }
    559     void onRBrac() {
    560       IntelExprState CurrState = State;
    561       switch (State) {
    562       default:
    563         State = IES_ERROR;
    564         break;
    565       case IES_INTEGER:
    566       case IES_REGISTER:
    567       case IES_RPAREN:
    568         State = IES_RBRAC;
    569         if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) {
    570           // If we already have a BaseReg, then assume this is the IndexReg with
    571           // a scale of 1.
    572           if (!BaseReg) {
    573             BaseReg = TmpReg;
    574           } else {
    575             assert (!IndexReg && "BaseReg/IndexReg already set!");
    576             IndexReg = TmpReg;
    577             Scale = 1;
    578           }
    579         }
    580         break;
    581       }
    582       PrevState = CurrState;
    583     }
    584     void onLParen() {
    585       IntelExprState CurrState = State;
    586       switch (State) {
    587       default:
    588         State = IES_ERROR;
    589         break;
    590       case IES_PLUS:
    591       case IES_MINUS:
    592       case IES_NOT:
    593       case IES_OR:
    594       case IES_AND:
    595       case IES_LSHIFT:
    596       case IES_RSHIFT:
    597       case IES_MULTIPLY:
    598       case IES_DIVIDE:
    599       case IES_LPAREN:
    600         // FIXME: We don't handle this type of unary minus or not, yet.
    601         if ((PrevState == IES_PLUS || PrevState == IES_MINUS ||
    602             PrevState == IES_OR || PrevState == IES_AND ||
    603             PrevState == IES_LSHIFT || PrevState == IES_RSHIFT ||
    604             PrevState == IES_MULTIPLY || PrevState == IES_DIVIDE ||
    605             PrevState == IES_LPAREN || PrevState == IES_LBRAC ||
    606             PrevState == IES_NOT) &&
    607             (CurrState == IES_MINUS || CurrState == IES_NOT)) {
    608           State = IES_ERROR;
    609           break;
    610         }
    611         State = IES_LPAREN;
    612         IC.pushOperator(IC_LPAREN);
    613         break;
    614       }
    615       PrevState = CurrState;
    616     }
    617     void onRParen() {
    618       PrevState = State;
    619       switch (State) {
    620       default:
    621         State = IES_ERROR;
    622         break;
    623       case IES_INTEGER:
    624       case IES_REGISTER:
    625       case IES_RPAREN:
    626         State = IES_RPAREN;
    627         IC.pushOperator(IC_RPAREN);
    628         break;
    629       }
    630     }
    631   };
    632 
    633   MCAsmParser &getParser() const { return Parser; }
    634 
    635   MCAsmLexer &getLexer() const { return Parser.getLexer(); }
    636 
    637   bool Error(SMLoc L, const Twine &Msg,
    638              ArrayRef<SMRange> Ranges = None,
    639              bool MatchingInlineAsm = false) {
    640     if (MatchingInlineAsm) return true;
    641     return Parser.Error(L, Msg, Ranges);
    642   }
    643 
    644   bool ErrorAndEatStatement(SMLoc L, const Twine &Msg,
    645           ArrayRef<SMRange> Ranges = None,
    646           bool MatchingInlineAsm = false) {
    647       Parser.eatToEndOfStatement();
    648       return Error(L, Msg, Ranges, MatchingInlineAsm);
    649   }
    650 
    651   std::nullptr_t ErrorOperand(SMLoc Loc, StringRef Msg) {
    652     Error(Loc, Msg);
    653     return nullptr;
    654   }
    655 
    656   std::unique_ptr<X86Operand> DefaultMemSIOperand(SMLoc Loc);
    657   std::unique_ptr<X86Operand> DefaultMemDIOperand(SMLoc Loc);
    658   std::unique_ptr<X86Operand> ParseOperand();
    659   std::unique_ptr<X86Operand> ParseATTOperand();
    660   std::unique_ptr<X86Operand> ParseIntelOperand();
    661   std::unique_ptr<X86Operand> ParseIntelOffsetOfOperator();
    662   bool ParseIntelDotOperator(const MCExpr *Disp, const MCExpr *&NewDisp);
    663   std::unique_ptr<X86Operand> ParseIntelOperator(unsigned OpKind);
    664   std::unique_ptr<X86Operand>
    665   ParseIntelSegmentOverride(unsigned SegReg, SMLoc Start, unsigned Size);
    666   std::unique_ptr<X86Operand>
    667   ParseIntelMemOperand(int64_t ImmDisp, SMLoc StartLoc, unsigned Size);
    668   bool ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End);
    669   std::unique_ptr<X86Operand> ParseIntelBracExpression(unsigned SegReg,
    670                                                        SMLoc Start,
    671                                                        int64_t ImmDisp,
    672                                                        unsigned Size);
    673   bool ParseIntelIdentifier(const MCExpr *&Val, StringRef &Identifier,
    674                             InlineAsmIdentifierInfo &Info,
    675                             bool IsUnevaluatedOperand, SMLoc &End);
    676 
    677   std::unique_ptr<X86Operand> ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
    678 
    679   std::unique_ptr<X86Operand>
    680   CreateMemForInlineAsm(unsigned SegReg, const MCExpr *Disp, unsigned BaseReg,
    681                         unsigned IndexReg, unsigned Scale, SMLoc Start,
    682                         SMLoc End, unsigned Size, StringRef Identifier,
    683                         InlineAsmIdentifierInfo &Info);
    684 
    685   bool ParseDirectiveWord(unsigned Size, SMLoc L);
    686   bool ParseDirectiveCode(StringRef IDVal, SMLoc L);
    687 
    688   bool processInstruction(MCInst &Inst, const OperandVector &Ops);
    689 
    690   /// Wrapper around MCStreamer::EmitInstruction(). Possibly adds
    691   /// instrumentation around Inst.
    692   void EmitInstruction(MCInst &Inst, OperandVector &Operands, MCStreamer &Out);
    693 
    694   bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
    695                                OperandVector &Operands, MCStreamer &Out,
    696                                unsigned &ErrorInfo,
    697                                bool MatchingInlineAsm) override;
    698 
    699   /// doSrcDstMatch - Returns true if operands are matching in their
    700   /// word size (%si and %di, %esi and %edi, etc.). Order depends on
    701   /// the parsing mode (Intel vs. AT&T).
    702   bool doSrcDstMatch(X86Operand &Op1, X86Operand &Op2);
    703 
    704   /// Parses AVX512 specific operand primitives: masked registers ({%k<NUM>}, {z})
    705   /// and memory broadcasting ({1to<NUM>}) primitives, updating Operands vector if required.
    706   /// \return \c true if no parsing errors occurred, \c false otherwise.
    707   bool HandleAVX512Operand(OperandVector &Operands,
    708                            const MCParsedAsmOperand &Op);
    709 
    710   bool is64BitMode() const {
    711     // FIXME: Can tablegen auto-generate this?
    712     return (STI.getFeatureBits() & X86::Mode64Bit) != 0;
    713   }
    714   bool is32BitMode() const {
    715     // FIXME: Can tablegen auto-generate this?
    716     return (STI.getFeatureBits() & X86::Mode32Bit) != 0;
    717   }
    718   bool is16BitMode() const {
    719     // FIXME: Can tablegen auto-generate this?
    720     return (STI.getFeatureBits() & X86::Mode16Bit) != 0;
    721   }
    722   void SwitchMode(uint64_t mode) {
    723     uint64_t oldMode = STI.getFeatureBits() &
    724         (X86::Mode64Bit | X86::Mode32Bit | X86::Mode16Bit);
    725     unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(oldMode | mode));
    726     setAvailableFeatures(FB);
    727     assert(mode == (STI.getFeatureBits() &
    728                     (X86::Mode64Bit | X86::Mode32Bit | X86::Mode16Bit)));
    729   }
    730 
    731   bool isParsingIntelSyntax() {
    732     return getParser().getAssemblerDialect();
    733   }
    734 
    735   /// @name Auto-generated Matcher Functions
    736   /// {
    737 
    738 #define GET_ASSEMBLER_HEADER
    739 #include "X86GenAsmMatcher.inc"
    740 
    741   /// }
    742 
    743 public:
    744   X86AsmParser(MCSubtargetInfo &sti, MCAsmParser &parser,
    745                const MCInstrInfo &mii,
    746                const MCTargetOptions &Options)
    747       : MCTargetAsmParser(), STI(sti), Parser(parser), MII(mii),
    748         InstInfo(nullptr) {
    749 
    750     // Initialize the set of available features.
    751     setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
    752     Instrumentation.reset(
    753         CreateX86AsmInstrumentation(Options, Parser.getContext(), STI));
    754   }
    755 
    756   bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override;
    757 
    758   bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
    759                         SMLoc NameLoc, OperandVector &Operands) override;
    760 
    761   bool ParseDirective(AsmToken DirectiveID) override;
    762 };
    763 } // end anonymous namespace
    764 
    765 /// @name Auto-generated Match Functions
    766 /// {
    767 
    768 static unsigned MatchRegisterName(StringRef Name);
    769 
    770 /// }
    771 
    772 static bool CheckBaseRegAndIndexReg(unsigned BaseReg, unsigned IndexReg,
    773                                     StringRef &ErrMsg) {
    774   // If we have both a base register and an index register make sure they are
    775   // both 64-bit or 32-bit registers.
    776   // To support VSIB, IndexReg can be 128-bit or 256-bit registers.
    777   if (BaseReg != 0 && IndexReg != 0) {
    778     if (X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg) &&
    779         (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) ||
    780          X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg)) &&
    781         IndexReg != X86::RIZ) {
    782       ErrMsg = "base register is 64-bit, but index register is not";
    783       return true;
    784     }
    785     if (X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg) &&
    786         (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) ||
    787          X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg)) &&
    788         IndexReg != X86::EIZ){
    789       ErrMsg = "base register is 32-bit, but index register is not";
    790       return true;
    791     }
    792     if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg)) {
    793       if (X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg) ||
    794           X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg)) {
    795         ErrMsg = "base register is 16-bit, but index register is not";
    796         return true;
    797       }
    798       if (((BaseReg == X86::BX || BaseReg == X86::BP) &&
    799            IndexReg != X86::SI && IndexReg != X86::DI) ||
    800           ((BaseReg == X86::SI || BaseReg == X86::DI) &&
    801            IndexReg != X86::BX && IndexReg != X86::BP)) {
    802         ErrMsg = "invalid 16-bit base/index register combination";
    803         return true;
    804       }
    805     }
    806   }
    807   return false;
    808 }
    809 
    810 bool X86AsmParser::doSrcDstMatch(X86Operand &Op1, X86Operand &Op2)
    811 {
    812   // Return true and let a normal complaint about bogus operands happen.
    813   if (!Op1.isMem() || !Op2.isMem())
    814     return true;
    815 
    816   // Actually these might be the other way round if Intel syntax is
    817   // being used. It doesn't matter.
    818   unsigned diReg = Op1.Mem.BaseReg;
    819   unsigned siReg = Op2.Mem.BaseReg;
    820 
    821   if (X86MCRegisterClasses[X86::GR16RegClassID].contains(siReg))
    822     return X86MCRegisterClasses[X86::GR16RegClassID].contains(diReg);
    823   if (X86MCRegisterClasses[X86::GR32RegClassID].contains(siReg))
    824     return X86MCRegisterClasses[X86::GR32RegClassID].contains(diReg);
    825   if (X86MCRegisterClasses[X86::GR64RegClassID].contains(siReg))
    826     return X86MCRegisterClasses[X86::GR64RegClassID].contains(diReg);
    827   // Again, return true and let another error happen.
    828   return true;
    829 }
    830 
    831 bool X86AsmParser::ParseRegister(unsigned &RegNo,
    832                                  SMLoc &StartLoc, SMLoc &EndLoc) {
    833   RegNo = 0;
    834   const AsmToken &PercentTok = Parser.getTok();
    835   StartLoc = PercentTok.getLoc();
    836 
    837   // If we encounter a %, ignore it. This code handles registers with and
    838   // without the prefix, unprefixed registers can occur in cfi directives.
    839   if (!isParsingIntelSyntax() && PercentTok.is(AsmToken::Percent))
    840     Parser.Lex(); // Eat percent token.
    841 
    842   const AsmToken &Tok = Parser.getTok();
    843   EndLoc = Tok.getEndLoc();
    844 
    845   if (Tok.isNot(AsmToken::Identifier)) {
    846     if (isParsingIntelSyntax()) return true;
    847     return Error(StartLoc, "invalid register name",
    848                  SMRange(StartLoc, EndLoc));
    849   }
    850 
    851   RegNo = MatchRegisterName(Tok.getString());
    852 
    853   // If the match failed, try the register name as lowercase.
    854   if (RegNo == 0)
    855     RegNo = MatchRegisterName(Tok.getString().lower());
    856 
    857   if (!is64BitMode()) {
    858     // FIXME: This should be done using Requires<Not64BitMode> and
    859     // Requires<In64BitMode> so "eiz" usage in 64-bit instructions can be also
    860     // checked.
    861     // FIXME: Check AH, CH, DH, BH cannot be used in an instruction requiring a
    862     // REX prefix.
    863     if (RegNo == X86::RIZ ||
    864         X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo) ||
    865         X86II::isX86_64NonExtLowByteReg(RegNo) ||
    866         X86II::isX86_64ExtendedReg(RegNo))
    867       return Error(StartLoc, "register %"
    868                    + Tok.getString() + " is only available in 64-bit mode",
    869                    SMRange(StartLoc, EndLoc));
    870   }
    871 
    872   // Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens.
    873   if (RegNo == 0 && (Tok.getString() == "st" || Tok.getString() == "ST")) {
    874     RegNo = X86::ST0;
    875     Parser.Lex(); // Eat 'st'
    876 
    877     // Check to see if we have '(4)' after %st.
    878     if (getLexer().isNot(AsmToken::LParen))
    879       return false;
    880     // Lex the paren.
    881     getParser().Lex();
    882 
    883     const AsmToken &IntTok = Parser.getTok();
    884     if (IntTok.isNot(AsmToken::Integer))
    885       return Error(IntTok.getLoc(), "expected stack index");
    886     switch (IntTok.getIntVal()) {
    887     case 0: RegNo = X86::ST0; break;
    888     case 1: RegNo = X86::ST1; break;
    889     case 2: RegNo = X86::ST2; break;
    890     case 3: RegNo = X86::ST3; break;
    891     case 4: RegNo = X86::ST4; break;
    892     case 5: RegNo = X86::ST5; break;
    893     case 6: RegNo = X86::ST6; break;
    894     case 7: RegNo = X86::ST7; break;
    895     default: return Error(IntTok.getLoc(), "invalid stack index");
    896     }
    897 
    898     if (getParser().Lex().isNot(AsmToken::RParen))
    899       return Error(Parser.getTok().getLoc(), "expected ')'");
    900 
    901     EndLoc = Parser.getTok().getEndLoc();
    902     Parser.Lex(); // Eat ')'
    903     return false;
    904   }
    905 
    906   EndLoc = Parser.getTok().getEndLoc();
    907 
    908   // If this is "db[0-7]", match it as an alias
    909   // for dr[0-7].
    910   if (RegNo == 0 && Tok.getString().size() == 3 &&
    911       Tok.getString().startswith("db")) {
    912     switch (Tok.getString()[2]) {
    913     case '0': RegNo = X86::DR0; break;
    914     case '1': RegNo = X86::DR1; break;
    915     case '2': RegNo = X86::DR2; break;
    916     case '3': RegNo = X86::DR3; break;
    917     case '4': RegNo = X86::DR4; break;
    918     case '5': RegNo = X86::DR5; break;
    919     case '6': RegNo = X86::DR6; break;
    920     case '7': RegNo = X86::DR7; break;
    921     }
    922 
    923     if (RegNo != 0) {
    924       EndLoc = Parser.getTok().getEndLoc();
    925       Parser.Lex(); // Eat it.
    926       return false;
    927     }
    928   }
    929 
    930   if (RegNo == 0) {
    931     if (isParsingIntelSyntax()) return true;
    932     return Error(StartLoc, "invalid register name",
    933                  SMRange(StartLoc, EndLoc));
    934   }
    935 
    936   Parser.Lex(); // Eat identifier token.
    937   return false;
    938 }
    939 
    940 std::unique_ptr<X86Operand> X86AsmParser::DefaultMemSIOperand(SMLoc Loc) {
    941   unsigned basereg =
    942     is64BitMode() ? X86::RSI : (is32BitMode() ? X86::ESI : X86::SI);
    943   const MCExpr *Disp = MCConstantExpr::Create(0, getContext());
    944   return X86Operand::CreateMem(/*SegReg=*/0, Disp, /*BaseReg=*/basereg,
    945                                /*IndexReg=*/0, /*Scale=*/1, Loc, Loc, 0);
    946 }
    947 
    948 std::unique_ptr<X86Operand> X86AsmParser::DefaultMemDIOperand(SMLoc Loc) {
    949   unsigned basereg =
    950     is64BitMode() ? X86::RDI : (is32BitMode() ? X86::EDI : X86::DI);
    951   const MCExpr *Disp = MCConstantExpr::Create(0, getContext());
    952   return X86Operand::CreateMem(/*SegReg=*/0, Disp, /*BaseReg=*/basereg,
    953                                /*IndexReg=*/0, /*Scale=*/1, Loc, Loc, 0);
    954 }
    955 
    956 std::unique_ptr<X86Operand> X86AsmParser::ParseOperand() {
    957   if (isParsingIntelSyntax())
    958     return ParseIntelOperand();
    959   return ParseATTOperand();
    960 }
    961 
    962 /// getIntelMemOperandSize - Return intel memory operand size.
    963 static unsigned getIntelMemOperandSize(StringRef OpStr) {
    964   unsigned Size = StringSwitch<unsigned>(OpStr)
    965     .Cases("BYTE", "byte", 8)
    966     .Cases("WORD", "word", 16)
    967     .Cases("DWORD", "dword", 32)
    968     .Cases("QWORD", "qword", 64)
    969     .Cases("XWORD", "xword", 80)
    970     .Cases("XMMWORD", "xmmword", 128)
    971     .Cases("YMMWORD", "ymmword", 256)
    972     .Cases("ZMMWORD", "zmmword", 512)
    973     .Cases("OPAQUE", "opaque", -1U) // needs to be non-zero, but doesn't matter
    974     .Default(0);
    975   return Size;
    976 }
    977 
    978 std::unique_ptr<X86Operand> X86AsmParser::CreateMemForInlineAsm(
    979     unsigned SegReg, const MCExpr *Disp, unsigned BaseReg, unsigned IndexReg,
    980     unsigned Scale, SMLoc Start, SMLoc End, unsigned Size, StringRef Identifier,
    981     InlineAsmIdentifierInfo &Info) {
    982   // If this is not a VarDecl then assume it is a FuncDecl or some other label
    983   // reference.  We need an 'r' constraint here, so we need to create register
    984   // operand to ensure proper matching.  Just pick a GPR based on the size of
    985   // a pointer.
    986   if (isa<MCSymbolRefExpr>(Disp) && !Info.IsVarDecl) {
    987     unsigned RegNo =
    988         is64BitMode() ? X86::RBX : (is32BitMode() ? X86::EBX : X86::BX);
    989     return X86Operand::CreateReg(RegNo, Start, End, /*AddressOf=*/true,
    990                                  SMLoc(), Identifier, Info.OpDecl);
    991   }
    992 
    993   // We either have a direct symbol reference, or an offset from a symbol.  The
    994   // parser always puts the symbol on the LHS, so look there for size
    995   // calculation purposes.
    996   const MCBinaryExpr *BinOp = dyn_cast<MCBinaryExpr>(Disp);
    997   bool IsSymRef =
    998       isa<MCSymbolRefExpr>(BinOp ? BinOp->getLHS() : Disp);
    999   if (IsSymRef) {
   1000     if (!Size) {
   1001       Size = Info.Type * 8; // Size is in terms of bits in this context.
   1002       if (Size)
   1003         InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_SizeDirective, Start,
   1004                                                     /*Len=*/0, Size));
   1005     }
   1006   }
   1007 
   1008   // When parsing inline assembly we set the base register to a non-zero value
   1009   // if we don't know the actual value at this time.  This is necessary to
   1010   // get the matching correct in some cases.
   1011   BaseReg = BaseReg ? BaseReg : 1;
   1012   return X86Operand::CreateMem(SegReg, Disp, BaseReg, IndexReg, Scale, Start,
   1013                                End, Size, Identifier, Info.OpDecl);
   1014 }
   1015 
   1016 static void
   1017 RewriteIntelBracExpression(SmallVectorImpl<AsmRewrite> *AsmRewrites,
   1018                            StringRef SymName, int64_t ImmDisp,
   1019                            int64_t FinalImmDisp, SMLoc &BracLoc,
   1020                            SMLoc &StartInBrac, SMLoc &End) {
   1021   // Remove the '[' and ']' from the IR string.
   1022   AsmRewrites->push_back(AsmRewrite(AOK_Skip, BracLoc, 1));
   1023   AsmRewrites->push_back(AsmRewrite(AOK_Skip, End, 1));
   1024 
   1025   // If ImmDisp is non-zero, then we parsed a displacement before the
   1026   // bracketed expression (i.e., ImmDisp [ BaseReg + Scale*IndexReg + Disp])
   1027   // If ImmDisp doesn't match the displacement computed by the state machine
   1028   // then we have an additional displacement in the bracketed expression.
   1029   if (ImmDisp != FinalImmDisp) {
   1030     if (ImmDisp) {
   1031       // We have an immediate displacement before the bracketed expression.
   1032       // Adjust this to match the final immediate displacement.
   1033       bool Found = false;
   1034       for (SmallVectorImpl<AsmRewrite>::iterator I = AsmRewrites->begin(),
   1035              E = AsmRewrites->end(); I != E; ++I) {
   1036         if ((*I).Loc.getPointer() > BracLoc.getPointer())
   1037           continue;
   1038         if ((*I).Kind == AOK_ImmPrefix || (*I).Kind == AOK_Imm) {
   1039           assert (!Found && "ImmDisp already rewritten.");
   1040           (*I).Kind = AOK_Imm;
   1041           (*I).Len = BracLoc.getPointer() - (*I).Loc.getPointer();
   1042           (*I).Val = FinalImmDisp;
   1043           Found = true;
   1044           break;
   1045         }
   1046       }
   1047       assert (Found && "Unable to rewrite ImmDisp.");
   1048       (void)Found;
   1049     } else {
   1050       // We have a symbolic and an immediate displacement, but no displacement
   1051       // before the bracketed expression.  Put the immediate displacement
   1052       // before the bracketed expression.
   1053       AsmRewrites->push_back(AsmRewrite(AOK_Imm, BracLoc, 0, FinalImmDisp));
   1054     }
   1055   }
   1056   // Remove all the ImmPrefix rewrites within the brackets.
   1057   for (SmallVectorImpl<AsmRewrite>::iterator I = AsmRewrites->begin(),
   1058          E = AsmRewrites->end(); I != E; ++I) {
   1059     if ((*I).Loc.getPointer() < StartInBrac.getPointer())
   1060       continue;
   1061     if ((*I).Kind == AOK_ImmPrefix)
   1062       (*I).Kind = AOK_Delete;
   1063   }
   1064   const char *SymLocPtr = SymName.data();
   1065   // Skip everything before the symbol.
   1066   if (unsigned Len = SymLocPtr - StartInBrac.getPointer()) {
   1067     assert(Len > 0 && "Expected a non-negative length.");
   1068     AsmRewrites->push_back(AsmRewrite(AOK_Skip, StartInBrac, Len));
   1069   }
   1070   // Skip everything after the symbol.
   1071   if (unsigned Len = End.getPointer() - (SymLocPtr + SymName.size())) {
   1072     SMLoc Loc = SMLoc::getFromPointer(SymLocPtr + SymName.size());
   1073     assert(Len > 0 && "Expected a non-negative length.");
   1074     AsmRewrites->push_back(AsmRewrite(AOK_Skip, Loc, Len));
   1075   }
   1076 }
   1077 
   1078 bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
   1079   const AsmToken &Tok = Parser.getTok();
   1080 
   1081   bool Done = false;
   1082   while (!Done) {
   1083     bool UpdateLocLex = true;
   1084 
   1085     // The period in the dot operator (e.g., [ebx].foo.bar) is parsed as an
   1086     // identifier.  Don't try an parse it as a register.
   1087     if (Tok.getString().startswith("."))
   1088       break;
   1089 
   1090     // If we're parsing an immediate expression, we don't expect a '['.
   1091     if (SM.getStopOnLBrac() && getLexer().getKind() == AsmToken::LBrac)
   1092       break;
   1093 
   1094     AsmToken::TokenKind TK = getLexer().getKind();
   1095     switch (TK) {
   1096     default: {
   1097       if (SM.isValidEndState()) {
   1098         Done = true;
   1099         break;
   1100       }
   1101       return Error(Tok.getLoc(), "unknown token in expression");
   1102     }
   1103     case AsmToken::EndOfStatement: {
   1104       Done = true;
   1105       break;
   1106     }
   1107     case AsmToken::String:
   1108     case AsmToken::Identifier: {
   1109       // This could be a register or a symbolic displacement.
   1110       unsigned TmpReg;
   1111       const MCExpr *Val;
   1112       SMLoc IdentLoc = Tok.getLoc();
   1113       StringRef Identifier = Tok.getString();
   1114       if (TK != AsmToken::String && !ParseRegister(TmpReg, IdentLoc, End)) {
   1115         SM.onRegister(TmpReg);
   1116         UpdateLocLex = false;
   1117         break;
   1118       } else {
   1119         if (!isParsingInlineAsm()) {
   1120           if (getParser().parsePrimaryExpr(Val, End))
   1121             return Error(Tok.getLoc(), "Unexpected identifier!");
   1122         } else {
   1123           // This is a dot operator, not an adjacent identifier.
   1124           if (Identifier.find('.') != StringRef::npos) {
   1125             return false;
   1126           } else {
   1127             InlineAsmIdentifierInfo &Info = SM.getIdentifierInfo();
   1128             if (ParseIntelIdentifier(Val, Identifier, Info,
   1129                                      /*Unevaluated=*/false, End))
   1130               return true;
   1131           }
   1132         }
   1133         SM.onIdentifierExpr(Val, Identifier);
   1134         UpdateLocLex = false;
   1135         break;
   1136       }
   1137       return Error(Tok.getLoc(), "Unexpected identifier!");
   1138     }
   1139     case AsmToken::Integer: {
   1140       StringRef ErrMsg;
   1141       if (isParsingInlineAsm() && SM.getAddImmPrefix())
   1142         InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_ImmPrefix,
   1143                                                     Tok.getLoc()));
   1144       // Look for 'b' or 'f' following an Integer as a directional label
   1145       SMLoc Loc = getTok().getLoc();
   1146       int64_t IntVal = getTok().getIntVal();
   1147       End = consumeToken();
   1148       UpdateLocLex = false;
   1149       if (getLexer().getKind() == AsmToken::Identifier) {
   1150         StringRef IDVal = getTok().getString();
   1151         if (IDVal == "f" || IDVal == "b") {
   1152           MCSymbol *Sym =
   1153               getContext().GetDirectionalLocalSymbol(IntVal, IDVal == "b");
   1154           MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
   1155           const MCExpr *Val =
   1156 	    MCSymbolRefExpr::Create(Sym, Variant, getContext());
   1157           if (IDVal == "b" && Sym->isUndefined())
   1158             return Error(Loc, "invalid reference to undefined symbol");
   1159           StringRef Identifier = Sym->getName();
   1160           SM.onIdentifierExpr(Val, Identifier);
   1161           End = consumeToken();
   1162         } else {
   1163           if (SM.onInteger(IntVal, ErrMsg))
   1164             return Error(Loc, ErrMsg);
   1165         }
   1166       } else {
   1167         if (SM.onInteger(IntVal, ErrMsg))
   1168           return Error(Loc, ErrMsg);
   1169       }
   1170       break;
   1171     }
   1172     case AsmToken::Plus:    SM.onPlus(); break;
   1173     case AsmToken::Minus:   SM.onMinus(); break;
   1174     case AsmToken::Tilde:   SM.onNot(); break;
   1175     case AsmToken::Star:    SM.onStar(); break;
   1176     case AsmToken::Slash:   SM.onDivide(); break;
   1177     case AsmToken::Pipe:    SM.onOr(); break;
   1178     case AsmToken::Amp:     SM.onAnd(); break;
   1179     case AsmToken::LessLess:
   1180                             SM.onLShift(); break;
   1181     case AsmToken::GreaterGreater:
   1182                             SM.onRShift(); break;
   1183     case AsmToken::LBrac:   SM.onLBrac(); break;
   1184     case AsmToken::RBrac:   SM.onRBrac(); break;
   1185     case AsmToken::LParen:  SM.onLParen(); break;
   1186     case AsmToken::RParen:  SM.onRParen(); break;
   1187     }
   1188     if (SM.hadError())
   1189       return Error(Tok.getLoc(), "unknown token in expression");
   1190 
   1191     if (!Done && UpdateLocLex)
   1192       End = consumeToken();
   1193   }
   1194   return false;
   1195 }
   1196 
   1197 std::unique_ptr<X86Operand>
   1198 X86AsmParser::ParseIntelBracExpression(unsigned SegReg, SMLoc Start,
   1199                                        int64_t ImmDisp, unsigned Size) {
   1200   const AsmToken &Tok = Parser.getTok();
   1201   SMLoc BracLoc = Tok.getLoc(), End = Tok.getEndLoc();
   1202   if (getLexer().isNot(AsmToken::LBrac))
   1203     return ErrorOperand(BracLoc, "Expected '[' token!");
   1204   Parser.Lex(); // Eat '['
   1205 
   1206   SMLoc StartInBrac = Tok.getLoc();
   1207   // Parse [ Symbol + ImmDisp ] and [ BaseReg + Scale*IndexReg + ImmDisp ].  We
   1208   // may have already parsed an immediate displacement before the bracketed
   1209   // expression.
   1210   IntelExprStateMachine SM(ImmDisp, /*StopOnLBrac=*/false, /*AddImmPrefix=*/true);
   1211   if (ParseIntelExpression(SM, End))
   1212     return nullptr;
   1213 
   1214   const MCExpr *Disp = nullptr;
   1215   if (const MCExpr *Sym = SM.getSym()) {
   1216     // A symbolic displacement.
   1217     Disp = Sym;
   1218     if (isParsingInlineAsm())
   1219       RewriteIntelBracExpression(InstInfo->AsmRewrites, SM.getSymName(),
   1220                                  ImmDisp, SM.getImm(), BracLoc, StartInBrac,
   1221                                  End);
   1222   }
   1223 
   1224   if (SM.getImm() || !Disp) {
   1225     const MCExpr *Imm = MCConstantExpr::Create(SM.getImm(), getContext());
   1226     if (Disp)
   1227       Disp = MCBinaryExpr::CreateAdd(Disp, Imm, getContext());
   1228     else
   1229       Disp = Imm;  // An immediate displacement only.
   1230   }
   1231 
   1232   // Parse struct field access.  Intel requires a dot, but MSVC doesn't.  MSVC
   1233   // will in fact do global lookup the field name inside all global typedefs,
   1234   // but we don't emulate that.
   1235   if (Tok.getString().find('.') != StringRef::npos) {
   1236     const MCExpr *NewDisp;
   1237     if (ParseIntelDotOperator(Disp, NewDisp))
   1238       return nullptr;
   1239 
   1240     End = Tok.getEndLoc();
   1241     Parser.Lex();  // Eat the field.
   1242     Disp = NewDisp;
   1243   }
   1244 
   1245   int BaseReg = SM.getBaseReg();
   1246   int IndexReg = SM.getIndexReg();
   1247   int Scale = SM.getScale();
   1248   if (!isParsingInlineAsm()) {
   1249     // handle [-42]
   1250     if (!BaseReg && !IndexReg) {
   1251       if (!SegReg)
   1252         return X86Operand::CreateMem(Disp, Start, End, Size);
   1253       else
   1254         return X86Operand::CreateMem(SegReg, Disp, 0, 0, 1, Start, End, Size);
   1255     }
   1256     StringRef ErrMsg;
   1257     if (CheckBaseRegAndIndexReg(BaseReg, IndexReg, ErrMsg)) {
   1258       Error(StartInBrac, ErrMsg);
   1259       return nullptr;
   1260     }
   1261     return X86Operand::CreateMem(SegReg, Disp, BaseReg, IndexReg, Scale, Start,
   1262                                  End, Size);
   1263   }
   1264 
   1265   InlineAsmIdentifierInfo &Info = SM.getIdentifierInfo();
   1266   return CreateMemForInlineAsm(SegReg, Disp, BaseReg, IndexReg, Scale, Start,
   1267                                End, Size, SM.getSymName(), Info);
   1268 }
   1269 
   1270 // Inline assembly may use variable names with namespace alias qualifiers.
   1271 bool X86AsmParser::ParseIntelIdentifier(const MCExpr *&Val,
   1272                                         StringRef &Identifier,
   1273                                         InlineAsmIdentifierInfo &Info,
   1274                                         bool IsUnevaluatedOperand, SMLoc &End) {
   1275   assert (isParsingInlineAsm() && "Expected to be parsing inline assembly.");
   1276   Val = nullptr;
   1277 
   1278   StringRef LineBuf(Identifier.data());
   1279   SemaCallback->LookupInlineAsmIdentifier(LineBuf, Info, IsUnevaluatedOperand);
   1280 
   1281   const AsmToken &Tok = Parser.getTok();
   1282 
   1283   // Advance the token stream until the end of the current token is
   1284   // after the end of what the frontend claimed.
   1285   const char *EndPtr = Tok.getLoc().getPointer() + LineBuf.size();
   1286   while (true) {
   1287     End = Tok.getEndLoc();
   1288     getLexer().Lex();
   1289 
   1290     assert(End.getPointer() <= EndPtr && "frontend claimed part of a token?");
   1291     if (End.getPointer() == EndPtr) break;
   1292   }
   1293 
   1294   // Create the symbol reference.
   1295   Identifier = LineBuf;
   1296   MCSymbol *Sym = getContext().GetOrCreateSymbol(Identifier);
   1297   MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
   1298   Val = MCSymbolRefExpr::Create(Sym, Variant, getParser().getContext());
   1299   return false;
   1300 }
   1301 
   1302 /// \brief Parse intel style segment override.
   1303 std::unique_ptr<X86Operand>
   1304 X86AsmParser::ParseIntelSegmentOverride(unsigned SegReg, SMLoc Start,
   1305                                         unsigned Size) {
   1306   assert(SegReg != 0 && "Tried to parse a segment override without a segment!");
   1307   const AsmToken &Tok = Parser.getTok(); // Eat colon.
   1308   if (Tok.isNot(AsmToken::Colon))
   1309     return ErrorOperand(Tok.getLoc(), "Expected ':' token!");
   1310   Parser.Lex(); // Eat ':'
   1311 
   1312   int64_t ImmDisp = 0;
   1313   if (getLexer().is(AsmToken::Integer)) {
   1314     ImmDisp = Tok.getIntVal();
   1315     AsmToken ImmDispToken = Parser.Lex(); // Eat the integer.
   1316 
   1317     if (isParsingInlineAsm())
   1318       InstInfo->AsmRewrites->push_back(
   1319           AsmRewrite(AOK_ImmPrefix, ImmDispToken.getLoc()));
   1320 
   1321     if (getLexer().isNot(AsmToken::LBrac)) {
   1322       // An immediate following a 'segment register', 'colon' token sequence can
   1323       // be followed by a bracketed expression.  If it isn't we know we have our
   1324       // final segment override.
   1325       const MCExpr *Disp = MCConstantExpr::Create(ImmDisp, getContext());
   1326       return X86Operand::CreateMem(SegReg, Disp, /*BaseReg=*/0, /*IndexReg=*/0,
   1327                                    /*Scale=*/1, Start, ImmDispToken.getEndLoc(),
   1328                                    Size);
   1329     }
   1330   }
   1331 
   1332   if (getLexer().is(AsmToken::LBrac))
   1333     return ParseIntelBracExpression(SegReg, Start, ImmDisp, Size);
   1334 
   1335   const MCExpr *Val;
   1336   SMLoc End;
   1337   if (!isParsingInlineAsm()) {
   1338     if (getParser().parsePrimaryExpr(Val, End))
   1339       return ErrorOperand(Tok.getLoc(), "unknown token in expression");
   1340 
   1341     return X86Operand::CreateMem(Val, Start, End, Size);
   1342   }
   1343 
   1344   InlineAsmIdentifierInfo Info;
   1345   StringRef Identifier = Tok.getString();
   1346   if (ParseIntelIdentifier(Val, Identifier, Info,
   1347                            /*Unevaluated=*/false, End))
   1348     return nullptr;
   1349   return CreateMemForInlineAsm(/*SegReg=*/0, Val, /*BaseReg=*/0,/*IndexReg=*/0,
   1350                                /*Scale=*/1, Start, End, Size, Identifier, Info);
   1351 }
   1352 
   1353 /// ParseIntelMemOperand - Parse intel style memory operand.
   1354 std::unique_ptr<X86Operand> X86AsmParser::ParseIntelMemOperand(int64_t ImmDisp,
   1355                                                                SMLoc Start,
   1356                                                                unsigned Size) {
   1357   const AsmToken &Tok = Parser.getTok();
   1358   SMLoc End;
   1359 
   1360   // Parse ImmDisp [ BaseReg + Scale*IndexReg + Disp ].
   1361   if (getLexer().is(AsmToken::LBrac))
   1362     return ParseIntelBracExpression(/*SegReg=*/0, Start, ImmDisp, Size);
   1363   assert(ImmDisp == 0);
   1364 
   1365   const MCExpr *Val;
   1366   if (!isParsingInlineAsm()) {
   1367     if (getParser().parsePrimaryExpr(Val, End))
   1368       return ErrorOperand(Tok.getLoc(), "unknown token in expression");
   1369 
   1370     return X86Operand::CreateMem(Val, Start, End, Size);
   1371   }
   1372 
   1373   InlineAsmIdentifierInfo Info;
   1374   StringRef Identifier = Tok.getString();
   1375   if (ParseIntelIdentifier(Val, Identifier, Info,
   1376                            /*Unevaluated=*/false, End))
   1377     return nullptr;
   1378 
   1379   if (!getLexer().is(AsmToken::LBrac))
   1380     return CreateMemForInlineAsm(/*SegReg=*/0, Val, /*BaseReg=*/0, /*IndexReg=*/0,
   1381                                  /*Scale=*/1, Start, End, Size, Identifier, Info);
   1382 
   1383   Parser.Lex(); // Eat '['
   1384 
   1385   // Parse Identifier [ ImmDisp ]
   1386   IntelExprStateMachine SM(/*ImmDisp=*/0, /*StopOnLBrac=*/true,
   1387                            /*AddImmPrefix=*/false);
   1388   if (ParseIntelExpression(SM, End))
   1389     return nullptr;
   1390 
   1391   if (SM.getSym()) {
   1392     Error(Start, "cannot use more than one symbol in memory operand");
   1393     return nullptr;
   1394   }
   1395   if (SM.getBaseReg()) {
   1396     Error(Start, "cannot use base register with variable reference");
   1397     return nullptr;
   1398   }
   1399   if (SM.getIndexReg()) {
   1400     Error(Start, "cannot use index register with variable reference");
   1401     return nullptr;
   1402   }
   1403 
   1404   const MCExpr *Disp = MCConstantExpr::Create(SM.getImm(), getContext());
   1405   // BaseReg is non-zero to avoid assertions.  In the context of inline asm,
   1406   // we're pointing to a local variable in memory, so the base register is
   1407   // really the frame or stack pointer.
   1408   return X86Operand::CreateMem(/*SegReg=*/0, Disp, /*BaseReg=*/1, /*IndexReg=*/0,
   1409                                /*Scale=*/1, Start, End, Size, Identifier,
   1410                                Info.OpDecl);
   1411 }
   1412 
   1413 /// Parse the '.' operator.
   1414 bool X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp,
   1415                                                 const MCExpr *&NewDisp) {
   1416   const AsmToken &Tok = Parser.getTok();
   1417   int64_t OrigDispVal, DotDispVal;
   1418 
   1419   // FIXME: Handle non-constant expressions.
   1420   if (const MCConstantExpr *OrigDisp = dyn_cast<MCConstantExpr>(Disp))
   1421     OrigDispVal = OrigDisp->getValue();
   1422   else
   1423     return Error(Tok.getLoc(), "Non-constant offsets are not supported!");
   1424 
   1425   // Drop the optional '.'.
   1426   StringRef DotDispStr = Tok.getString();
   1427   if (DotDispStr.startswith("."))
   1428     DotDispStr = DotDispStr.drop_front(1);
   1429 
   1430   // .Imm gets lexed as a real.
   1431   if (Tok.is(AsmToken::Real)) {
   1432     APInt DotDisp;
   1433     DotDispStr.getAsInteger(10, DotDisp);
   1434     DotDispVal = DotDisp.getZExtValue();
   1435   } else if (isParsingInlineAsm() && Tok.is(AsmToken::Identifier)) {
   1436     unsigned DotDisp;
   1437     std::pair<StringRef, StringRef> BaseMember = DotDispStr.split('.');
   1438     if (SemaCallback->LookupInlineAsmField(BaseMember.first, BaseMember.second,
   1439                                            DotDisp))
   1440       return Error(Tok.getLoc(), "Unable to lookup field reference!");
   1441     DotDispVal = DotDisp;
   1442   } else
   1443     return Error(Tok.getLoc(), "Unexpected token type!");
   1444 
   1445   if (isParsingInlineAsm() && Tok.is(AsmToken::Identifier)) {
   1446     SMLoc Loc = SMLoc::getFromPointer(DotDispStr.data());
   1447     unsigned Len = DotDispStr.size();
   1448     unsigned Val = OrigDispVal + DotDispVal;
   1449     InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_DotOperator, Loc, Len,
   1450                                                 Val));
   1451   }
   1452 
   1453   NewDisp = MCConstantExpr::Create(OrigDispVal + DotDispVal, getContext());
   1454   return false;
   1455 }
   1456 
   1457 /// Parse the 'offset' operator.  This operator is used to specify the
   1458 /// location rather then the content of a variable.
   1459 std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOffsetOfOperator() {
   1460   const AsmToken &Tok = Parser.getTok();
   1461   SMLoc OffsetOfLoc = Tok.getLoc();
   1462   Parser.Lex(); // Eat offset.
   1463 
   1464   const MCExpr *Val;
   1465   InlineAsmIdentifierInfo Info;
   1466   SMLoc Start = Tok.getLoc(), End;
   1467   StringRef Identifier = Tok.getString();
   1468   if (ParseIntelIdentifier(Val, Identifier, Info,
   1469                            /*Unevaluated=*/false, End))
   1470     return nullptr;
   1471 
   1472   // Don't emit the offset operator.
   1473   InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, OffsetOfLoc, 7));
   1474 
   1475   // The offset operator will have an 'r' constraint, thus we need to create
   1476   // register operand to ensure proper matching.  Just pick a GPR based on
   1477   // the size of a pointer.
   1478   unsigned RegNo =
   1479       is64BitMode() ? X86::RBX : (is32BitMode() ? X86::EBX : X86::BX);
   1480   return X86Operand::CreateReg(RegNo, Start, End, /*GetAddress=*/true,
   1481                                OffsetOfLoc, Identifier, Info.OpDecl);
   1482 }
   1483 
   1484 enum IntelOperatorKind {
   1485   IOK_LENGTH,
   1486   IOK_SIZE,
   1487   IOK_TYPE
   1488 };
   1489 
   1490 /// Parse the 'LENGTH', 'TYPE' and 'SIZE' operators.  The LENGTH operator
   1491 /// returns the number of elements in an array.  It returns the value 1 for
   1492 /// non-array variables.  The SIZE operator returns the size of a C or C++
   1493 /// variable.  A variable's size is the product of its LENGTH and TYPE.  The
   1494 /// TYPE operator returns the size of a C or C++ type or variable. If the
   1495 /// variable is an array, TYPE returns the size of a single element.
   1496 std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOperator(unsigned OpKind) {
   1497   const AsmToken &Tok = Parser.getTok();
   1498   SMLoc TypeLoc = Tok.getLoc();
   1499   Parser.Lex(); // Eat operator.
   1500 
   1501   const MCExpr *Val = nullptr;
   1502   InlineAsmIdentifierInfo Info;
   1503   SMLoc Start = Tok.getLoc(), End;
   1504   StringRef Identifier = Tok.getString();
   1505   if (ParseIntelIdentifier(Val, Identifier, Info,
   1506                            /*Unevaluated=*/true, End))
   1507     return nullptr;
   1508 
   1509   if (!Info.OpDecl)
   1510     return ErrorOperand(Start, "unable to lookup expression");
   1511 
   1512   unsigned CVal = 0;
   1513   switch(OpKind) {
   1514   default: llvm_unreachable("Unexpected operand kind!");
   1515   case IOK_LENGTH: CVal = Info.Length; break;
   1516   case IOK_SIZE: CVal = Info.Size; break;
   1517   case IOK_TYPE: CVal = Info.Type; break;
   1518   }
   1519 
   1520   // Rewrite the type operator and the C or C++ type or variable in terms of an
   1521   // immediate.  E.g. TYPE foo -> $$4
   1522   unsigned Len = End.getPointer() - TypeLoc.getPointer();
   1523   InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Imm, TypeLoc, Len, CVal));
   1524 
   1525   const MCExpr *Imm = MCConstantExpr::Create(CVal, getContext());
   1526   return X86Operand::CreateImm(Imm, Start, End);
   1527 }
   1528 
   1529 std::unique_ptr<X86Operand> X86AsmParser::ParseIntelOperand() {
   1530   const AsmToken &Tok = Parser.getTok();
   1531   SMLoc Start, End;
   1532 
   1533   // Offset, length, type and size operators.
   1534   if (isParsingInlineAsm()) {
   1535     StringRef AsmTokStr = Tok.getString();
   1536     if (AsmTokStr == "offset" || AsmTokStr == "OFFSET")
   1537       return ParseIntelOffsetOfOperator();
   1538     if (AsmTokStr == "length" || AsmTokStr == "LENGTH")
   1539       return ParseIntelOperator(IOK_LENGTH);
   1540     if (AsmTokStr == "size" || AsmTokStr == "SIZE")
   1541       return ParseIntelOperator(IOK_SIZE);
   1542     if (AsmTokStr == "type" || AsmTokStr == "TYPE")
   1543       return ParseIntelOperator(IOK_TYPE);
   1544   }
   1545 
   1546   unsigned Size = getIntelMemOperandSize(Tok.getString());
   1547   if (Size) {
   1548     Parser.Lex(); // Eat operand size (e.g., byte, word).
   1549     if (Tok.getString() != "PTR" && Tok.getString() != "ptr")
   1550       return ErrorOperand(Start, "Expected 'PTR' or 'ptr' token!");
   1551     Parser.Lex(); // Eat ptr.
   1552   }
   1553   Start = Tok.getLoc();
   1554 
   1555   // Immediate.
   1556   if (getLexer().is(AsmToken::Integer) || getLexer().is(AsmToken::Minus) ||
   1557       getLexer().is(AsmToken::Tilde) || getLexer().is(AsmToken::LParen)) {
   1558     AsmToken StartTok = Tok;
   1559     IntelExprStateMachine SM(/*Imm=*/0, /*StopOnLBrac=*/true,
   1560                              /*AddImmPrefix=*/false);
   1561     if (ParseIntelExpression(SM, End))
   1562       return nullptr;
   1563 
   1564     int64_t Imm = SM.getImm();
   1565     if (isParsingInlineAsm()) {
   1566       unsigned Len = Tok.getLoc().getPointer() - Start.getPointer();
   1567       if (StartTok.getString().size() == Len)
   1568         // Just add a prefix if this wasn't a complex immediate expression.
   1569         InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_ImmPrefix, Start));
   1570       else
   1571         // Otherwise, rewrite the complex expression as a single immediate.
   1572         InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Imm, Start, Len, Imm));
   1573     }
   1574 
   1575     if (getLexer().isNot(AsmToken::LBrac)) {
   1576       // If a directional label (ie. 1f or 2b) was parsed above from
   1577       // ParseIntelExpression() then SM.getSym() was set to a pointer to
   1578       // to the MCExpr with the directional local symbol and this is a
   1579       // memory operand not an immediate operand.
   1580       if (SM.getSym())
   1581         return X86Operand::CreateMem(SM.getSym(), Start, End, Size);
   1582 
   1583       const MCExpr *ImmExpr = MCConstantExpr::Create(Imm, getContext());
   1584       return X86Operand::CreateImm(ImmExpr, Start, End);
   1585     }
   1586 
   1587     // Only positive immediates are valid.
   1588     if (Imm < 0)
   1589       return ErrorOperand(Start, "expected a positive immediate displacement "
   1590                           "before bracketed expr.");
   1591 
   1592     // Parse ImmDisp [ BaseReg + Scale*IndexReg + Disp ].
   1593     return ParseIntelMemOperand(Imm, Start, Size);
   1594   }
   1595 
   1596   // Register.
   1597   unsigned RegNo = 0;
   1598   if (!ParseRegister(RegNo, Start, End)) {
   1599     // If this is a segment register followed by a ':', then this is the start
   1600     // of a segment override, otherwise this is a normal register reference.
   1601     if (getLexer().isNot(AsmToken::Colon))
   1602       return X86Operand::CreateReg(RegNo, Start, End);
   1603 
   1604     return ParseIntelSegmentOverride(/*SegReg=*/RegNo, Start, Size);
   1605   }
   1606 
   1607   // Memory operand.
   1608   return ParseIntelMemOperand(/*Disp=*/0, Start, Size);
   1609 }
   1610 
   1611 std::unique_ptr<X86Operand> X86AsmParser::ParseATTOperand() {
   1612   switch (getLexer().getKind()) {
   1613   default:
   1614     // Parse a memory operand with no segment register.
   1615     return ParseMemOperand(0, Parser.getTok().getLoc());
   1616   case AsmToken::Percent: {
   1617     // Read the register.
   1618     unsigned RegNo;
   1619     SMLoc Start, End;
   1620     if (ParseRegister(RegNo, Start, End)) return nullptr;
   1621     if (RegNo == X86::EIZ || RegNo == X86::RIZ) {
   1622       Error(Start, "%eiz and %riz can only be used as index registers",
   1623             SMRange(Start, End));
   1624       return nullptr;
   1625     }
   1626 
   1627     // If this is a segment register followed by a ':', then this is the start
   1628     // of a memory reference, otherwise this is a normal register reference.
   1629     if (getLexer().isNot(AsmToken::Colon))
   1630       return X86Operand::CreateReg(RegNo, Start, End);
   1631 
   1632     getParser().Lex(); // Eat the colon.
   1633     return ParseMemOperand(RegNo, Start);
   1634   }
   1635   case AsmToken::Dollar: {
   1636     // $42 -> immediate.
   1637     SMLoc Start = Parser.getTok().getLoc(), End;
   1638     Parser.Lex();
   1639     const MCExpr *Val;
   1640     if (getParser().parseExpression(Val, End))
   1641       return nullptr;
   1642     return X86Operand::CreateImm(Val, Start, End);
   1643   }
   1644   }
   1645 }
   1646 
   1647 bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands,
   1648                                        const MCParsedAsmOperand &Op) {
   1649   if(STI.getFeatureBits() & X86::FeatureAVX512) {
   1650     if (getLexer().is(AsmToken::LCurly)) {
   1651       // Eat "{" and mark the current place.
   1652       const SMLoc consumedToken = consumeToken();
   1653       // Distinguish {1to<NUM>} from {%k<NUM>}.
   1654       if(getLexer().is(AsmToken::Integer)) {
   1655         // Parse memory broadcasting ({1to<NUM>}).
   1656         if (getLexer().getTok().getIntVal() != 1)
   1657           return !ErrorAndEatStatement(getLexer().getLoc(),
   1658                                        "Expected 1to<NUM> at this point");
   1659         Parser.Lex();  // Eat "1" of 1to8
   1660         if (!getLexer().is(AsmToken::Identifier) ||
   1661             !getLexer().getTok().getIdentifier().startswith("to"))
   1662           return !ErrorAndEatStatement(getLexer().getLoc(),
   1663                                        "Expected 1to<NUM> at this point");
   1664         // Recognize only reasonable suffixes.
   1665         const char *BroadcastPrimitive =
   1666           StringSwitch<const char*>(getLexer().getTok().getIdentifier())
   1667             .Case("to8",  "{1to8}")
   1668             .Case("to16", "{1to16}")
   1669             .Default(nullptr);
   1670         if (!BroadcastPrimitive)
   1671           return !ErrorAndEatStatement(getLexer().getLoc(),
   1672                                        "Invalid memory broadcast primitive.");
   1673         Parser.Lex();  // Eat "toN" of 1toN
   1674         if (!getLexer().is(AsmToken::RCurly))
   1675           return !ErrorAndEatStatement(getLexer().getLoc(),
   1676                                        "Expected } at this point");
   1677         Parser.Lex();  // Eat "}"
   1678         Operands.push_back(X86Operand::CreateToken(BroadcastPrimitive,
   1679                                                    consumedToken));
   1680         // No AVX512 specific primitives can pass
   1681         // after memory broadcasting, so return.
   1682         return true;
   1683       } else {
   1684         // Parse mask register {%k1}
   1685         Operands.push_back(X86Operand::CreateToken("{", consumedToken));
   1686         if (std::unique_ptr<X86Operand> Op = ParseOperand()) {
   1687           Operands.push_back(std::move(Op));
   1688           if (!getLexer().is(AsmToken::RCurly))
   1689             return !ErrorAndEatStatement(getLexer().getLoc(),
   1690                                          "Expected } at this point");
   1691           Operands.push_back(X86Operand::CreateToken("}", consumeToken()));
   1692 
   1693           // Parse "zeroing non-masked" semantic {z}
   1694           if (getLexer().is(AsmToken::LCurly)) {
   1695             Operands.push_back(X86Operand::CreateToken("{z}", consumeToken()));
   1696             if (!getLexer().is(AsmToken::Identifier) ||
   1697                 getLexer().getTok().getIdentifier() != "z")
   1698               return !ErrorAndEatStatement(getLexer().getLoc(),
   1699                                            "Expected z at this point");
   1700             Parser.Lex();  // Eat the z
   1701             if (!getLexer().is(AsmToken::RCurly))
   1702               return !ErrorAndEatStatement(getLexer().getLoc(),
   1703                                            "Expected } at this point");
   1704             Parser.Lex();  // Eat the }
   1705           }
   1706         }
   1707       }
   1708     }
   1709   }
   1710   return true;
   1711 }
   1712 
   1713 /// ParseMemOperand: segment: disp(basereg, indexreg, scale).  The '%ds:' prefix
   1714 /// has already been parsed if present.
   1715 std::unique_ptr<X86Operand> X86AsmParser::ParseMemOperand(unsigned SegReg,
   1716                                                           SMLoc MemStart) {
   1717 
   1718   // We have to disambiguate a parenthesized expression "(4+5)" from the start
   1719   // of a memory operand with a missing displacement "(%ebx)" or "(,%eax)".  The
   1720   // only way to do this without lookahead is to eat the '(' and see what is
   1721   // after it.
   1722   const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
   1723   if (getLexer().isNot(AsmToken::LParen)) {
   1724     SMLoc ExprEnd;
   1725     if (getParser().parseExpression(Disp, ExprEnd)) return nullptr;
   1726 
   1727     // After parsing the base expression we could either have a parenthesized
   1728     // memory address or not.  If not, return now.  If so, eat the (.
   1729     if (getLexer().isNot(AsmToken::LParen)) {
   1730       // Unless we have a segment register, treat this as an immediate.
   1731       if (SegReg == 0)
   1732         return X86Operand::CreateMem(Disp, MemStart, ExprEnd);
   1733       return X86Operand::CreateMem(SegReg, Disp, 0, 0, 1, MemStart, ExprEnd);
   1734     }
   1735 
   1736     // Eat the '('.
   1737     Parser.Lex();
   1738   } else {
   1739     // Okay, we have a '('.  We don't know if this is an expression or not, but
   1740     // so we have to eat the ( to see beyond it.
   1741     SMLoc LParenLoc = Parser.getTok().getLoc();
   1742     Parser.Lex(); // Eat the '('.
   1743 
   1744     if (getLexer().is(AsmToken::Percent) || getLexer().is(AsmToken::Comma)) {
   1745       // Nothing to do here, fall into the code below with the '(' part of the
   1746       // memory operand consumed.
   1747     } else {
   1748       SMLoc ExprEnd;
   1749 
   1750       // It must be an parenthesized expression, parse it now.
   1751       if (getParser().parseParenExpression(Disp, ExprEnd))
   1752         return nullptr;
   1753 
   1754       // After parsing the base expression we could either have a parenthesized
   1755       // memory address or not.  If not, return now.  If so, eat the (.
   1756       if (getLexer().isNot(AsmToken::LParen)) {
   1757         // Unless we have a segment register, treat this as an immediate.
   1758         if (SegReg == 0)
   1759           return X86Operand::CreateMem(Disp, LParenLoc, ExprEnd);
   1760         return X86Operand::CreateMem(SegReg, Disp, 0, 0, 1, MemStart, ExprEnd);
   1761       }
   1762 
   1763       // Eat the '('.
   1764       Parser.Lex();
   1765     }
   1766   }
   1767 
   1768   // If we reached here, then we just ate the ( of the memory operand.  Process
   1769   // the rest of the memory operand.
   1770   unsigned BaseReg = 0, IndexReg = 0, Scale = 1;
   1771   SMLoc IndexLoc, BaseLoc;
   1772 
   1773   if (getLexer().is(AsmToken::Percent)) {
   1774     SMLoc StartLoc, EndLoc;
   1775     BaseLoc = Parser.getTok().getLoc();
   1776     if (ParseRegister(BaseReg, StartLoc, EndLoc)) return nullptr;
   1777     if (BaseReg == X86::EIZ || BaseReg == X86::RIZ) {
   1778       Error(StartLoc, "eiz and riz can only be used as index registers",
   1779             SMRange(StartLoc, EndLoc));
   1780       return nullptr;
   1781     }
   1782   }
   1783 
   1784   if (getLexer().is(AsmToken::Comma)) {
   1785     Parser.Lex(); // Eat the comma.
   1786     IndexLoc = Parser.getTok().getLoc();
   1787 
   1788     // Following the comma we should have either an index register, or a scale
   1789     // value. We don't support the later form, but we want to parse it
   1790     // correctly.
   1791     //
   1792     // Not that even though it would be completely consistent to support syntax
   1793     // like "1(%eax,,1)", the assembler doesn't. Use "eiz" or "riz" for this.
   1794     if (getLexer().is(AsmToken::Percent)) {
   1795       SMLoc L;
   1796       if (ParseRegister(IndexReg, L, L)) return nullptr;
   1797 
   1798       if (getLexer().isNot(AsmToken::RParen)) {
   1799         // Parse the scale amount:
   1800         //  ::= ',' [scale-expression]
   1801         if (getLexer().isNot(AsmToken::Comma)) {
   1802           Error(Parser.getTok().getLoc(),
   1803                 "expected comma in scale expression");
   1804           return nullptr;
   1805         }
   1806         Parser.Lex(); // Eat the comma.
   1807 
   1808         if (getLexer().isNot(AsmToken::RParen)) {
   1809           SMLoc Loc = Parser.getTok().getLoc();
   1810 
   1811           int64_t ScaleVal;
   1812           if (getParser().parseAbsoluteExpression(ScaleVal)){
   1813             Error(Loc, "expected scale expression");
   1814             return nullptr;
   1815           }
   1816 
   1817           // Validate the scale amount.
   1818 	  if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) &&
   1819               ScaleVal != 1) {
   1820             Error(Loc, "scale factor in 16-bit address must be 1");
   1821             return nullptr;
   1822 	  }
   1823           if (ScaleVal != 1 && ScaleVal != 2 && ScaleVal != 4 && ScaleVal != 8){
   1824             Error(Loc, "scale factor in address must be 1, 2, 4 or 8");
   1825             return nullptr;
   1826           }
   1827           Scale = (unsigned)ScaleVal;
   1828         }
   1829       }
   1830     } else if (getLexer().isNot(AsmToken::RParen)) {
   1831       // A scale amount without an index is ignored.
   1832       // index.
   1833       SMLoc Loc = Parser.getTok().getLoc();
   1834 
   1835       int64_t Value;
   1836       if (getParser().parseAbsoluteExpression(Value))
   1837         return nullptr;
   1838 
   1839       if (Value != 1)
   1840         Warning(Loc, "scale factor without index register is ignored");
   1841       Scale = 1;
   1842     }
   1843   }
   1844 
   1845   // Ok, we've eaten the memory operand, verify we have a ')' and eat it too.
   1846   if (getLexer().isNot(AsmToken::RParen)) {
   1847     Error(Parser.getTok().getLoc(), "unexpected token in memory operand");
   1848     return nullptr;
   1849   }
   1850   SMLoc MemEnd = Parser.getTok().getEndLoc();
   1851   Parser.Lex(); // Eat the ')'.
   1852 
   1853   // Check for use of invalid 16-bit registers. Only BX/BP/SI/DI are allowed,
   1854   // and then only in non-64-bit modes. Except for DX, which is a special case
   1855   // because an unofficial form of in/out instructions uses it.
   1856   if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) &&
   1857       (is64BitMode() || (BaseReg != X86::BX && BaseReg != X86::BP &&
   1858                          BaseReg != X86::SI && BaseReg != X86::DI)) &&
   1859       BaseReg != X86::DX) {
   1860     Error(BaseLoc, "invalid 16-bit base register");
   1861     return nullptr;
   1862   }
   1863   if (BaseReg == 0 &&
   1864       X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg)) {
   1865     Error(IndexLoc, "16-bit memory operand may not include only index register");
   1866     return nullptr;
   1867   }
   1868 
   1869   StringRef ErrMsg;
   1870   if (CheckBaseRegAndIndexReg(BaseReg, IndexReg, ErrMsg)) {
   1871     Error(BaseLoc, ErrMsg);
   1872     return nullptr;
   1873   }
   1874 
   1875   return X86Operand::CreateMem(SegReg, Disp, BaseReg, IndexReg, Scale,
   1876                                MemStart, MemEnd);
   1877 }
   1878 
   1879 bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
   1880                                     SMLoc NameLoc, OperandVector &Operands) {
   1881   InstInfo = &Info;
   1882   StringRef PatchedName = Name;
   1883 
   1884   // FIXME: Hack to recognize setneb as setne.
   1885   if (PatchedName.startswith("set") && PatchedName.endswith("b") &&
   1886       PatchedName != "setb" && PatchedName != "setnb")
   1887     PatchedName = PatchedName.substr(0, Name.size()-1);
   1888 
   1889   // FIXME: Hack to recognize cmp<comparison code>{ss,sd,ps,pd}.
   1890   const MCExpr *ExtraImmOp = nullptr;
   1891   if ((PatchedName.startswith("cmp") || PatchedName.startswith("vcmp")) &&
   1892       (PatchedName.endswith("ss") || PatchedName.endswith("sd") ||
   1893        PatchedName.endswith("ps") || PatchedName.endswith("pd"))) {
   1894     bool IsVCMP = PatchedName[0] == 'v';
   1895     unsigned SSECCIdx = IsVCMP ? 4 : 3;
   1896     unsigned SSEComparisonCode = StringSwitch<unsigned>(
   1897       PatchedName.slice(SSECCIdx, PatchedName.size() - 2))
   1898       .Case("eq",       0x00)
   1899       .Case("lt",       0x01)
   1900       .Case("le",       0x02)
   1901       .Case("unord",    0x03)
   1902       .Case("neq",      0x04)
   1903       .Case("nlt",      0x05)
   1904       .Case("nle",      0x06)
   1905       .Case("ord",      0x07)
   1906       /* AVX only from here */
   1907       .Case("eq_uq",    0x08)
   1908       .Case("nge",      0x09)
   1909       .Case("ngt",      0x0A)
   1910       .Case("false",    0x0B)
   1911       .Case("neq_oq",   0x0C)
   1912       .Case("ge",       0x0D)
   1913       .Case("gt",       0x0E)
   1914       .Case("true",     0x0F)
   1915       .Case("eq_os",    0x10)
   1916       .Case("lt_oq",    0x11)
   1917       .Case("le_oq",    0x12)
   1918       .Case("unord_s",  0x13)
   1919       .Case("neq_us",   0x14)
   1920       .Case("nlt_uq",   0x15)
   1921       .Case("nle_uq",   0x16)
   1922       .Case("ord_s",    0x17)
   1923       .Case("eq_us",    0x18)
   1924       .Case("nge_uq",   0x19)
   1925       .Case("ngt_uq",   0x1A)
   1926       .Case("false_os", 0x1B)
   1927       .Case("neq_os",   0x1C)
   1928       .Case("ge_oq",    0x1D)
   1929       .Case("gt_oq",    0x1E)
   1930       .Case("true_us",  0x1F)
   1931       .Default(~0U);
   1932     if (SSEComparisonCode != ~0U && (IsVCMP || SSEComparisonCode < 8)) {
   1933       ExtraImmOp = MCConstantExpr::Create(SSEComparisonCode,
   1934                                           getParser().getContext());
   1935       if (PatchedName.endswith("ss")) {
   1936         PatchedName = IsVCMP ? "vcmpss" : "cmpss";
   1937       } else if (PatchedName.endswith("sd")) {
   1938         PatchedName = IsVCMP ? "vcmpsd" : "cmpsd";
   1939       } else if (PatchedName.endswith("ps")) {
   1940         PatchedName = IsVCMP ? "vcmpps" : "cmpps";
   1941       } else {
   1942         assert(PatchedName.endswith("pd") && "Unexpected mnemonic!");
   1943         PatchedName = IsVCMP ? "vcmppd" : "cmppd";
   1944       }
   1945     }
   1946   }
   1947 
   1948   Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc));
   1949 
   1950   if (ExtraImmOp && !isParsingIntelSyntax())
   1951     Operands.push_back(X86Operand::CreateImm(ExtraImmOp, NameLoc, NameLoc));
   1952 
   1953   // Determine whether this is an instruction prefix.
   1954   bool isPrefix =
   1955     Name == "lock" || Name == "rep" ||
   1956     Name == "repe" || Name == "repz" ||
   1957     Name == "repne" || Name == "repnz" ||
   1958     Name == "rex64" || Name == "data16";
   1959 
   1960 
   1961   // This does the actual operand parsing.  Don't parse any more if we have a
   1962   // prefix juxtaposed with an operation like "lock incl 4(%rax)", because we
   1963   // just want to parse the "lock" as the first instruction and the "incl" as
   1964   // the next one.
   1965   if (getLexer().isNot(AsmToken::EndOfStatement) && !isPrefix) {
   1966 
   1967     // Parse '*' modifier.
   1968     if (getLexer().is(AsmToken::Star))
   1969       Operands.push_back(X86Operand::CreateToken("*", consumeToken()));
   1970 
   1971     // Read the operands.
   1972     while(1) {
   1973       if (std::unique_ptr<X86Operand> Op = ParseOperand()) {
   1974         Operands.push_back(std::move(Op));
   1975         if (!HandleAVX512Operand(Operands, *Operands.back()))
   1976           return true;
   1977       } else {
   1978          Parser.eatToEndOfStatement();
   1979          return true;
   1980       }
   1981       // check for comma and eat it
   1982       if (getLexer().is(AsmToken::Comma))
   1983         Parser.Lex();
   1984       else
   1985         break;
   1986      }
   1987 
   1988     if (getLexer().isNot(AsmToken::EndOfStatement))
   1989       return ErrorAndEatStatement(getLexer().getLoc(),
   1990                                   "unexpected token in argument list");
   1991    }
   1992 
   1993   // Consume the EndOfStatement or the prefix separator Slash
   1994   if (getLexer().is(AsmToken::EndOfStatement) ||
   1995       (isPrefix && getLexer().is(AsmToken::Slash)))
   1996     Parser.Lex();
   1997 
   1998   if (ExtraImmOp && isParsingIntelSyntax())
   1999     Operands.push_back(X86Operand::CreateImm(ExtraImmOp, NameLoc, NameLoc));
   2000 
   2001   // This is a terrible hack to handle "out[bwl]? %al, (%dx)" ->
   2002   // "outb %al, %dx".  Out doesn't take a memory form, but this is a widely
   2003   // documented form in various unofficial manuals, so a lot of code uses it.
   2004   if ((Name == "outb" || Name == "outw" || Name == "outl" || Name == "out") &&
   2005       Operands.size() == 3) {
   2006     X86Operand &Op = (X86Operand &)*Operands.back();
   2007     if (Op.isMem() && Op.Mem.SegReg == 0 &&
   2008         isa<MCConstantExpr>(Op.Mem.Disp) &&
   2009         cast<MCConstantExpr>(Op.Mem.Disp)->getValue() == 0 &&
   2010         Op.Mem.BaseReg == MatchRegisterName("dx") && Op.Mem.IndexReg == 0) {
   2011       SMLoc Loc = Op.getEndLoc();
   2012       Operands.back() = X86Operand::CreateReg(Op.Mem.BaseReg, Loc, Loc);
   2013     }
   2014   }
   2015   // Same hack for "in[bwl]? (%dx), %al" -> "inb %dx, %al".
   2016   if ((Name == "inb" || Name == "inw" || Name == "inl" || Name == "in") &&
   2017       Operands.size() == 3) {
   2018     X86Operand &Op = (X86Operand &)*Operands[1];
   2019     if (Op.isMem() && Op.Mem.SegReg == 0 &&
   2020         isa<MCConstantExpr>(Op.Mem.Disp) &&
   2021         cast<MCConstantExpr>(Op.Mem.Disp)->getValue() == 0 &&
   2022         Op.Mem.BaseReg == MatchRegisterName("dx") && Op.Mem.IndexReg == 0) {
   2023       SMLoc Loc = Op.getEndLoc();
   2024       Operands[1] = X86Operand::CreateReg(Op.Mem.BaseReg, Loc, Loc);
   2025     }
   2026   }
   2027 
   2028   // Append default arguments to "ins[bwld]"
   2029   if (Name.startswith("ins") && Operands.size() == 1 &&
   2030       (Name == "insb" || Name == "insw" || Name == "insl" ||
   2031        Name == "insd" )) {
   2032     if (isParsingIntelSyntax()) {
   2033       Operands.push_back(X86Operand::CreateReg(X86::DX, NameLoc, NameLoc));
   2034       Operands.push_back(DefaultMemDIOperand(NameLoc));
   2035     } else {
   2036       Operands.push_back(X86Operand::CreateReg(X86::DX, NameLoc, NameLoc));
   2037       Operands.push_back(DefaultMemDIOperand(NameLoc));
   2038     }
   2039   }
   2040 
   2041   // Append default arguments to "outs[bwld]"
   2042   if (Name.startswith("outs") && Operands.size() == 1 &&
   2043       (Name == "outsb" || Name == "outsw" || Name == "outsl" ||
   2044        Name == "outsd" )) {
   2045     if (isParsingIntelSyntax()) {
   2046       Operands.push_back(DefaultMemSIOperand(NameLoc));
   2047       Operands.push_back(X86Operand::CreateReg(X86::DX, NameLoc, NameLoc));
   2048     } else {
   2049       Operands.push_back(DefaultMemSIOperand(NameLoc));
   2050       Operands.push_back(X86Operand::CreateReg(X86::DX, NameLoc, NameLoc));
   2051     }
   2052   }
   2053 
   2054   // Transform "lods[bwlq]" into "lods[bwlq] ($SIREG)" for appropriate
   2055   // values of $SIREG according to the mode. It would be nice if this
   2056   // could be achieved with InstAlias in the tables.
   2057   if (Name.startswith("lods") && Operands.size() == 1 &&
   2058       (Name == "lods" || Name == "lodsb" || Name == "lodsw" ||
   2059        Name == "lodsl" || Name == "lodsd" || Name == "lodsq"))
   2060     Operands.push_back(DefaultMemSIOperand(NameLoc));
   2061 
   2062   // Transform "stos[bwlq]" into "stos[bwlq] ($DIREG)" for appropriate
   2063   // values of $DIREG according to the mode. It would be nice if this
   2064   // could be achieved with InstAlias in the tables.
   2065   if (Name.startswith("stos") && Operands.size() == 1 &&
   2066       (Name == "stos" || Name == "stosb" || Name == "stosw" ||
   2067        Name == "stosl" || Name == "stosd" || Name == "stosq"))
   2068     Operands.push_back(DefaultMemDIOperand(NameLoc));
   2069 
   2070   // Transform "scas[bwlq]" into "scas[bwlq] ($DIREG)" for appropriate
   2071   // values of $DIREG according to the mode. It would be nice if this
   2072   // could be achieved with InstAlias in the tables.
   2073   if (Name.startswith("scas") && Operands.size() == 1 &&
   2074       (Name == "scas" || Name == "scasb" || Name == "scasw" ||
   2075        Name == "scasl" || Name == "scasd" || Name == "scasq"))
   2076     Operands.push_back(DefaultMemDIOperand(NameLoc));
   2077 
   2078   // Add default SI and DI operands to "cmps[bwlq]".
   2079   if (Name.startswith("cmps") &&
   2080       (Name == "cmps" || Name == "cmpsb" || Name == "cmpsw" ||
   2081        Name == "cmpsl" || Name == "cmpsd" || Name == "cmpsq")) {
   2082     if (Operands.size() == 1) {
   2083       if (isParsingIntelSyntax()) {
   2084         Operands.push_back(DefaultMemSIOperand(NameLoc));
   2085         Operands.push_back(DefaultMemDIOperand(NameLoc));
   2086       } else {
   2087         Operands.push_back(DefaultMemDIOperand(NameLoc));
   2088         Operands.push_back(DefaultMemSIOperand(NameLoc));
   2089       }
   2090     } else if (Operands.size() == 3) {
   2091       X86Operand &Op = (X86Operand &)*Operands[1];
   2092       X86Operand &Op2 = (X86Operand &)*Operands[2];
   2093       if (!doSrcDstMatch(Op, Op2))
   2094         return Error(Op.getStartLoc(),
   2095                      "mismatching source and destination index registers");
   2096     }
   2097   }
   2098 
   2099   // Add default SI and DI operands to "movs[bwlq]".
   2100   if ((Name.startswith("movs") &&
   2101       (Name == "movs" || Name == "movsb" || Name == "movsw" ||
   2102        Name == "movsl" || Name == "movsd" || Name == "movsq")) ||
   2103       (Name.startswith("smov") &&
   2104       (Name == "smov" || Name == "smovb" || Name == "smovw" ||
   2105        Name == "smovl" || Name == "smovd" || Name == "smovq"))) {
   2106     if (Operands.size() == 1) {
   2107       if (Name == "movsd")
   2108         Operands.back() = X86Operand::CreateToken("movsl", NameLoc);
   2109       if (isParsingIntelSyntax()) {
   2110         Operands.push_back(DefaultMemDIOperand(NameLoc));
   2111         Operands.push_back(DefaultMemSIOperand(NameLoc));
   2112       } else {
   2113         Operands.push_back(DefaultMemSIOperand(NameLoc));
   2114         Operands.push_back(DefaultMemDIOperand(NameLoc));
   2115       }
   2116     } else if (Operands.size() == 3) {
   2117       X86Operand &Op = (X86Operand &)*Operands[1];
   2118       X86Operand &Op2 = (X86Operand &)*Operands[2];
   2119       if (!doSrcDstMatch(Op, Op2))
   2120         return Error(Op.getStartLoc(),
   2121                      "mismatching source and destination index registers");
   2122     }
   2123   }
   2124 
   2125   // FIXME: Hack to handle recognize s{hr,ar,hl} $1, <op>.  Canonicalize to
   2126   // "shift <op>".
   2127   if ((Name.startswith("shr") || Name.startswith("sar") ||
   2128        Name.startswith("shl") || Name.startswith("sal") ||
   2129        Name.startswith("rcl") || Name.startswith("rcr") ||
   2130        Name.startswith("rol") || Name.startswith("ror")) &&
   2131       Operands.size() == 3) {
   2132     if (isParsingIntelSyntax()) {
   2133       // Intel syntax
   2134       X86Operand &Op1 = static_cast<X86Operand &>(*Operands[2]);
   2135       if (Op1.isImm() && isa<MCConstantExpr>(Op1.getImm()) &&
   2136           cast<MCConstantExpr>(Op1.getImm())->getValue() == 1)
   2137         Operands.pop_back();
   2138     } else {
   2139       X86Operand &Op1 = static_cast<X86Operand &>(*Operands[1]);
   2140       if (Op1.isImm() && isa<MCConstantExpr>(Op1.getImm()) &&
   2141           cast<MCConstantExpr>(Op1.getImm())->getValue() == 1)
   2142         Operands.erase(Operands.begin() + 1);
   2143     }
   2144   }
   2145 
   2146   // Transforms "int $3" into "int3" as a size optimization.  We can't write an
   2147   // instalias with an immediate operand yet.
   2148   if (Name == "int" && Operands.size() == 2) {
   2149     X86Operand &Op1 = static_cast<X86Operand &>(*Operands[1]);
   2150     if (Op1.isImm() && isa<MCConstantExpr>(Op1.getImm()) &&
   2151         cast<MCConstantExpr>(Op1.getImm())->getValue() == 3) {
   2152       Operands.erase(Operands.begin() + 1);
   2153       static_cast<X86Operand &>(*Operands[0]).setTokenValue("int3");
   2154     }
   2155   }
   2156 
   2157   return false;
   2158 }
   2159 
   2160 static bool convertToSExti8(MCInst &Inst, unsigned Opcode, unsigned Reg,
   2161                             bool isCmp) {
   2162   MCInst TmpInst;
   2163   TmpInst.setOpcode(Opcode);
   2164   if (!isCmp)
   2165     TmpInst.addOperand(MCOperand::CreateReg(Reg));
   2166   TmpInst.addOperand(MCOperand::CreateReg(Reg));
   2167   TmpInst.addOperand(Inst.getOperand(0));
   2168   Inst = TmpInst;
   2169   return true;
   2170 }
   2171 
   2172 static bool convert16i16to16ri8(MCInst &Inst, unsigned Opcode,
   2173                                 bool isCmp = false) {
   2174   if (!Inst.getOperand(0).isImm() ||
   2175       !isImmSExti16i8Value(Inst.getOperand(0).getImm()))
   2176     return false;
   2177 
   2178   return convertToSExti8(Inst, Opcode, X86::AX, isCmp);
   2179 }
   2180 
   2181 static bool convert32i32to32ri8(MCInst &Inst, unsigned Opcode,
   2182                                 bool isCmp = false) {
   2183   if (!Inst.getOperand(0).isImm() ||
   2184       !isImmSExti32i8Value(Inst.getOperand(0).getImm()))
   2185     return false;
   2186 
   2187   return convertToSExti8(Inst, Opcode, X86::EAX, isCmp);
   2188 }
   2189 
   2190 static bool convert64i32to64ri8(MCInst &Inst, unsigned Opcode,
   2191                                 bool isCmp = false) {
   2192   if (!Inst.getOperand(0).isImm() ||
   2193       !isImmSExti64i8Value(Inst.getOperand(0).getImm()))
   2194     return false;
   2195 
   2196   return convertToSExti8(Inst, Opcode, X86::RAX, isCmp);
   2197 }
   2198 
   2199 bool X86AsmParser::processInstruction(MCInst &Inst, const OperandVector &Ops) {
   2200   switch (Inst.getOpcode()) {
   2201   default: return false;
   2202   case X86::AND16i16: return convert16i16to16ri8(Inst, X86::AND16ri8);
   2203   case X86::AND32i32: return convert32i32to32ri8(Inst, X86::AND32ri8);
   2204   case X86::AND64i32: return convert64i32to64ri8(Inst, X86::AND64ri8);
   2205   case X86::XOR16i16: return convert16i16to16ri8(Inst, X86::XOR16ri8);
   2206   case X86::XOR32i32: return convert32i32to32ri8(Inst, X86::XOR32ri8);
   2207   case X86::XOR64i32: return convert64i32to64ri8(Inst, X86::XOR64ri8);
   2208   case X86::OR16i16:  return convert16i16to16ri8(Inst, X86::OR16ri8);
   2209   case X86::OR32i32:  return convert32i32to32ri8(Inst, X86::OR32ri8);
   2210   case X86::OR64i32:  return convert64i32to64ri8(Inst, X86::OR64ri8);
   2211   case X86::CMP16i16: return convert16i16to16ri8(Inst, X86::CMP16ri8, true);
   2212   case X86::CMP32i32: return convert32i32to32ri8(Inst, X86::CMP32ri8, true);
   2213   case X86::CMP64i32: return convert64i32to64ri8(Inst, X86::CMP64ri8, true);
   2214   case X86::ADD16i16: return convert16i16to16ri8(Inst, X86::ADD16ri8);
   2215   case X86::ADD32i32: return convert32i32to32ri8(Inst, X86::ADD32ri8);
   2216   case X86::ADD64i32: return convert64i32to64ri8(Inst, X86::ADD64ri8);
   2217   case X86::SUB16i16: return convert16i16to16ri8(Inst, X86::SUB16ri8);
   2218   case X86::SUB32i32: return convert32i32to32ri8(Inst, X86::SUB32ri8);
   2219   case X86::SUB64i32: return convert64i32to64ri8(Inst, X86::SUB64ri8);
   2220   case X86::ADC16i16: return convert16i16to16ri8(Inst, X86::ADC16ri8);
   2221   case X86::ADC32i32: return convert32i32to32ri8(Inst, X86::ADC32ri8);
   2222   case X86::ADC64i32: return convert64i32to64ri8(Inst, X86::ADC64ri8);
   2223   case X86::SBB16i16: return convert16i16to16ri8(Inst, X86::SBB16ri8);
   2224   case X86::SBB32i32: return convert32i32to32ri8(Inst, X86::SBB32ri8);
   2225   case X86::SBB64i32: return convert64i32to64ri8(Inst, X86::SBB64ri8);
   2226   case X86::VMOVAPDrr:
   2227   case X86::VMOVAPDYrr:
   2228   case X86::VMOVAPSrr:
   2229   case X86::VMOVAPSYrr:
   2230   case X86::VMOVDQArr:
   2231   case X86::VMOVDQAYrr:
   2232   case X86::VMOVDQUrr:
   2233   case X86::VMOVDQUYrr:
   2234   case X86::VMOVUPDrr:
   2235   case X86::VMOVUPDYrr:
   2236   case X86::VMOVUPSrr:
   2237   case X86::VMOVUPSYrr: {
   2238     if (X86II::isX86_64ExtendedReg(Inst.getOperand(0).getReg()) ||
   2239         !X86II::isX86_64ExtendedReg(Inst.getOperand(1).getReg()))
   2240       return false;
   2241 
   2242     unsigned NewOpc;
   2243     switch (Inst.getOpcode()) {
   2244     default: llvm_unreachable("Invalid opcode");
   2245     case X86::VMOVAPDrr:  NewOpc = X86::VMOVAPDrr_REV;  break;
   2246     case X86::VMOVAPDYrr: NewOpc = X86::VMOVAPDYrr_REV; break;
   2247     case X86::VMOVAPSrr:  NewOpc = X86::VMOVAPSrr_REV;  break;
   2248     case X86::VMOVAPSYrr: NewOpc = X86::VMOVAPSYrr_REV; break;
   2249     case X86::VMOVDQArr:  NewOpc = X86::VMOVDQArr_REV;  break;
   2250     case X86::VMOVDQAYrr: NewOpc = X86::VMOVDQAYrr_REV; break;
   2251     case X86::VMOVDQUrr:  NewOpc = X86::VMOVDQUrr_REV;  break;
   2252     case X86::VMOVDQUYrr: NewOpc = X86::VMOVDQUYrr_REV; break;
   2253     case X86::VMOVUPDrr:  NewOpc = X86::VMOVUPDrr_REV;  break;
   2254     case X86::VMOVUPDYrr: NewOpc = X86::VMOVUPDYrr_REV; break;
   2255     case X86::VMOVUPSrr:  NewOpc = X86::VMOVUPSrr_REV;  break;
   2256     case X86::VMOVUPSYrr: NewOpc = X86::VMOVUPSYrr_REV; break;
   2257     }
   2258     Inst.setOpcode(NewOpc);
   2259     return true;
   2260   }
   2261   case X86::VMOVSDrr:
   2262   case X86::VMOVSSrr: {
   2263     if (X86II::isX86_64ExtendedReg(Inst.getOperand(0).getReg()) ||
   2264         !X86II::isX86_64ExtendedReg(Inst.getOperand(2).getReg()))
   2265       return false;
   2266     unsigned NewOpc;
   2267     switch (Inst.getOpcode()) {
   2268     default: llvm_unreachable("Invalid opcode");
   2269     case X86::VMOVSDrr: NewOpc = X86::VMOVSDrr_REV;   break;
   2270     case X86::VMOVSSrr: NewOpc = X86::VMOVSSrr_REV;   break;
   2271     }
   2272     Inst.setOpcode(NewOpc);
   2273     return true;
   2274   }
   2275   }
   2276 }
   2277 
   2278 static const char *getSubtargetFeatureName(unsigned Val);
   2279 
   2280 void X86AsmParser::EmitInstruction(MCInst &Inst, OperandVector &Operands,
   2281                                    MCStreamer &Out) {
   2282   Instrumentation->InstrumentInstruction(Inst, Operands, getContext(), MII,
   2283                                          Out);
   2284   Out.EmitInstruction(Inst, STI);
   2285 }
   2286 
   2287 bool X86AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
   2288                                            OperandVector &Operands,
   2289                                            MCStreamer &Out, unsigned &ErrorInfo,
   2290                                            bool MatchingInlineAsm) {
   2291   assert(!Operands.empty() && "Unexpect empty operand list!");
   2292   X86Operand &Op = static_cast<X86Operand &>(*Operands[0]);
   2293   assert(Op.isToken() && "Leading operand should always be a mnemonic!");
   2294   ArrayRef<SMRange> EmptyRanges = None;
   2295 
   2296   // First, handle aliases that expand to multiple instructions.
   2297   // FIXME: This should be replaced with a real .td file alias mechanism.
   2298   // Also, MatchInstructionImpl should actually *do* the EmitInstruction
   2299   // call.
   2300   if (Op.getToken() == "fstsw" || Op.getToken() == "fstcw" ||
   2301       Op.getToken() == "fstsww" || Op.getToken() == "fstcww" ||
   2302       Op.getToken() == "finit" || Op.getToken() == "fsave" ||
   2303       Op.getToken() == "fstenv" || Op.getToken() == "fclex") {
   2304     MCInst Inst;
   2305     Inst.setOpcode(X86::WAIT);
   2306     Inst.setLoc(IDLoc);
   2307     if (!MatchingInlineAsm)
   2308       EmitInstruction(Inst, Operands, Out);
   2309 
   2310     const char *Repl = StringSwitch<const char *>(Op.getToken())
   2311                            .Case("finit", "fninit")
   2312                            .Case("fsave", "fnsave")
   2313                            .Case("fstcw", "fnstcw")
   2314                            .Case("fstcww", "fnstcw")
   2315                            .Case("fstenv", "fnstenv")
   2316                            .Case("fstsw", "fnstsw")
   2317                            .Case("fstsww", "fnstsw")
   2318                            .Case("fclex", "fnclex")
   2319                            .Default(nullptr);
   2320     assert(Repl && "Unknown wait-prefixed instruction");
   2321     Operands[0] = X86Operand::CreateToken(Repl, IDLoc);
   2322   }
   2323 
   2324   bool WasOriginallyInvalidOperand = false;
   2325   MCInst Inst;
   2326 
   2327   // First, try a direct match.
   2328   switch (MatchInstructionImpl(Operands, Inst,
   2329                                ErrorInfo, MatchingInlineAsm,
   2330                                isParsingIntelSyntax())) {
   2331   default: break;
   2332   case Match_Success:
   2333     // Some instructions need post-processing to, for example, tweak which
   2334     // encoding is selected. Loop on it while changes happen so the
   2335     // individual transformations can chain off each other.
   2336     if (!MatchingInlineAsm)
   2337       while (processInstruction(Inst, Operands))
   2338         ;
   2339 
   2340     Inst.setLoc(IDLoc);
   2341     if (!MatchingInlineAsm)
   2342       EmitInstruction(Inst, Operands, Out);
   2343     Opcode = Inst.getOpcode();
   2344     return false;
   2345   case Match_MissingFeature: {
   2346     assert(ErrorInfo && "Unknown missing feature!");
   2347     // Special case the error message for the very common case where only
   2348     // a single subtarget feature is missing.
   2349     std::string Msg = "instruction requires:";
   2350     unsigned Mask = 1;
   2351     for (unsigned i = 0; i < (sizeof(ErrorInfo)*8-1); ++i) {
   2352       if (ErrorInfo & Mask) {
   2353         Msg += " ";
   2354         Msg += getSubtargetFeatureName(ErrorInfo & Mask);
   2355       }
   2356       Mask <<= 1;
   2357     }
   2358     return Error(IDLoc, Msg, EmptyRanges, MatchingInlineAsm);
   2359   }
   2360   case Match_InvalidOperand:
   2361     WasOriginallyInvalidOperand = true;
   2362     break;
   2363   case Match_MnemonicFail:
   2364     break;
   2365   }
   2366 
   2367   // FIXME: Ideally, we would only attempt suffix matches for things which are
   2368   // valid prefixes, and we could just infer the right unambiguous
   2369   // type. However, that requires substantially more matcher support than the
   2370   // following hack.
   2371 
   2372   // Change the operand to point to a temporary token.
   2373   StringRef Base = Op.getToken();
   2374   SmallString<16> Tmp;
   2375   Tmp += Base;
   2376   Tmp += ' ';
   2377   Op.setTokenValue(Tmp.str());
   2378 
   2379   // If this instruction starts with an 'f', then it is a floating point stack
   2380   // instruction.  These come in up to three forms for 32-bit, 64-bit, and
   2381   // 80-bit floating point, which use the suffixes s,l,t respectively.
   2382   //
   2383   // Otherwise, we assume that this may be an integer instruction, which comes
   2384   // in 8/16/32/64-bit forms using the b,w,l,q suffixes respectively.
   2385   const char *Suffixes = Base[0] != 'f' ? "bwlq" : "slt\0";
   2386 
   2387   // Check for the various suffix matches.
   2388   Tmp[Base.size()] = Suffixes[0];
   2389   unsigned ErrorInfoIgnore;
   2390   unsigned ErrorInfoMissingFeature = 0; // Init suppresses compiler warnings.
   2391   unsigned Match1, Match2, Match3, Match4;
   2392 
   2393   Match1 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
   2394                                 MatchingInlineAsm, isParsingIntelSyntax());
   2395   // If this returned as a missing feature failure, remember that.
   2396   if (Match1 == Match_MissingFeature)
   2397     ErrorInfoMissingFeature = ErrorInfoIgnore;
   2398   Tmp[Base.size()] = Suffixes[1];
   2399   Match2 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
   2400                                 MatchingInlineAsm, isParsingIntelSyntax());
   2401   // If this returned as a missing feature failure, remember that.
   2402   if (Match2 == Match_MissingFeature)
   2403     ErrorInfoMissingFeature = ErrorInfoIgnore;
   2404   Tmp[Base.size()] = Suffixes[2];
   2405   Match3 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
   2406                                 MatchingInlineAsm, isParsingIntelSyntax());
   2407   // If this returned as a missing feature failure, remember that.
   2408   if (Match3 == Match_MissingFeature)
   2409     ErrorInfoMissingFeature = ErrorInfoIgnore;
   2410   Tmp[Base.size()] = Suffixes[3];
   2411   Match4 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
   2412                                 MatchingInlineAsm, isParsingIntelSyntax());
   2413   // If this returned as a missing feature failure, remember that.
   2414   if (Match4 == Match_MissingFeature)
   2415     ErrorInfoMissingFeature = ErrorInfoIgnore;
   2416 
   2417   // Restore the old token.
   2418   Op.setTokenValue(Base);
   2419 
   2420   // If exactly one matched, then we treat that as a successful match (and the
   2421   // instruction will already have been filled in correctly, since the failing
   2422   // matches won't have modified it).
   2423   unsigned NumSuccessfulMatches =
   2424     (Match1 == Match_Success) + (Match2 == Match_Success) +
   2425     (Match3 == Match_Success) + (Match4 == Match_Success);
   2426   if (NumSuccessfulMatches == 1) {
   2427     Inst.setLoc(IDLoc);
   2428     if (!MatchingInlineAsm)
   2429       EmitInstruction(Inst, Operands, Out);
   2430     Opcode = Inst.getOpcode();
   2431     return false;
   2432   }
   2433 
   2434   // Otherwise, the match failed, try to produce a decent error message.
   2435 
   2436   // If we had multiple suffix matches, then identify this as an ambiguous
   2437   // match.
   2438   if (NumSuccessfulMatches > 1) {
   2439     char MatchChars[4];
   2440     unsigned NumMatches = 0;
   2441     if (Match1 == Match_Success) MatchChars[NumMatches++] = Suffixes[0];
   2442     if (Match2 == Match_Success) MatchChars[NumMatches++] = Suffixes[1];
   2443     if (Match3 == Match_Success) MatchChars[NumMatches++] = Suffixes[2];
   2444     if (Match4 == Match_Success) MatchChars[NumMatches++] = Suffixes[3];
   2445 
   2446     SmallString<126> Msg;
   2447     raw_svector_ostream OS(Msg);
   2448     OS << "ambiguous instructions require an explicit suffix (could be ";
   2449     for (unsigned i = 0; i != NumMatches; ++i) {
   2450       if (i != 0)
   2451         OS << ", ";
   2452       if (i + 1 == NumMatches)
   2453         OS << "or ";
   2454       OS << "'" << Base << MatchChars[i] << "'";
   2455     }
   2456     OS << ")";
   2457     Error(IDLoc, OS.str(), EmptyRanges, MatchingInlineAsm);
   2458     return true;
   2459   }
   2460 
   2461   // Okay, we know that none of the variants matched successfully.
   2462 
   2463   // If all of the instructions reported an invalid mnemonic, then the original
   2464   // mnemonic was invalid.
   2465   if ((Match1 == Match_MnemonicFail) && (Match2 == Match_MnemonicFail) &&
   2466       (Match3 == Match_MnemonicFail) && (Match4 == Match_MnemonicFail)) {
   2467     if (!WasOriginallyInvalidOperand) {
   2468       ArrayRef<SMRange> Ranges =
   2469           MatchingInlineAsm ? EmptyRanges : Op.getLocRange();
   2470       return Error(IDLoc, "invalid instruction mnemonic '" + Base + "'",
   2471                    Ranges, MatchingInlineAsm);
   2472     }
   2473 
   2474     // Recover location info for the operand if we know which was the problem.
   2475     if (ErrorInfo != ~0U) {
   2476       if (ErrorInfo >= Operands.size())
   2477         return Error(IDLoc, "too few operands for instruction",
   2478                      EmptyRanges, MatchingInlineAsm);
   2479 
   2480       X86Operand &Operand = (X86Operand &)*Operands[ErrorInfo];
   2481       if (Operand.getStartLoc().isValid()) {
   2482         SMRange OperandRange = Operand.getLocRange();
   2483         return Error(Operand.getStartLoc(), "invalid operand for instruction",
   2484                      OperandRange, MatchingInlineAsm);
   2485       }
   2486     }
   2487 
   2488     return Error(IDLoc, "invalid operand for instruction", EmptyRanges,
   2489                  MatchingInlineAsm);
   2490   }
   2491 
   2492   // If one instruction matched with a missing feature, report this as a
   2493   // missing feature.
   2494   if ((Match1 == Match_MissingFeature) + (Match2 == Match_MissingFeature) +
   2495       (Match3 == Match_MissingFeature) + (Match4 == Match_MissingFeature) == 1){
   2496     std::string Msg = "instruction requires:";
   2497     unsigned Mask = 1;
   2498     for (unsigned i = 0; i < (sizeof(ErrorInfoMissingFeature)*8-1); ++i) {
   2499       if (ErrorInfoMissingFeature & Mask) {
   2500         Msg += " ";
   2501         Msg += getSubtargetFeatureName(ErrorInfoMissingFeature & Mask);
   2502       }
   2503       Mask <<= 1;
   2504     }
   2505     return Error(IDLoc, Msg, EmptyRanges, MatchingInlineAsm);
   2506   }
   2507 
   2508   // If one instruction matched with an invalid operand, report this as an
   2509   // operand failure.
   2510   if ((Match1 == Match_InvalidOperand) + (Match2 == Match_InvalidOperand) +
   2511       (Match3 == Match_InvalidOperand) + (Match4 == Match_InvalidOperand) == 1){
   2512     Error(IDLoc, "invalid operand for instruction", EmptyRanges,
   2513           MatchingInlineAsm);
   2514     return true;
   2515   }
   2516 
   2517   // If all of these were an outright failure, report it in a useless way.
   2518   Error(IDLoc, "unknown use of instruction mnemonic without a size suffix",
   2519         EmptyRanges, MatchingInlineAsm);
   2520   return true;
   2521 }
   2522 
   2523 
   2524 bool X86AsmParser::ParseDirective(AsmToken DirectiveID) {
   2525   StringRef IDVal = DirectiveID.getIdentifier();
   2526   if (IDVal == ".word")
   2527     return ParseDirectiveWord(2, DirectiveID.getLoc());
   2528   else if (IDVal.startswith(".code"))
   2529     return ParseDirectiveCode(IDVal, DirectiveID.getLoc());
   2530   else if (IDVal.startswith(".att_syntax")) {
   2531     getParser().setAssemblerDialect(0);
   2532     return false;
   2533   } else if (IDVal.startswith(".intel_syntax")) {
   2534     getParser().setAssemblerDialect(1);
   2535     if (getLexer().isNot(AsmToken::EndOfStatement)) {
   2536       // FIXME: Handle noprefix
   2537       if (Parser.getTok().getString() == "noprefix")
   2538         Parser.Lex();
   2539     }
   2540     return false;
   2541   }
   2542   return true;
   2543 }
   2544 
   2545 /// ParseDirectiveWord
   2546 ///  ::= .word [ expression (, expression)* ]
   2547 bool X86AsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
   2548   if (getLexer().isNot(AsmToken::EndOfStatement)) {
   2549     for (;;) {
   2550       const MCExpr *Value;
   2551       if (getParser().parseExpression(Value))
   2552         return false;
   2553 
   2554       getParser().getStreamer().EmitValue(Value, Size);
   2555 
   2556       if (getLexer().is(AsmToken::EndOfStatement))
   2557         break;
   2558 
   2559       // FIXME: Improve diagnostic.
   2560       if (getLexer().isNot(AsmToken::Comma)) {
   2561         Error(L, "unexpected token in directive");
   2562         return false;
   2563       }
   2564       Parser.Lex();
   2565     }
   2566   }
   2567 
   2568   Parser.Lex();
   2569   return false;
   2570 }
   2571 
   2572 /// ParseDirectiveCode
   2573 ///  ::= .code16 | .code32 | .code64
   2574 bool X86AsmParser::ParseDirectiveCode(StringRef IDVal, SMLoc L) {
   2575   if (IDVal == ".code16") {
   2576     Parser.Lex();
   2577     if (!is16BitMode()) {
   2578       SwitchMode(X86::Mode16Bit);
   2579       getParser().getStreamer().EmitAssemblerFlag(MCAF_Code16);
   2580     }
   2581   } else if (IDVal == ".code32") {
   2582     Parser.Lex();
   2583     if (!is32BitMode()) {
   2584       SwitchMode(X86::Mode32Bit);
   2585       getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32);
   2586     }
   2587   } else if (IDVal == ".code64") {
   2588     Parser.Lex();
   2589     if (!is64BitMode()) {
   2590       SwitchMode(X86::Mode64Bit);
   2591       getParser().getStreamer().EmitAssemblerFlag(MCAF_Code64);
   2592     }
   2593   } else {
   2594     Error(L, "unknown directive " + IDVal);
   2595     return false;
   2596   }
   2597 
   2598   return false;
   2599 }
   2600 
   2601 // Force static initialization.
   2602 extern "C" void LLVMInitializeX86AsmParser() {
   2603   RegisterMCAsmParser<X86AsmParser> X(TheX86_32Target);
   2604   RegisterMCAsmParser<X86AsmParser> Y(TheX86_64Target);
   2605 }
   2606 
   2607 #define GET_REGISTER_MATCHER
   2608 #define GET_MATCHER_IMPLEMENTATION
   2609 #define GET_SUBTARGET_FEATURE_NAME
   2610 #include "X86GenAsmMatcher.inc"
   2611