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