1 //===-- X86AsmParser.cpp - Parse X86 assembly to MCInst instructions ------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "MCTargetDesc/X86BaseInfo.h"
10 #include "MCTargetDesc/X86IntelInstPrinter.h"
11 #include "MCTargetDesc/X86MCExpr.h"
12 #include "MCTargetDesc/X86TargetStreamer.h"
13 #include "TargetInfo/X86TargetInfo.h"
14 #include "X86AsmParserCommon.h"
15 #include "X86Operand.h"
16 #include "llvm/ADT/STLExtras.h"
17 #include "llvm/ADT/SmallString.h"
18 #include "llvm/ADT/SmallVector.h"
19 #include "llvm/ADT/StringSwitch.h"
20 #include "llvm/ADT/Twine.h"
21 #include "llvm/MC/MCContext.h"
22 #include "llvm/MC/MCExpr.h"
23 #include "llvm/MC/MCInst.h"
24 #include "llvm/MC/MCInstrInfo.h"
25 #include "llvm/MC/MCParser/MCAsmLexer.h"
26 #include "llvm/MC/MCParser/MCAsmParser.h"
27 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
28 #include "llvm/MC/MCParser/MCTargetAsmParser.h"
29 #include "llvm/MC/MCRegisterInfo.h"
30 #include "llvm/MC/MCSection.h"
31 #include "llvm/MC/MCStreamer.h"
32 #include "llvm/MC/MCSubtargetInfo.h"
33 #include "llvm/MC/MCSymbol.h"
34 #include "llvm/MC/TargetRegistry.h"
35 #include "llvm/Support/CommandLine.h"
36 #include "llvm/Support/Compiler.h"
37 #include "llvm/Support/SourceMgr.h"
38 #include "llvm/Support/raw_ostream.h"
39 #include <algorithm>
40 #include <memory>
41 
42 using namespace llvm;
43 
44 static cl::opt<bool> LVIInlineAsmHardening(
45     "x86-experimental-lvi-inline-asm-hardening",
46     cl::desc("Harden inline assembly code that may be vulnerable to Load Value"
47              " Injection (LVI). This feature is experimental."), cl::Hidden);
48 
49 static bool checkScale(unsigned Scale, StringRef &ErrMsg) {
50   if (Scale != 1 && Scale != 2 && Scale != 4 && Scale != 8) {
51     ErrMsg = "scale factor in address must be 1, 2, 4 or 8";
52     return true;
53   }
54   return false;
55 }
56 
57 namespace {
58 
59 static const char OpPrecedence[] = {
60     0,  // IC_OR
61     1,  // IC_XOR
62     2,  // IC_AND
63     4,  // IC_LSHIFT
64     4,  // IC_RSHIFT
65     5,  // IC_PLUS
66     5,  // IC_MINUS
67     6,  // IC_MULTIPLY
68     6,  // IC_DIVIDE
69     6,  // IC_MOD
70     7,  // IC_NOT
71     8,  // IC_NEG
72     9,  // IC_RPAREN
73     10, // IC_LPAREN
74     0,  // IC_IMM
75     0,  // IC_REGISTER
76     3,  // IC_EQ
77     3,  // IC_NE
78     3,  // IC_LT
79     3,  // IC_LE
80     3,  // IC_GT
81     3   // IC_GE
82 };
83 
84 class X86AsmParser : public MCTargetAsmParser {
85   ParseInstructionInfo *InstInfo;
86   bool Code16GCC;
87   unsigned ForcedDataPrefix = 0;
88 
89   enum VEXEncoding {
90     VEXEncoding_Default,
91     VEXEncoding_VEX,
92     VEXEncoding_VEX2,
93     VEXEncoding_VEX3,
94     VEXEncoding_EVEX,
95   };
96 
97   VEXEncoding ForcedVEXEncoding = VEXEncoding_Default;
98 
99   enum DispEncoding {
100     DispEncoding_Default,
101     DispEncoding_Disp8,
102     DispEncoding_Disp32,
103   };
104 
105   DispEncoding ForcedDispEncoding = DispEncoding_Default;
106 
107 private:
108   SMLoc consumeToken() {
109     MCAsmParser &Parser = getParser();
110     SMLoc Result = Parser.getTok().getLoc();
111     Parser.Lex();
112     return Result;
113   }
114 
115   X86TargetStreamer &getTargetStreamer() {
116     assert(getParser().getStreamer().getTargetStreamer() &&
117            "do not have a target streamer");
118     MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
119     return static_cast<X86TargetStreamer &>(TS);
120   }
121 
122   unsigned MatchInstruction(const OperandVector &Operands, MCInst &Inst,
123                             uint64_t &ErrorInfo, FeatureBitset &MissingFeatures,
124                             bool matchingInlineAsm, unsigned VariantID = 0) {
125     // In Code16GCC mode, match as 32-bit.
126     if (Code16GCC)
127       SwitchMode(X86::Is32Bit);
128     unsigned rv = MatchInstructionImpl(Operands, Inst, ErrorInfo,
129                                        MissingFeatures, matchingInlineAsm,
130                                        VariantID);
131     if (Code16GCC)
132       SwitchMode(X86::Is16Bit);
133     return rv;
134   }
135 
136   enum InfixCalculatorTok {
137     IC_OR = 0,
138     IC_XOR,
139     IC_AND,
140     IC_LSHIFT,
141     IC_RSHIFT,
142     IC_PLUS,
143     IC_MINUS,
144     IC_MULTIPLY,
145     IC_DIVIDE,
146     IC_MOD,
147     IC_NOT,
148     IC_NEG,
149     IC_RPAREN,
150     IC_LPAREN,
151     IC_IMM,
152     IC_REGISTER,
153     IC_EQ,
154     IC_NE,
155     IC_LT,
156     IC_LE,
157     IC_GT,
158     IC_GE
159   };
160 
161   enum IntelOperatorKind {
162     IOK_INVALID = 0,
163     IOK_LENGTH,
164     IOK_SIZE,
165     IOK_TYPE,
166   };
167 
168   enum MasmOperatorKind {
169     MOK_INVALID = 0,
170     MOK_LENGTHOF,
171     MOK_SIZEOF,
172     MOK_TYPE,
173   };
174 
175   class InfixCalculator {
176     typedef std::pair< InfixCalculatorTok, int64_t > ICToken;
177     SmallVector<InfixCalculatorTok, 4> InfixOperatorStack;
178     SmallVector<ICToken, 4> PostfixStack;
179 
180     bool isUnaryOperator(InfixCalculatorTok Op) const {
181       return Op == IC_NEG || Op == IC_NOT;
182     }
183 
184   public:
185     int64_t popOperand() {
186       assert (!PostfixStack.empty() && "Poped an empty stack!");
187       ICToken Op = PostfixStack.pop_back_val();
188       if (!(Op.first == IC_IMM || Op.first == IC_REGISTER))
189         return -1; // The invalid Scale value will be caught later by checkScale
190       return Op.second;
191     }
192     void pushOperand(InfixCalculatorTok Op, int64_t Val = 0) {
193       assert ((Op == IC_IMM || Op == IC_REGISTER) &&
194               "Unexpected operand!");
195       PostfixStack.push_back(std::make_pair(Op, Val));
196     }
197 
198     void popOperator() { InfixOperatorStack.pop_back(); }
199     void pushOperator(InfixCalculatorTok Op) {
200       // Push the new operator if the stack is empty.
201       if (InfixOperatorStack.empty()) {
202         InfixOperatorStack.push_back(Op);
203         return;
204       }
205 
206       // Push the new operator if it has a higher precedence than the operator
207       // on the top of the stack or the operator on the top of the stack is a
208       // left parentheses.
209       unsigned Idx = InfixOperatorStack.size() - 1;
210       InfixCalculatorTok StackOp = InfixOperatorStack[Idx];
211       if (OpPrecedence[Op] > OpPrecedence[StackOp] || StackOp == IC_LPAREN) {
212         InfixOperatorStack.push_back(Op);
213         return;
214       }
215 
216       // The operator on the top of the stack has higher precedence than the
217       // new operator.
218       unsigned ParenCount = 0;
219       while (true) {
220         // Nothing to process.
221         if (InfixOperatorStack.empty())
222           break;
223 
224         Idx = InfixOperatorStack.size() - 1;
225         StackOp = InfixOperatorStack[Idx];
226         if (!(OpPrecedence[StackOp] >= OpPrecedence[Op] || ParenCount))
227           break;
228 
229         // If we have an even parentheses count and we see a left parentheses,
230         // then stop processing.
231         if (!ParenCount && StackOp == IC_LPAREN)
232           break;
233 
234         if (StackOp == IC_RPAREN) {
235           ++ParenCount;
236           InfixOperatorStack.pop_back();
237         } else if (StackOp == IC_LPAREN) {
238           --ParenCount;
239           InfixOperatorStack.pop_back();
240         } else {
241           InfixOperatorStack.pop_back();
242           PostfixStack.push_back(std::make_pair(StackOp, 0));
243         }
244       }
245       // Push the new operator.
246       InfixOperatorStack.push_back(Op);
247     }
248 
249     int64_t execute() {
250       // Push any remaining operators onto the postfix stack.
251       while (!InfixOperatorStack.empty()) {
252         InfixCalculatorTok StackOp = InfixOperatorStack.pop_back_val();
253         if (StackOp != IC_LPAREN && StackOp != IC_RPAREN)
254           PostfixStack.push_back(std::make_pair(StackOp, 0));
255       }
256 
257       if (PostfixStack.empty())
258         return 0;
259 
260       SmallVector<ICToken, 16> OperandStack;
261       for (unsigned i = 0, e = PostfixStack.size(); i != e; ++i) {
262         ICToken Op = PostfixStack[i];
263         if (Op.first == IC_IMM || Op.first == IC_REGISTER) {
264           OperandStack.push_back(Op);
265         } else if (isUnaryOperator(Op.first)) {
266           assert (OperandStack.size() > 0 && "Too few operands.");
267           ICToken Operand = OperandStack.pop_back_val();
268           assert (Operand.first == IC_IMM &&
269                   "Unary operation with a register!");
270           switch (Op.first) {
271           default:
272             report_fatal_error("Unexpected operator!");
273             break;
274           case IC_NEG:
275             OperandStack.push_back(std::make_pair(IC_IMM, -Operand.second));
276             break;
277           case IC_NOT:
278             OperandStack.push_back(std::make_pair(IC_IMM, ~Operand.second));
279             break;
280           }
281         } else {
282           assert (OperandStack.size() > 1 && "Too few operands.");
283           int64_t Val;
284           ICToken Op2 = OperandStack.pop_back_val();
285           ICToken Op1 = OperandStack.pop_back_val();
286           switch (Op.first) {
287           default:
288             report_fatal_error("Unexpected operator!");
289             break;
290           case IC_PLUS:
291             Val = Op1.second + Op2.second;
292             OperandStack.push_back(std::make_pair(IC_IMM, Val));
293             break;
294           case IC_MINUS:
295             Val = Op1.second - Op2.second;
296             OperandStack.push_back(std::make_pair(IC_IMM, Val));
297             break;
298           case IC_MULTIPLY:
299             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
300                     "Multiply operation with an immediate and a register!");
301             Val = Op1.second * Op2.second;
302             OperandStack.push_back(std::make_pair(IC_IMM, Val));
303             break;
304           case IC_DIVIDE:
305             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
306                     "Divide operation with an immediate and a register!");
307             assert (Op2.second != 0 && "Division by zero!");
308             Val = Op1.second / Op2.second;
309             OperandStack.push_back(std::make_pair(IC_IMM, Val));
310             break;
311           case IC_MOD:
312             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
313                     "Modulo operation with an immediate and a register!");
314             Val = Op1.second % Op2.second;
315             OperandStack.push_back(std::make_pair(IC_IMM, Val));
316             break;
317           case IC_OR:
318             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
319                     "Or operation with an immediate and a register!");
320             Val = Op1.second | Op2.second;
321             OperandStack.push_back(std::make_pair(IC_IMM, Val));
322             break;
323           case IC_XOR:
324             assert(Op1.first == IC_IMM && Op2.first == IC_IMM &&
325               "Xor operation with an immediate and a register!");
326             Val = Op1.second ^ Op2.second;
327             OperandStack.push_back(std::make_pair(IC_IMM, Val));
328             break;
329           case IC_AND:
330             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
331                     "And operation with an immediate and a register!");
332             Val = Op1.second & Op2.second;
333             OperandStack.push_back(std::make_pair(IC_IMM, Val));
334             break;
335           case IC_LSHIFT:
336             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
337                     "Left shift operation with an immediate and a register!");
338             Val = Op1.second << Op2.second;
339             OperandStack.push_back(std::make_pair(IC_IMM, Val));
340             break;
341           case IC_RSHIFT:
342             assert (Op1.first == IC_IMM && Op2.first == IC_IMM &&
343                     "Right shift operation with an immediate and a register!");
344             Val = Op1.second >> Op2.second;
345             OperandStack.push_back(std::make_pair(IC_IMM, Val));
346             break;
347           case IC_EQ:
348             assert(Op1.first == IC_IMM && Op2.first == IC_IMM &&
349                    "Equals operation with an immediate and a register!");
350             Val = (Op1.second == Op2.second) ? -1 : 0;
351             OperandStack.push_back(std::make_pair(IC_IMM, Val));
352             break;
353           case IC_NE:
354             assert(Op1.first == IC_IMM && Op2.first == IC_IMM &&
355                    "Not-equals operation with an immediate and a register!");
356             Val = (Op1.second != Op2.second) ? -1 : 0;
357             OperandStack.push_back(std::make_pair(IC_IMM, Val));
358             break;
359           case IC_LT:
360             assert(Op1.first == IC_IMM && Op2.first == IC_IMM &&
361                    "Less-than operation with an immediate and a register!");
362             Val = (Op1.second < Op2.second) ? -1 : 0;
363             OperandStack.push_back(std::make_pair(IC_IMM, Val));
364             break;
365           case IC_LE:
366             assert(Op1.first == IC_IMM && Op2.first == IC_IMM &&
367                    "Less-than-or-equal operation with an immediate and a "
368                    "register!");
369             Val = (Op1.second <= Op2.second) ? -1 : 0;
370             OperandStack.push_back(std::make_pair(IC_IMM, Val));
371             break;
372           case IC_GT:
373             assert(Op1.first == IC_IMM && Op2.first == IC_IMM &&
374                    "Greater-than operation with an immediate and a register!");
375             Val = (Op1.second > Op2.second) ? -1 : 0;
376             OperandStack.push_back(std::make_pair(IC_IMM, Val));
377             break;
378           case IC_GE:
379             assert(Op1.first == IC_IMM && Op2.first == IC_IMM &&
380                    "Greater-than-or-equal operation with an immediate and a "
381                    "register!");
382             Val = (Op1.second >= Op2.second) ? -1 : 0;
383             OperandStack.push_back(std::make_pair(IC_IMM, Val));
384             break;
385           }
386         }
387       }
388       assert (OperandStack.size() == 1 && "Expected a single result.");
389       return OperandStack.pop_back_val().second;
390     }
391   };
392 
393   enum IntelExprState {
394     IES_INIT,
395     IES_OR,
396     IES_XOR,
397     IES_AND,
398     IES_EQ,
399     IES_NE,
400     IES_LT,
401     IES_LE,
402     IES_GT,
403     IES_GE,
404     IES_LSHIFT,
405     IES_RSHIFT,
406     IES_PLUS,
407     IES_MINUS,
408     IES_OFFSET,
409     IES_CAST,
410     IES_NOT,
411     IES_MULTIPLY,
412     IES_DIVIDE,
413     IES_MOD,
414     IES_LBRAC,
415     IES_RBRAC,
416     IES_LPAREN,
417     IES_RPAREN,
418     IES_REGISTER,
419     IES_INTEGER,
420     IES_IDENTIFIER,
421     IES_ERROR
422   };
423 
424   class IntelExprStateMachine {
425     IntelExprState State, PrevState;
426     unsigned BaseReg, IndexReg, TmpReg, Scale;
427     int64_t Imm;
428     const MCExpr *Sym;
429     StringRef SymName;
430     InfixCalculator IC;
431     InlineAsmIdentifierInfo Info;
432     short BracCount;
433     bool MemExpr;
434     bool OffsetOperator;
435     bool AttachToOperandIdx;
436     bool IsPIC;
437     SMLoc OffsetOperatorLoc;
438     AsmTypeInfo CurType;
439 
440     bool setSymRef(const MCExpr *Val, StringRef ID, StringRef &ErrMsg) {
441       if (Sym) {
442         ErrMsg = "cannot use more than one symbol in memory operand";
443         return true;
444       }
445       Sym = Val;
446       SymName = ID;
447       return false;
448     }
449 
450   public:
451     IntelExprStateMachine()
452         : State(IES_INIT), PrevState(IES_ERROR), BaseReg(0), IndexReg(0),
453           TmpReg(0), Scale(0), Imm(0), Sym(nullptr), BracCount(0),
454           MemExpr(false), OffsetOperator(false), AttachToOperandIdx(false),
455           IsPIC(false) {}
456 
457     void addImm(int64_t imm) { Imm += imm; }
458     short getBracCount() const { return BracCount; }
459     bool isMemExpr() const { return MemExpr; }
460     bool isOffsetOperator() const { return OffsetOperator; }
461     SMLoc getOffsetLoc() const { return OffsetOperatorLoc; }
462     unsigned getBaseReg() const { return BaseReg; }
463     unsigned getIndexReg() const { return IndexReg; }
464     unsigned getScale() const { return Scale; }
465     const MCExpr *getSym() const { return Sym; }
466     StringRef getSymName() const { return SymName; }
467     StringRef getType() const { return CurType.Name; }
468     unsigned getSize() const { return CurType.Size; }
469     unsigned getElementSize() const { return CurType.ElementSize; }
470     unsigned getLength() const { return CurType.Length; }
471     int64_t getImm() { return Imm + IC.execute(); }
472     bool isValidEndState() const {
473       return State == IES_RBRAC || State == IES_INTEGER;
474     }
475 
476     // Is the intel expression appended after an operand index.
477     // [OperandIdx][Intel Expression]
478     // This is neccessary for checking if it is an independent
479     // intel expression at back end when parse inline asm.
480     void setAppendAfterOperand() { AttachToOperandIdx = true; }
481 
482     bool isPIC() const { return IsPIC; }
483     void setPIC() { IsPIC = true; }
484 
485     bool hadError() const { return State == IES_ERROR; }
486     const InlineAsmIdentifierInfo &getIdentifierInfo() const { return Info; }
487 
488     bool regsUseUpError(StringRef &ErrMsg) {
489       // This case mostly happen in inline asm, e.g. Arr[BaseReg + IndexReg]
490       // can not intruduce additional register in inline asm in PIC model.
491       if (IsPIC && AttachToOperandIdx)
492         ErrMsg = "Don't use 2 or more regs for mem offset in PIC model!";
493       else
494         ErrMsg = "BaseReg/IndexReg already set!";
495       return true;
496     }
497 
498     void onOr() {
499       IntelExprState CurrState = State;
500       switch (State) {
501       default:
502         State = IES_ERROR;
503         break;
504       case IES_INTEGER:
505       case IES_RPAREN:
506       case IES_REGISTER:
507         State = IES_OR;
508         IC.pushOperator(IC_OR);
509         break;
510       }
511       PrevState = CurrState;
512     }
513     void onXor() {
514       IntelExprState CurrState = State;
515       switch (State) {
516       default:
517         State = IES_ERROR;
518         break;
519       case IES_INTEGER:
520       case IES_RPAREN:
521       case IES_REGISTER:
522         State = IES_XOR;
523         IC.pushOperator(IC_XOR);
524         break;
525       }
526       PrevState = CurrState;
527     }
528     void onAnd() {
529       IntelExprState CurrState = State;
530       switch (State) {
531       default:
532         State = IES_ERROR;
533         break;
534       case IES_INTEGER:
535       case IES_RPAREN:
536       case IES_REGISTER:
537         State = IES_AND;
538         IC.pushOperator(IC_AND);
539         break;
540       }
541       PrevState = CurrState;
542     }
543     void onEq() {
544       IntelExprState CurrState = State;
545       switch (State) {
546       default:
547         State = IES_ERROR;
548         break;
549       case IES_INTEGER:
550       case IES_RPAREN:
551       case IES_REGISTER:
552         State = IES_EQ;
553         IC.pushOperator(IC_EQ);
554         break;
555       }
556       PrevState = CurrState;
557     }
558     void onNE() {
559       IntelExprState CurrState = State;
560       switch (State) {
561       default:
562         State = IES_ERROR;
563         break;
564       case IES_INTEGER:
565       case IES_RPAREN:
566       case IES_REGISTER:
567         State = IES_NE;
568         IC.pushOperator(IC_NE);
569         break;
570       }
571       PrevState = CurrState;
572     }
573     void onLT() {
574       IntelExprState CurrState = State;
575       switch (State) {
576       default:
577         State = IES_ERROR;
578         break;
579       case IES_INTEGER:
580       case IES_RPAREN:
581       case IES_REGISTER:
582         State = IES_LT;
583         IC.pushOperator(IC_LT);
584         break;
585       }
586       PrevState = CurrState;
587     }
588     void onLE() {
589       IntelExprState CurrState = State;
590       switch (State) {
591       default:
592         State = IES_ERROR;
593         break;
594       case IES_INTEGER:
595       case IES_RPAREN:
596       case IES_REGISTER:
597         State = IES_LE;
598         IC.pushOperator(IC_LE);
599         break;
600       }
601       PrevState = CurrState;
602     }
603     void onGT() {
604       IntelExprState CurrState = State;
605       switch (State) {
606       default:
607         State = IES_ERROR;
608         break;
609       case IES_INTEGER:
610       case IES_RPAREN:
611       case IES_REGISTER:
612         State = IES_GT;
613         IC.pushOperator(IC_GT);
614         break;
615       }
616       PrevState = CurrState;
617     }
618     void onGE() {
619       IntelExprState CurrState = State;
620       switch (State) {
621       default:
622         State = IES_ERROR;
623         break;
624       case IES_INTEGER:
625       case IES_RPAREN:
626       case IES_REGISTER:
627         State = IES_GE;
628         IC.pushOperator(IC_GE);
629         break;
630       }
631       PrevState = CurrState;
632     }
633     void onLShift() {
634       IntelExprState CurrState = State;
635       switch (State) {
636       default:
637         State = IES_ERROR;
638         break;
639       case IES_INTEGER:
640       case IES_RPAREN:
641       case IES_REGISTER:
642         State = IES_LSHIFT;
643         IC.pushOperator(IC_LSHIFT);
644         break;
645       }
646       PrevState = CurrState;
647     }
648     void onRShift() {
649       IntelExprState CurrState = State;
650       switch (State) {
651       default:
652         State = IES_ERROR;
653         break;
654       case IES_INTEGER:
655       case IES_RPAREN:
656       case IES_REGISTER:
657         State = IES_RSHIFT;
658         IC.pushOperator(IC_RSHIFT);
659         break;
660       }
661       PrevState = CurrState;
662     }
663     bool onPlus(StringRef &ErrMsg) {
664       IntelExprState CurrState = State;
665       switch (State) {
666       default:
667         State = IES_ERROR;
668         break;
669       case IES_INTEGER:
670       case IES_RPAREN:
671       case IES_REGISTER:
672       case IES_OFFSET:
673         State = IES_PLUS;
674         IC.pushOperator(IC_PLUS);
675         if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) {
676           // If we already have a BaseReg, then assume this is the IndexReg with
677           // no explicit scale.
678           if (!BaseReg) {
679             BaseReg = TmpReg;
680           } else {
681             if (IndexReg)
682               return regsUseUpError(ErrMsg);
683             IndexReg = TmpReg;
684             Scale = 0;
685           }
686         }
687         break;
688       }
689       PrevState = CurrState;
690       return false;
691     }
692     bool onMinus(StringRef &ErrMsg) {
693       IntelExprState CurrState = State;
694       switch (State) {
695       default:
696         State = IES_ERROR;
697         break;
698       case IES_OR:
699       case IES_XOR:
700       case IES_AND:
701       case IES_EQ:
702       case IES_NE:
703       case IES_LT:
704       case IES_LE:
705       case IES_GT:
706       case IES_GE:
707       case IES_LSHIFT:
708       case IES_RSHIFT:
709       case IES_PLUS:
710       case IES_NOT:
711       case IES_MULTIPLY:
712       case IES_DIVIDE:
713       case IES_MOD:
714       case IES_LPAREN:
715       case IES_RPAREN:
716       case IES_LBRAC:
717       case IES_RBRAC:
718       case IES_INTEGER:
719       case IES_REGISTER:
720       case IES_INIT:
721       case IES_OFFSET:
722         State = IES_MINUS;
723         // push minus operator if it is not a negate operator
724         if (CurrState == IES_REGISTER || CurrState == IES_RPAREN ||
725             CurrState == IES_INTEGER  || CurrState == IES_RBRAC  ||
726             CurrState == IES_OFFSET)
727           IC.pushOperator(IC_MINUS);
728         else if (PrevState == IES_REGISTER && CurrState == IES_MULTIPLY) {
729           // We have negate operator for Scale: it's illegal
730           ErrMsg = "Scale can't be negative";
731           return true;
732         } else
733           IC.pushOperator(IC_NEG);
734         if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) {
735           // If we already have a BaseReg, then assume this is the IndexReg with
736           // no explicit scale.
737           if (!BaseReg) {
738             BaseReg = TmpReg;
739           } else {
740             if (IndexReg)
741               return regsUseUpError(ErrMsg);
742             IndexReg = TmpReg;
743             Scale = 0;
744           }
745         }
746         break;
747       }
748       PrevState = CurrState;
749       return false;
750     }
751     void onNot() {
752       IntelExprState CurrState = State;
753       switch (State) {
754       default:
755         State = IES_ERROR;
756         break;
757       case IES_OR:
758       case IES_XOR:
759       case IES_AND:
760       case IES_EQ:
761       case IES_NE:
762       case IES_LT:
763       case IES_LE:
764       case IES_GT:
765       case IES_GE:
766       case IES_LSHIFT:
767       case IES_RSHIFT:
768       case IES_PLUS:
769       case IES_MINUS:
770       case IES_NOT:
771       case IES_MULTIPLY:
772       case IES_DIVIDE:
773       case IES_MOD:
774       case IES_LPAREN:
775       case IES_LBRAC:
776       case IES_INIT:
777         State = IES_NOT;
778         IC.pushOperator(IC_NOT);
779         break;
780       }
781       PrevState = CurrState;
782     }
783     bool onRegister(unsigned Reg, StringRef &ErrMsg) {
784       IntelExprState CurrState = State;
785       switch (State) {
786       default:
787         State = IES_ERROR;
788         break;
789       case IES_PLUS:
790       case IES_LPAREN:
791       case IES_LBRAC:
792         State = IES_REGISTER;
793         TmpReg = Reg;
794         IC.pushOperand(IC_REGISTER);
795         break;
796       case IES_MULTIPLY:
797         // Index Register - Scale * Register
798         if (PrevState == IES_INTEGER) {
799           if (IndexReg)
800             return regsUseUpError(ErrMsg);
801           State = IES_REGISTER;
802           IndexReg = Reg;
803           // Get the scale and replace the 'Scale * Register' with '0'.
804           Scale = IC.popOperand();
805           if (checkScale(Scale, ErrMsg))
806             return true;
807           IC.pushOperand(IC_IMM);
808           IC.popOperator();
809         } else {
810           State = IES_ERROR;
811         }
812         break;
813       }
814       PrevState = CurrState;
815       return false;
816     }
817     bool onIdentifierExpr(const MCExpr *SymRef, StringRef SymRefName,
818                           const InlineAsmIdentifierInfo &IDInfo,
819                           const AsmTypeInfo &Type, bool ParsingMSInlineAsm,
820                           StringRef &ErrMsg) {
821       // InlineAsm: Treat an enum value as an integer
822       if (ParsingMSInlineAsm)
823         if (IDInfo.isKind(InlineAsmIdentifierInfo::IK_EnumVal))
824           return onInteger(IDInfo.Enum.EnumVal, ErrMsg);
825       // Treat a symbolic constant like an integer
826       if (auto *CE = dyn_cast<MCConstantExpr>(SymRef))
827         return onInteger(CE->getValue(), ErrMsg);
828       PrevState = State;
829       switch (State) {
830       default:
831         State = IES_ERROR;
832         break;
833       case IES_CAST:
834       case IES_PLUS:
835       case IES_MINUS:
836       case IES_NOT:
837       case IES_INIT:
838       case IES_LBRAC:
839       case IES_LPAREN:
840         if (setSymRef(SymRef, SymRefName, ErrMsg))
841           return true;
842         MemExpr = true;
843         State = IES_INTEGER;
844         IC.pushOperand(IC_IMM);
845         if (ParsingMSInlineAsm)
846           Info = IDInfo;
847         setTypeInfo(Type);
848         break;
849       }
850       return false;
851     }
852     bool onInteger(int64_t TmpInt, StringRef &ErrMsg) {
853       IntelExprState CurrState = State;
854       switch (State) {
855       default:
856         State = IES_ERROR;
857         break;
858       case IES_PLUS:
859       case IES_MINUS:
860       case IES_NOT:
861       case IES_OR:
862       case IES_XOR:
863       case IES_AND:
864       case IES_EQ:
865       case IES_NE:
866       case IES_LT:
867       case IES_LE:
868       case IES_GT:
869       case IES_GE:
870       case IES_LSHIFT:
871       case IES_RSHIFT:
872       case IES_DIVIDE:
873       case IES_MOD:
874       case IES_MULTIPLY:
875       case IES_LPAREN:
876       case IES_INIT:
877       case IES_LBRAC:
878         State = IES_INTEGER;
879         if (PrevState == IES_REGISTER && CurrState == IES_MULTIPLY) {
880           // Index Register - Register * Scale
881           if (IndexReg)
882             return regsUseUpError(ErrMsg);
883           IndexReg = TmpReg;
884           Scale = TmpInt;
885           if (checkScale(Scale, ErrMsg))
886             return true;
887           // Get the scale and replace the 'Register * Scale' with '0'.
888           IC.popOperator();
889         } else {
890           IC.pushOperand(IC_IMM, TmpInt);
891         }
892         break;
893       }
894       PrevState = CurrState;
895       return false;
896     }
897     void onStar() {
898       PrevState = State;
899       switch (State) {
900       default:
901         State = IES_ERROR;
902         break;
903       case IES_INTEGER:
904       case IES_REGISTER:
905       case IES_RPAREN:
906         State = IES_MULTIPLY;
907         IC.pushOperator(IC_MULTIPLY);
908         break;
909       }
910     }
911     void onDivide() {
912       PrevState = State;
913       switch (State) {
914       default:
915         State = IES_ERROR;
916         break;
917       case IES_INTEGER:
918       case IES_RPAREN:
919         State = IES_DIVIDE;
920         IC.pushOperator(IC_DIVIDE);
921         break;
922       }
923     }
924     void onMod() {
925       PrevState = State;
926       switch (State) {
927       default:
928         State = IES_ERROR;
929         break;
930       case IES_INTEGER:
931       case IES_RPAREN:
932         State = IES_MOD;
933         IC.pushOperator(IC_MOD);
934         break;
935       }
936     }
937     bool onLBrac() {
938       if (BracCount)
939         return true;
940       PrevState = State;
941       switch (State) {
942       default:
943         State = IES_ERROR;
944         break;
945       case IES_RBRAC:
946       case IES_INTEGER:
947       case IES_RPAREN:
948         State = IES_PLUS;
949         IC.pushOperator(IC_PLUS);
950         CurType.Length = 1;
951         CurType.Size = CurType.ElementSize;
952         break;
953       case IES_INIT:
954       case IES_CAST:
955         assert(!BracCount && "BracCount should be zero on parsing's start");
956         State = IES_LBRAC;
957         break;
958       }
959       MemExpr = true;
960       BracCount++;
961       return false;
962     }
963     bool onRBrac(StringRef &ErrMsg) {
964       IntelExprState CurrState = State;
965       switch (State) {
966       default:
967         State = IES_ERROR;
968         break;
969       case IES_INTEGER:
970       case IES_OFFSET:
971       case IES_REGISTER:
972       case IES_RPAREN:
973         if (BracCount-- != 1) {
974           ErrMsg = "unexpected bracket encountered";
975           return true;
976         }
977         State = IES_RBRAC;
978         if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) {
979           // If we already have a BaseReg, then assume this is the IndexReg with
980           // no explicit scale.
981           if (!BaseReg) {
982             BaseReg = TmpReg;
983           } else {
984             if (IndexReg)
985               return regsUseUpError(ErrMsg);
986             IndexReg = TmpReg;
987             Scale = 0;
988           }
989         }
990         break;
991       }
992       PrevState = CurrState;
993       return false;
994     }
995     void onLParen() {
996       IntelExprState CurrState = State;
997       switch (State) {
998       default:
999         State = IES_ERROR;
1000         break;
1001       case IES_PLUS:
1002       case IES_MINUS:
1003       case IES_NOT:
1004       case IES_OR:
1005       case IES_XOR:
1006       case IES_AND:
1007       case IES_EQ:
1008       case IES_NE:
1009       case IES_LT:
1010       case IES_LE:
1011       case IES_GT:
1012       case IES_GE:
1013       case IES_LSHIFT:
1014       case IES_RSHIFT:
1015       case IES_MULTIPLY:
1016       case IES_DIVIDE:
1017       case IES_MOD:
1018       case IES_LPAREN:
1019       case IES_INIT:
1020       case IES_LBRAC:
1021         State = IES_LPAREN;
1022         IC.pushOperator(IC_LPAREN);
1023         break;
1024       }
1025       PrevState = CurrState;
1026     }
1027     void onRParen() {
1028       PrevState = State;
1029       switch (State) {
1030       default:
1031         State = IES_ERROR;
1032         break;
1033       case IES_INTEGER:
1034       case IES_OFFSET:
1035       case IES_REGISTER:
1036       case IES_RBRAC:
1037       case IES_RPAREN:
1038         State = IES_RPAREN;
1039         IC.pushOperator(IC_RPAREN);
1040         break;
1041       }
1042     }
1043     bool onOffset(const MCExpr *Val, SMLoc OffsetLoc, StringRef ID,
1044                   const InlineAsmIdentifierInfo &IDInfo,
1045                   bool ParsingMSInlineAsm, StringRef &ErrMsg) {
1046       PrevState = State;
1047       switch (State) {
1048       default:
1049         ErrMsg = "unexpected offset operator expression";
1050         return true;
1051       case IES_PLUS:
1052       case IES_INIT:
1053       case IES_LBRAC:
1054         if (setSymRef(Val, ID, ErrMsg))
1055           return true;
1056         OffsetOperator = true;
1057         OffsetOperatorLoc = OffsetLoc;
1058         State = IES_OFFSET;
1059         // As we cannot yet resolve the actual value (offset), we retain
1060         // the requested semantics by pushing a '0' to the operands stack
1061         IC.pushOperand(IC_IMM);
1062         if (ParsingMSInlineAsm) {
1063           Info = IDInfo;
1064         }
1065         break;
1066       }
1067       return false;
1068     }
1069     void onCast(AsmTypeInfo Info) {
1070       PrevState = State;
1071       switch (State) {
1072       default:
1073         State = IES_ERROR;
1074         break;
1075       case IES_LPAREN:
1076         setTypeInfo(Info);
1077         State = IES_CAST;
1078         break;
1079       }
1080     }
1081     void setTypeInfo(AsmTypeInfo Type) { CurType = Type; }
1082   };
1083 
1084   bool Error(SMLoc L, const Twine &Msg, SMRange Range = None,
1085              bool MatchingInlineAsm = false) {
1086     MCAsmParser &Parser = getParser();
1087     if (MatchingInlineAsm) {
1088       if (!getLexer().isAtStartOfStatement())
1089         Parser.eatToEndOfStatement();
1090       return false;
1091     }
1092     return Parser.Error(L, Msg, Range);
1093   }
1094 
1095   bool MatchRegisterByName(unsigned &RegNo, StringRef RegName, SMLoc StartLoc,
1096                            SMLoc EndLoc);
1097   bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc,
1098                      bool RestoreOnFailure);
1099 
1100   std::unique_ptr<X86Operand> DefaultMemSIOperand(SMLoc Loc);
1101   std::unique_ptr<X86Operand> DefaultMemDIOperand(SMLoc Loc);
1102   bool IsSIReg(unsigned Reg);
1103   unsigned GetSIDIForRegClass(unsigned RegClassID, unsigned Reg, bool IsSIReg);
1104   void
1105   AddDefaultSrcDestOperands(OperandVector &Operands,
1106                             std::unique_ptr<llvm::MCParsedAsmOperand> &&Src,
1107                             std::unique_ptr<llvm::MCParsedAsmOperand> &&Dst);
1108   bool VerifyAndAdjustOperands(OperandVector &OrigOperands,
1109                                OperandVector &FinalOperands);
1110   bool parseOperand(OperandVector &Operands, StringRef Name);
1111   bool parseATTOperand(OperandVector &Operands);
1112   bool parseIntelOperand(OperandVector &Operands, StringRef Name);
1113   bool ParseIntelOffsetOperator(const MCExpr *&Val, StringRef &ID,
1114                                 InlineAsmIdentifierInfo &Info, SMLoc &End);
1115   bool ParseIntelDotOperator(IntelExprStateMachine &SM, SMLoc &End);
1116   unsigned IdentifyIntelInlineAsmOperator(StringRef Name);
1117   unsigned ParseIntelInlineAsmOperator(unsigned OpKind);
1118   unsigned IdentifyMasmOperator(StringRef Name);
1119   bool ParseMasmOperator(unsigned OpKind, int64_t &Val);
1120   bool ParseRoundingModeOp(SMLoc Start, OperandVector &Operands);
1121   bool ParseIntelNamedOperator(StringRef Name, IntelExprStateMachine &SM,
1122                                bool &ParseError, SMLoc &End);
1123   bool ParseMasmNamedOperator(StringRef Name, IntelExprStateMachine &SM,
1124                               bool &ParseError, SMLoc &End);
1125   void RewriteIntelExpression(IntelExprStateMachine &SM, SMLoc Start,
1126                               SMLoc End);
1127   bool ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End);
1128   bool ParseIntelInlineAsmIdentifier(const MCExpr *&Val, StringRef &Identifier,
1129                                      InlineAsmIdentifierInfo &Info,
1130                                      bool IsUnevaluatedOperand, SMLoc &End,
1131                                      bool IsParsingOffsetOperator = false);
1132   void tryParseOperandIdx(AsmToken::TokenKind PrevTK,
1133                           IntelExprStateMachine &SM);
1134 
1135   bool ParseMemOperand(unsigned SegReg, const MCExpr *Disp, SMLoc StartLoc,
1136                        SMLoc EndLoc, OperandVector &Operands);
1137 
1138   X86::CondCode ParseConditionCode(StringRef CCode);
1139 
1140   bool ParseIntelMemoryOperandSize(unsigned &Size);
1141   bool CreateMemForMSInlineAsm(unsigned SegReg, const MCExpr *Disp,
1142                                unsigned BaseReg, unsigned IndexReg,
1143                                unsigned Scale, SMLoc Start, SMLoc End,
1144                                unsigned Size, StringRef Identifier,
1145                                const InlineAsmIdentifierInfo &Info,
1146                                OperandVector &Operands);
1147 
1148   bool parseDirectiveArch();
1149   bool parseDirectiveNops(SMLoc L);
1150   bool parseDirectiveEven(SMLoc L);
1151   bool ParseDirectiveCode(StringRef IDVal, SMLoc L);
1152 
1153   /// CodeView FPO data directives.
1154   bool parseDirectiveFPOProc(SMLoc L);
1155   bool parseDirectiveFPOSetFrame(SMLoc L);
1156   bool parseDirectiveFPOPushReg(SMLoc L);
1157   bool parseDirectiveFPOStackAlloc(SMLoc L);
1158   bool parseDirectiveFPOStackAlign(SMLoc L);
1159   bool parseDirectiveFPOEndPrologue(SMLoc L);
1160   bool parseDirectiveFPOEndProc(SMLoc L);
1161 
1162   /// SEH directives.
1163   bool parseSEHRegisterNumber(unsigned RegClassID, unsigned &RegNo);
1164   bool parseDirectiveSEHPushReg(SMLoc);
1165   bool parseDirectiveSEHSetFrame(SMLoc);
1166   bool parseDirectiveSEHSaveReg(SMLoc);
1167   bool parseDirectiveSEHSaveXMM(SMLoc);
1168   bool parseDirectiveSEHPushFrame(SMLoc);
1169 
1170   unsigned checkTargetMatchPredicate(MCInst &Inst) override;
1171 
1172   bool validateInstruction(MCInst &Inst, const OperandVector &Ops);
1173   bool processInstruction(MCInst &Inst, const OperandVector &Ops);
1174 
1175   // Load Value Injection (LVI) Mitigations for machine code
1176   void emitWarningForSpecialLVIInstruction(SMLoc Loc);
1177   void applyLVICFIMitigation(MCInst &Inst, MCStreamer &Out);
1178   void applyLVILoadHardeningMitigation(MCInst &Inst, MCStreamer &Out);
1179 
1180   /// Wrapper around MCStreamer::emitInstruction(). Possibly adds
1181   /// instrumentation around Inst.
1182   void emitInstruction(MCInst &Inst, OperandVector &Operands, MCStreamer &Out);
1183 
1184   bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
1185                                OperandVector &Operands, MCStreamer &Out,
1186                                uint64_t &ErrorInfo,
1187                                bool MatchingInlineAsm) override;
1188 
1189   void MatchFPUWaitAlias(SMLoc IDLoc, X86Operand &Op, OperandVector &Operands,
1190                          MCStreamer &Out, bool MatchingInlineAsm);
1191 
1192   bool ErrorMissingFeature(SMLoc IDLoc, const FeatureBitset &MissingFeatures,
1193                            bool MatchingInlineAsm);
1194 
1195   bool MatchAndEmitATTInstruction(SMLoc IDLoc, unsigned &Opcode,
1196                                   OperandVector &Operands, MCStreamer &Out,
1197                                   uint64_t &ErrorInfo,
1198                                   bool MatchingInlineAsm);
1199 
1200   bool MatchAndEmitIntelInstruction(SMLoc IDLoc, unsigned &Opcode,
1201                                     OperandVector &Operands, MCStreamer &Out,
1202                                     uint64_t &ErrorInfo,
1203                                     bool MatchingInlineAsm);
1204 
1205   bool OmitRegisterFromClobberLists(unsigned RegNo) override;
1206 
1207   /// Parses AVX512 specific operand primitives: masked registers ({%k<NUM>}, {z})
1208   /// and memory broadcasting ({1to<NUM>}) primitives, updating Operands vector if required.
1209   /// return false if no parsing errors occurred, true otherwise.
1210   bool HandleAVX512Operand(OperandVector &Operands);
1211 
1212   bool ParseZ(std::unique_ptr<X86Operand> &Z, const SMLoc &StartLoc);
1213 
1214   bool is64BitMode() const {
1215     // FIXME: Can tablegen auto-generate this?
1216     return getSTI().getFeatureBits()[X86::Is64Bit];
1217   }
1218   bool is32BitMode() const {
1219     // FIXME: Can tablegen auto-generate this?
1220     return getSTI().getFeatureBits()[X86::Is32Bit];
1221   }
1222   bool is16BitMode() const {
1223     // FIXME: Can tablegen auto-generate this?
1224     return getSTI().getFeatureBits()[X86::Is16Bit];
1225   }
1226   void SwitchMode(unsigned mode) {
1227     MCSubtargetInfo &STI = copySTI();
1228     FeatureBitset AllModes({X86::Is64Bit, X86::Is32Bit, X86::Is16Bit});
1229     FeatureBitset OldMode = STI.getFeatureBits() & AllModes;
1230     FeatureBitset FB = ComputeAvailableFeatures(
1231       STI.ToggleFeature(OldMode.flip(mode)));
1232     setAvailableFeatures(FB);
1233 
1234     assert(FeatureBitset({mode}) == (STI.getFeatureBits() & AllModes));
1235   }
1236 
1237   unsigned getPointerWidth() {
1238     if (is16BitMode()) return 16;
1239     if (is32BitMode()) return 32;
1240     if (is64BitMode()) return 64;
1241     llvm_unreachable("invalid mode");
1242   }
1243 
1244   bool isParsingIntelSyntax() {
1245     return getParser().getAssemblerDialect();
1246   }
1247 
1248   /// @name Auto-generated Matcher Functions
1249   /// {
1250 
1251 #define GET_ASSEMBLER_HEADER
1252 #include "X86GenAsmMatcher.inc"
1253 
1254   /// }
1255 
1256 public:
1257   enum X86MatchResultTy {
1258     Match_Unsupported = FIRST_TARGET_MATCH_RESULT_TY,
1259 #define GET_OPERAND_DIAGNOSTIC_TYPES
1260 #include "X86GenAsmMatcher.inc"
1261   };
1262 
1263   X86AsmParser(const MCSubtargetInfo &sti, MCAsmParser &Parser,
1264                const MCInstrInfo &mii, const MCTargetOptions &Options)
1265       : MCTargetAsmParser(Options, sti, mii),  InstInfo(nullptr),
1266         Code16GCC(false) {
1267 
1268     Parser.addAliasForDirective(".word", ".2byte");
1269 
1270     // Initialize the set of available features.
1271     setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits()));
1272   }
1273 
1274   bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override;
1275   OperandMatchResultTy tryParseRegister(unsigned &RegNo, SMLoc &StartLoc,
1276                                         SMLoc &EndLoc) override;
1277 
1278   bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) override;
1279 
1280   bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
1281                         SMLoc NameLoc, OperandVector &Operands) override;
1282 
1283   bool ParseDirective(AsmToken DirectiveID) override;
1284 };
1285 } // end anonymous namespace
1286 
1287 /// @name Auto-generated Match Functions
1288 /// {
1289 
1290 static unsigned MatchRegisterName(StringRef Name);
1291 
1292 /// }
1293 
1294 static bool CheckBaseRegAndIndexRegAndScale(unsigned BaseReg, unsigned IndexReg,
1295                                             unsigned Scale, bool Is64BitMode,
1296                                             StringRef &ErrMsg) {
1297   // If we have both a base register and an index register make sure they are
1298   // both 64-bit or 32-bit registers.
1299   // To support VSIB, IndexReg can be 128-bit or 256-bit registers.
1300 
1301   if (BaseReg != 0 &&
1302       !(BaseReg == X86::RIP || BaseReg == X86::EIP ||
1303         X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) ||
1304         X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg) ||
1305         X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg))) {
1306     ErrMsg = "invalid base+index expression";
1307     return true;
1308   }
1309 
1310   if (IndexReg != 0 &&
1311       !(IndexReg == X86::EIZ || IndexReg == X86::RIZ ||
1312         X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) ||
1313         X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg) ||
1314         X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg) ||
1315         X86MCRegisterClasses[X86::VR128XRegClassID].contains(IndexReg) ||
1316         X86MCRegisterClasses[X86::VR256XRegClassID].contains(IndexReg) ||
1317         X86MCRegisterClasses[X86::VR512RegClassID].contains(IndexReg))) {
1318     ErrMsg = "invalid base+index expression";
1319     return true;
1320   }
1321 
1322   if (((BaseReg == X86::RIP || BaseReg == X86::EIP) && IndexReg != 0) ||
1323       IndexReg == X86::EIP || IndexReg == X86::RIP ||
1324       IndexReg == X86::ESP || IndexReg == X86::RSP) {
1325     ErrMsg = "invalid base+index expression";
1326     return true;
1327   }
1328 
1329   // Check for use of invalid 16-bit registers. Only BX/BP/SI/DI are allowed,
1330   // and then only in non-64-bit modes.
1331   if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) &&
1332       (Is64BitMode || (BaseReg != X86::BX && BaseReg != X86::BP &&
1333                        BaseReg != X86::SI && BaseReg != X86::DI))) {
1334     ErrMsg = "invalid 16-bit base register";
1335     return true;
1336   }
1337 
1338   if (BaseReg == 0 &&
1339       X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg)) {
1340     ErrMsg = "16-bit memory operand may not include only index register";
1341     return true;
1342   }
1343 
1344   if (BaseReg != 0 && IndexReg != 0) {
1345     if (X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg) &&
1346         (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) ||
1347          X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg) ||
1348          IndexReg == X86::EIZ)) {
1349       ErrMsg = "base register is 64-bit, but index register is not";
1350       return true;
1351     }
1352     if (X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg) &&
1353         (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) ||
1354          X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg) ||
1355          IndexReg == X86::RIZ)) {
1356       ErrMsg = "base register is 32-bit, but index register is not";
1357       return true;
1358     }
1359     if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg)) {
1360       if (X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg) ||
1361           X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg)) {
1362         ErrMsg = "base register is 16-bit, but index register is not";
1363         return true;
1364       }
1365       if ((BaseReg != X86::BX && BaseReg != X86::BP) ||
1366           (IndexReg != X86::SI && IndexReg != X86::DI)) {
1367         ErrMsg = "invalid 16-bit base/index register combination";
1368         return true;
1369       }
1370     }
1371   }
1372 
1373   // RIP/EIP-relative addressing is only supported in 64-bit mode.
1374   if (!Is64BitMode && BaseReg != 0 &&
1375       (BaseReg == X86::RIP || BaseReg == X86::EIP)) {
1376     ErrMsg = "IP-relative addressing requires 64-bit mode";
1377     return true;
1378   }
1379 
1380   return checkScale(Scale, ErrMsg);
1381 }
1382 
1383 bool X86AsmParser::MatchRegisterByName(unsigned &RegNo, StringRef RegName,
1384                                        SMLoc StartLoc, SMLoc EndLoc) {
1385   // If we encounter a %, ignore it. This code handles registers with and
1386   // without the prefix, unprefixed registers can occur in cfi directives.
1387   RegName.consume_front("%");
1388 
1389   RegNo = MatchRegisterName(RegName);
1390 
1391   // If the match failed, try the register name as lowercase.
1392   if (RegNo == 0)
1393     RegNo = MatchRegisterName(RegName.lower());
1394 
1395   // The "flags" and "mxcsr" registers cannot be referenced directly.
1396   // Treat it as an identifier instead.
1397   if (isParsingMSInlineAsm() && isParsingIntelSyntax() &&
1398       (RegNo == X86::EFLAGS || RegNo == X86::MXCSR))
1399     RegNo = 0;
1400 
1401   if (!is64BitMode()) {
1402     // FIXME: This should be done using Requires<Not64BitMode> and
1403     // Requires<In64BitMode> so "eiz" usage in 64-bit instructions can be also
1404     // checked.
1405     if (RegNo == X86::RIZ || RegNo == X86::RIP ||
1406         X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo) ||
1407         X86II::isX86_64NonExtLowByteReg(RegNo) ||
1408         X86II::isX86_64ExtendedReg(RegNo)) {
1409       return Error(StartLoc,
1410                    "register %" + RegName + " is only available in 64-bit mode",
1411                    SMRange(StartLoc, EndLoc));
1412     }
1413   }
1414 
1415   // If this is "db[0-15]", match it as an alias
1416   // for dr[0-15].
1417   if (RegNo == 0 && RegName.startswith("db")) {
1418     if (RegName.size() == 3) {
1419       switch (RegName[2]) {
1420       case '0':
1421         RegNo = X86::DR0;
1422         break;
1423       case '1':
1424         RegNo = X86::DR1;
1425         break;
1426       case '2':
1427         RegNo = X86::DR2;
1428         break;
1429       case '3':
1430         RegNo = X86::DR3;
1431         break;
1432       case '4':
1433         RegNo = X86::DR4;
1434         break;
1435       case '5':
1436         RegNo = X86::DR5;
1437         break;
1438       case '6':
1439         RegNo = X86::DR6;
1440         break;
1441       case '7':
1442         RegNo = X86::DR7;
1443         break;
1444       case '8':
1445         RegNo = X86::DR8;
1446         break;
1447       case '9':
1448         RegNo = X86::DR9;
1449         break;
1450       }
1451     } else if (RegName.size() == 4 && RegName[2] == '1') {
1452       switch (RegName[3]) {
1453       case '0':
1454         RegNo = X86::DR10;
1455         break;
1456       case '1':
1457         RegNo = X86::DR11;
1458         break;
1459       case '2':
1460         RegNo = X86::DR12;
1461         break;
1462       case '3':
1463         RegNo = X86::DR13;
1464         break;
1465       case '4':
1466         RegNo = X86::DR14;
1467         break;
1468       case '5':
1469         RegNo = X86::DR15;
1470         break;
1471       }
1472     }
1473   }
1474 
1475   if (RegNo == 0) {
1476     if (isParsingIntelSyntax())
1477       return true;
1478     return Error(StartLoc, "invalid register name", SMRange(StartLoc, EndLoc));
1479   }
1480   return false;
1481 }
1482 
1483 bool X86AsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
1484                                  SMLoc &EndLoc, bool RestoreOnFailure) {
1485   MCAsmParser &Parser = getParser();
1486   MCAsmLexer &Lexer = getLexer();
1487   RegNo = 0;
1488 
1489   SmallVector<AsmToken, 5> Tokens;
1490   auto OnFailure = [RestoreOnFailure, &Lexer, &Tokens]() {
1491     if (RestoreOnFailure) {
1492       while (!Tokens.empty()) {
1493         Lexer.UnLex(Tokens.pop_back_val());
1494       }
1495     }
1496   };
1497 
1498   const AsmToken &PercentTok = Parser.getTok();
1499   StartLoc = PercentTok.getLoc();
1500 
1501   // If we encounter a %, ignore it. This code handles registers with and
1502   // without the prefix, unprefixed registers can occur in cfi directives.
1503   if (!isParsingIntelSyntax() && PercentTok.is(AsmToken::Percent)) {
1504     Tokens.push_back(PercentTok);
1505     Parser.Lex(); // Eat percent token.
1506   }
1507 
1508   const AsmToken &Tok = Parser.getTok();
1509   EndLoc = Tok.getEndLoc();
1510 
1511   if (Tok.isNot(AsmToken::Identifier)) {
1512     OnFailure();
1513     if (isParsingIntelSyntax()) return true;
1514     return Error(StartLoc, "invalid register name",
1515                  SMRange(StartLoc, EndLoc));
1516   }
1517 
1518   if (MatchRegisterByName(RegNo, Tok.getString(), StartLoc, EndLoc)) {
1519     OnFailure();
1520     return true;
1521   }
1522 
1523   // Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens.
1524   if (RegNo == X86::ST0) {
1525     Tokens.push_back(Tok);
1526     Parser.Lex(); // Eat 'st'
1527 
1528     // Check to see if we have '(4)' after %st.
1529     if (Lexer.isNot(AsmToken::LParen))
1530       return false;
1531     // Lex the paren.
1532     Tokens.push_back(Parser.getTok());
1533     Parser.Lex();
1534 
1535     const AsmToken &IntTok = Parser.getTok();
1536     if (IntTok.isNot(AsmToken::Integer)) {
1537       OnFailure();
1538       return Error(IntTok.getLoc(), "expected stack index");
1539     }
1540     switch (IntTok.getIntVal()) {
1541     case 0: RegNo = X86::ST0; break;
1542     case 1: RegNo = X86::ST1; break;
1543     case 2: RegNo = X86::ST2; break;
1544     case 3: RegNo = X86::ST3; break;
1545     case 4: RegNo = X86::ST4; break;
1546     case 5: RegNo = X86::ST5; break;
1547     case 6: RegNo = X86::ST6; break;
1548     case 7: RegNo = X86::ST7; break;
1549     default:
1550       OnFailure();
1551       return Error(IntTok.getLoc(), "invalid stack index");
1552     }
1553 
1554     // Lex IntTok
1555     Tokens.push_back(IntTok);
1556     Parser.Lex();
1557     if (Lexer.isNot(AsmToken::RParen)) {
1558       OnFailure();
1559       return Error(Parser.getTok().getLoc(), "expected ')'");
1560     }
1561 
1562     EndLoc = Parser.getTok().getEndLoc();
1563     Parser.Lex(); // Eat ')'
1564     return false;
1565   }
1566 
1567   EndLoc = Parser.getTok().getEndLoc();
1568 
1569   if (RegNo == 0) {
1570     OnFailure();
1571     if (isParsingIntelSyntax()) return true;
1572     return Error(StartLoc, "invalid register name",
1573                  SMRange(StartLoc, EndLoc));
1574   }
1575 
1576   Parser.Lex(); // Eat identifier token.
1577   return false;
1578 }
1579 
1580 bool X86AsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
1581                                  SMLoc &EndLoc) {
1582   return ParseRegister(RegNo, StartLoc, EndLoc, /*RestoreOnFailure=*/false);
1583 }
1584 
1585 OperandMatchResultTy X86AsmParser::tryParseRegister(unsigned &RegNo,
1586                                                     SMLoc &StartLoc,
1587                                                     SMLoc &EndLoc) {
1588   bool Result =
1589       ParseRegister(RegNo, StartLoc, EndLoc, /*RestoreOnFailure=*/true);
1590   bool PendingErrors = getParser().hasPendingError();
1591   getParser().clearPendingErrors();
1592   if (PendingErrors)
1593     return MatchOperand_ParseFail;
1594   if (Result)
1595     return MatchOperand_NoMatch;
1596   return MatchOperand_Success;
1597 }
1598 
1599 std::unique_ptr<X86Operand> X86AsmParser::DefaultMemSIOperand(SMLoc Loc) {
1600   bool Parse32 = is32BitMode() || Code16GCC;
1601   unsigned Basereg = is64BitMode() ? X86::RSI : (Parse32 ? X86::ESI : X86::SI);
1602   const MCExpr *Disp = MCConstantExpr::create(0, getContext());
1603   return X86Operand::CreateMem(getPointerWidth(), /*SegReg=*/0, Disp,
1604                                /*BaseReg=*/Basereg, /*IndexReg=*/0, /*Scale=*/1,
1605                                Loc, Loc, 0);
1606 }
1607 
1608 std::unique_ptr<X86Operand> X86AsmParser::DefaultMemDIOperand(SMLoc Loc) {
1609   bool Parse32 = is32BitMode() || Code16GCC;
1610   unsigned Basereg = is64BitMode() ? X86::RDI : (Parse32 ? X86::EDI : X86::DI);
1611   const MCExpr *Disp = MCConstantExpr::create(0, getContext());
1612   return X86Operand::CreateMem(getPointerWidth(), /*SegReg=*/0, Disp,
1613                                /*BaseReg=*/Basereg, /*IndexReg=*/0, /*Scale=*/1,
1614                                Loc, Loc, 0);
1615 }
1616 
1617 bool X86AsmParser::IsSIReg(unsigned Reg) {
1618   switch (Reg) {
1619   default: llvm_unreachable("Only (R|E)SI and (R|E)DI are expected!");
1620   case X86::RSI:
1621   case X86::ESI:
1622   case X86::SI:
1623     return true;
1624   case X86::RDI:
1625   case X86::EDI:
1626   case X86::DI:
1627     return false;
1628   }
1629 }
1630 
1631 unsigned X86AsmParser::GetSIDIForRegClass(unsigned RegClassID, unsigned Reg,
1632                                           bool IsSIReg) {
1633   switch (RegClassID) {
1634   default: llvm_unreachable("Unexpected register class");
1635   case X86::GR64RegClassID:
1636     return IsSIReg ? X86::RSI : X86::RDI;
1637   case X86::GR32RegClassID:
1638     return IsSIReg ? X86::ESI : X86::EDI;
1639   case X86::GR16RegClassID:
1640     return IsSIReg ? X86::SI : X86::DI;
1641   }
1642 }
1643 
1644 void X86AsmParser::AddDefaultSrcDestOperands(
1645     OperandVector& Operands, std::unique_ptr<llvm::MCParsedAsmOperand> &&Src,
1646     std::unique_ptr<llvm::MCParsedAsmOperand> &&Dst) {
1647   if (isParsingIntelSyntax()) {
1648     Operands.push_back(std::move(Dst));
1649     Operands.push_back(std::move(Src));
1650   }
1651   else {
1652     Operands.push_back(std::move(Src));
1653     Operands.push_back(std::move(Dst));
1654   }
1655 }
1656 
1657 bool X86AsmParser::VerifyAndAdjustOperands(OperandVector &OrigOperands,
1658                                            OperandVector &FinalOperands) {
1659 
1660   if (OrigOperands.size() > 1) {
1661     // Check if sizes match, OrigOperands also contains the instruction name
1662     assert(OrigOperands.size() == FinalOperands.size() + 1 &&
1663            "Operand size mismatch");
1664 
1665     SmallVector<std::pair<SMLoc, std::string>, 2> Warnings;
1666     // Verify types match
1667     int RegClassID = -1;
1668     for (unsigned int i = 0; i < FinalOperands.size(); ++i) {
1669       X86Operand &OrigOp = static_cast<X86Operand &>(*OrigOperands[i + 1]);
1670       X86Operand &FinalOp = static_cast<X86Operand &>(*FinalOperands[i]);
1671 
1672       if (FinalOp.isReg() &&
1673           (!OrigOp.isReg() || FinalOp.getReg() != OrigOp.getReg()))
1674         // Return false and let a normal complaint about bogus operands happen
1675         return false;
1676 
1677       if (FinalOp.isMem()) {
1678 
1679         if (!OrigOp.isMem())
1680           // Return false and let a normal complaint about bogus operands happen
1681           return false;
1682 
1683         unsigned OrigReg = OrigOp.Mem.BaseReg;
1684         unsigned FinalReg = FinalOp.Mem.BaseReg;
1685 
1686         // If we've already encounterd a register class, make sure all register
1687         // bases are of the same register class
1688         if (RegClassID != -1 &&
1689             !X86MCRegisterClasses[RegClassID].contains(OrigReg)) {
1690           return Error(OrigOp.getStartLoc(),
1691                        "mismatching source and destination index registers");
1692         }
1693 
1694         if (X86MCRegisterClasses[X86::GR64RegClassID].contains(OrigReg))
1695           RegClassID = X86::GR64RegClassID;
1696         else if (X86MCRegisterClasses[X86::GR32RegClassID].contains(OrigReg))
1697           RegClassID = X86::GR32RegClassID;
1698         else if (X86MCRegisterClasses[X86::GR16RegClassID].contains(OrigReg))
1699           RegClassID = X86::GR16RegClassID;
1700         else
1701           // Unexpected register class type
1702           // Return false and let a normal complaint about bogus operands happen
1703           return false;
1704 
1705         bool IsSI = IsSIReg(FinalReg);
1706         FinalReg = GetSIDIForRegClass(RegClassID, FinalReg, IsSI);
1707 
1708         if (FinalReg != OrigReg) {
1709           std::string RegName = IsSI ? "ES:(R|E)SI" : "ES:(R|E)DI";
1710           Warnings.push_back(std::make_pair(
1711               OrigOp.getStartLoc(),
1712               "memory operand is only for determining the size, " + RegName +
1713                   " will be used for the location"));
1714         }
1715 
1716         FinalOp.Mem.Size = OrigOp.Mem.Size;
1717         FinalOp.Mem.SegReg = OrigOp.Mem.SegReg;
1718         FinalOp.Mem.BaseReg = FinalReg;
1719       }
1720     }
1721 
1722     // Produce warnings only if all the operands passed the adjustment - prevent
1723     // legal cases like "movsd (%rax), %xmm0" mistakenly produce warnings
1724     for (auto &WarningMsg : Warnings) {
1725       Warning(WarningMsg.first, WarningMsg.second);
1726     }
1727 
1728     // Remove old operands
1729     for (unsigned int i = 0; i < FinalOperands.size(); ++i)
1730       OrigOperands.pop_back();
1731   }
1732   // OrigOperands.append(FinalOperands.begin(), FinalOperands.end());
1733   for (unsigned int i = 0; i < FinalOperands.size(); ++i)
1734     OrigOperands.push_back(std::move(FinalOperands[i]));
1735 
1736   return false;
1737 }
1738 
1739 bool X86AsmParser::parseOperand(OperandVector &Operands, StringRef Name) {
1740   if (isParsingIntelSyntax())
1741     return parseIntelOperand(Operands, Name);
1742 
1743   return parseATTOperand(Operands);
1744 }
1745 
1746 bool X86AsmParser::CreateMemForMSInlineAsm(
1747     unsigned SegReg, const MCExpr *Disp, unsigned BaseReg, unsigned IndexReg,
1748     unsigned Scale, SMLoc Start, SMLoc End, unsigned Size, StringRef Identifier,
1749     const InlineAsmIdentifierInfo &Info, OperandVector &Operands) {
1750   // If we found a decl other than a VarDecl, then assume it is a FuncDecl or
1751   // some other label reference.
1752   if (Info.isKind(InlineAsmIdentifierInfo::IK_Label)) {
1753     // Insert an explicit size if the user didn't have one.
1754     if (!Size) {
1755       Size = getPointerWidth();
1756       InstInfo->AsmRewrites->emplace_back(AOK_SizeDirective, Start,
1757                                           /*Len=*/0, Size);
1758     }
1759     // Create an absolute memory reference in order to match against
1760     // instructions taking a PC relative operand.
1761     Operands.push_back(X86Operand::CreateMem(getPointerWidth(), Disp, Start,
1762                                              End, Size, Identifier,
1763                                              Info.Label.Decl));
1764     return false;
1765   }
1766   // We either have a direct symbol reference, or an offset from a symbol.  The
1767   // parser always puts the symbol on the LHS, so look there for size
1768   // calculation purposes.
1769   unsigned FrontendSize = 0;
1770   void *Decl = nullptr;
1771   bool IsGlobalLV = false;
1772   if (Info.isKind(InlineAsmIdentifierInfo::IK_Var)) {
1773     // Size is in terms of bits in this context.
1774     FrontendSize = Info.Var.Type * 8;
1775     Decl = Info.Var.Decl;
1776     IsGlobalLV = Info.Var.IsGlobalLV;
1777   }
1778   // It is widely common for MS InlineAsm to use a global variable and one/two
1779   // registers in a mmory expression, and though unaccessible via rip/eip.
1780   if (IsGlobalLV && (BaseReg || IndexReg)) {
1781     Operands.push_back(X86Operand::CreateMem(getPointerWidth(), Disp, Start,
1782                                              End, Size, Identifier, Decl, 0,
1783                                              BaseReg && IndexReg));
1784     return false;
1785   }
1786   // Otherwise, we set the base register to a non-zero value
1787   // if we don't know the actual value at this time.  This is necessary to
1788   // get the matching correct in some cases.
1789   BaseReg = BaseReg ? BaseReg : 1;
1790   Operands.push_back(X86Operand::CreateMem(
1791       getPointerWidth(), SegReg, Disp, BaseReg, IndexReg, Scale, Start, End,
1792       Size,
1793       /*DefaultBaseReg=*/X86::RIP, Identifier, Decl, FrontendSize));
1794   return false;
1795 }
1796 
1797 // Some binary bitwise operators have a named synonymous
1798 // Query a candidate string for being such a named operator
1799 // and if so - invoke the appropriate handler
1800 bool X86AsmParser::ParseIntelNamedOperator(StringRef Name,
1801                                            IntelExprStateMachine &SM,
1802                                            bool &ParseError, SMLoc &End) {
1803   // A named operator should be either lower or upper case, but not a mix...
1804   // except in MASM, which uses full case-insensitivity.
1805   if (Name.compare(Name.lower()) && Name.compare(Name.upper()) &&
1806       !getParser().isParsingMasm())
1807     return false;
1808   if (Name.equals_insensitive("not")) {
1809     SM.onNot();
1810   } else if (Name.equals_insensitive("or")) {
1811     SM.onOr();
1812   } else if (Name.equals_insensitive("shl")) {
1813     SM.onLShift();
1814   } else if (Name.equals_insensitive("shr")) {
1815     SM.onRShift();
1816   } else if (Name.equals_insensitive("xor")) {
1817     SM.onXor();
1818   } else if (Name.equals_insensitive("and")) {
1819     SM.onAnd();
1820   } else if (Name.equals_insensitive("mod")) {
1821     SM.onMod();
1822   } else if (Name.equals_insensitive("offset")) {
1823     SMLoc OffsetLoc = getTok().getLoc();
1824     const MCExpr *Val = nullptr;
1825     StringRef ID;
1826     InlineAsmIdentifierInfo Info;
1827     ParseError = ParseIntelOffsetOperator(Val, ID, Info, End);
1828     if (ParseError)
1829       return true;
1830     StringRef ErrMsg;
1831     ParseError =
1832         SM.onOffset(Val, OffsetLoc, ID, Info, isParsingMSInlineAsm(), ErrMsg);
1833     if (ParseError)
1834       return Error(SMLoc::getFromPointer(Name.data()), ErrMsg);
1835   } else {
1836     return false;
1837   }
1838   if (!Name.equals_insensitive("offset"))
1839     End = consumeToken();
1840   return true;
1841 }
1842 bool X86AsmParser::ParseMasmNamedOperator(StringRef Name,
1843                                           IntelExprStateMachine &SM,
1844                                           bool &ParseError, SMLoc &End) {
1845   if (Name.equals_insensitive("eq")) {
1846     SM.onEq();
1847   } else if (Name.equals_insensitive("ne")) {
1848     SM.onNE();
1849   } else if (Name.equals_insensitive("lt")) {
1850     SM.onLT();
1851   } else if (Name.equals_insensitive("le")) {
1852     SM.onLE();
1853   } else if (Name.equals_insensitive("gt")) {
1854     SM.onGT();
1855   } else if (Name.equals_insensitive("ge")) {
1856     SM.onGE();
1857   } else {
1858     return false;
1859   }
1860   End = consumeToken();
1861   return true;
1862 }
1863 
1864 // Check if current intel expression append after an operand.
1865 // Like: [Operand][Intel Expression]
1866 void X86AsmParser::tryParseOperandIdx(AsmToken::TokenKind PrevTK,
1867                                       IntelExprStateMachine &SM) {
1868   if (PrevTK != AsmToken::RBrac)
1869     return;
1870 
1871   SM.setAppendAfterOperand();
1872 }
1873 
1874 bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
1875   MCAsmParser &Parser = getParser();
1876   StringRef ErrMsg;
1877 
1878   AsmToken::TokenKind PrevTK = AsmToken::Error;
1879 
1880   if (getContext().getObjectFileInfo()->isPositionIndependent())
1881     SM.setPIC();
1882 
1883   bool Done = false;
1884   while (!Done) {
1885     // Get a fresh reference on each loop iteration in case the previous
1886     // iteration moved the token storage during UnLex().
1887     const AsmToken &Tok = Parser.getTok();
1888 
1889     bool UpdateLocLex = true;
1890     AsmToken::TokenKind TK = getLexer().getKind();
1891 
1892     switch (TK) {
1893     default:
1894       if ((Done = SM.isValidEndState()))
1895         break;
1896       return Error(Tok.getLoc(), "unknown token in expression");
1897     case AsmToken::Error:
1898       return Error(getLexer().getErrLoc(), getLexer().getErr());
1899       break;
1900     case AsmToken::EndOfStatement:
1901       Done = true;
1902       break;
1903     case AsmToken::Real:
1904       // DotOperator: [ebx].0
1905       UpdateLocLex = false;
1906       if (ParseIntelDotOperator(SM, End))
1907         return true;
1908       break;
1909     case AsmToken::Dot:
1910       if (!Parser.isParsingMasm()) {
1911         if ((Done = SM.isValidEndState()))
1912           break;
1913         return Error(Tok.getLoc(), "unknown token in expression");
1914       }
1915       // MASM allows spaces around the dot operator (e.g., "var . x")
1916       Lex();
1917       UpdateLocLex = false;
1918       if (ParseIntelDotOperator(SM, End))
1919         return true;
1920       break;
1921     case AsmToken::Dollar:
1922       if (!Parser.isParsingMasm()) {
1923         if ((Done = SM.isValidEndState()))
1924           break;
1925         return Error(Tok.getLoc(), "unknown token in expression");
1926       }
1927       LLVM_FALLTHROUGH;
1928     case AsmToken::String: {
1929       if (Parser.isParsingMasm()) {
1930         // MASM parsers handle strings in expressions as constants.
1931         SMLoc ValueLoc = Tok.getLoc();
1932         int64_t Res;
1933         const MCExpr *Val;
1934         if (Parser.parsePrimaryExpr(Val, End, nullptr))
1935           return true;
1936         UpdateLocLex = false;
1937         if (!Val->evaluateAsAbsolute(Res, getStreamer().getAssemblerPtr()))
1938           return Error(ValueLoc, "expected absolute value");
1939         if (SM.onInteger(Res, ErrMsg))
1940           return Error(ValueLoc, ErrMsg);
1941         break;
1942       }
1943       LLVM_FALLTHROUGH;
1944     }
1945     case AsmToken::At:
1946     case AsmToken::Identifier: {
1947       SMLoc IdentLoc = Tok.getLoc();
1948       StringRef Identifier = Tok.getString();
1949       UpdateLocLex = false;
1950       if (Parser.isParsingMasm()) {
1951         size_t DotOffset = Identifier.find_first_of('.');
1952         if (DotOffset != StringRef::npos) {
1953           consumeToken();
1954           StringRef LHS = Identifier.slice(0, DotOffset);
1955           StringRef Dot = Identifier.slice(DotOffset, DotOffset + 1);
1956           StringRef RHS = Identifier.slice(DotOffset + 1, StringRef::npos);
1957           if (!RHS.empty()) {
1958             getLexer().UnLex(AsmToken(AsmToken::Identifier, RHS));
1959           }
1960           getLexer().UnLex(AsmToken(AsmToken::Dot, Dot));
1961           if (!LHS.empty()) {
1962             getLexer().UnLex(AsmToken(AsmToken::Identifier, LHS));
1963           }
1964           break;
1965         }
1966       }
1967       // (MASM only) <TYPE> PTR operator
1968       if (Parser.isParsingMasm()) {
1969         const AsmToken &NextTok = getLexer().peekTok();
1970         if (NextTok.is(AsmToken::Identifier) &&
1971             NextTok.getIdentifier().equals_insensitive("ptr")) {
1972           AsmTypeInfo Info;
1973           if (Parser.lookUpType(Identifier, Info))
1974             return Error(Tok.getLoc(), "unknown type");
1975           SM.onCast(Info);
1976           // Eat type and PTR.
1977           consumeToken();
1978           End = consumeToken();
1979           break;
1980         }
1981       }
1982       // Register, or (MASM only) <register>.<field>
1983       unsigned Reg;
1984       if (Tok.is(AsmToken::Identifier)) {
1985         if (!ParseRegister(Reg, IdentLoc, End, /*RestoreOnFailure=*/true)) {
1986           if (SM.onRegister(Reg, ErrMsg))
1987             return Error(IdentLoc, ErrMsg);
1988           break;
1989         }
1990         if (Parser.isParsingMasm()) {
1991           const std::pair<StringRef, StringRef> IDField =
1992               Tok.getString().split('.');
1993           const StringRef ID = IDField.first, Field = IDField.second;
1994           SMLoc IDEndLoc = SMLoc::getFromPointer(ID.data() + ID.size());
1995           if (!Field.empty() &&
1996               !MatchRegisterByName(Reg, ID, IdentLoc, IDEndLoc)) {
1997             if (SM.onRegister(Reg, ErrMsg))
1998               return Error(IdentLoc, ErrMsg);
1999 
2000             AsmFieldInfo Info;
2001             SMLoc FieldStartLoc = SMLoc::getFromPointer(Field.data());
2002             if (Parser.lookUpField(Field, Info))
2003               return Error(FieldStartLoc, "unknown offset");
2004             else if (SM.onPlus(ErrMsg))
2005               return Error(getTok().getLoc(), ErrMsg);
2006             else if (SM.onInteger(Info.Offset, ErrMsg))
2007               return Error(IdentLoc, ErrMsg);
2008             SM.setTypeInfo(Info.Type);
2009 
2010             End = consumeToken();
2011             break;
2012           }
2013         }
2014       }
2015       // Operator synonymous ("not", "or" etc.)
2016       bool ParseError = false;
2017       if (ParseIntelNamedOperator(Identifier, SM, ParseError, End)) {
2018         if (ParseError)
2019           return true;
2020         break;
2021       }
2022       if (Parser.isParsingMasm() &&
2023           ParseMasmNamedOperator(Identifier, SM, ParseError, End)) {
2024         if (ParseError)
2025           return true;
2026         break;
2027       }
2028       // Symbol reference, when parsing assembly content
2029       InlineAsmIdentifierInfo Info;
2030       AsmFieldInfo FieldInfo;
2031       const MCExpr *Val;
2032       if (isParsingMSInlineAsm() || Parser.isParsingMasm()) {
2033         // MS Dot Operator expression
2034         if (Identifier.count('.') &&
2035             (PrevTK == AsmToken::RBrac || PrevTK == AsmToken::RParen)) {
2036           if (ParseIntelDotOperator(SM, End))
2037             return true;
2038           break;
2039         }
2040       }
2041       if (isParsingMSInlineAsm()) {
2042         // MS InlineAsm operators (TYPE/LENGTH/SIZE)
2043         if (unsigned OpKind = IdentifyIntelInlineAsmOperator(Identifier)) {
2044           if (int64_t Val = ParseIntelInlineAsmOperator(OpKind)) {
2045             if (SM.onInteger(Val, ErrMsg))
2046               return Error(IdentLoc, ErrMsg);
2047           } else {
2048             return true;
2049           }
2050           break;
2051         }
2052         // MS InlineAsm identifier
2053         // Call parseIdentifier() to combine @ with the identifier behind it.
2054         if (TK == AsmToken::At && Parser.parseIdentifier(Identifier))
2055           return Error(IdentLoc, "expected identifier");
2056         if (ParseIntelInlineAsmIdentifier(Val, Identifier, Info, false, End))
2057           return true;
2058         else if (SM.onIdentifierExpr(Val, Identifier, Info, FieldInfo.Type,
2059                                      true, ErrMsg))
2060           return Error(IdentLoc, ErrMsg);
2061         break;
2062       }
2063       if (Parser.isParsingMasm()) {
2064         if (unsigned OpKind = IdentifyMasmOperator(Identifier)) {
2065           int64_t Val;
2066           if (ParseMasmOperator(OpKind, Val))
2067             return true;
2068           if (SM.onInteger(Val, ErrMsg))
2069             return Error(IdentLoc, ErrMsg);
2070           break;
2071         }
2072         if (!getParser().lookUpType(Identifier, FieldInfo.Type)) {
2073           // Field offset immediate; <TYPE>.<field specification>
2074           Lex(); // eat type
2075           bool EndDot = parseOptionalToken(AsmToken::Dot);
2076           while (EndDot || (getTok().is(AsmToken::Identifier) &&
2077                             getTok().getString().startswith("."))) {
2078             getParser().parseIdentifier(Identifier);
2079             if (!EndDot)
2080               Identifier.consume_front(".");
2081             EndDot = Identifier.consume_back(".");
2082             if (getParser().lookUpField(FieldInfo.Type.Name, Identifier,
2083                                         FieldInfo)) {
2084               SMLoc IDEnd =
2085                   SMLoc::getFromPointer(Identifier.data() + Identifier.size());
2086               return Error(IdentLoc, "Unable to lookup field reference!",
2087                            SMRange(IdentLoc, IDEnd));
2088             }
2089             if (!EndDot)
2090               EndDot = parseOptionalToken(AsmToken::Dot);
2091           }
2092           if (SM.onInteger(FieldInfo.Offset, ErrMsg))
2093             return Error(IdentLoc, ErrMsg);
2094           break;
2095         }
2096       }
2097       if (getParser().parsePrimaryExpr(Val, End, &FieldInfo.Type)) {
2098         return Error(Tok.getLoc(), "Unexpected identifier!");
2099       } else if (SM.onIdentifierExpr(Val, Identifier, Info, FieldInfo.Type,
2100                                      false, ErrMsg)) {
2101         return Error(IdentLoc, ErrMsg);
2102       }
2103       break;
2104     }
2105     case AsmToken::Integer: {
2106       // Look for 'b' or 'f' following an Integer as a directional label
2107       SMLoc Loc = getTok().getLoc();
2108       int64_t IntVal = getTok().getIntVal();
2109       End = consumeToken();
2110       UpdateLocLex = false;
2111       if (getLexer().getKind() == AsmToken::Identifier) {
2112         StringRef IDVal = getTok().getString();
2113         if (IDVal == "f" || IDVal == "b") {
2114           MCSymbol *Sym =
2115               getContext().getDirectionalLocalSymbol(IntVal, IDVal == "b");
2116           MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
2117           const MCExpr *Val =
2118               MCSymbolRefExpr::create(Sym, Variant, getContext());
2119           if (IDVal == "b" && Sym->isUndefined())
2120             return Error(Loc, "invalid reference to undefined symbol");
2121           StringRef Identifier = Sym->getName();
2122           InlineAsmIdentifierInfo Info;
2123           AsmTypeInfo Type;
2124           if (SM.onIdentifierExpr(Val, Identifier, Info, Type,
2125                                   isParsingMSInlineAsm(), ErrMsg))
2126             return Error(Loc, ErrMsg);
2127           End = consumeToken();
2128         } else {
2129           if (SM.onInteger(IntVal, ErrMsg))
2130             return Error(Loc, ErrMsg);
2131         }
2132       } else {
2133         if (SM.onInteger(IntVal, ErrMsg))
2134           return Error(Loc, ErrMsg);
2135       }
2136       break;
2137     }
2138     case AsmToken::Plus:
2139       if (SM.onPlus(ErrMsg))
2140         return Error(getTok().getLoc(), ErrMsg);
2141       break;
2142     case AsmToken::Minus:
2143       if (SM.onMinus(ErrMsg))
2144         return Error(getTok().getLoc(), ErrMsg);
2145       break;
2146     case AsmToken::Tilde:   SM.onNot(); break;
2147     case AsmToken::Star:    SM.onStar(); break;
2148     case AsmToken::Slash:   SM.onDivide(); break;
2149     case AsmToken::Percent: SM.onMod(); break;
2150     case AsmToken::Pipe:    SM.onOr(); break;
2151     case AsmToken::Caret:   SM.onXor(); break;
2152     case AsmToken::Amp:     SM.onAnd(); break;
2153     case AsmToken::LessLess:
2154                             SM.onLShift(); break;
2155     case AsmToken::GreaterGreater:
2156                             SM.onRShift(); break;
2157     case AsmToken::LBrac:
2158       if (SM.onLBrac())
2159         return Error(Tok.getLoc(), "unexpected bracket encountered");
2160       tryParseOperandIdx(PrevTK, SM);
2161       break;
2162     case AsmToken::RBrac:
2163       if (SM.onRBrac(ErrMsg)) {
2164         return Error(Tok.getLoc(), ErrMsg);
2165       }
2166       break;
2167     case AsmToken::LParen:  SM.onLParen(); break;
2168     case AsmToken::RParen:  SM.onRParen(); break;
2169     }
2170     if (SM.hadError())
2171       return Error(Tok.getLoc(), "unknown token in expression");
2172 
2173     if (!Done && UpdateLocLex)
2174       End = consumeToken();
2175 
2176     PrevTK = TK;
2177   }
2178   return false;
2179 }
2180 
2181 void X86AsmParser::RewriteIntelExpression(IntelExprStateMachine &SM,
2182                                           SMLoc Start, SMLoc End) {
2183   SMLoc Loc = Start;
2184   unsigned ExprLen = End.getPointer() - Start.getPointer();
2185   // Skip everything before a symbol displacement (if we have one)
2186   if (SM.getSym() && !SM.isOffsetOperator()) {
2187     StringRef SymName = SM.getSymName();
2188     if (unsigned Len = SymName.data() - Start.getPointer())
2189       InstInfo->AsmRewrites->emplace_back(AOK_Skip, Start, Len);
2190     Loc = SMLoc::getFromPointer(SymName.data() + SymName.size());
2191     ExprLen = End.getPointer() - (SymName.data() + SymName.size());
2192     // If we have only a symbol than there's no need for complex rewrite,
2193     // simply skip everything after it
2194     if (!(SM.getBaseReg() || SM.getIndexReg() || SM.getImm())) {
2195       if (ExprLen)
2196         InstInfo->AsmRewrites->emplace_back(AOK_Skip, Loc, ExprLen);
2197       return;
2198     }
2199   }
2200   // Build an Intel Expression rewrite
2201   StringRef BaseRegStr;
2202   StringRef IndexRegStr;
2203   StringRef OffsetNameStr;
2204   if (SM.getBaseReg())
2205     BaseRegStr = X86IntelInstPrinter::getRegisterName(SM.getBaseReg());
2206   if (SM.getIndexReg())
2207     IndexRegStr = X86IntelInstPrinter::getRegisterName(SM.getIndexReg());
2208   if (SM.isOffsetOperator())
2209     OffsetNameStr = SM.getSymName();
2210   // Emit it
2211   IntelExpr Expr(BaseRegStr, IndexRegStr, SM.getScale(), OffsetNameStr,
2212                  SM.getImm(), SM.isMemExpr());
2213   InstInfo->AsmRewrites->emplace_back(Loc, ExprLen, Expr);
2214 }
2215 
2216 // Inline assembly may use variable names with namespace alias qualifiers.
2217 bool X86AsmParser::ParseIntelInlineAsmIdentifier(
2218     const MCExpr *&Val, StringRef &Identifier, InlineAsmIdentifierInfo &Info,
2219     bool IsUnevaluatedOperand, SMLoc &End, bool IsParsingOffsetOperator) {
2220   MCAsmParser &Parser = getParser();
2221   assert(isParsingMSInlineAsm() && "Expected to be parsing inline assembly.");
2222   Val = nullptr;
2223 
2224   StringRef LineBuf(Identifier.data());
2225   SemaCallback->LookupInlineAsmIdentifier(LineBuf, Info, IsUnevaluatedOperand);
2226 
2227   const AsmToken &Tok = Parser.getTok();
2228   SMLoc Loc = Tok.getLoc();
2229 
2230   // Advance the token stream until the end of the current token is
2231   // after the end of what the frontend claimed.
2232   const char *EndPtr = Tok.getLoc().getPointer() + LineBuf.size();
2233   do {
2234     End = Tok.getEndLoc();
2235     getLexer().Lex();
2236   } while (End.getPointer() < EndPtr);
2237   Identifier = LineBuf;
2238 
2239   // The frontend should end parsing on an assembler token boundary, unless it
2240   // failed parsing.
2241   assert((End.getPointer() == EndPtr ||
2242           Info.isKind(InlineAsmIdentifierInfo::IK_Invalid)) &&
2243           "frontend claimed part of a token?");
2244 
2245   // If the identifier lookup was unsuccessful, assume that we are dealing with
2246   // a label.
2247   if (Info.isKind(InlineAsmIdentifierInfo::IK_Invalid)) {
2248     StringRef InternalName =
2249       SemaCallback->LookupInlineAsmLabel(Identifier, getSourceManager(),
2250                                          Loc, false);
2251     assert(InternalName.size() && "We should have an internal name here.");
2252     // Push a rewrite for replacing the identifier name with the internal name,
2253     // unless we are parsing the operand of an offset operator
2254     if (!IsParsingOffsetOperator)
2255       InstInfo->AsmRewrites->emplace_back(AOK_Label, Loc, Identifier.size(),
2256                                           InternalName);
2257     else
2258       Identifier = InternalName;
2259   } else if (Info.isKind(InlineAsmIdentifierInfo::IK_EnumVal))
2260     return false;
2261   // Create the symbol reference.
2262   MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier);
2263   MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None;
2264   Val = MCSymbolRefExpr::create(Sym, Variant, getParser().getContext());
2265   return false;
2266 }
2267 
2268 //ParseRoundingModeOp - Parse AVX-512 rounding mode operand
2269 bool X86AsmParser::ParseRoundingModeOp(SMLoc Start, OperandVector &Operands) {
2270   MCAsmParser &Parser = getParser();
2271   const AsmToken &Tok = Parser.getTok();
2272   // Eat "{" and mark the current place.
2273   const SMLoc consumedToken = consumeToken();
2274   if (Tok.isNot(AsmToken::Identifier))
2275     return Error(Tok.getLoc(), "Expected an identifier after {");
2276   if (Tok.getIdentifier().startswith("r")){
2277     int rndMode = StringSwitch<int>(Tok.getIdentifier())
2278       .Case("rn", X86::STATIC_ROUNDING::TO_NEAREST_INT)
2279       .Case("rd", X86::STATIC_ROUNDING::TO_NEG_INF)
2280       .Case("ru", X86::STATIC_ROUNDING::TO_POS_INF)
2281       .Case("rz", X86::STATIC_ROUNDING::TO_ZERO)
2282       .Default(-1);
2283     if (-1 == rndMode)
2284       return Error(Tok.getLoc(), "Invalid rounding mode.");
2285      Parser.Lex();  // Eat "r*" of r*-sae
2286     if (!getLexer().is(AsmToken::Minus))
2287       return Error(Tok.getLoc(), "Expected - at this point");
2288     Parser.Lex();  // Eat "-"
2289     Parser.Lex();  // Eat the sae
2290     if (!getLexer().is(AsmToken::RCurly))
2291       return Error(Tok.getLoc(), "Expected } at this point");
2292     SMLoc End = Tok.getEndLoc();
2293     Parser.Lex();  // Eat "}"
2294     const MCExpr *RndModeOp =
2295       MCConstantExpr::create(rndMode, Parser.getContext());
2296     Operands.push_back(X86Operand::CreateImm(RndModeOp, Start, End));
2297     return false;
2298   }
2299   if(Tok.getIdentifier().equals("sae")){
2300     Parser.Lex();  // Eat the sae
2301     if (!getLexer().is(AsmToken::RCurly))
2302       return Error(Tok.getLoc(), "Expected } at this point");
2303     Parser.Lex();  // Eat "}"
2304     Operands.push_back(X86Operand::CreateToken("{sae}", consumedToken));
2305     return false;
2306   }
2307   return Error(Tok.getLoc(), "unknown token in expression");
2308 }
2309 
2310 /// Parse the '.' operator.
2311 bool X86AsmParser::ParseIntelDotOperator(IntelExprStateMachine &SM,
2312                                          SMLoc &End) {
2313   const AsmToken &Tok = getTok();
2314   AsmFieldInfo Info;
2315 
2316   // Drop the optional '.'.
2317   StringRef DotDispStr = Tok.getString();
2318   if (DotDispStr.startswith("."))
2319     DotDispStr = DotDispStr.drop_front(1);
2320   StringRef TrailingDot;
2321 
2322   // .Imm gets lexed as a real.
2323   if (Tok.is(AsmToken::Real)) {
2324     APInt DotDisp;
2325     DotDispStr.getAsInteger(10, DotDisp);
2326     Info.Offset = DotDisp.getZExtValue();
2327   } else if ((isParsingMSInlineAsm() || getParser().isParsingMasm()) &&
2328              Tok.is(AsmToken::Identifier)) {
2329     if (DotDispStr.endswith(".")) {
2330       TrailingDot = DotDispStr.substr(DotDispStr.size() - 1);
2331       DotDispStr = DotDispStr.drop_back(1);
2332     }
2333     const std::pair<StringRef, StringRef> BaseMember = DotDispStr.split('.');
2334     const StringRef Base = BaseMember.first, Member = BaseMember.second;
2335     if (getParser().lookUpField(SM.getType(), DotDispStr, Info) &&
2336         getParser().lookUpField(SM.getSymName(), DotDispStr, Info) &&
2337         getParser().lookUpField(DotDispStr, Info) &&
2338         (!SemaCallback ||
2339          SemaCallback->LookupInlineAsmField(Base, Member, Info.Offset)))
2340       return Error(Tok.getLoc(), "Unable to lookup field reference!");
2341   } else {
2342     return Error(Tok.getLoc(), "Unexpected token type!");
2343   }
2344 
2345   // Eat the DotExpression and update End
2346   End = SMLoc::getFromPointer(DotDispStr.data());
2347   const char *DotExprEndLoc = DotDispStr.data() + DotDispStr.size();
2348   while (Tok.getLoc().getPointer() < DotExprEndLoc)
2349     Lex();
2350   if (!TrailingDot.empty())
2351     getLexer().UnLex(AsmToken(AsmToken::Dot, TrailingDot));
2352   SM.addImm(Info.Offset);
2353   SM.setTypeInfo(Info.Type);
2354   return false;
2355 }
2356 
2357 /// Parse the 'offset' operator.
2358 /// This operator is used to specify the location of a given operand
2359 bool X86AsmParser::ParseIntelOffsetOperator(const MCExpr *&Val, StringRef &ID,
2360                                             InlineAsmIdentifierInfo &Info,
2361                                             SMLoc &End) {
2362   // Eat offset, mark start of identifier.
2363   SMLoc Start = Lex().getLoc();
2364   ID = getTok().getString();
2365   if (!isParsingMSInlineAsm()) {
2366     if ((getTok().isNot(AsmToken::Identifier) &&
2367          getTok().isNot(AsmToken::String)) ||
2368         getParser().parsePrimaryExpr(Val, End, nullptr))
2369       return Error(Start, "unexpected token!");
2370   } else if (ParseIntelInlineAsmIdentifier(Val, ID, Info, false, End, true)) {
2371     return Error(Start, "unable to lookup expression");
2372   } else if (Info.isKind(InlineAsmIdentifierInfo::IK_EnumVal)) {
2373     return Error(Start, "offset operator cannot yet handle constants");
2374   }
2375   return false;
2376 }
2377 
2378 // Query a candidate string for being an Intel assembly operator
2379 // Report back its kind, or IOK_INVALID if does not evaluated as a known one
2380 unsigned X86AsmParser::IdentifyIntelInlineAsmOperator(StringRef Name) {
2381   return StringSwitch<unsigned>(Name)
2382     .Cases("TYPE","type",IOK_TYPE)
2383     .Cases("SIZE","size",IOK_SIZE)
2384     .Cases("LENGTH","length",IOK_LENGTH)
2385     .Default(IOK_INVALID);
2386 }
2387 
2388 /// Parse the 'LENGTH', 'TYPE' and 'SIZE' operators.  The LENGTH operator
2389 /// returns the number of elements in an array.  It returns the value 1 for
2390 /// non-array variables.  The SIZE operator returns the size of a C or C++
2391 /// variable.  A variable's size is the product of its LENGTH and TYPE.  The
2392 /// TYPE operator returns the size of a C or C++ type or variable. If the
2393 /// variable is an array, TYPE returns the size of a single element.
2394 unsigned X86AsmParser::ParseIntelInlineAsmOperator(unsigned OpKind) {
2395   MCAsmParser &Parser = getParser();
2396   const AsmToken &Tok = Parser.getTok();
2397   Parser.Lex(); // Eat operator.
2398 
2399   const MCExpr *Val = nullptr;
2400   InlineAsmIdentifierInfo Info;
2401   SMLoc Start = Tok.getLoc(), End;
2402   StringRef Identifier = Tok.getString();
2403   if (ParseIntelInlineAsmIdentifier(Val, Identifier, Info,
2404                                     /*IsUnevaluatedOperand=*/true, End))
2405     return 0;
2406 
2407   if (!Info.isKind(InlineAsmIdentifierInfo::IK_Var)) {
2408     Error(Start, "unable to lookup expression");
2409     return 0;
2410   }
2411 
2412   unsigned CVal = 0;
2413   switch(OpKind) {
2414   default: llvm_unreachable("Unexpected operand kind!");
2415   case IOK_LENGTH: CVal = Info.Var.Length; break;
2416   case IOK_SIZE: CVal = Info.Var.Size; break;
2417   case IOK_TYPE: CVal = Info.Var.Type; break;
2418   }
2419 
2420   return CVal;
2421 }
2422 
2423 // Query a candidate string for being an Intel assembly operator
2424 // Report back its kind, or IOK_INVALID if does not evaluated as a known one
2425 unsigned X86AsmParser::IdentifyMasmOperator(StringRef Name) {
2426   return StringSwitch<unsigned>(Name.lower())
2427       .Case("type", MOK_TYPE)
2428       .Cases("size", "sizeof", MOK_SIZEOF)
2429       .Cases("length", "lengthof", MOK_LENGTHOF)
2430       .Default(MOK_INVALID);
2431 }
2432 
2433 /// Parse the 'LENGTHOF', 'SIZEOF', and 'TYPE' operators.  The LENGTHOF operator
2434 /// returns the number of elements in an array.  It returns the value 1 for
2435 /// non-array variables.  The SIZEOF operator returns the size of a type or
2436 /// variable in bytes.  A variable's size is the product of its LENGTH and TYPE.
2437 /// The TYPE operator returns the size of a variable. If the variable is an
2438 /// array, TYPE returns the size of a single element.
2439 bool X86AsmParser::ParseMasmOperator(unsigned OpKind, int64_t &Val) {
2440   MCAsmParser &Parser = getParser();
2441   SMLoc OpLoc = Parser.getTok().getLoc();
2442   Parser.Lex(); // Eat operator.
2443 
2444   Val = 0;
2445   if (OpKind == MOK_SIZEOF || OpKind == MOK_TYPE) {
2446     // Check for SIZEOF(<type>) and TYPE(<type>).
2447     bool InParens = Parser.getTok().is(AsmToken::LParen);
2448     const AsmToken &IDTok = InParens ? getLexer().peekTok() : Parser.getTok();
2449     AsmTypeInfo Type;
2450     if (IDTok.is(AsmToken::Identifier) &&
2451         !Parser.lookUpType(IDTok.getIdentifier(), Type)) {
2452       Val = Type.Size;
2453 
2454       // Eat tokens.
2455       if (InParens)
2456         parseToken(AsmToken::LParen);
2457       parseToken(AsmToken::Identifier);
2458       if (InParens)
2459         parseToken(AsmToken::RParen);
2460     }
2461   }
2462 
2463   if (!Val) {
2464     IntelExprStateMachine SM;
2465     SMLoc End, Start = Parser.getTok().getLoc();
2466     if (ParseIntelExpression(SM, End))
2467       return true;
2468 
2469     switch (OpKind) {
2470     default:
2471       llvm_unreachable("Unexpected operand kind!");
2472     case MOK_SIZEOF:
2473       Val = SM.getSize();
2474       break;
2475     case MOK_LENGTHOF:
2476       Val = SM.getLength();
2477       break;
2478     case MOK_TYPE:
2479       Val = SM.getElementSize();
2480       break;
2481     }
2482 
2483     if (!Val)
2484       return Error(OpLoc, "expression has unknown type", SMRange(Start, End));
2485   }
2486 
2487   return false;
2488 }
2489 
2490 bool X86AsmParser::ParseIntelMemoryOperandSize(unsigned &Size) {
2491   Size = StringSwitch<unsigned>(getTok().getString())
2492     .Cases("BYTE", "byte", 8)
2493     .Cases("WORD", "word", 16)
2494     .Cases("DWORD", "dword", 32)
2495     .Cases("FLOAT", "float", 32)
2496     .Cases("LONG", "long", 32)
2497     .Cases("FWORD", "fword", 48)
2498     .Cases("DOUBLE", "double", 64)
2499     .Cases("QWORD", "qword", 64)
2500     .Cases("MMWORD","mmword", 64)
2501     .Cases("XWORD", "xword", 80)
2502     .Cases("TBYTE", "tbyte", 80)
2503     .Cases("XMMWORD", "xmmword", 128)
2504     .Cases("YMMWORD", "ymmword", 256)
2505     .Cases("ZMMWORD", "zmmword", 512)
2506     .Default(0);
2507   if (Size) {
2508     const AsmToken &Tok = Lex(); // Eat operand size (e.g., byte, word).
2509     if (!(Tok.getString().equals("PTR") || Tok.getString().equals("ptr")))
2510       return Error(Tok.getLoc(), "Expected 'PTR' or 'ptr' token!");
2511     Lex(); // Eat ptr.
2512   }
2513   return false;
2514 }
2515 
2516 bool X86AsmParser::parseIntelOperand(OperandVector &Operands, StringRef Name) {
2517   MCAsmParser &Parser = getParser();
2518   const AsmToken &Tok = Parser.getTok();
2519   SMLoc Start, End;
2520 
2521   // Parse optional Size directive.
2522   unsigned Size;
2523   if (ParseIntelMemoryOperandSize(Size))
2524     return true;
2525   bool PtrInOperand = bool(Size);
2526 
2527   Start = Tok.getLoc();
2528 
2529   // Rounding mode operand.
2530   if (getLexer().is(AsmToken::LCurly))
2531     return ParseRoundingModeOp(Start, Operands);
2532 
2533   // Register operand.
2534   unsigned RegNo = 0;
2535   if (Tok.is(AsmToken::Identifier) && !ParseRegister(RegNo, Start, End)) {
2536     if (RegNo == X86::RIP)
2537       return Error(Start, "rip can only be used as a base register");
2538     // A Register followed by ':' is considered a segment override
2539     if (Tok.isNot(AsmToken::Colon)) {
2540       if (PtrInOperand)
2541         return Error(Start, "expected memory operand after 'ptr', "
2542                             "found register operand instead");
2543       Operands.push_back(X86Operand::CreateReg(RegNo, Start, End));
2544       return false;
2545     }
2546     // An alleged segment override. check if we have a valid segment register
2547     if (!X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(RegNo))
2548       return Error(Start, "invalid segment register");
2549     // Eat ':' and update Start location
2550     Start = Lex().getLoc();
2551   }
2552 
2553   // Immediates and Memory
2554   IntelExprStateMachine SM;
2555   if (ParseIntelExpression(SM, End))
2556     return true;
2557 
2558   if (isParsingMSInlineAsm())
2559     RewriteIntelExpression(SM, Start, Tok.getLoc());
2560 
2561   int64_t Imm = SM.getImm();
2562   const MCExpr *Disp = SM.getSym();
2563   const MCExpr *ImmDisp = MCConstantExpr::create(Imm, getContext());
2564   if (Disp && Imm)
2565     Disp = MCBinaryExpr::createAdd(Disp, ImmDisp, getContext());
2566   if (!Disp)
2567     Disp = ImmDisp;
2568 
2569   // RegNo != 0 specifies a valid segment register,
2570   // and we are parsing a segment override
2571   if (!SM.isMemExpr() && !RegNo) {
2572     if (isParsingMSInlineAsm() && SM.isOffsetOperator()) {
2573       const InlineAsmIdentifierInfo &Info = SM.getIdentifierInfo();
2574       if (Info.isKind(InlineAsmIdentifierInfo::IK_Var)) {
2575         // Disp includes the address of a variable; make sure this is recorded
2576         // for later handling.
2577         Operands.push_back(X86Operand::CreateImm(Disp, Start, End,
2578                                                  SM.getSymName(), Info.Var.Decl,
2579                                                  Info.Var.IsGlobalLV));
2580         return false;
2581       }
2582     }
2583 
2584     Operands.push_back(X86Operand::CreateImm(Disp, Start, End));
2585     return false;
2586   }
2587 
2588   StringRef ErrMsg;
2589   unsigned BaseReg = SM.getBaseReg();
2590   unsigned IndexReg = SM.getIndexReg();
2591   if (IndexReg && BaseReg == X86::RIP)
2592     BaseReg = 0;
2593   unsigned Scale = SM.getScale();
2594   if (!PtrInOperand)
2595     Size = SM.getElementSize() << 3;
2596 
2597   if (Scale == 0 && BaseReg != X86::ESP && BaseReg != X86::RSP &&
2598       (IndexReg == X86::ESP || IndexReg == X86::RSP))
2599     std::swap(BaseReg, IndexReg);
2600 
2601   // If BaseReg is a vector register and IndexReg is not, swap them unless
2602   // Scale was specified in which case it would be an error.
2603   if (Scale == 0 &&
2604       !(X86MCRegisterClasses[X86::VR128XRegClassID].contains(IndexReg) ||
2605         X86MCRegisterClasses[X86::VR256XRegClassID].contains(IndexReg) ||
2606         X86MCRegisterClasses[X86::VR512RegClassID].contains(IndexReg)) &&
2607       (X86MCRegisterClasses[X86::VR128XRegClassID].contains(BaseReg) ||
2608        X86MCRegisterClasses[X86::VR256XRegClassID].contains(BaseReg) ||
2609        X86MCRegisterClasses[X86::VR512RegClassID].contains(BaseReg)))
2610     std::swap(BaseReg, IndexReg);
2611 
2612   if (Scale != 0 &&
2613       X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg))
2614     return Error(Start, "16-bit addresses cannot have a scale");
2615 
2616   // If there was no explicit scale specified, change it to 1.
2617   if (Scale == 0)
2618     Scale = 1;
2619 
2620   // If this is a 16-bit addressing mode with the base and index in the wrong
2621   // order, swap them so CheckBaseRegAndIndexRegAndScale doesn't fail. It is
2622   // shared with att syntax where order matters.
2623   if ((BaseReg == X86::SI || BaseReg == X86::DI) &&
2624       (IndexReg == X86::BX || IndexReg == X86::BP))
2625     std::swap(BaseReg, IndexReg);
2626 
2627   if ((BaseReg || IndexReg) &&
2628       CheckBaseRegAndIndexRegAndScale(BaseReg, IndexReg, Scale, is64BitMode(),
2629                                       ErrMsg))
2630     return Error(Start, ErrMsg);
2631   if (isParsingMSInlineAsm())
2632     return CreateMemForMSInlineAsm(RegNo, Disp, BaseReg, IndexReg, Scale, Start,
2633                                    End, Size, SM.getSymName(),
2634                                    SM.getIdentifierInfo(), Operands);
2635 
2636   // When parsing x64 MS-style assembly, all non-absolute references to a named
2637   // variable default to RIP-relative.
2638   unsigned DefaultBaseReg = X86::NoRegister;
2639   bool MaybeDirectBranchDest = true;
2640 
2641   if (Parser.isParsingMasm()) {
2642     bool IsUnconditionalBranch =
2643         Name.equals_insensitive("jmp") || Name.equals_insensitive("call");
2644     if (is64BitMode() && SM.getElementSize() > 0) {
2645       DefaultBaseReg = X86::RIP;
2646     }
2647     if (IsUnconditionalBranch) {
2648       if (PtrInOperand) {
2649         MaybeDirectBranchDest = false;
2650         if (is64BitMode())
2651           DefaultBaseReg = X86::RIP;
2652       } else if (!BaseReg && !IndexReg && Disp &&
2653                  Disp->getKind() == MCExpr::SymbolRef) {
2654         if (is64BitMode()) {
2655           if (SM.getSize() == 8) {
2656             MaybeDirectBranchDest = false;
2657             DefaultBaseReg = X86::RIP;
2658           }
2659         } else {
2660           if (SM.getSize() == 4 || SM.getSize() == 2)
2661             MaybeDirectBranchDest = false;
2662         }
2663       }
2664     }
2665   }
2666 
2667   if ((BaseReg || IndexReg || RegNo || DefaultBaseReg != X86::NoRegister))
2668     Operands.push_back(X86Operand::CreateMem(
2669         getPointerWidth(), RegNo, Disp, BaseReg, IndexReg, Scale, Start, End,
2670         Size, DefaultBaseReg, /*SymName=*/StringRef(), /*OpDecl=*/nullptr,
2671         /*FrontendSize=*/0, /*UseUpRegs=*/false, MaybeDirectBranchDest));
2672   else
2673     Operands.push_back(X86Operand::CreateMem(
2674         getPointerWidth(), Disp, Start, End, Size, /*SymName=*/StringRef(),
2675         /*OpDecl=*/nullptr, /*FrontendSize=*/0, /*UseUpRegs=*/false,
2676         MaybeDirectBranchDest));
2677   return false;
2678 }
2679 
2680 bool X86AsmParser::parseATTOperand(OperandVector &Operands) {
2681   MCAsmParser &Parser = getParser();
2682   switch (getLexer().getKind()) {
2683   case AsmToken::Dollar: {
2684     // $42 or $ID -> immediate.
2685     SMLoc Start = Parser.getTok().getLoc(), End;
2686     Parser.Lex();
2687     const MCExpr *Val;
2688     // This is an immediate, so we should not parse a register. Do a precheck
2689     // for '%' to supercede intra-register parse errors.
2690     SMLoc L = Parser.getTok().getLoc();
2691     if (check(getLexer().is(AsmToken::Percent), L,
2692               "expected immediate expression") ||
2693         getParser().parseExpression(Val, End) ||
2694         check(isa<X86MCExpr>(Val), L, "expected immediate expression"))
2695       return true;
2696     Operands.push_back(X86Operand::CreateImm(Val, Start, End));
2697     return false;
2698   }
2699   case AsmToken::LCurly: {
2700     SMLoc Start = Parser.getTok().getLoc();
2701     return ParseRoundingModeOp(Start, Operands);
2702   }
2703   default: {
2704     // This a memory operand or a register. We have some parsing complications
2705     // as a '(' may be part of an immediate expression or the addressing mode
2706     // block. This is complicated by the fact that an assembler-level variable
2707     // may refer either to a register or an immediate expression.
2708 
2709     SMLoc Loc = Parser.getTok().getLoc(), EndLoc;
2710     const MCExpr *Expr = nullptr;
2711     unsigned Reg = 0;
2712     if (getLexer().isNot(AsmToken::LParen)) {
2713       // No '(' so this is either a displacement expression or a register.
2714       if (Parser.parseExpression(Expr, EndLoc))
2715         return true;
2716       if (auto *RE = dyn_cast<X86MCExpr>(Expr)) {
2717         // Segment Register. Reset Expr and copy value to register.
2718         Expr = nullptr;
2719         Reg = RE->getRegNo();
2720 
2721         // Check the register.
2722         if (Reg == X86::EIZ || Reg == X86::RIZ)
2723           return Error(
2724               Loc, "%eiz and %riz can only be used as index registers",
2725               SMRange(Loc, EndLoc));
2726         if (Reg == X86::RIP)
2727           return Error(Loc, "%rip can only be used as a base register",
2728                        SMRange(Loc, EndLoc));
2729         // Return register that are not segment prefixes immediately.
2730         if (!Parser.parseOptionalToken(AsmToken::Colon)) {
2731           Operands.push_back(X86Operand::CreateReg(Reg, Loc, EndLoc));
2732           return false;
2733         }
2734         if (!X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(Reg))
2735           return Error(Loc, "invalid segment register");
2736         // Accept a '*' absolute memory reference after the segment. Place it
2737         // before the full memory operand.
2738         if (getLexer().is(AsmToken::Star))
2739           Operands.push_back(X86Operand::CreateToken("*", consumeToken()));
2740       }
2741     }
2742     // This is a Memory operand.
2743     return ParseMemOperand(Reg, Expr, Loc, EndLoc, Operands);
2744   }
2745   }
2746 }
2747 
2748 // X86::COND_INVALID if not a recognized condition code or alternate mnemonic,
2749 // otherwise the EFLAGS Condition Code enumerator.
2750 X86::CondCode X86AsmParser::ParseConditionCode(StringRef CC) {
2751   return StringSwitch<X86::CondCode>(CC)
2752       .Case("o", X86::COND_O)          // Overflow
2753       .Case("no", X86::COND_NO)        // No Overflow
2754       .Cases("b", "nae", X86::COND_B)  // Below/Neither Above nor Equal
2755       .Cases("ae", "nb", X86::COND_AE) // Above or Equal/Not Below
2756       .Cases("e", "z", X86::COND_E)    // Equal/Zero
2757       .Cases("ne", "nz", X86::COND_NE) // Not Equal/Not Zero
2758       .Cases("be", "na", X86::COND_BE) // Below or Equal/Not Above
2759       .Cases("a", "nbe", X86::COND_A)  // Above/Neither Below nor Equal
2760       .Case("s", X86::COND_S)          // Sign
2761       .Case("ns", X86::COND_NS)        // No Sign
2762       .Cases("p", "pe", X86::COND_P)   // Parity/Parity Even
2763       .Cases("np", "po", X86::COND_NP) // No Parity/Parity Odd
2764       .Cases("l", "nge", X86::COND_L)  // Less/Neither Greater nor Equal
2765       .Cases("ge", "nl", X86::COND_GE) // Greater or Equal/Not Less
2766       .Cases("le", "ng", X86::COND_LE) // Less or Equal/Not Greater
2767       .Cases("g", "nle", X86::COND_G)  // Greater/Neither Less nor Equal
2768       .Default(X86::COND_INVALID);
2769 }
2770 
2771 // true on failure, false otherwise
2772 // If no {z} mark was found - Parser doesn't advance
2773 bool X86AsmParser::ParseZ(std::unique_ptr<X86Operand> &Z,
2774                           const SMLoc &StartLoc) {
2775   MCAsmParser &Parser = getParser();
2776   // Assuming we are just pass the '{' mark, quering the next token
2777   // Searched for {z}, but none was found. Return false, as no parsing error was
2778   // encountered
2779   if (!(getLexer().is(AsmToken::Identifier) &&
2780         (getLexer().getTok().getIdentifier() == "z")))
2781     return false;
2782   Parser.Lex(); // Eat z
2783   // Query and eat the '}' mark
2784   if (!getLexer().is(AsmToken::RCurly))
2785     return Error(getLexer().getLoc(), "Expected } at this point");
2786   Parser.Lex(); // Eat '}'
2787   // Assign Z with the {z} mark operand
2788   Z = X86Operand::CreateToken("{z}", StartLoc);
2789   return false;
2790 }
2791 
2792 // true on failure, false otherwise
2793 bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands) {
2794   MCAsmParser &Parser = getParser();
2795   if (getLexer().is(AsmToken::LCurly)) {
2796     // Eat "{" and mark the current place.
2797     const SMLoc consumedToken = consumeToken();
2798     // Distinguish {1to<NUM>} from {%k<NUM>}.
2799     if(getLexer().is(AsmToken::Integer)) {
2800       // Parse memory broadcasting ({1to<NUM>}).
2801       if (getLexer().getTok().getIntVal() != 1)
2802         return TokError("Expected 1to<NUM> at this point");
2803       StringRef Prefix = getLexer().getTok().getString();
2804       Parser.Lex(); // Eat first token of 1to8
2805       if (!getLexer().is(AsmToken::Identifier))
2806         return TokError("Expected 1to<NUM> at this point");
2807       // Recognize only reasonable suffixes.
2808       SmallVector<char, 5> BroadcastVector;
2809       StringRef BroadcastString = (Prefix + getLexer().getTok().getIdentifier())
2810                                       .toStringRef(BroadcastVector);
2811       if (!BroadcastString.startswith("1to"))
2812         return TokError("Expected 1to<NUM> at this point");
2813       const char *BroadcastPrimitive =
2814           StringSwitch<const char *>(BroadcastString)
2815               .Case("1to2", "{1to2}")
2816               .Case("1to4", "{1to4}")
2817               .Case("1to8", "{1to8}")
2818               .Case("1to16", "{1to16}")
2819               .Case("1to32", "{1to32}")
2820               .Default(nullptr);
2821       if (!BroadcastPrimitive)
2822         return TokError("Invalid memory broadcast primitive.");
2823       Parser.Lex(); // Eat trailing token of 1toN
2824       if (!getLexer().is(AsmToken::RCurly))
2825         return TokError("Expected } at this point");
2826       Parser.Lex();  // Eat "}"
2827       Operands.push_back(X86Operand::CreateToken(BroadcastPrimitive,
2828                                                  consumedToken));
2829       // No AVX512 specific primitives can pass
2830       // after memory broadcasting, so return.
2831       return false;
2832     } else {
2833       // Parse either {k}{z}, {z}{k}, {k} or {z}
2834       // last one have no meaning, but GCC accepts it
2835       // Currently, we're just pass a '{' mark
2836       std::unique_ptr<X86Operand> Z;
2837       if (ParseZ(Z, consumedToken))
2838         return true;
2839       // Reaching here means that parsing of the allegadly '{z}' mark yielded
2840       // no errors.
2841       // Query for the need of further parsing for a {%k<NUM>} mark
2842       if (!Z || getLexer().is(AsmToken::LCurly)) {
2843         SMLoc StartLoc = Z ? consumeToken() : consumedToken;
2844         // Parse an op-mask register mark ({%k<NUM>}), which is now to be
2845         // expected
2846         unsigned RegNo;
2847         SMLoc RegLoc;
2848         if (!ParseRegister(RegNo, RegLoc, StartLoc) &&
2849             X86MCRegisterClasses[X86::VK1RegClassID].contains(RegNo)) {
2850           if (RegNo == X86::K0)
2851             return Error(RegLoc, "Register k0 can't be used as write mask");
2852           if (!getLexer().is(AsmToken::RCurly))
2853             return Error(getLexer().getLoc(), "Expected } at this point");
2854           Operands.push_back(X86Operand::CreateToken("{", StartLoc));
2855           Operands.push_back(
2856               X86Operand::CreateReg(RegNo, StartLoc, StartLoc));
2857           Operands.push_back(X86Operand::CreateToken("}", consumeToken()));
2858         } else
2859           return Error(getLexer().getLoc(),
2860                         "Expected an op-mask register at this point");
2861         // {%k<NUM>} mark is found, inquire for {z}
2862         if (getLexer().is(AsmToken::LCurly) && !Z) {
2863           // Have we've found a parsing error, or found no (expected) {z} mark
2864           // - report an error
2865           if (ParseZ(Z, consumeToken()) || !Z)
2866             return Error(getLexer().getLoc(),
2867                          "Expected a {z} mark at this point");
2868 
2869         }
2870         // '{z}' on its own is meaningless, hence should be ignored.
2871         // on the contrary - have it been accompanied by a K register,
2872         // allow it.
2873         if (Z)
2874           Operands.push_back(std::move(Z));
2875       }
2876     }
2877   }
2878   return false;
2879 }
2880 
2881 /// ParseMemOperand: 'seg : disp(basereg, indexreg, scale)'.  The '%ds:' prefix
2882 /// has already been parsed if present. disp may be provided as well.
2883 bool X86AsmParser::ParseMemOperand(unsigned SegReg, const MCExpr *Disp,
2884                                    SMLoc StartLoc, SMLoc EndLoc,
2885                                    OperandVector &Operands) {
2886   MCAsmParser &Parser = getParser();
2887   SMLoc Loc;
2888   // Based on the initial passed values, we may be in any of these cases, we are
2889   // in one of these cases (with current position (*)):
2890 
2891   //   1. seg : * disp  (base-index-scale-expr)
2892   //   2. seg : *(disp) (base-index-scale-expr)
2893   //   3. seg :       *(base-index-scale-expr)
2894   //   4.        disp  *(base-index-scale-expr)
2895   //   5.      *(disp)  (base-index-scale-expr)
2896   //   6.             *(base-index-scale-expr)
2897   //   7.  disp *
2898   //   8. *(disp)
2899 
2900   // If we do not have an displacement yet, check if we're in cases 4 or 6 by
2901   // checking if the first object after the parenthesis is a register (or an
2902   // identifier referring to a register) and parse the displacement or default
2903   // to 0 as appropriate.
2904   auto isAtMemOperand = [this]() {
2905     if (this->getLexer().isNot(AsmToken::LParen))
2906       return false;
2907     AsmToken Buf[2];
2908     StringRef Id;
2909     auto TokCount = this->getLexer().peekTokens(Buf, true);
2910     if (TokCount == 0)
2911       return false;
2912     switch (Buf[0].getKind()) {
2913     case AsmToken::Percent:
2914     case AsmToken::Comma:
2915       return true;
2916     // These lower cases are doing a peekIdentifier.
2917     case AsmToken::At:
2918     case AsmToken::Dollar:
2919       if ((TokCount > 1) &&
2920           (Buf[1].is(AsmToken::Identifier) || Buf[1].is(AsmToken::String)) &&
2921           (Buf[0].getLoc().getPointer() + 1 == Buf[1].getLoc().getPointer()))
2922         Id = StringRef(Buf[0].getLoc().getPointer(),
2923                        Buf[1].getIdentifier().size() + 1);
2924       break;
2925     case AsmToken::Identifier:
2926     case AsmToken::String:
2927       Id = Buf[0].getIdentifier();
2928       break;
2929     default:
2930       return false;
2931     }
2932     // We have an ID. Check if it is bound to a register.
2933     if (!Id.empty()) {
2934       MCSymbol *Sym = this->getContext().getOrCreateSymbol(Id);
2935       if (Sym->isVariable()) {
2936         auto V = Sym->getVariableValue(/*SetUsed*/ false);
2937         return isa<X86MCExpr>(V);
2938       }
2939     }
2940     return false;
2941   };
2942 
2943   if (!Disp) {
2944     // Parse immediate if we're not at a mem operand yet.
2945     if (!isAtMemOperand()) {
2946       if (Parser.parseTokenLoc(Loc) || Parser.parseExpression(Disp, EndLoc))
2947         return true;
2948       assert(!isa<X86MCExpr>(Disp) && "Expected non-register here.");
2949     } else {
2950       // Disp is implicitly zero if we haven't parsed it yet.
2951       Disp = MCConstantExpr::create(0, Parser.getContext());
2952     }
2953   }
2954 
2955   // We are now either at the end of the operand or at the '(' at the start of a
2956   // base-index-scale-expr.
2957 
2958   if (!parseOptionalToken(AsmToken::LParen)) {
2959     if (SegReg == 0)
2960       Operands.push_back(
2961           X86Operand::CreateMem(getPointerWidth(), Disp, StartLoc, EndLoc));
2962     else
2963       Operands.push_back(X86Operand::CreateMem(getPointerWidth(), SegReg, Disp,
2964                                                0, 0, 1, StartLoc, EndLoc));
2965     return false;
2966   }
2967 
2968   // If we reached here, then eat the '(' and Process
2969   // the rest of the memory operand.
2970   unsigned BaseReg = 0, IndexReg = 0, Scale = 1;
2971   SMLoc BaseLoc = getLexer().getLoc();
2972   const MCExpr *E;
2973   StringRef ErrMsg;
2974 
2975   // Parse BaseReg if one is provided.
2976   if (getLexer().isNot(AsmToken::Comma) && getLexer().isNot(AsmToken::RParen)) {
2977     if (Parser.parseExpression(E, EndLoc) ||
2978         check(!isa<X86MCExpr>(E), BaseLoc, "expected register here"))
2979       return true;
2980 
2981     // Check the register.
2982     BaseReg = cast<X86MCExpr>(E)->getRegNo();
2983     if (BaseReg == X86::EIZ || BaseReg == X86::RIZ)
2984       return Error(BaseLoc, "eiz and riz can only be used as index registers",
2985                    SMRange(BaseLoc, EndLoc));
2986   }
2987 
2988   if (parseOptionalToken(AsmToken::Comma)) {
2989     // Following the comma we should have either an index register, or a scale
2990     // value. We don't support the later form, but we want to parse it
2991     // correctly.
2992     //
2993     // Even though it would be completely consistent to support syntax like
2994     // "1(%eax,,1)", the assembler doesn't. Use "eiz" or "riz" for this.
2995     if (getLexer().isNot(AsmToken::RParen)) {
2996       if (Parser.parseTokenLoc(Loc) || Parser.parseExpression(E, EndLoc))
2997         return true;
2998 
2999       if (!isa<X86MCExpr>(E)) {
3000         // We've parsed an unexpected Scale Value instead of an index
3001         // register. Interpret it as an absolute.
3002         int64_t ScaleVal;
3003         if (!E->evaluateAsAbsolute(ScaleVal, getStreamer().getAssemblerPtr()))
3004           return Error(Loc, "expected absolute expression");
3005         if (ScaleVal != 1)
3006           Warning(Loc, "scale factor without index register is ignored");
3007         Scale = 1;
3008       } else { // IndexReg Found.
3009         IndexReg = cast<X86MCExpr>(E)->getRegNo();
3010 
3011         if (BaseReg == X86::RIP)
3012           return Error(Loc,
3013                        "%rip as base register can not have an index register");
3014         if (IndexReg == X86::RIP)
3015           return Error(Loc, "%rip is not allowed as an index register");
3016 
3017         if (parseOptionalToken(AsmToken::Comma)) {
3018           // Parse the scale amount:
3019           //  ::= ',' [scale-expression]
3020 
3021           // A scale amount without an index is ignored.
3022           if (getLexer().isNot(AsmToken::RParen)) {
3023             int64_t ScaleVal;
3024             if (Parser.parseTokenLoc(Loc) ||
3025                 Parser.parseAbsoluteExpression(ScaleVal))
3026               return Error(Loc, "expected scale expression");
3027             Scale = (unsigned)ScaleVal;
3028             // Validate the scale amount.
3029             if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) &&
3030                 Scale != 1)
3031               return Error(Loc, "scale factor in 16-bit address must be 1");
3032             if (checkScale(Scale, ErrMsg))
3033               return Error(Loc, ErrMsg);
3034           }
3035         }
3036       }
3037     }
3038   }
3039 
3040   // Ok, we've eaten the memory operand, verify we have a ')' and eat it too.
3041   if (parseToken(AsmToken::RParen, "unexpected token in memory operand"))
3042     return true;
3043 
3044   // This is to support otherwise illegal operand (%dx) found in various
3045   // unofficial manuals examples (e.g. "out[s]?[bwl]? %al, (%dx)") and must now
3046   // be supported. Mark such DX variants separately fix only in special cases.
3047   if (BaseReg == X86::DX && IndexReg == 0 && Scale == 1 && SegReg == 0 &&
3048       isa<MCConstantExpr>(Disp) &&
3049       cast<MCConstantExpr>(Disp)->getValue() == 0) {
3050     Operands.push_back(X86Operand::CreateDXReg(BaseLoc, BaseLoc));
3051     return false;
3052   }
3053 
3054   if (CheckBaseRegAndIndexRegAndScale(BaseReg, IndexReg, Scale, is64BitMode(),
3055                                       ErrMsg))
3056     return Error(BaseLoc, ErrMsg);
3057 
3058   if (SegReg || BaseReg || IndexReg)
3059     Operands.push_back(X86Operand::CreateMem(getPointerWidth(), SegReg, Disp,
3060                                              BaseReg, IndexReg, Scale, StartLoc,
3061                                              EndLoc));
3062   else
3063     Operands.push_back(
3064         X86Operand::CreateMem(getPointerWidth(), Disp, StartLoc, EndLoc));
3065   return false;
3066 }
3067 
3068 // Parse either a standard primary expression or a register.
3069 bool X86AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) {
3070   MCAsmParser &Parser = getParser();
3071   // See if this is a register first.
3072   if (getTok().is(AsmToken::Percent) ||
3073       (isParsingIntelSyntax() && getTok().is(AsmToken::Identifier) &&
3074        MatchRegisterName(Parser.getTok().getString()))) {
3075     SMLoc StartLoc = Parser.getTok().getLoc();
3076     unsigned RegNo;
3077     if (ParseRegister(RegNo, StartLoc, EndLoc))
3078       return true;
3079     Res = X86MCExpr::create(RegNo, Parser.getContext());
3080     return false;
3081   }
3082   return Parser.parsePrimaryExpr(Res, EndLoc, nullptr);
3083 }
3084 
3085 bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
3086                                     SMLoc NameLoc, OperandVector &Operands) {
3087   MCAsmParser &Parser = getParser();
3088   InstInfo = &Info;
3089 
3090   // Reset the forced VEX encoding.
3091   ForcedVEXEncoding = VEXEncoding_Default;
3092   ForcedDispEncoding = DispEncoding_Default;
3093 
3094   // Parse pseudo prefixes.
3095   while (true) {
3096     if (Name == "{") {
3097       if (getLexer().isNot(AsmToken::Identifier))
3098         return Error(Parser.getTok().getLoc(), "Unexpected token after '{'");
3099       std::string Prefix = Parser.getTok().getString().lower();
3100       Parser.Lex(); // Eat identifier.
3101       if (getLexer().isNot(AsmToken::RCurly))
3102         return Error(Parser.getTok().getLoc(), "Expected '}'");
3103       Parser.Lex(); // Eat curly.
3104 
3105       if (Prefix == "vex")
3106         ForcedVEXEncoding = VEXEncoding_VEX;
3107       else if (Prefix == "vex2")
3108         ForcedVEXEncoding = VEXEncoding_VEX2;
3109       else if (Prefix == "vex3")
3110         ForcedVEXEncoding = VEXEncoding_VEX3;
3111       else if (Prefix == "evex")
3112         ForcedVEXEncoding = VEXEncoding_EVEX;
3113       else if (Prefix == "disp8")
3114         ForcedDispEncoding = DispEncoding_Disp8;
3115       else if (Prefix == "disp32")
3116         ForcedDispEncoding = DispEncoding_Disp32;
3117       else
3118         return Error(NameLoc, "unknown prefix");
3119 
3120       NameLoc = Parser.getTok().getLoc();
3121       if (getLexer().is(AsmToken::LCurly)) {
3122         Parser.Lex();
3123         Name = "{";
3124       } else {
3125         if (getLexer().isNot(AsmToken::Identifier))
3126           return Error(Parser.getTok().getLoc(), "Expected identifier");
3127         // FIXME: The mnemonic won't match correctly if its not in lower case.
3128         Name = Parser.getTok().getString();
3129         Parser.Lex();
3130       }
3131       continue;
3132     }
3133     // Parse MASM style pseudo prefixes.
3134     if (isParsingMSInlineAsm()) {
3135       if (Name.equals_insensitive("vex"))
3136         ForcedVEXEncoding = VEXEncoding_VEX;
3137       else if (Name.equals_insensitive("vex2"))
3138         ForcedVEXEncoding = VEXEncoding_VEX2;
3139       else if (Name.equals_insensitive("vex3"))
3140         ForcedVEXEncoding = VEXEncoding_VEX3;
3141       else if (Name.equals_insensitive("evex"))
3142         ForcedVEXEncoding = VEXEncoding_EVEX;
3143 
3144       if (ForcedVEXEncoding != VEXEncoding_Default) {
3145         if (getLexer().isNot(AsmToken::Identifier))
3146           return Error(Parser.getTok().getLoc(), "Expected identifier");
3147         // FIXME: The mnemonic won't match correctly if its not in lower case.
3148         Name = Parser.getTok().getString();
3149         NameLoc = Parser.getTok().getLoc();
3150         Parser.Lex();
3151       }
3152     }
3153     break;
3154   }
3155 
3156   // Support the suffix syntax for overriding displacement size as well.
3157   if (Name.consume_back(".d32")) {
3158     ForcedDispEncoding = DispEncoding_Disp32;
3159   } else if (Name.consume_back(".d8")) {
3160     ForcedDispEncoding = DispEncoding_Disp8;
3161   }
3162 
3163   StringRef PatchedName = Name;
3164 
3165   // Hack to skip "short" following Jcc.
3166   if (isParsingIntelSyntax() &&
3167       (PatchedName == "jmp" || PatchedName == "jc" || PatchedName == "jnc" ||
3168        PatchedName == "jcxz" || PatchedName == "jecxz" ||
3169        (PatchedName.startswith("j") &&
3170         ParseConditionCode(PatchedName.substr(1)) != X86::COND_INVALID))) {
3171     StringRef NextTok = Parser.getTok().getString();
3172     if (Parser.isParsingMasm() ? NextTok.equals_insensitive("short")
3173                                : NextTok == "short") {
3174       SMLoc NameEndLoc =
3175           NameLoc.getFromPointer(NameLoc.getPointer() + Name.size());
3176       // Eat the short keyword.
3177       Parser.Lex();
3178       // MS and GAS ignore the short keyword; they both determine the jmp type
3179       // based on the distance of the label. (NASM does emit different code with
3180       // and without "short," though.)
3181       InstInfo->AsmRewrites->emplace_back(AOK_Skip, NameEndLoc,
3182                                           NextTok.size() + 1);
3183     }
3184   }
3185 
3186   // FIXME: Hack to recognize setneb as setne.
3187   if (PatchedName.startswith("set") && PatchedName.endswith("b") &&
3188       PatchedName != "setb" && PatchedName != "setnb")
3189     PatchedName = PatchedName.substr(0, Name.size()-1);
3190 
3191   unsigned ComparisonPredicate = ~0U;
3192 
3193   // FIXME: Hack to recognize cmp<comparison code>{sh,ss,sd,ph,ps,pd}.
3194   if ((PatchedName.startswith("cmp") || PatchedName.startswith("vcmp")) &&
3195       (PatchedName.endswith("ss") || PatchedName.endswith("sd") ||
3196        PatchedName.endswith("sh") || PatchedName.endswith("ph") ||
3197        PatchedName.endswith("ps") || PatchedName.endswith("pd"))) {
3198     bool IsVCMP = PatchedName[0] == 'v';
3199     unsigned CCIdx = IsVCMP ? 4 : 3;
3200     unsigned CC = StringSwitch<unsigned>(
3201       PatchedName.slice(CCIdx, PatchedName.size() - 2))
3202       .Case("eq",       0x00)
3203       .Case("eq_oq",    0x00)
3204       .Case("lt",       0x01)
3205       .Case("lt_os",    0x01)
3206       .Case("le",       0x02)
3207       .Case("le_os",    0x02)
3208       .Case("unord",    0x03)
3209       .Case("unord_q",  0x03)
3210       .Case("neq",      0x04)
3211       .Case("neq_uq",   0x04)
3212       .Case("nlt",      0x05)
3213       .Case("nlt_us",   0x05)
3214       .Case("nle",      0x06)
3215       .Case("nle_us",   0x06)
3216       .Case("ord",      0x07)
3217       .Case("ord_q",    0x07)
3218       /* AVX only from here */
3219       .Case("eq_uq",    0x08)
3220       .Case("nge",      0x09)
3221       .Case("nge_us",   0x09)
3222       .Case("ngt",      0x0A)
3223       .Case("ngt_us",   0x0A)
3224       .Case("false",    0x0B)
3225       .Case("false_oq", 0x0B)
3226       .Case("neq_oq",   0x0C)
3227       .Case("ge",       0x0D)
3228       .Case("ge_os",    0x0D)
3229       .Case("gt",       0x0E)
3230       .Case("gt_os",    0x0E)
3231       .Case("true",     0x0F)
3232       .Case("true_uq",  0x0F)
3233       .Case("eq_os",    0x10)
3234       .Case("lt_oq",    0x11)
3235       .Case("le_oq",    0x12)
3236       .Case("unord_s",  0x13)
3237       .Case("neq_us",   0x14)
3238       .Case("nlt_uq",   0x15)
3239       .Case("nle_uq",   0x16)
3240       .Case("ord_s",    0x17)
3241       .Case("eq_us",    0x18)
3242       .Case("nge_uq",   0x19)
3243       .Case("ngt_uq",   0x1A)
3244       .Case("false_os", 0x1B)
3245       .Case("neq_os",   0x1C)
3246       .Case("ge_oq",    0x1D)
3247       .Case("gt_oq",    0x1E)
3248       .Case("true_us",  0x1F)
3249       .Default(~0U);
3250     if (CC != ~0U && (IsVCMP || CC < 8) &&
3251         (IsVCMP || PatchedName.back() != 'h')) {
3252       if (PatchedName.endswith("ss"))
3253         PatchedName = IsVCMP ? "vcmpss" : "cmpss";
3254       else if (PatchedName.endswith("sd"))
3255         PatchedName = IsVCMP ? "vcmpsd" : "cmpsd";
3256       else if (PatchedName.endswith("ps"))
3257         PatchedName = IsVCMP ? "vcmpps" : "cmpps";
3258       else if (PatchedName.endswith("pd"))
3259         PatchedName = IsVCMP ? "vcmppd" : "cmppd";
3260       else if (PatchedName.endswith("sh"))
3261         PatchedName = "vcmpsh";
3262       else if (PatchedName.endswith("ph"))
3263         PatchedName = "vcmpph";
3264       else
3265         llvm_unreachable("Unexpected suffix!");
3266 
3267       ComparisonPredicate = CC;
3268     }
3269   }
3270 
3271   // FIXME: Hack to recognize vpcmp<comparison code>{ub,uw,ud,uq,b,w,d,q}.
3272   if (PatchedName.startswith("vpcmp") &&
3273       (PatchedName.back() == 'b' || PatchedName.back() == 'w' ||
3274        PatchedName.back() == 'd' || PatchedName.back() == 'q')) {
3275     unsigned SuffixSize = PatchedName.drop_back().back() == 'u' ? 2 : 1;
3276     unsigned CC = StringSwitch<unsigned>(
3277       PatchedName.slice(5, PatchedName.size() - SuffixSize))
3278       .Case("eq",    0x0) // Only allowed on unsigned. Checked below.
3279       .Case("lt",    0x1)
3280       .Case("le",    0x2)
3281       //.Case("false", 0x3) // Not a documented alias.
3282       .Case("neq",   0x4)
3283       .Case("nlt",   0x5)
3284       .Case("nle",   0x6)
3285       //.Case("true",  0x7) // Not a documented alias.
3286       .Default(~0U);
3287     if (CC != ~0U && (CC != 0 || SuffixSize == 2)) {
3288       switch (PatchedName.back()) {
3289       default: llvm_unreachable("Unexpected character!");
3290       case 'b': PatchedName = SuffixSize == 2 ? "vpcmpub" : "vpcmpb"; break;
3291       case 'w': PatchedName = SuffixSize == 2 ? "vpcmpuw" : "vpcmpw"; break;
3292       case 'd': PatchedName = SuffixSize == 2 ? "vpcmpud" : "vpcmpd"; break;
3293       case 'q': PatchedName = SuffixSize == 2 ? "vpcmpuq" : "vpcmpq"; break;
3294       }
3295       // Set up the immediate to push into the operands later.
3296       ComparisonPredicate = CC;
3297     }
3298   }
3299 
3300   // FIXME: Hack to recognize vpcom<comparison code>{ub,uw,ud,uq,b,w,d,q}.
3301   if (PatchedName.startswith("vpcom") &&
3302       (PatchedName.back() == 'b' || PatchedName.back() == 'w' ||
3303        PatchedName.back() == 'd' || PatchedName.back() == 'q')) {
3304     unsigned SuffixSize = PatchedName.drop_back().back() == 'u' ? 2 : 1;
3305     unsigned CC = StringSwitch<unsigned>(
3306       PatchedName.slice(5, PatchedName.size() - SuffixSize))
3307       .Case("lt",    0x0)
3308       .Case("le",    0x1)
3309       .Case("gt",    0x2)
3310       .Case("ge",    0x3)
3311       .Case("eq",    0x4)
3312       .Case("neq",   0x5)
3313       .Case("false", 0x6)
3314       .Case("true",  0x7)
3315       .Default(~0U);
3316     if (CC != ~0U) {
3317       switch (PatchedName.back()) {
3318       default: llvm_unreachable("Unexpected character!");
3319       case 'b': PatchedName = SuffixSize == 2 ? "vpcomub" : "vpcomb"; break;
3320       case 'w': PatchedName = SuffixSize == 2 ? "vpcomuw" : "vpcomw"; break;
3321       case 'd': PatchedName = SuffixSize == 2 ? "vpcomud" : "vpcomd"; break;
3322       case 'q': PatchedName = SuffixSize == 2 ? "vpcomuq" : "vpcomq"; break;
3323       }
3324       // Set up the immediate to push into the operands later.
3325       ComparisonPredicate = CC;
3326     }
3327   }
3328 
3329 
3330   // Determine whether this is an instruction prefix.
3331   // FIXME:
3332   // Enhance prefixes integrity robustness. for example, following forms
3333   // are currently tolerated:
3334   // repz repnz <insn>    ; GAS errors for the use of two similar prefixes
3335   // lock addq %rax, %rbx ; Destination operand must be of memory type
3336   // xacquire <insn>      ; xacquire must be accompanied by 'lock'
3337   bool IsPrefix =
3338       StringSwitch<bool>(Name)
3339           .Cases("cs", "ds", "es", "fs", "gs", "ss", true)
3340           .Cases("rex64", "data32", "data16", "addr32", "addr16", true)
3341           .Cases("xacquire", "xrelease", true)
3342           .Cases("acquire", "release", isParsingIntelSyntax())
3343           .Default(false);
3344 
3345   auto isLockRepeatNtPrefix = [](StringRef N) {
3346     return StringSwitch<bool>(N)
3347         .Cases("lock", "rep", "repe", "repz", "repne", "repnz", "notrack", true)
3348         .Default(false);
3349   };
3350 
3351   bool CurlyAsEndOfStatement = false;
3352 
3353   unsigned Flags = X86::IP_NO_PREFIX;
3354   while (isLockRepeatNtPrefix(Name.lower())) {
3355     unsigned Prefix =
3356         StringSwitch<unsigned>(Name)
3357             .Cases("lock", "lock", X86::IP_HAS_LOCK)
3358             .Cases("rep", "repe", "repz", X86::IP_HAS_REPEAT)
3359             .Cases("repne", "repnz", X86::IP_HAS_REPEAT_NE)
3360             .Cases("notrack", "notrack", X86::IP_HAS_NOTRACK)
3361             .Default(X86::IP_NO_PREFIX); // Invalid prefix (impossible)
3362     Flags |= Prefix;
3363     if (getLexer().is(AsmToken::EndOfStatement)) {
3364       // We don't have real instr with the given prefix
3365       //  let's use the prefix as the instr.
3366       // TODO: there could be several prefixes one after another
3367       Flags = X86::IP_NO_PREFIX;
3368       break;
3369     }
3370     // FIXME: The mnemonic won't match correctly if its not in lower case.
3371     Name = Parser.getTok().getString();
3372     Parser.Lex(); // eat the prefix
3373     // Hack: we could have something like "rep # some comment" or
3374     //    "lock; cmpxchg16b $1" or "lock\0A\09incl" or "lock/incl"
3375     while (Name.startswith(";") || Name.startswith("\n") ||
3376            Name.startswith("#") || Name.startswith("\t") ||
3377            Name.startswith("/")) {
3378       // FIXME: The mnemonic won't match correctly if its not in lower case.
3379       Name = Parser.getTok().getString();
3380       Parser.Lex(); // go to next prefix or instr
3381     }
3382   }
3383 
3384   if (Flags)
3385     PatchedName = Name;
3386 
3387   // Hacks to handle 'data16' and 'data32'
3388   if (PatchedName == "data16" && is16BitMode()) {
3389     return Error(NameLoc, "redundant data16 prefix");
3390   }
3391   if (PatchedName == "data32") {
3392     if (is32BitMode())
3393       return Error(NameLoc, "redundant data32 prefix");
3394     if (is64BitMode())
3395       return Error(NameLoc, "'data32' is not supported in 64-bit mode");
3396     // Hack to 'data16' for the table lookup.
3397     PatchedName = "data16";
3398 
3399     if (getLexer().isNot(AsmToken::EndOfStatement)) {
3400       StringRef Next = Parser.getTok().getString();
3401       getLexer().Lex();
3402       // data32 effectively changes the instruction suffix.
3403       // TODO Generalize.
3404       if (Next == "callw")
3405         Next = "calll";
3406       if (Next == "ljmpw")
3407         Next = "ljmpl";
3408 
3409       Name = Next;
3410       PatchedName = Name;
3411       ForcedDataPrefix = X86::Is32Bit;
3412       IsPrefix = false;
3413     }
3414   }
3415 
3416   Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc));
3417 
3418   // Push the immediate if we extracted one from the mnemonic.
3419   if (ComparisonPredicate != ~0U && !isParsingIntelSyntax()) {
3420     const MCExpr *ImmOp = MCConstantExpr::create(ComparisonPredicate,
3421                                                  getParser().getContext());
3422     Operands.push_back(X86Operand::CreateImm(ImmOp, NameLoc, NameLoc));
3423   }
3424 
3425   // This does the actual operand parsing.  Don't parse any more if we have a
3426   // prefix juxtaposed with an operation like "lock incl 4(%rax)", because we
3427   // just want to parse the "lock" as the first instruction and the "incl" as
3428   // the next one.
3429   if (getLexer().isNot(AsmToken::EndOfStatement) && !IsPrefix) {
3430     // Parse '*' modifier.
3431     if (getLexer().is(AsmToken::Star))
3432       Operands.push_back(X86Operand::CreateToken("*", consumeToken()));
3433 
3434     // Read the operands.
3435     while (true) {
3436       if (parseOperand(Operands, Name))
3437         return true;
3438       if (HandleAVX512Operand(Operands))
3439         return true;
3440 
3441       // check for comma and eat it
3442       if (getLexer().is(AsmToken::Comma))
3443         Parser.Lex();
3444       else
3445         break;
3446      }
3447 
3448     // In MS inline asm curly braces mark the beginning/end of a block,
3449     // therefore they should be interepreted as end of statement
3450     CurlyAsEndOfStatement =
3451         isParsingIntelSyntax() && isParsingMSInlineAsm() &&
3452         (getLexer().is(AsmToken::LCurly) || getLexer().is(AsmToken::RCurly));
3453     if (getLexer().isNot(AsmToken::EndOfStatement) && !CurlyAsEndOfStatement)
3454       return TokError("unexpected token in argument list");
3455   }
3456 
3457   // Push the immediate if we extracted one from the mnemonic.
3458   if (ComparisonPredicate != ~0U && isParsingIntelSyntax()) {
3459     const MCExpr *ImmOp = MCConstantExpr::create(ComparisonPredicate,
3460                                                  getParser().getContext());
3461     Operands.push_back(X86Operand::CreateImm(ImmOp, NameLoc, NameLoc));
3462   }
3463 
3464   // Consume the EndOfStatement or the prefix separator Slash
3465   if (getLexer().is(AsmToken::EndOfStatement) ||
3466       (IsPrefix && getLexer().is(AsmToken::Slash)))
3467     Parser.Lex();
3468   else if (CurlyAsEndOfStatement)
3469     // Add an actual EndOfStatement before the curly brace
3470     Info.AsmRewrites->emplace_back(AOK_EndOfStatement,
3471                                    getLexer().getTok().getLoc(), 0);
3472 
3473   // This is for gas compatibility and cannot be done in td.
3474   // Adding "p" for some floating point with no argument.
3475   // For example: fsub --> fsubp
3476   bool IsFp =
3477     Name == "fsub" || Name == "fdiv" || Name == "fsubr" || Name == "fdivr";
3478   if (IsFp && Operands.size() == 1) {
3479     const char *Repl = StringSwitch<const char *>(Name)
3480       .Case("fsub", "fsubp")
3481       .Case("fdiv", "fdivp")
3482       .Case("fsubr", "fsubrp")
3483       .Case("fdivr", "fdivrp");
3484     static_cast<X86Operand &>(*Operands[0]).setTokenValue(Repl);
3485   }
3486 
3487   if ((Name == "mov" || Name == "movw" || Name == "movl") &&
3488       (Operands.size() == 3)) {
3489     X86Operand &Op1 = (X86Operand &)*Operands[1];
3490     X86Operand &Op2 = (X86Operand &)*Operands[2];
3491     SMLoc Loc = Op1.getEndLoc();
3492     // Moving a 32 or 16 bit value into a segment register has the same
3493     // behavior. Modify such instructions to always take shorter form.
3494     if (Op1.isReg() && Op2.isReg() &&
3495         X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(
3496             Op2.getReg()) &&
3497         (X86MCRegisterClasses[X86::GR16RegClassID].contains(Op1.getReg()) ||
3498          X86MCRegisterClasses[X86::GR32RegClassID].contains(Op1.getReg()))) {
3499       // Change instruction name to match new instruction.
3500       if (Name != "mov" && Name[3] == (is16BitMode() ? 'l' : 'w')) {
3501         Name = is16BitMode() ? "movw" : "movl";
3502         Operands[0] = X86Operand::CreateToken(Name, NameLoc);
3503       }
3504       // Select the correct equivalent 16-/32-bit source register.
3505       unsigned Reg =
3506           getX86SubSuperRegisterOrZero(Op1.getReg(), is16BitMode() ? 16 : 32);
3507       Operands[1] = X86Operand::CreateReg(Reg, Loc, Loc);
3508     }
3509   }
3510 
3511   // This is a terrible hack to handle "out[s]?[bwl]? %al, (%dx)" ->
3512   // "outb %al, %dx".  Out doesn't take a memory form, but this is a widely
3513   // documented form in various unofficial manuals, so a lot of code uses it.
3514   if ((Name == "outb" || Name == "outsb" || Name == "outw" || Name == "outsw" ||
3515        Name == "outl" || Name == "outsl" || Name == "out" || Name == "outs") &&
3516       Operands.size() == 3) {
3517     X86Operand &Op = (X86Operand &)*Operands.back();
3518     if (Op.isDXReg())
3519       Operands.back() = X86Operand::CreateReg(X86::DX, Op.getStartLoc(),
3520                                               Op.getEndLoc());
3521   }
3522   // Same hack for "in[s]?[bwl]? (%dx), %al" -> "inb %dx, %al".
3523   if ((Name == "inb" || Name == "insb" || Name == "inw" || Name == "insw" ||
3524        Name == "inl" || Name == "insl" || Name == "in" || Name == "ins") &&
3525       Operands.size() == 3) {
3526     X86Operand &Op = (X86Operand &)*Operands[1];
3527     if (Op.isDXReg())
3528       Operands[1] = X86Operand::CreateReg(X86::DX, Op.getStartLoc(),
3529                                           Op.getEndLoc());
3530   }
3531 
3532   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 2> TmpOperands;
3533   bool HadVerifyError = false;
3534 
3535   // Append default arguments to "ins[bwld]"
3536   if (Name.startswith("ins") &&
3537       (Operands.size() == 1 || Operands.size() == 3) &&
3538       (Name == "insb" || Name == "insw" || Name == "insl" || Name == "insd" ||
3539        Name == "ins")) {
3540 
3541     AddDefaultSrcDestOperands(TmpOperands,
3542                               X86Operand::CreateReg(X86::DX, NameLoc, NameLoc),
3543                               DefaultMemDIOperand(NameLoc));
3544     HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands);
3545   }
3546 
3547   // Append default arguments to "outs[bwld]"
3548   if (Name.startswith("outs") &&
3549       (Operands.size() == 1 || Operands.size() == 3) &&
3550       (Name == "outsb" || Name == "outsw" || Name == "outsl" ||
3551        Name == "outsd" || Name == "outs")) {
3552     AddDefaultSrcDestOperands(TmpOperands, DefaultMemSIOperand(NameLoc),
3553                               X86Operand::CreateReg(X86::DX, NameLoc, NameLoc));
3554     HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands);
3555   }
3556 
3557   // Transform "lods[bwlq]" into "lods[bwlq] ($SIREG)" for appropriate
3558   // values of $SIREG according to the mode. It would be nice if this
3559   // could be achieved with InstAlias in the tables.
3560   if (Name.startswith("lods") &&
3561       (Operands.size() == 1 || Operands.size() == 2) &&
3562       (Name == "lods" || Name == "lodsb" || Name == "lodsw" ||
3563        Name == "lodsl" || Name == "lodsd" || Name == "lodsq")) {
3564     TmpOperands.push_back(DefaultMemSIOperand(NameLoc));
3565     HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands);
3566   }
3567 
3568   // Transform "stos[bwlq]" into "stos[bwlq] ($DIREG)" for appropriate
3569   // values of $DIREG according to the mode. It would be nice if this
3570   // could be achieved with InstAlias in the tables.
3571   if (Name.startswith("stos") &&
3572       (Operands.size() == 1 || Operands.size() == 2) &&
3573       (Name == "stos" || Name == "stosb" || Name == "stosw" ||
3574        Name == "stosl" || Name == "stosd" || Name == "stosq")) {
3575     TmpOperands.push_back(DefaultMemDIOperand(NameLoc));
3576     HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands);
3577   }
3578 
3579   // Transform "scas[bwlq]" into "scas[bwlq] ($DIREG)" for appropriate
3580   // values of $DIREG according to the mode. It would be nice if this
3581   // could be achieved with InstAlias in the tables.
3582   if (Name.startswith("scas") &&
3583       (Operands.size() == 1 || Operands.size() == 2) &&
3584       (Name == "scas" || Name == "scasb" || Name == "scasw" ||
3585        Name == "scasl" || Name == "scasd" || Name == "scasq")) {
3586     TmpOperands.push_back(DefaultMemDIOperand(NameLoc));
3587     HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands);
3588   }
3589 
3590   // Add default SI and DI operands to "cmps[bwlq]".
3591   if (Name.startswith("cmps") &&
3592       (Operands.size() == 1 || Operands.size() == 3) &&
3593       (Name == "cmps" || Name == "cmpsb" || Name == "cmpsw" ||
3594        Name == "cmpsl" || Name == "cmpsd" || Name == "cmpsq")) {
3595     AddDefaultSrcDestOperands(TmpOperands, DefaultMemDIOperand(NameLoc),
3596                               DefaultMemSIOperand(NameLoc));
3597     HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands);
3598   }
3599 
3600   // Add default SI and DI operands to "movs[bwlq]".
3601   if (((Name.startswith("movs") &&
3602         (Name == "movs" || Name == "movsb" || Name == "movsw" ||
3603          Name == "movsl" || Name == "movsd" || Name == "movsq")) ||
3604        (Name.startswith("smov") &&
3605         (Name == "smov" || Name == "smovb" || Name == "smovw" ||
3606          Name == "smovl" || Name == "smovd" || Name == "smovq"))) &&
3607       (Operands.size() == 1 || Operands.size() == 3)) {
3608     if (Name == "movsd" && Operands.size() == 1 && !isParsingIntelSyntax())
3609       Operands.back() = X86Operand::CreateToken("movsl", NameLoc);
3610     AddDefaultSrcDestOperands(TmpOperands, DefaultMemSIOperand(NameLoc),
3611                               DefaultMemDIOperand(NameLoc));
3612     HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands);
3613   }
3614 
3615   // Check if we encountered an error for one the string insturctions
3616   if (HadVerifyError) {
3617     return HadVerifyError;
3618   }
3619 
3620   // Transforms "xlat mem8" into "xlatb"
3621   if ((Name == "xlat" || Name == "xlatb") && Operands.size() == 2) {
3622     X86Operand &Op1 = static_cast<X86Operand &>(*Operands[1]);
3623     if (Op1.isMem8()) {
3624       Warning(Op1.getStartLoc(), "memory operand is only for determining the "
3625                                  "size, (R|E)BX will be used for the location");
3626       Operands.pop_back();
3627       static_cast<X86Operand &>(*Operands[0]).setTokenValue("xlatb");
3628     }
3629   }
3630 
3631   if (Flags)
3632     Operands.push_back(X86Operand::CreatePrefix(Flags, NameLoc, NameLoc));
3633   return false;
3634 }
3635 
3636 bool X86AsmParser::processInstruction(MCInst &Inst, const OperandVector &Ops) {
3637   const MCRegisterInfo *MRI = getContext().getRegisterInfo();
3638 
3639   switch (Inst.getOpcode()) {
3640   default: return false;
3641   case X86::JMP_1:
3642     // {disp32} forces a larger displacement as if the instruction was relaxed.
3643     // NOTE: 16-bit mode uses 16-bit displacement even though it says {disp32}.
3644     // This matches GNU assembler.
3645     if (ForcedDispEncoding == DispEncoding_Disp32) {
3646       Inst.setOpcode(is16BitMode() ? X86::JMP_2 : X86::JMP_4);
3647       return true;
3648     }
3649 
3650     return false;
3651   case X86::JCC_1:
3652     // {disp32} forces a larger displacement as if the instruction was relaxed.
3653     // NOTE: 16-bit mode uses 16-bit displacement even though it says {disp32}.
3654     // This matches GNU assembler.
3655     if (ForcedDispEncoding == DispEncoding_Disp32) {
3656       Inst.setOpcode(is16BitMode() ? X86::JCC_2 : X86::JCC_4);
3657       return true;
3658     }
3659 
3660     return false;
3661   case X86::VMOVZPQILo2PQIrr:
3662   case X86::VMOVAPDrr:
3663   case X86::VMOVAPDYrr:
3664   case X86::VMOVAPSrr:
3665   case X86::VMOVAPSYrr:
3666   case X86::VMOVDQArr:
3667   case X86::VMOVDQAYrr:
3668   case X86::VMOVDQUrr:
3669   case X86::VMOVDQUYrr:
3670   case X86::VMOVUPDrr:
3671   case X86::VMOVUPDYrr:
3672   case X86::VMOVUPSrr:
3673   case X86::VMOVUPSYrr: {
3674     // We can get a smaller encoding by using VEX.R instead of VEX.B if one of
3675     // the registers is extended, but other isn't.
3676     if (ForcedVEXEncoding == VEXEncoding_VEX3 ||
3677         MRI->getEncodingValue(Inst.getOperand(0).getReg()) >= 8 ||
3678         MRI->getEncodingValue(Inst.getOperand(1).getReg()) < 8)
3679       return false;
3680 
3681     unsigned NewOpc;
3682     switch (Inst.getOpcode()) {
3683     default: llvm_unreachable("Invalid opcode");
3684     case X86::VMOVZPQILo2PQIrr: NewOpc = X86::VMOVPQI2QIrr;   break;
3685     case X86::VMOVAPDrr:        NewOpc = X86::VMOVAPDrr_REV;  break;
3686     case X86::VMOVAPDYrr:       NewOpc = X86::VMOVAPDYrr_REV; break;
3687     case X86::VMOVAPSrr:        NewOpc = X86::VMOVAPSrr_REV;  break;
3688     case X86::VMOVAPSYrr:       NewOpc = X86::VMOVAPSYrr_REV; break;
3689     case X86::VMOVDQArr:        NewOpc = X86::VMOVDQArr_REV;  break;
3690     case X86::VMOVDQAYrr:       NewOpc = X86::VMOVDQAYrr_REV; break;
3691     case X86::VMOVDQUrr:        NewOpc = X86::VMOVDQUrr_REV;  break;
3692     case X86::VMOVDQUYrr:       NewOpc = X86::VMOVDQUYrr_REV; break;
3693     case X86::VMOVUPDrr:        NewOpc = X86::VMOVUPDrr_REV;  break;
3694     case X86::VMOVUPDYrr:       NewOpc = X86::VMOVUPDYrr_REV; break;
3695     case X86::VMOVUPSrr:        NewOpc = X86::VMOVUPSrr_REV;  break;
3696     case X86::VMOVUPSYrr:       NewOpc = X86::VMOVUPSYrr_REV; break;
3697     }
3698     Inst.setOpcode(NewOpc);
3699     return true;
3700   }
3701   case X86::VMOVSDrr:
3702   case X86::VMOVSSrr: {
3703     // We can get a smaller encoding by using VEX.R instead of VEX.B if one of
3704     // the registers is extended, but other isn't.
3705     if (ForcedVEXEncoding == VEXEncoding_VEX3 ||
3706         MRI->getEncodingValue(Inst.getOperand(0).getReg()) >= 8 ||
3707         MRI->getEncodingValue(Inst.getOperand(2).getReg()) < 8)
3708       return false;
3709 
3710     unsigned NewOpc;
3711     switch (Inst.getOpcode()) {
3712     default: llvm_unreachable("Invalid opcode");
3713     case X86::VMOVSDrr: NewOpc = X86::VMOVSDrr_REV; break;
3714     case X86::VMOVSSrr: NewOpc = X86::VMOVSSrr_REV; break;
3715     }
3716     Inst.setOpcode(NewOpc);
3717     return true;
3718   }
3719   case X86::RCR8ri: case X86::RCR16ri: case X86::RCR32ri: case X86::RCR64ri:
3720   case X86::RCL8ri: case X86::RCL16ri: case X86::RCL32ri: case X86::RCL64ri:
3721   case X86::ROR8ri: case X86::ROR16ri: case X86::ROR32ri: case X86::ROR64ri:
3722   case X86::ROL8ri: case X86::ROL16ri: case X86::ROL32ri: case X86::ROL64ri:
3723   case X86::SAR8ri: case X86::SAR16ri: case X86::SAR32ri: case X86::SAR64ri:
3724   case X86::SHR8ri: case X86::SHR16ri: case X86::SHR32ri: case X86::SHR64ri:
3725   case X86::SHL8ri: case X86::SHL16ri: case X86::SHL32ri: case X86::SHL64ri: {
3726     // Optimize s{hr,ar,hl} $1, <op> to "shift <op>". Similar for rotate.
3727     // FIXME: It would be great if we could just do this with an InstAlias.
3728     if (!Inst.getOperand(2).isImm() || Inst.getOperand(2).getImm() != 1)
3729       return false;
3730 
3731     unsigned NewOpc;
3732     switch (Inst.getOpcode()) {
3733     default: llvm_unreachable("Invalid opcode");
3734     case X86::RCR8ri:  NewOpc = X86::RCR8r1;  break;
3735     case X86::RCR16ri: NewOpc = X86::RCR16r1; break;
3736     case X86::RCR32ri: NewOpc = X86::RCR32r1; break;
3737     case X86::RCR64ri: NewOpc = X86::RCR64r1; break;
3738     case X86::RCL8ri:  NewOpc = X86::RCL8r1;  break;
3739     case X86::RCL16ri: NewOpc = X86::RCL16r1; break;
3740     case X86::RCL32ri: NewOpc = X86::RCL32r1; break;
3741     case X86::RCL64ri: NewOpc = X86::RCL64r1; break;
3742     case X86::ROR8ri:  NewOpc = X86::ROR8r1;  break;
3743     case X86::ROR16ri: NewOpc = X86::ROR16r1; break;
3744     case X86::ROR32ri: NewOpc = X86::ROR32r1; break;
3745     case X86::ROR64ri: NewOpc = X86::ROR64r1; break;
3746     case X86::ROL8ri:  NewOpc = X86::ROL8r1;  break;
3747     case X86::ROL16ri: NewOpc = X86::ROL16r1; break;
3748     case X86::ROL32ri: NewOpc = X86::ROL32r1; break;
3749     case X86::ROL64ri: NewOpc = X86::ROL64r1; break;
3750     case X86::SAR8ri:  NewOpc = X86::SAR8r1;  break;
3751     case X86::SAR16ri: NewOpc = X86::SAR16r1; break;
3752     case X86::SAR32ri: NewOpc = X86::SAR32r1; break;
3753     case X86::SAR64ri: NewOpc = X86::SAR64r1; break;
3754     case X86::SHR8ri:  NewOpc = X86::SHR8r1;  break;
3755     case X86::SHR16ri: NewOpc = X86::SHR16r1; break;
3756     case X86::SHR32ri: NewOpc = X86::SHR32r1; break;
3757     case X86::SHR64ri: NewOpc = X86::SHR64r1; break;
3758     case X86::SHL8ri:  NewOpc = X86::SHL8r1;  break;
3759     case X86::SHL16ri: NewOpc = X86::SHL16r1; break;
3760     case X86::SHL32ri: NewOpc = X86::SHL32r1; break;
3761     case X86::SHL64ri: NewOpc = X86::SHL64r1; break;
3762     }
3763 
3764     MCInst TmpInst;
3765     TmpInst.setOpcode(NewOpc);
3766     TmpInst.addOperand(Inst.getOperand(0));
3767     TmpInst.addOperand(Inst.getOperand(1));
3768     Inst = TmpInst;
3769     return true;
3770   }
3771   case X86::RCR8mi: case X86::RCR16mi: case X86::RCR32mi: case X86::RCR64mi:
3772   case X86::RCL8mi: case X86::RCL16mi: case X86::RCL32mi: case X86::RCL64mi:
3773   case X86::ROR8mi: case X86::ROR16mi: case X86::ROR32mi: case X86::ROR64mi:
3774   case X86::ROL8mi: case X86::ROL16mi: case X86::ROL32mi: case X86::ROL64mi:
3775   case X86::SAR8mi: case X86::SAR16mi: case X86::SAR32mi: case X86::SAR64mi:
3776   case X86::SHR8mi: case X86::SHR16mi: case X86::SHR32mi: case X86::SHR64mi:
3777   case X86::SHL8mi: case X86::SHL16mi: case X86::SHL32mi: case X86::SHL64mi: {
3778     // Optimize s{hr,ar,hl} $1, <op> to "shift <op>". Similar for rotate.
3779     // FIXME: It would be great if we could just do this with an InstAlias.
3780     if (!Inst.getOperand(X86::AddrNumOperands).isImm() ||
3781         Inst.getOperand(X86::AddrNumOperands).getImm() != 1)
3782       return false;
3783 
3784     unsigned NewOpc;
3785     switch (Inst.getOpcode()) {
3786     default: llvm_unreachable("Invalid opcode");
3787     case X86::RCR8mi:  NewOpc = X86::RCR8m1;  break;
3788     case X86::RCR16mi: NewOpc = X86::RCR16m1; break;
3789     case X86::RCR32mi: NewOpc = X86::RCR32m1; break;
3790     case X86::RCR64mi: NewOpc = X86::RCR64m1; break;
3791     case X86::RCL8mi:  NewOpc = X86::RCL8m1;  break;
3792     case X86::RCL16mi: NewOpc = X86::RCL16m1; break;
3793     case X86::RCL32mi: NewOpc = X86::RCL32m1; break;
3794     case X86::RCL64mi: NewOpc = X86::RCL64m1; break;
3795     case X86::ROR8mi:  NewOpc = X86::ROR8m1;  break;
3796     case X86::ROR16mi: NewOpc = X86::ROR16m1; break;
3797     case X86::ROR32mi: NewOpc = X86::ROR32m1; break;
3798     case X86::ROR64mi: NewOpc = X86::ROR64m1; break;
3799     case X86::ROL8mi:  NewOpc = X86::ROL8m1;  break;
3800     case X86::ROL16mi: NewOpc = X86::ROL16m1; break;
3801     case X86::ROL32mi: NewOpc = X86::ROL32m1; break;
3802     case X86::ROL64mi: NewOpc = X86::ROL64m1; break;
3803     case X86::SAR8mi:  NewOpc = X86::SAR8m1;  break;
3804     case X86::SAR16mi: NewOpc = X86::SAR16m1; break;
3805     case X86::SAR32mi: NewOpc = X86::SAR32m1; break;
3806     case X86::SAR64mi: NewOpc = X86::SAR64m1; break;
3807     case X86::SHR8mi:  NewOpc = X86::SHR8m1;  break;
3808     case X86::SHR16mi: NewOpc = X86::SHR16m1; break;
3809     case X86::SHR32mi: NewOpc = X86::SHR32m1; break;
3810     case X86::SHR64mi: NewOpc = X86::SHR64m1; break;
3811     case X86::SHL8mi:  NewOpc = X86::SHL8m1;  break;
3812     case X86::SHL16mi: NewOpc = X86::SHL16m1; break;
3813     case X86::SHL32mi: NewOpc = X86::SHL32m1; break;
3814     case X86::SHL64mi: NewOpc = X86::SHL64m1; break;
3815     }
3816 
3817     MCInst TmpInst;
3818     TmpInst.setOpcode(NewOpc);
3819     for (int i = 0; i != X86::AddrNumOperands; ++i)
3820       TmpInst.addOperand(Inst.getOperand(i));
3821     Inst = TmpInst;
3822     return true;
3823   }
3824   case X86::INT: {
3825     // Transforms "int $3" into "int3" as a size optimization.  We can't write an
3826     // instalias with an immediate operand yet.
3827     if (!Inst.getOperand(0).isImm() || Inst.getOperand(0).getImm() != 3)
3828       return false;
3829 
3830     MCInst TmpInst;
3831     TmpInst.setOpcode(X86::INT3);
3832     Inst = TmpInst;
3833     return true;
3834   }
3835   }
3836 }
3837 
3838 bool X86AsmParser::validateInstruction(MCInst &Inst, const OperandVector &Ops) {
3839   const MCRegisterInfo *MRI = getContext().getRegisterInfo();
3840 
3841   switch (Inst.getOpcode()) {
3842   case X86::VGATHERDPDYrm:
3843   case X86::VGATHERDPDrm:
3844   case X86::VGATHERDPSYrm:
3845   case X86::VGATHERDPSrm:
3846   case X86::VGATHERQPDYrm:
3847   case X86::VGATHERQPDrm:
3848   case X86::VGATHERQPSYrm:
3849   case X86::VGATHERQPSrm:
3850   case X86::VPGATHERDDYrm:
3851   case X86::VPGATHERDDrm:
3852   case X86::VPGATHERDQYrm:
3853   case X86::VPGATHERDQrm:
3854   case X86::VPGATHERQDYrm:
3855   case X86::VPGATHERQDrm:
3856   case X86::VPGATHERQQYrm:
3857   case X86::VPGATHERQQrm: {
3858     unsigned Dest = MRI->getEncodingValue(Inst.getOperand(0).getReg());
3859     unsigned Mask = MRI->getEncodingValue(Inst.getOperand(1).getReg());
3860     unsigned Index =
3861       MRI->getEncodingValue(Inst.getOperand(3 + X86::AddrIndexReg).getReg());
3862     if (Dest == Mask || Dest == Index || Mask == Index)
3863       return Warning(Ops[0]->getStartLoc(), "mask, index, and destination "
3864                                             "registers should be distinct");
3865     break;
3866   }
3867   case X86::VGATHERDPDZ128rm:
3868   case X86::VGATHERDPDZ256rm:
3869   case X86::VGATHERDPDZrm:
3870   case X86::VGATHERDPSZ128rm:
3871   case X86::VGATHERDPSZ256rm:
3872   case X86::VGATHERDPSZrm:
3873   case X86::VGATHERQPDZ128rm:
3874   case X86::VGATHERQPDZ256rm:
3875   case X86::VGATHERQPDZrm:
3876   case X86::VGATHERQPSZ128rm:
3877   case X86::VGATHERQPSZ256rm:
3878   case X86::VGATHERQPSZrm:
3879   case X86::VPGATHERDDZ128rm:
3880   case X86::VPGATHERDDZ256rm:
3881   case X86::VPGATHERDDZrm:
3882   case X86::VPGATHERDQZ128rm:
3883   case X86::VPGATHERDQZ256rm:
3884   case X86::VPGATHERDQZrm:
3885   case X86::VPGATHERQDZ128rm:
3886   case X86::VPGATHERQDZ256rm:
3887   case X86::VPGATHERQDZrm:
3888   case X86::VPGATHERQQZ128rm:
3889   case X86::VPGATHERQQZ256rm:
3890   case X86::VPGATHERQQZrm: {
3891     unsigned Dest = MRI->getEncodingValue(Inst.getOperand(0).getReg());
3892     unsigned Index =
3893       MRI->getEncodingValue(Inst.getOperand(4 + X86::AddrIndexReg).getReg());
3894     if (Dest == Index)
3895       return Warning(Ops[0]->getStartLoc(), "index and destination registers "
3896                                             "should be distinct");
3897     break;
3898   }
3899   case X86::V4FMADDPSrm:
3900   case X86::V4FMADDPSrmk:
3901   case X86::V4FMADDPSrmkz:
3902   case X86::V4FMADDSSrm:
3903   case X86::V4FMADDSSrmk:
3904   case X86::V4FMADDSSrmkz:
3905   case X86::V4FNMADDPSrm:
3906   case X86::V4FNMADDPSrmk:
3907   case X86::V4FNMADDPSrmkz:
3908   case X86::V4FNMADDSSrm:
3909   case X86::V4FNMADDSSrmk:
3910   case X86::V4FNMADDSSrmkz:
3911   case X86::VP4DPWSSDSrm:
3912   case X86::VP4DPWSSDSrmk:
3913   case X86::VP4DPWSSDSrmkz:
3914   case X86::VP4DPWSSDrm:
3915   case X86::VP4DPWSSDrmk:
3916   case X86::VP4DPWSSDrmkz: {
3917     unsigned Src2 = Inst.getOperand(Inst.getNumOperands() -
3918                                     X86::AddrNumOperands - 1).getReg();
3919     unsigned Src2Enc = MRI->getEncodingValue(Src2);
3920     if (Src2Enc % 4 != 0) {
3921       StringRef RegName = X86IntelInstPrinter::getRegisterName(Src2);
3922       unsigned GroupStart = (Src2Enc / 4) * 4;
3923       unsigned GroupEnd = GroupStart + 3;
3924       return Warning(Ops[0]->getStartLoc(),
3925                      "source register '" + RegName + "' implicitly denotes '" +
3926                      RegName.take_front(3) + Twine(GroupStart) + "' to '" +
3927                      RegName.take_front(3) + Twine(GroupEnd) +
3928                      "' source group");
3929     }
3930     break;
3931   }
3932   case X86::VFCMADDCPHZ128m:
3933   case X86::VFCMADDCPHZ256m:
3934   case X86::VFCMADDCPHZm:
3935   case X86::VFCMADDCPHZ128mb:
3936   case X86::VFCMADDCPHZ256mb:
3937   case X86::VFCMADDCPHZmb:
3938   case X86::VFCMADDCPHZ128mbk:
3939   case X86::VFCMADDCPHZ256mbk:
3940   case X86::VFCMADDCPHZmbk:
3941   case X86::VFCMADDCPHZ128mbkz:
3942   case X86::VFCMADDCPHZ256mbkz:
3943   case X86::VFCMADDCPHZmbkz:
3944   case X86::VFCMADDCPHZ128mk:
3945   case X86::VFCMADDCPHZ256mk:
3946   case X86::VFCMADDCPHZmk:
3947   case X86::VFCMADDCPHZ128mkz:
3948   case X86::VFCMADDCPHZ256mkz:
3949   case X86::VFCMADDCPHZmkz:
3950   case X86::VFCMADDCPHZ128r:
3951   case X86::VFCMADDCPHZ256r:
3952   case X86::VFCMADDCPHZr:
3953   case X86::VFCMADDCPHZ128rk:
3954   case X86::VFCMADDCPHZ256rk:
3955   case X86::VFCMADDCPHZrk:
3956   case X86::VFCMADDCPHZ128rkz:
3957   case X86::VFCMADDCPHZ256rkz:
3958   case X86::VFCMADDCPHZrkz:
3959   case X86::VFCMADDCPHZrb:
3960   case X86::VFCMADDCPHZrbk:
3961   case X86::VFCMADDCPHZrbkz:
3962   case X86::VFCMADDCSHZm:
3963   case X86::VFCMADDCSHZmk:
3964   case X86::VFCMADDCSHZmkz:
3965   case X86::VFCMADDCSHZr:
3966   case X86::VFCMADDCSHZrb:
3967   case X86::VFCMADDCSHZrbk:
3968   case X86::VFCMADDCSHZrbkz:
3969   case X86::VFCMADDCSHZrk:
3970   case X86::VFCMADDCSHZrkz:
3971   case X86::VFMADDCPHZ128m:
3972   case X86::VFMADDCPHZ256m:
3973   case X86::VFMADDCPHZm:
3974   case X86::VFMADDCPHZ128mb:
3975   case X86::VFMADDCPHZ256mb:
3976   case X86::VFMADDCPHZmb:
3977   case X86::VFMADDCPHZ128mbk:
3978   case X86::VFMADDCPHZ256mbk:
3979   case X86::VFMADDCPHZmbk:
3980   case X86::VFMADDCPHZ128mbkz:
3981   case X86::VFMADDCPHZ256mbkz:
3982   case X86::VFMADDCPHZmbkz:
3983   case X86::VFMADDCPHZ128mk:
3984   case X86::VFMADDCPHZ256mk:
3985   case X86::VFMADDCPHZmk:
3986   case X86::VFMADDCPHZ128mkz:
3987   case X86::VFMADDCPHZ256mkz:
3988   case X86::VFMADDCPHZmkz:
3989   case X86::VFMADDCPHZ128r:
3990   case X86::VFMADDCPHZ256r:
3991   case X86::VFMADDCPHZr:
3992   case X86::VFMADDCPHZ128rk:
3993   case X86::VFMADDCPHZ256rk:
3994   case X86::VFMADDCPHZrk:
3995   case X86::VFMADDCPHZ128rkz:
3996   case X86::VFMADDCPHZ256rkz:
3997   case X86::VFMADDCPHZrkz:
3998   case X86::VFMADDCPHZrb:
3999   case X86::VFMADDCPHZrbk:
4000   case X86::VFMADDCPHZrbkz:
4001   case X86::VFMADDCSHZm:
4002   case X86::VFMADDCSHZmk:
4003   case X86::VFMADDCSHZmkz:
4004   case X86::VFMADDCSHZr:
4005   case X86::VFMADDCSHZrb:
4006   case X86::VFMADDCSHZrbk:
4007   case X86::VFMADDCSHZrbkz:
4008   case X86::VFMADDCSHZrk:
4009   case X86::VFMADDCSHZrkz: {
4010     unsigned Dest = Inst.getOperand(0).getReg();
4011     for (unsigned i = 2; i < Inst.getNumOperands(); i++)
4012       if (Inst.getOperand(i).isReg() && Dest == Inst.getOperand(i).getReg())
4013         return Warning(Ops[0]->getStartLoc(), "Destination register should be "
4014                                               "distinct from source registers");
4015     break;
4016   }
4017   case X86::VFCMULCPHZ128rm:
4018   case X86::VFCMULCPHZ256rm:
4019   case X86::VFCMULCPHZrm:
4020   case X86::VFCMULCPHZ128rmb:
4021   case X86::VFCMULCPHZ256rmb:
4022   case X86::VFCMULCPHZrmb:
4023   case X86::VFCMULCPHZ128rmbk:
4024   case X86::VFCMULCPHZ256rmbk:
4025   case X86::VFCMULCPHZrmbk:
4026   case X86::VFCMULCPHZ128rmbkz:
4027   case X86::VFCMULCPHZ256rmbkz:
4028   case X86::VFCMULCPHZrmbkz:
4029   case X86::VFCMULCPHZ128rmk:
4030   case X86::VFCMULCPHZ256rmk:
4031   case X86::VFCMULCPHZrmk:
4032   case X86::VFCMULCPHZ128rmkz:
4033   case X86::VFCMULCPHZ256rmkz:
4034   case X86::VFCMULCPHZrmkz:
4035   case X86::VFCMULCPHZ128rr:
4036   case X86::VFCMULCPHZ256rr:
4037   case X86::VFCMULCPHZrr:
4038   case X86::VFCMULCPHZ128rrk:
4039   case X86::VFCMULCPHZ256rrk:
4040   case X86::VFCMULCPHZrrk:
4041   case X86::VFCMULCPHZ128rrkz:
4042   case X86::VFCMULCPHZ256rrkz:
4043   case X86::VFCMULCPHZrrkz:
4044   case X86::VFCMULCPHZrrb:
4045   case X86::VFCMULCPHZrrbk:
4046   case X86::VFCMULCPHZrrbkz:
4047   case X86::VFCMULCSHZrm:
4048   case X86::VFCMULCSHZrmk:
4049   case X86::VFCMULCSHZrmkz:
4050   case X86::VFCMULCSHZrr:
4051   case X86::VFCMULCSHZrrb:
4052   case X86::VFCMULCSHZrrbk:
4053   case X86::VFCMULCSHZrrbkz:
4054   case X86::VFCMULCSHZrrk:
4055   case X86::VFCMULCSHZrrkz:
4056   case X86::VFMULCPHZ128rm:
4057   case X86::VFMULCPHZ256rm:
4058   case X86::VFMULCPHZrm:
4059   case X86::VFMULCPHZ128rmb:
4060   case X86::VFMULCPHZ256rmb:
4061   case X86::VFMULCPHZrmb:
4062   case X86::VFMULCPHZ128rmbk:
4063   case X86::VFMULCPHZ256rmbk:
4064   case X86::VFMULCPHZrmbk:
4065   case X86::VFMULCPHZ128rmbkz:
4066   case X86::VFMULCPHZ256rmbkz:
4067   case X86::VFMULCPHZrmbkz:
4068   case X86::VFMULCPHZ128rmk:
4069   case X86::VFMULCPHZ256rmk:
4070   case X86::VFMULCPHZrmk:
4071   case X86::VFMULCPHZ128rmkz:
4072   case X86::VFMULCPHZ256rmkz:
4073   case X86::VFMULCPHZrmkz:
4074   case X86::VFMULCPHZ128rr:
4075   case X86::VFMULCPHZ256rr:
4076   case X86::VFMULCPHZrr:
4077   case X86::VFMULCPHZ128rrk:
4078   case X86::VFMULCPHZ256rrk:
4079   case X86::VFMULCPHZrrk:
4080   case X86::VFMULCPHZ128rrkz:
4081   case X86::VFMULCPHZ256rrkz:
4082   case X86::VFMULCPHZrrkz:
4083   case X86::VFMULCPHZrrb:
4084   case X86::VFMULCPHZrrbk:
4085   case X86::VFMULCPHZrrbkz:
4086   case X86::VFMULCSHZrm:
4087   case X86::VFMULCSHZrmk:
4088   case X86::VFMULCSHZrmkz:
4089   case X86::VFMULCSHZrr:
4090   case X86::VFMULCSHZrrb:
4091   case X86::VFMULCSHZrrbk:
4092   case X86::VFMULCSHZrrbkz:
4093   case X86::VFMULCSHZrrk:
4094   case X86::VFMULCSHZrrkz: {
4095     unsigned Dest = Inst.getOperand(0).getReg();
4096     for (unsigned i = 1; i < Inst.getNumOperands(); i++)
4097       if (Inst.getOperand(i).isReg() && Dest == Inst.getOperand(i).getReg())
4098         return Warning(Ops[0]->getStartLoc(), "Destination register should be "
4099                                               "distinct from source registers");
4100     break;
4101   }
4102   }
4103 
4104   const MCInstrDesc &MCID = MII.get(Inst.getOpcode());
4105   // Check that we aren't mixing AH/BH/CH/DH with REX prefix. We only need to
4106   // check this with the legacy encoding, VEX/EVEX/XOP don't use REX.
4107   if ((MCID.TSFlags & X86II::EncodingMask) == 0) {
4108     MCPhysReg HReg = X86::NoRegister;
4109     bool UsesRex = MCID.TSFlags & X86II::REX_W;
4110     unsigned NumOps = Inst.getNumOperands();
4111     for (unsigned i = 0; i != NumOps; ++i) {
4112       const MCOperand &MO = Inst.getOperand(i);
4113       if (!MO.isReg())
4114         continue;
4115       unsigned Reg = MO.getReg();
4116       if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH)
4117         HReg = Reg;
4118       if (X86II::isX86_64NonExtLowByteReg(Reg) ||
4119           X86II::isX86_64ExtendedReg(Reg))
4120         UsesRex = true;
4121     }
4122 
4123     if (UsesRex && HReg != X86::NoRegister) {
4124       StringRef RegName = X86IntelInstPrinter::getRegisterName(HReg);
4125       return Error(Ops[0]->getStartLoc(),
4126                    "can't encode '" + RegName + "' in an instruction requiring "
4127                    "REX prefix");
4128     }
4129   }
4130 
4131   return false;
4132 }
4133 
4134 static const char *getSubtargetFeatureName(uint64_t Val);
4135 
4136 void X86AsmParser::emitWarningForSpecialLVIInstruction(SMLoc Loc) {
4137   Warning(Loc, "Instruction may be vulnerable to LVI and "
4138                "requires manual mitigation");
4139   Note(SMLoc(), "See https://software.intel.com/"
4140                 "security-software-guidance/insights/"
4141                 "deep-dive-load-value-injection#specialinstructions"
4142                 " for more information");
4143 }
4144 
4145 /// RET instructions and also instructions that indirect calls/jumps from memory
4146 /// combine a load and a branch within a single instruction. To mitigate these
4147 /// instructions against LVI, they must be decomposed into separate load and
4148 /// branch instructions, with an LFENCE in between. For more details, see:
4149 /// - X86LoadValueInjectionRetHardening.cpp
4150 /// - X86LoadValueInjectionIndirectThunks.cpp
4151 /// - https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection
4152 ///
4153 /// Returns `true` if a mitigation was applied or warning was emitted.
4154 void X86AsmParser::applyLVICFIMitigation(MCInst &Inst, MCStreamer &Out) {
4155   // Information on control-flow instructions that require manual mitigation can
4156   // be found here:
4157   // https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection#specialinstructions
4158   switch (Inst.getOpcode()) {
4159   case X86::RET16:
4160   case X86::RET32:
4161   case X86::RET64:
4162   case X86::RETI16:
4163   case X86::RETI32:
4164   case X86::RETI64: {
4165     MCInst ShlInst, FenceInst;
4166     bool Parse32 = is32BitMode() || Code16GCC;
4167     unsigned Basereg =
4168         is64BitMode() ? X86::RSP : (Parse32 ? X86::ESP : X86::SP);
4169     const MCExpr *Disp = MCConstantExpr::create(0, getContext());
4170     auto ShlMemOp = X86Operand::CreateMem(getPointerWidth(), /*SegReg=*/0, Disp,
4171                                           /*BaseReg=*/Basereg, /*IndexReg=*/0,
4172                                           /*Scale=*/1, SMLoc{}, SMLoc{}, 0);
4173     ShlInst.setOpcode(X86::SHL64mi);
4174     ShlMemOp->addMemOperands(ShlInst, 5);
4175     ShlInst.addOperand(MCOperand::createImm(0));
4176     FenceInst.setOpcode(X86::LFENCE);
4177     Out.emitInstruction(ShlInst, getSTI());
4178     Out.emitInstruction(FenceInst, getSTI());
4179     return;
4180   }
4181   case X86::JMP16m:
4182   case X86::JMP32m:
4183   case X86::JMP64m:
4184   case X86::CALL16m:
4185   case X86::CALL32m:
4186   case X86::CALL64m:
4187     emitWarningForSpecialLVIInstruction(Inst.getLoc());
4188     return;
4189   }
4190 }
4191 
4192 /// To mitigate LVI, every instruction that performs a load can be followed by
4193 /// an LFENCE instruction to squash any potential mis-speculation. There are
4194 /// some instructions that require additional considerations, and may requre
4195 /// manual mitigation. For more details, see:
4196 /// https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection
4197 ///
4198 /// Returns `true` if a mitigation was applied or warning was emitted.
4199 void X86AsmParser::applyLVILoadHardeningMitigation(MCInst &Inst,
4200                                                    MCStreamer &Out) {
4201   auto Opcode = Inst.getOpcode();
4202   auto Flags = Inst.getFlags();
4203   if ((Flags & X86::IP_HAS_REPEAT) || (Flags & X86::IP_HAS_REPEAT_NE)) {
4204     // Information on REP string instructions that require manual mitigation can
4205     // be found here:
4206     // https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection#specialinstructions
4207     switch (Opcode) {
4208     case X86::CMPSB:
4209     case X86::CMPSW:
4210     case X86::CMPSL:
4211     case X86::CMPSQ:
4212     case X86::SCASB:
4213     case X86::SCASW:
4214     case X86::SCASL:
4215     case X86::SCASQ:
4216       emitWarningForSpecialLVIInstruction(Inst.getLoc());
4217       return;
4218     }
4219   } else if (Opcode == X86::REP_PREFIX || Opcode == X86::REPNE_PREFIX) {
4220     // If a REP instruction is found on its own line, it may or may not be
4221     // followed by a vulnerable instruction. Emit a warning just in case.
4222     emitWarningForSpecialLVIInstruction(Inst.getLoc());
4223     return;
4224   }
4225 
4226   const MCInstrDesc &MCID = MII.get(Inst.getOpcode());
4227 
4228   // Can't mitigate after terminators or calls. A control flow change may have
4229   // already occurred.
4230   if (MCID.isTerminator() || MCID.isCall())
4231     return;
4232 
4233   // LFENCE has the mayLoad property, don't double fence.
4234   if (MCID.mayLoad() && Inst.getOpcode() != X86::LFENCE) {
4235     MCInst FenceInst;
4236     FenceInst.setOpcode(X86::LFENCE);
4237     Out.emitInstruction(FenceInst, getSTI());
4238   }
4239 }
4240 
4241 void X86AsmParser::emitInstruction(MCInst &Inst, OperandVector &Operands,
4242                                    MCStreamer &Out) {
4243   if (LVIInlineAsmHardening &&
4244       getSTI().getFeatureBits()[X86::FeatureLVIControlFlowIntegrity])
4245     applyLVICFIMitigation(Inst, Out);
4246 
4247   Out.emitInstruction(Inst, getSTI());
4248 
4249   if (LVIInlineAsmHardening &&
4250       getSTI().getFeatureBits()[X86::FeatureLVILoadHardening])
4251     applyLVILoadHardeningMitigation(Inst, Out);
4252 }
4253 
4254 bool X86AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
4255                                            OperandVector &Operands,
4256                                            MCStreamer &Out, uint64_t &ErrorInfo,
4257                                            bool MatchingInlineAsm) {
4258   if (isParsingIntelSyntax())
4259     return MatchAndEmitIntelInstruction(IDLoc, Opcode, Operands, Out, ErrorInfo,
4260                                         MatchingInlineAsm);
4261   return MatchAndEmitATTInstruction(IDLoc, Opcode, Operands, Out, ErrorInfo,
4262                                     MatchingInlineAsm);
4263 }
4264 
4265 void X86AsmParser::MatchFPUWaitAlias(SMLoc IDLoc, X86Operand &Op,
4266                                      OperandVector &Operands, MCStreamer &Out,
4267                                      bool MatchingInlineAsm) {
4268   // FIXME: This should be replaced with a real .td file alias mechanism.
4269   // Also, MatchInstructionImpl should actually *do* the EmitInstruction
4270   // call.
4271   const char *Repl = StringSwitch<const char *>(Op.getToken())
4272                          .Case("finit", "fninit")
4273                          .Case("fsave", "fnsave")
4274                          .Case("fstcw", "fnstcw")
4275                          .Case("fstcww", "fnstcw")
4276                          .Case("fstenv", "fnstenv")
4277                          .Case("fstsw", "fnstsw")
4278                          .Case("fstsww", "fnstsw")
4279                          .Case("fclex", "fnclex")
4280                          .Default(nullptr);
4281   if (Repl) {
4282     MCInst Inst;
4283     Inst.setOpcode(X86::WAIT);
4284     Inst.setLoc(IDLoc);
4285     if (!MatchingInlineAsm)
4286       emitInstruction(Inst, Operands, Out);
4287     Operands[0] = X86Operand::CreateToken(Repl, IDLoc);
4288   }
4289 }
4290 
4291 bool X86AsmParser::ErrorMissingFeature(SMLoc IDLoc,
4292                                        const FeatureBitset &MissingFeatures,
4293                                        bool MatchingInlineAsm) {
4294   assert(MissingFeatures.any() && "Unknown missing feature!");
4295   SmallString<126> Msg;
4296   raw_svector_ostream OS(Msg);
4297   OS << "instruction requires:";
4298   for (unsigned i = 0, e = MissingFeatures.size(); i != e; ++i) {
4299     if (MissingFeatures[i])
4300       OS << ' ' << getSubtargetFeatureName(i);
4301   }
4302   return Error(IDLoc, OS.str(), SMRange(), MatchingInlineAsm);
4303 }
4304 
4305 static unsigned getPrefixes(OperandVector &Operands) {
4306   unsigned Result = 0;
4307   X86Operand &Prefix = static_cast<X86Operand &>(*Operands.back());
4308   if (Prefix.isPrefix()) {
4309     Result = Prefix.getPrefix();
4310     Operands.pop_back();
4311   }
4312   return Result;
4313 }
4314 
4315 unsigned X86AsmParser::checkTargetMatchPredicate(MCInst &Inst) {
4316   unsigned Opc = Inst.getOpcode();
4317   const MCInstrDesc &MCID = MII.get(Opc);
4318 
4319   if (ForcedVEXEncoding == VEXEncoding_EVEX &&
4320       (MCID.TSFlags & X86II::EncodingMask) != X86II::EVEX)
4321     return Match_Unsupported;
4322 
4323   if ((ForcedVEXEncoding == VEXEncoding_VEX ||
4324        ForcedVEXEncoding == VEXEncoding_VEX2 ||
4325        ForcedVEXEncoding == VEXEncoding_VEX3) &&
4326       (MCID.TSFlags & X86II::EncodingMask) != X86II::VEX)
4327     return Match_Unsupported;
4328 
4329   // These instructions are only available with {vex}, {vex2} or {vex3} prefix
4330   if (MCID.TSFlags & X86II::ExplicitVEXPrefix &&
4331       (ForcedVEXEncoding != VEXEncoding_VEX &&
4332        ForcedVEXEncoding != VEXEncoding_VEX2 &&
4333        ForcedVEXEncoding != VEXEncoding_VEX3))
4334     return Match_Unsupported;
4335 
4336   return Match_Success;
4337 }
4338 
4339 bool X86AsmParser::MatchAndEmitATTInstruction(SMLoc IDLoc, unsigned &Opcode,
4340                                               OperandVector &Operands,
4341                                               MCStreamer &Out,
4342                                               uint64_t &ErrorInfo,
4343                                               bool MatchingInlineAsm) {
4344   assert(!Operands.empty() && "Unexpect empty operand list!");
4345   assert((*Operands[0]).isToken() && "Leading operand should always be a mnemonic!");
4346   SMRange EmptyRange = None;
4347 
4348   // First, handle aliases that expand to multiple instructions.
4349   MatchFPUWaitAlias(IDLoc, static_cast<X86Operand &>(*Operands[0]), Operands,
4350                     Out, MatchingInlineAsm);
4351   X86Operand &Op = static_cast<X86Operand &>(*Operands[0]);
4352   unsigned Prefixes = getPrefixes(Operands);
4353 
4354   MCInst Inst;
4355 
4356   // If VEX/EVEX encoding is forced, we need to pass the USE_* flag to the
4357   // encoder and printer.
4358   if (ForcedVEXEncoding == VEXEncoding_VEX)
4359     Prefixes |= X86::IP_USE_VEX;
4360   else if (ForcedVEXEncoding == VEXEncoding_VEX2)
4361     Prefixes |= X86::IP_USE_VEX2;
4362   else if (ForcedVEXEncoding == VEXEncoding_VEX3)
4363     Prefixes |= X86::IP_USE_VEX3;
4364   else if (ForcedVEXEncoding == VEXEncoding_EVEX)
4365     Prefixes |= X86::IP_USE_EVEX;
4366 
4367   // Set encoded flags for {disp8} and {disp32}.
4368   if (ForcedDispEncoding == DispEncoding_Disp8)
4369     Prefixes |= X86::IP_USE_DISP8;
4370   else if (ForcedDispEncoding == DispEncoding_Disp32)
4371     Prefixes |= X86::IP_USE_DISP32;
4372 
4373   if (Prefixes)
4374     Inst.setFlags(Prefixes);
4375 
4376   // In 16-bit mode, if data32 is specified, temporarily switch to 32-bit mode
4377   // when matching the instruction.
4378   if (ForcedDataPrefix == X86::Is32Bit)
4379     SwitchMode(X86::Is32Bit);
4380   // First, try a direct match.
4381   FeatureBitset MissingFeatures;
4382   unsigned OriginalError = MatchInstruction(Operands, Inst, ErrorInfo,
4383                                             MissingFeatures, MatchingInlineAsm,
4384                                             isParsingIntelSyntax());
4385   if (ForcedDataPrefix == X86::Is32Bit) {
4386     SwitchMode(X86::Is16Bit);
4387     ForcedDataPrefix = 0;
4388   }
4389   switch (OriginalError) {
4390   default: llvm_unreachable("Unexpected match result!");
4391   case Match_Success:
4392     if (!MatchingInlineAsm && validateInstruction(Inst, Operands))
4393       return true;
4394     // Some instructions need post-processing to, for example, tweak which
4395     // encoding is selected. Loop on it while changes happen so the
4396     // individual transformations can chain off each other.
4397     if (!MatchingInlineAsm)
4398       while (processInstruction(Inst, Operands))
4399         ;
4400 
4401     Inst.setLoc(IDLoc);
4402     if (!MatchingInlineAsm)
4403       emitInstruction(Inst, Operands, Out);
4404     Opcode = Inst.getOpcode();
4405     return false;
4406   case Match_InvalidImmUnsignedi4: {
4407     SMLoc ErrorLoc = ((X86Operand &)*Operands[ErrorInfo]).getStartLoc();
4408     if (ErrorLoc == SMLoc())
4409       ErrorLoc = IDLoc;
4410     return Error(ErrorLoc, "immediate must be an integer in range [0, 15]",
4411                  EmptyRange, MatchingInlineAsm);
4412   }
4413   case Match_MissingFeature:
4414     return ErrorMissingFeature(IDLoc, MissingFeatures, MatchingInlineAsm);
4415   case Match_InvalidOperand:
4416   case Match_MnemonicFail:
4417   case Match_Unsupported:
4418     break;
4419   }
4420   if (Op.getToken().empty()) {
4421     Error(IDLoc, "instruction must have size higher than 0", EmptyRange,
4422           MatchingInlineAsm);
4423     return true;
4424   }
4425 
4426   // FIXME: Ideally, we would only attempt suffix matches for things which are
4427   // valid prefixes, and we could just infer the right unambiguous
4428   // type. However, that requires substantially more matcher support than the
4429   // following hack.
4430 
4431   // Change the operand to point to a temporary token.
4432   StringRef Base = Op.getToken();
4433   SmallString<16> Tmp;
4434   Tmp += Base;
4435   Tmp += ' ';
4436   Op.setTokenValue(Tmp);
4437 
4438   // If this instruction starts with an 'f', then it is a floating point stack
4439   // instruction.  These come in up to three forms for 32-bit, 64-bit, and
4440   // 80-bit floating point, which use the suffixes s,l,t respectively.
4441   //
4442   // Otherwise, we assume that this may be an integer instruction, which comes
4443   // in 8/16/32/64-bit forms using the b,w,l,q suffixes respectively.
4444   const char *Suffixes = Base[0] != 'f' ? "bwlq" : "slt\0";
4445   // MemSize corresponding to Suffixes.  { 8, 16, 32, 64 }    { 32, 64, 80, 0 }
4446   const char *MemSize = Base[0] != 'f' ? "\x08\x10\x20\x40" : "\x20\x40\x50\0";
4447 
4448   // Check for the various suffix matches.
4449   uint64_t ErrorInfoIgnore;
4450   FeatureBitset ErrorInfoMissingFeatures; // Init suppresses compiler warnings.
4451   unsigned Match[4];
4452 
4453   // Some instruction like VPMULDQ is NOT the variant of VPMULD but a new one.
4454   // So we should make sure the suffix matcher only works for memory variant
4455   // that has the same size with the suffix.
4456   // FIXME: This flag is a workaround for legacy instructions that didn't
4457   // declare non suffix variant assembly.
4458   bool HasVectorReg = false;
4459   X86Operand *MemOp = nullptr;
4460   for (const auto &Op : Operands) {
4461     X86Operand *X86Op = static_cast<X86Operand *>(Op.get());
4462     if (X86Op->isVectorReg())
4463       HasVectorReg = true;
4464     else if (X86Op->isMem()) {
4465       MemOp = X86Op;
4466       assert(MemOp->Mem.Size == 0 && "Memory size always 0 under ATT syntax");
4467       // Have we found an unqualified memory operand,
4468       // break. IA allows only one memory operand.
4469       break;
4470     }
4471   }
4472 
4473   for (unsigned I = 0, E = array_lengthof(Match); I != E; ++I) {
4474     Tmp.back() = Suffixes[I];
4475     if (MemOp && HasVectorReg)
4476       MemOp->Mem.Size = MemSize[I];
4477     Match[I] = Match_MnemonicFail;
4478     if (MemOp || !HasVectorReg) {
4479       Match[I] =
4480           MatchInstruction(Operands, Inst, ErrorInfoIgnore, MissingFeatures,
4481                            MatchingInlineAsm, isParsingIntelSyntax());
4482       // If this returned as a missing feature failure, remember that.
4483       if (Match[I] == Match_MissingFeature)
4484         ErrorInfoMissingFeatures = MissingFeatures;
4485     }
4486   }
4487 
4488   // Restore the old token.
4489   Op.setTokenValue(Base);
4490 
4491   // If exactly one matched, then we treat that as a successful match (and the
4492   // instruction will already have been filled in correctly, since the failing
4493   // matches won't have modified it).
4494   unsigned NumSuccessfulMatches = llvm::count(Match, Match_Success);
4495   if (NumSuccessfulMatches == 1) {
4496     if (!MatchingInlineAsm && validateInstruction(Inst, Operands))
4497       return true;
4498     // Some instructions need post-processing to, for example, tweak which
4499     // encoding is selected. Loop on it while changes happen so the
4500     // individual transformations can chain off each other.
4501     if (!MatchingInlineAsm)
4502       while (processInstruction(Inst, Operands))
4503         ;
4504 
4505     Inst.setLoc(IDLoc);
4506     if (!MatchingInlineAsm)
4507       emitInstruction(Inst, Operands, Out);
4508     Opcode = Inst.getOpcode();
4509     return false;
4510   }
4511 
4512   // Otherwise, the match failed, try to produce a decent error message.
4513 
4514   // If we had multiple suffix matches, then identify this as an ambiguous
4515   // match.
4516   if (NumSuccessfulMatches > 1) {
4517     char MatchChars[4];
4518     unsigned NumMatches = 0;
4519     for (unsigned I = 0, E = array_lengthof(Match); I != E; ++I)
4520       if (Match[I] == Match_Success)
4521         MatchChars[NumMatches++] = Suffixes[I];
4522 
4523     SmallString<126> Msg;
4524     raw_svector_ostream OS(Msg);
4525     OS << "ambiguous instructions require an explicit suffix (could be ";
4526     for (unsigned i = 0; i != NumMatches; ++i) {
4527       if (i != 0)
4528         OS << ", ";
4529       if (i + 1 == NumMatches)
4530         OS << "or ";
4531       OS << "'" << Base << MatchChars[i] << "'";
4532     }
4533     OS << ")";
4534     Error(IDLoc, OS.str(), EmptyRange, MatchingInlineAsm);
4535     return true;
4536   }
4537 
4538   // Okay, we know that none of the variants matched successfully.
4539 
4540   // If all of the instructions reported an invalid mnemonic, then the original
4541   // mnemonic was invalid.
4542   if (llvm::count(Match, Match_MnemonicFail) == 4) {
4543     if (OriginalError == Match_MnemonicFail)
4544       return Error(IDLoc, "invalid instruction mnemonic '" + Base + "'",
4545                    Op.getLocRange(), MatchingInlineAsm);
4546 
4547     if (OriginalError == Match_Unsupported)
4548       return Error(IDLoc, "unsupported instruction", EmptyRange,
4549                    MatchingInlineAsm);
4550 
4551     assert(OriginalError == Match_InvalidOperand && "Unexpected error");
4552     // Recover location info for the operand if we know which was the problem.
4553     if (ErrorInfo != ~0ULL) {
4554       if (ErrorInfo >= Operands.size())
4555         return Error(IDLoc, "too few operands for instruction", EmptyRange,
4556                      MatchingInlineAsm);
4557 
4558       X86Operand &Operand = (X86Operand &)*Operands[ErrorInfo];
4559       if (Operand.getStartLoc().isValid()) {
4560         SMRange OperandRange = Operand.getLocRange();
4561         return Error(Operand.getStartLoc(), "invalid operand for instruction",
4562                      OperandRange, MatchingInlineAsm);
4563       }
4564     }
4565 
4566     return Error(IDLoc, "invalid operand for instruction", EmptyRange,
4567                  MatchingInlineAsm);
4568   }
4569 
4570   // If one instruction matched as unsupported, report this as unsupported.
4571   if (llvm::count(Match, Match_Unsupported) == 1) {
4572     return Error(IDLoc, "unsupported instruction", EmptyRange,
4573                  MatchingInlineAsm);
4574   }
4575 
4576   // If one instruction matched with a missing feature, report this as a
4577   // missing feature.
4578   if (llvm::count(Match, Match_MissingFeature) == 1) {
4579     ErrorInfo = Match_MissingFeature;
4580     return ErrorMissingFeature(IDLoc, ErrorInfoMissingFeatures,
4581                                MatchingInlineAsm);
4582   }
4583 
4584   // If one instruction matched with an invalid operand, report this as an
4585   // operand failure.
4586   if (llvm::count(Match, Match_InvalidOperand) == 1) {
4587     return Error(IDLoc, "invalid operand for instruction", EmptyRange,
4588                  MatchingInlineAsm);
4589   }
4590 
4591   // If all of these were an outright failure, report it in a useless way.
4592   Error(IDLoc, "unknown use of instruction mnemonic without a size suffix",
4593         EmptyRange, MatchingInlineAsm);
4594   return true;
4595 }
4596 
4597 bool X86AsmParser::MatchAndEmitIntelInstruction(SMLoc IDLoc, unsigned &Opcode,
4598                                                 OperandVector &Operands,
4599                                                 MCStreamer &Out,
4600                                                 uint64_t &ErrorInfo,
4601                                                 bool MatchingInlineAsm) {
4602   assert(!Operands.empty() && "Unexpect empty operand list!");
4603   assert((*Operands[0]).isToken() && "Leading operand should always be a mnemonic!");
4604   StringRef Mnemonic = (static_cast<X86Operand &>(*Operands[0])).getToken();
4605   SMRange EmptyRange = None;
4606   StringRef Base = (static_cast<X86Operand &>(*Operands[0])).getToken();
4607   unsigned Prefixes = getPrefixes(Operands);
4608 
4609   // First, handle aliases that expand to multiple instructions.
4610   MatchFPUWaitAlias(IDLoc, static_cast<X86Operand &>(*Operands[0]), Operands, Out, MatchingInlineAsm);
4611   X86Operand &Op = static_cast<X86Operand &>(*Operands[0]);
4612 
4613   MCInst Inst;
4614 
4615   // If VEX/EVEX encoding is forced, we need to pass the USE_* flag to the
4616   // encoder and printer.
4617   if (ForcedVEXEncoding == VEXEncoding_VEX)
4618     Prefixes |= X86::IP_USE_VEX;
4619   else if (ForcedVEXEncoding == VEXEncoding_VEX2)
4620     Prefixes |= X86::IP_USE_VEX2;
4621   else if (ForcedVEXEncoding == VEXEncoding_VEX3)
4622     Prefixes |= X86::IP_USE_VEX3;
4623   else if (ForcedVEXEncoding == VEXEncoding_EVEX)
4624     Prefixes |= X86::IP_USE_EVEX;
4625 
4626   // Set encoded flags for {disp8} and {disp32}.
4627   if (ForcedDispEncoding == DispEncoding_Disp8)
4628     Prefixes |= X86::IP_USE_DISP8;
4629   else if (ForcedDispEncoding == DispEncoding_Disp32)
4630     Prefixes |= X86::IP_USE_DISP32;
4631 
4632   if (Prefixes)
4633     Inst.setFlags(Prefixes);
4634 
4635   // Find one unsized memory operand, if present.
4636   X86Operand *UnsizedMemOp = nullptr;
4637   for (const auto &Op : Operands) {
4638     X86Operand *X86Op = static_cast<X86Operand *>(Op.get());
4639     if (X86Op->isMemUnsized()) {
4640       UnsizedMemOp = X86Op;
4641       // Have we found an unqualified memory operand,
4642       // break. IA allows only one memory operand.
4643       break;
4644     }
4645   }
4646 
4647   // Allow some instructions to have implicitly pointer-sized operands.  This is
4648   // compatible with gas.
4649   if (UnsizedMemOp) {
4650     static const char *const PtrSizedInstrs[] = {"call", "jmp", "push"};
4651     for (const char *Instr : PtrSizedInstrs) {
4652       if (Mnemonic == Instr) {
4653         UnsizedMemOp->Mem.Size = getPointerWidth();
4654         break;
4655       }
4656     }
4657   }
4658 
4659   SmallVector<unsigned, 8> Match;
4660   FeatureBitset ErrorInfoMissingFeatures;
4661   FeatureBitset MissingFeatures;
4662 
4663   // If unsized push has immediate operand we should default the default pointer
4664   // size for the size.
4665   if (Mnemonic == "push" && Operands.size() == 2) {
4666     auto *X86Op = static_cast<X86Operand *>(Operands[1].get());
4667     if (X86Op->isImm()) {
4668       // If it's not a constant fall through and let remainder take care of it.
4669       const auto *CE = dyn_cast<MCConstantExpr>(X86Op->getImm());
4670       unsigned Size = getPointerWidth();
4671       if (CE &&
4672           (isIntN(Size, CE->getValue()) || isUIntN(Size, CE->getValue()))) {
4673         SmallString<16> Tmp;
4674         Tmp += Base;
4675         Tmp += (is64BitMode())
4676                    ? "q"
4677                    : (is32BitMode()) ? "l" : (is16BitMode()) ? "w" : " ";
4678         Op.setTokenValue(Tmp);
4679         // Do match in ATT mode to allow explicit suffix usage.
4680         Match.push_back(MatchInstruction(Operands, Inst, ErrorInfo,
4681                                          MissingFeatures, MatchingInlineAsm,
4682                                          false /*isParsingIntelSyntax()*/));
4683         Op.setTokenValue(Base);
4684       }
4685     }
4686   }
4687 
4688   // If an unsized memory operand is present, try to match with each memory
4689   // operand size.  In Intel assembly, the size is not part of the instruction
4690   // mnemonic.
4691   if (UnsizedMemOp && UnsizedMemOp->isMemUnsized()) {
4692     static const unsigned MopSizes[] = {8, 16, 32, 64, 80, 128, 256, 512};
4693     for (unsigned Size : MopSizes) {
4694       UnsizedMemOp->Mem.Size = Size;
4695       uint64_t ErrorInfoIgnore;
4696       unsigned LastOpcode = Inst.getOpcode();
4697       unsigned M = MatchInstruction(Operands, Inst, ErrorInfoIgnore,
4698                                     MissingFeatures, MatchingInlineAsm,
4699                                     isParsingIntelSyntax());
4700       if (Match.empty() || LastOpcode != Inst.getOpcode())
4701         Match.push_back(M);
4702 
4703       // If this returned as a missing feature failure, remember that.
4704       if (Match.back() == Match_MissingFeature)
4705         ErrorInfoMissingFeatures = MissingFeatures;
4706     }
4707 
4708     // Restore the size of the unsized memory operand if we modified it.
4709     UnsizedMemOp->Mem.Size = 0;
4710   }
4711 
4712   // If we haven't matched anything yet, this is not a basic integer or FPU
4713   // operation.  There shouldn't be any ambiguity in our mnemonic table, so try
4714   // matching with the unsized operand.
4715   if (Match.empty()) {
4716     Match.push_back(MatchInstruction(
4717         Operands, Inst, ErrorInfo, MissingFeatures, MatchingInlineAsm,
4718         isParsingIntelSyntax()));
4719     // If this returned as a missing feature failure, remember that.
4720     if (Match.back() == Match_MissingFeature)
4721       ErrorInfoMissingFeatures = MissingFeatures;
4722   }
4723 
4724   // Restore the size of the unsized memory operand if we modified it.
4725   if (UnsizedMemOp)
4726     UnsizedMemOp->Mem.Size = 0;
4727 
4728   // If it's a bad mnemonic, all results will be the same.
4729   if (Match.back() == Match_MnemonicFail) {
4730     return Error(IDLoc, "invalid instruction mnemonic '" + Mnemonic + "'",
4731                  Op.getLocRange(), MatchingInlineAsm);
4732   }
4733 
4734   unsigned NumSuccessfulMatches = llvm::count(Match, Match_Success);
4735 
4736   // If matching was ambiguous and we had size information from the frontend,
4737   // try again with that. This handles cases like "movxz eax, m8/m16".
4738   if (UnsizedMemOp && NumSuccessfulMatches > 1 &&
4739       UnsizedMemOp->getMemFrontendSize()) {
4740     UnsizedMemOp->Mem.Size = UnsizedMemOp->getMemFrontendSize();
4741     unsigned M = MatchInstruction(
4742         Operands, Inst, ErrorInfo, MissingFeatures, MatchingInlineAsm,
4743         isParsingIntelSyntax());
4744     if (M == Match_Success)
4745       NumSuccessfulMatches = 1;
4746 
4747     // Add a rewrite that encodes the size information we used from the
4748     // frontend.
4749     InstInfo->AsmRewrites->emplace_back(
4750         AOK_SizeDirective, UnsizedMemOp->getStartLoc(),
4751         /*Len=*/0, UnsizedMemOp->getMemFrontendSize());
4752   }
4753 
4754   // If exactly one matched, then we treat that as a successful match (and the
4755   // instruction will already have been filled in correctly, since the failing
4756   // matches won't have modified it).
4757   if (NumSuccessfulMatches == 1) {
4758     if (!MatchingInlineAsm && validateInstruction(Inst, Operands))
4759       return true;
4760     // Some instructions need post-processing to, for example, tweak which
4761     // encoding is selected. Loop on it while changes happen so the individual
4762     // transformations can chain off each other.
4763     if (!MatchingInlineAsm)
4764       while (processInstruction(Inst, Operands))
4765         ;
4766     Inst.setLoc(IDLoc);
4767     if (!MatchingInlineAsm)
4768       emitInstruction(Inst, Operands, Out);
4769     Opcode = Inst.getOpcode();
4770     return false;
4771   } else if (NumSuccessfulMatches > 1) {
4772     assert(UnsizedMemOp &&
4773            "multiple matches only possible with unsized memory operands");
4774     return Error(UnsizedMemOp->getStartLoc(),
4775                  "ambiguous operand size for instruction '" + Mnemonic + "\'",
4776                  UnsizedMemOp->getLocRange());
4777   }
4778 
4779   // If one instruction matched as unsupported, report this as unsupported.
4780   if (llvm::count(Match, Match_Unsupported) == 1) {
4781     return Error(IDLoc, "unsupported instruction", EmptyRange,
4782                  MatchingInlineAsm);
4783   }
4784 
4785   // If one instruction matched with a missing feature, report this as a
4786   // missing feature.
4787   if (llvm::count(Match, Match_MissingFeature) == 1) {
4788     ErrorInfo = Match_MissingFeature;
4789     return ErrorMissingFeature(IDLoc, ErrorInfoMissingFeatures,
4790                                MatchingInlineAsm);
4791   }
4792 
4793   // If one instruction matched with an invalid operand, report this as an
4794   // operand failure.
4795   if (llvm::count(Match, Match_InvalidOperand) == 1) {
4796     return Error(IDLoc, "invalid operand for instruction", EmptyRange,
4797                  MatchingInlineAsm);
4798   }
4799 
4800   if (llvm::count(Match, Match_InvalidImmUnsignedi4) == 1) {
4801     SMLoc ErrorLoc = ((X86Operand &)*Operands[ErrorInfo]).getStartLoc();
4802     if (ErrorLoc == SMLoc())
4803       ErrorLoc = IDLoc;
4804     return Error(ErrorLoc, "immediate must be an integer in range [0, 15]",
4805                  EmptyRange, MatchingInlineAsm);
4806   }
4807 
4808   // If all of these were an outright failure, report it in a useless way.
4809   return Error(IDLoc, "unknown instruction mnemonic", EmptyRange,
4810                MatchingInlineAsm);
4811 }
4812 
4813 bool X86AsmParser::OmitRegisterFromClobberLists(unsigned RegNo) {
4814   return X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(RegNo);
4815 }
4816 
4817 bool X86AsmParser::ParseDirective(AsmToken DirectiveID) {
4818   MCAsmParser &Parser = getParser();
4819   StringRef IDVal = DirectiveID.getIdentifier();
4820   if (IDVal.startswith(".arch"))
4821     return parseDirectiveArch();
4822   if (IDVal.startswith(".code"))
4823     return ParseDirectiveCode(IDVal, DirectiveID.getLoc());
4824   else if (IDVal.startswith(".att_syntax")) {
4825     if (getLexer().isNot(AsmToken::EndOfStatement)) {
4826       if (Parser.getTok().getString() == "prefix")
4827         Parser.Lex();
4828       else if (Parser.getTok().getString() == "noprefix")
4829         return Error(DirectiveID.getLoc(), "'.att_syntax noprefix' is not "
4830                                            "supported: registers must have a "
4831                                            "'%' prefix in .att_syntax");
4832     }
4833     getParser().setAssemblerDialect(0);
4834     return false;
4835   } else if (IDVal.startswith(".intel_syntax")) {
4836     getParser().setAssemblerDialect(1);
4837     if (getLexer().isNot(AsmToken::EndOfStatement)) {
4838       if (Parser.getTok().getString() == "noprefix")
4839         Parser.Lex();
4840       else if (Parser.getTok().getString() == "prefix")
4841         return Error(DirectiveID.getLoc(), "'.intel_syntax prefix' is not "
4842                                            "supported: registers must not have "
4843                                            "a '%' prefix in .intel_syntax");
4844     }
4845     return false;
4846   } else if (IDVal == ".nops")
4847     return parseDirectiveNops(DirectiveID.getLoc());
4848   else if (IDVal == ".even")
4849     return parseDirectiveEven(DirectiveID.getLoc());
4850   else if (IDVal == ".cv_fpo_proc")
4851     return parseDirectiveFPOProc(DirectiveID.getLoc());
4852   else if (IDVal == ".cv_fpo_setframe")
4853     return parseDirectiveFPOSetFrame(DirectiveID.getLoc());
4854   else if (IDVal == ".cv_fpo_pushreg")
4855     return parseDirectiveFPOPushReg(DirectiveID.getLoc());
4856   else if (IDVal == ".cv_fpo_stackalloc")
4857     return parseDirectiveFPOStackAlloc(DirectiveID.getLoc());
4858   else if (IDVal == ".cv_fpo_stackalign")
4859     return parseDirectiveFPOStackAlign(DirectiveID.getLoc());
4860   else if (IDVal == ".cv_fpo_endprologue")
4861     return parseDirectiveFPOEndPrologue(DirectiveID.getLoc());
4862   else if (IDVal == ".cv_fpo_endproc")
4863     return parseDirectiveFPOEndProc(DirectiveID.getLoc());
4864   else if (IDVal == ".seh_pushreg" ||
4865            (Parser.isParsingMasm() && IDVal.equals_insensitive(".pushreg")))
4866     return parseDirectiveSEHPushReg(DirectiveID.getLoc());
4867   else if (IDVal == ".seh_setframe" ||
4868            (Parser.isParsingMasm() && IDVal.equals_insensitive(".setframe")))
4869     return parseDirectiveSEHSetFrame(DirectiveID.getLoc());
4870   else if (IDVal == ".seh_savereg" ||
4871            (Parser.isParsingMasm() && IDVal.equals_insensitive(".savereg")))
4872     return parseDirectiveSEHSaveReg(DirectiveID.getLoc());
4873   else if (IDVal == ".seh_savexmm" ||
4874            (Parser.isParsingMasm() && IDVal.equals_insensitive(".savexmm128")))
4875     return parseDirectiveSEHSaveXMM(DirectiveID.getLoc());
4876   else if (IDVal == ".seh_pushframe" ||
4877            (Parser.isParsingMasm() && IDVal.equals_insensitive(".pushframe")))
4878     return parseDirectiveSEHPushFrame(DirectiveID.getLoc());
4879 
4880   return true;
4881 }
4882 
4883 bool X86AsmParser::parseDirectiveArch() {
4884   // Ignore .arch for now.
4885   getParser().parseStringToEndOfStatement();
4886   return false;
4887 }
4888 
4889 /// parseDirectiveNops
4890 ///  ::= .nops size[, control]
4891 bool X86AsmParser::parseDirectiveNops(SMLoc L) {
4892   int64_t NumBytes = 0, Control = 0;
4893   SMLoc NumBytesLoc, ControlLoc;
4894   const MCSubtargetInfo& STI = getSTI();
4895   NumBytesLoc = getTok().getLoc();
4896   if (getParser().checkForValidSection() ||
4897       getParser().parseAbsoluteExpression(NumBytes))
4898     return true;
4899 
4900   if (parseOptionalToken(AsmToken::Comma)) {
4901     ControlLoc = getTok().getLoc();
4902     if (getParser().parseAbsoluteExpression(Control))
4903       return true;
4904   }
4905   if (getParser().parseEOL())
4906     return true;
4907 
4908   if (NumBytes <= 0) {
4909     Error(NumBytesLoc, "'.nops' directive with non-positive size");
4910     return false;
4911   }
4912 
4913   if (Control < 0) {
4914     Error(ControlLoc, "'.nops' directive with negative NOP size");
4915     return false;
4916   }
4917 
4918   /// Emit nops
4919   getParser().getStreamer().emitNops(NumBytes, Control, L, STI);
4920 
4921   return false;
4922 }
4923 
4924 /// parseDirectiveEven
4925 ///  ::= .even
4926 bool X86AsmParser::parseDirectiveEven(SMLoc L) {
4927   if (parseEOL())
4928     return false;
4929 
4930   const MCSection *Section = getStreamer().getCurrentSectionOnly();
4931   if (!Section) {
4932     getStreamer().initSections(false, getSTI());
4933     Section = getStreamer().getCurrentSectionOnly();
4934   }
4935   if (Section->useCodeAlign())
4936     getStreamer().emitCodeAlignment(2, &getSTI(), 0);
4937   else
4938     getStreamer().emitValueToAlignment(2, 0, 1, 0);
4939   return false;
4940 }
4941 
4942 /// ParseDirectiveCode
4943 ///  ::= .code16 | .code32 | .code64
4944 bool X86AsmParser::ParseDirectiveCode(StringRef IDVal, SMLoc L) {
4945   MCAsmParser &Parser = getParser();
4946   Code16GCC = false;
4947   if (IDVal == ".code16") {
4948     Parser.Lex();
4949     if (!is16BitMode()) {
4950       SwitchMode(X86::Is16Bit);
4951       getParser().getStreamer().emitAssemblerFlag(MCAF_Code16);
4952     }
4953   } else if (IDVal == ".code16gcc") {
4954     // .code16gcc parses as if in 32-bit mode, but emits code in 16-bit mode.
4955     Parser.Lex();
4956     Code16GCC = true;
4957     if (!is16BitMode()) {
4958       SwitchMode(X86::Is16Bit);
4959       getParser().getStreamer().emitAssemblerFlag(MCAF_Code16);
4960     }
4961   } else if (IDVal == ".code32") {
4962     Parser.Lex();
4963     if (!is32BitMode()) {
4964       SwitchMode(X86::Is32Bit);
4965       getParser().getStreamer().emitAssemblerFlag(MCAF_Code32);
4966     }
4967   } else if (IDVal == ".code64") {
4968     Parser.Lex();
4969     if (!is64BitMode()) {
4970       SwitchMode(X86::Is64Bit);
4971       getParser().getStreamer().emitAssemblerFlag(MCAF_Code64);
4972     }
4973   } else {
4974     Error(L, "unknown directive " + IDVal);
4975     return false;
4976   }
4977 
4978   return false;
4979 }
4980 
4981 // .cv_fpo_proc foo
4982 bool X86AsmParser::parseDirectiveFPOProc(SMLoc L) {
4983   MCAsmParser &Parser = getParser();
4984   StringRef ProcName;
4985   int64_t ParamsSize;
4986   if (Parser.parseIdentifier(ProcName))
4987     return Parser.TokError("expected symbol name");
4988   if (Parser.parseIntToken(ParamsSize, "expected parameter byte count"))
4989     return true;
4990   if (!isUIntN(32, ParamsSize))
4991     return Parser.TokError("parameters size out of range");
4992   if (parseEOL())
4993     return true;
4994   MCSymbol *ProcSym = getContext().getOrCreateSymbol(ProcName);
4995   return getTargetStreamer().emitFPOProc(ProcSym, ParamsSize, L);
4996 }
4997 
4998 // .cv_fpo_setframe ebp
4999 bool X86AsmParser::parseDirectiveFPOSetFrame(SMLoc L) {
5000   unsigned Reg;
5001   SMLoc DummyLoc;
5002   if (ParseRegister(Reg, DummyLoc, DummyLoc) || parseEOL())
5003     return true;
5004   return getTargetStreamer().emitFPOSetFrame(Reg, L);
5005 }
5006 
5007 // .cv_fpo_pushreg ebx
5008 bool X86AsmParser::parseDirectiveFPOPushReg(SMLoc L) {
5009   unsigned Reg;
5010   SMLoc DummyLoc;
5011   if (ParseRegister(Reg, DummyLoc, DummyLoc) || parseEOL())
5012     return true;
5013   return getTargetStreamer().emitFPOPushReg(Reg, L);
5014 }
5015 
5016 // .cv_fpo_stackalloc 20
5017 bool X86AsmParser::parseDirectiveFPOStackAlloc(SMLoc L) {
5018   MCAsmParser &Parser = getParser();
5019   int64_t Offset;
5020   if (Parser.parseIntToken(Offset, "expected offset") || parseEOL())
5021     return true;
5022   return getTargetStreamer().emitFPOStackAlloc(Offset, L);
5023 }
5024 
5025 // .cv_fpo_stackalign 8
5026 bool X86AsmParser::parseDirectiveFPOStackAlign(SMLoc L) {
5027   MCAsmParser &Parser = getParser();
5028   int64_t Offset;
5029   if (Parser.parseIntToken(Offset, "expected offset") || parseEOL())
5030     return true;
5031   return getTargetStreamer().emitFPOStackAlign(Offset, L);
5032 }
5033 
5034 // .cv_fpo_endprologue
5035 bool X86AsmParser::parseDirectiveFPOEndPrologue(SMLoc L) {
5036   MCAsmParser &Parser = getParser();
5037   if (Parser.parseEOL())
5038     return true;
5039   return getTargetStreamer().emitFPOEndPrologue(L);
5040 }
5041 
5042 // .cv_fpo_endproc
5043 bool X86AsmParser::parseDirectiveFPOEndProc(SMLoc L) {
5044   MCAsmParser &Parser = getParser();
5045   if (Parser.parseEOL())
5046     return true;
5047   return getTargetStreamer().emitFPOEndProc(L);
5048 }
5049 
5050 bool X86AsmParser::parseSEHRegisterNumber(unsigned RegClassID,
5051                                           unsigned &RegNo) {
5052   SMLoc startLoc = getLexer().getLoc();
5053   const MCRegisterInfo *MRI = getContext().getRegisterInfo();
5054 
5055   // Try parsing the argument as a register first.
5056   if (getLexer().getTok().isNot(AsmToken::Integer)) {
5057     SMLoc endLoc;
5058     if (ParseRegister(RegNo, startLoc, endLoc))
5059       return true;
5060 
5061     if (!X86MCRegisterClasses[RegClassID].contains(RegNo)) {
5062       return Error(startLoc,
5063                    "register is not supported for use with this directive");
5064     }
5065   } else {
5066     // Otherwise, an integer number matching the encoding of the desired
5067     // register may appear.
5068     int64_t EncodedReg;
5069     if (getParser().parseAbsoluteExpression(EncodedReg))
5070       return true;
5071 
5072     // The SEH register number is the same as the encoding register number. Map
5073     // from the encoding back to the LLVM register number.
5074     RegNo = 0;
5075     for (MCPhysReg Reg : X86MCRegisterClasses[RegClassID]) {
5076       if (MRI->getEncodingValue(Reg) == EncodedReg) {
5077         RegNo = Reg;
5078         break;
5079       }
5080     }
5081     if (RegNo == 0) {
5082       return Error(startLoc,
5083                    "incorrect register number for use with this directive");
5084     }
5085   }
5086 
5087   return false;
5088 }
5089 
5090 bool X86AsmParser::parseDirectiveSEHPushReg(SMLoc Loc) {
5091   unsigned Reg = 0;
5092   if (parseSEHRegisterNumber(X86::GR64RegClassID, Reg))
5093     return true;
5094 
5095   if (getLexer().isNot(AsmToken::EndOfStatement))
5096     return TokError("unexpected token in directive");
5097 
5098   getParser().Lex();
5099   getStreamer().emitWinCFIPushReg(Reg, Loc);
5100   return false;
5101 }
5102 
5103 bool X86AsmParser::parseDirectiveSEHSetFrame(SMLoc Loc) {
5104   unsigned Reg = 0;
5105   int64_t Off;
5106   if (parseSEHRegisterNumber(X86::GR64RegClassID, Reg))
5107     return true;
5108   if (getLexer().isNot(AsmToken::Comma))
5109     return TokError("you must specify a stack pointer offset");
5110 
5111   getParser().Lex();
5112   if (getParser().parseAbsoluteExpression(Off))
5113     return true;
5114 
5115   if (getLexer().isNot(AsmToken::EndOfStatement))
5116     return TokError("unexpected token in directive");
5117 
5118   getParser().Lex();
5119   getStreamer().emitWinCFISetFrame(Reg, Off, Loc);
5120   return false;
5121 }
5122 
5123 bool X86AsmParser::parseDirectiveSEHSaveReg(SMLoc Loc) {
5124   unsigned Reg = 0;
5125   int64_t Off;
5126   if (parseSEHRegisterNumber(X86::GR64RegClassID, Reg))
5127     return true;
5128   if (getLexer().isNot(AsmToken::Comma))
5129     return TokError("you must specify an offset on the stack");
5130 
5131   getParser().Lex();
5132   if (getParser().parseAbsoluteExpression(Off))
5133     return true;
5134 
5135   if (getLexer().isNot(AsmToken::EndOfStatement))
5136     return TokError("unexpected token in directive");
5137 
5138   getParser().Lex();
5139   getStreamer().emitWinCFISaveReg(Reg, Off, Loc);
5140   return false;
5141 }
5142 
5143 bool X86AsmParser::parseDirectiveSEHSaveXMM(SMLoc Loc) {
5144   unsigned Reg = 0;
5145   int64_t Off;
5146   if (parseSEHRegisterNumber(X86::VR128XRegClassID, Reg))
5147     return true;
5148   if (getLexer().isNot(AsmToken::Comma))
5149     return TokError("you must specify an offset on the stack");
5150 
5151   getParser().Lex();
5152   if (getParser().parseAbsoluteExpression(Off))
5153     return true;
5154 
5155   if (getLexer().isNot(AsmToken::EndOfStatement))
5156     return TokError("unexpected token in directive");
5157 
5158   getParser().Lex();
5159   getStreamer().emitWinCFISaveXMM(Reg, Off, Loc);
5160   return false;
5161 }
5162 
5163 bool X86AsmParser::parseDirectiveSEHPushFrame(SMLoc Loc) {
5164   bool Code = false;
5165   StringRef CodeID;
5166   if (getLexer().is(AsmToken::At)) {
5167     SMLoc startLoc = getLexer().getLoc();
5168     getParser().Lex();
5169     if (!getParser().parseIdentifier(CodeID)) {
5170       if (CodeID != "code")
5171         return Error(startLoc, "expected @code");
5172       Code = true;
5173     }
5174   }
5175 
5176   if (getLexer().isNot(AsmToken::EndOfStatement))
5177     return TokError("unexpected token in directive");
5178 
5179   getParser().Lex();
5180   getStreamer().emitWinCFIPushFrame(Code, Loc);
5181   return false;
5182 }
5183 
5184 // Force static initialization.
5185 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86AsmParser() {
5186   RegisterMCAsmParser<X86AsmParser> X(getTheX86_32Target());
5187   RegisterMCAsmParser<X86AsmParser> Y(getTheX86_64Target());
5188 }
5189 
5190 #define GET_REGISTER_MATCHER
5191 #define GET_MATCHER_IMPLEMENTATION
5192 #define GET_SUBTARGET_FEATURE_NAME
5193 #include "X86GenAsmMatcher.inc"
5194