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