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