d5568e08d30b089f83ce8c254995e597434e27db
[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 "llvm/ADT/APFloat.h"
12 #include "llvm/ADT/SmallString.h"
13 #include "llvm/ADT/SmallVector.h"
14 #include "llvm/ADT/StringSwitch.h"
15 #include "llvm/ADT/Twine.h"
16 #include "llvm/MC/MCExpr.h"
17 #include "llvm/MC/MCInst.h"
18 #include "llvm/MC/MCParser/MCAsmLexer.h"
19 #include "llvm/MC/MCParser/MCAsmParser.h"
20 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
21 #include "llvm/MC/MCRegisterInfo.h"
22 #include "llvm/MC/MCStreamer.h"
23 #include "llvm/MC/MCSubtargetInfo.h"
24 #include "llvm/MC/MCSymbol.h"
25 #include "llvm/MC/MCTargetAsmParser.h"
26 #include "llvm/Support/SourceMgr.h"
27 #include "llvm/Support/TargetRegistry.h"
28 #include "llvm/Support/raw_ostream.h"
29
30 using namespace llvm;
31
32 namespace {
33 struct X86Operand;
34
35 class X86AsmParser : public MCTargetAsmParser {
36   MCSubtargetInfo &STI;
37   MCAsmParser &Parser;
38   ParseInstructionInfo *InstInfo;
39 private:
40   MCAsmParser &getParser() const { return Parser; }
41
42   MCAsmLexer &getLexer() const { return Parser.getLexer(); }
43
44   bool Error(SMLoc L, const Twine &Msg,
45              ArrayRef<SMRange> Ranges = ArrayRef<SMRange>(),
46              bool MatchingInlineAsm = false) {
47     if (MatchingInlineAsm) return true;
48     return Parser.Error(L, Msg, Ranges);
49   }
50
51   X86Operand *ErrorOperand(SMLoc Loc, StringRef Msg) {
52     Error(Loc, Msg);
53     return 0;
54   }
55
56   X86Operand *ParseOperand();
57   X86Operand *ParseATTOperand();
58   X86Operand *ParseIntelOperand();
59   X86Operand *ParseIntelOffsetOfOperator(SMLoc StartLoc);
60   X86Operand *ParseIntelOperator(SMLoc StartLoc, unsigned OpKind);
61   X86Operand *ParseIntelMemOperand(unsigned SegReg, SMLoc StartLoc);
62   X86Operand *ParseIntelBracExpression(unsigned SegReg, unsigned Size);
63   X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
64
65   X86Operand *CreateMemForInlineAsm(const MCExpr *Disp, SMLoc Start, SMLoc End,
66                                     SMLoc SizeDirLoc, unsigned Size);
67
68   bool ParseIntelDotOperator(const MCExpr *Disp, const MCExpr **NewDisp,
69                              SmallString<64> &Err);
70
71   bool ParseDirectiveWord(unsigned Size, SMLoc L);
72   bool ParseDirectiveCode(StringRef IDVal, SMLoc L);
73
74   bool processInstruction(MCInst &Inst,
75                           const SmallVectorImpl<MCParsedAsmOperand*> &Ops);
76
77   bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
78                                SmallVectorImpl<MCParsedAsmOperand*> &Operands,
79                                MCStreamer &Out, unsigned &ErrorInfo,
80                                bool MatchingInlineAsm);
81
82   /// isSrcOp - Returns true if operand is either (%rsi) or %ds:%(rsi)
83   /// in 64bit mode or (%esi) or %es:(%esi) in 32bit mode.
84   bool isSrcOp(X86Operand &Op);
85
86   /// isDstOp - Returns true if operand is either (%rdi) or %es:(%rdi)
87   /// in 64bit mode or (%edi) or %es:(%edi) in 32bit mode.
88   bool isDstOp(X86Operand &Op);
89
90   bool is64BitMode() const {
91     // FIXME: Can tablegen auto-generate this?
92     return (STI.getFeatureBits() & X86::Mode64Bit) != 0;
93   }
94   void SwitchMode() {
95     unsigned FB = ComputeAvailableFeatures(STI.ToggleFeature(X86::Mode64Bit));
96     setAvailableFeatures(FB);
97   }
98
99   /// @name Auto-generated Matcher Functions
100   /// {
101
102 #define GET_ASSEMBLER_HEADER
103 #include "X86GenAsmMatcher.inc"
104
105   /// }
106
107 public:
108   X86AsmParser(MCSubtargetInfo &sti, MCAsmParser &parser)
109     : MCTargetAsmParser(), STI(sti), Parser(parser), InstInfo(0) {
110
111     // Initialize the set of available features.
112     setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits()));
113   }
114   virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc);
115
116   virtual bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
117                                 SMLoc NameLoc,
118                                 SmallVectorImpl<MCParsedAsmOperand*> &Operands);
119
120   virtual bool ParseDirective(AsmToken DirectiveID);
121
122   bool isParsingIntelSyntax() {
123     return getParser().getAssemblerDialect();
124   }
125 };
126 } // end anonymous namespace
127
128 /// @name Auto-generated Match Functions
129 /// {
130
131 static unsigned MatchRegisterName(StringRef Name);
132
133 /// }
134
135 static bool isImmSExti16i8Value(uint64_t Value) {
136   return ((                                  Value <= 0x000000000000007FULL)||
137           (0x000000000000FF80ULL <= Value && Value <= 0x000000000000FFFFULL)||
138           (0xFFFFFFFFFFFFFF80ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
139 }
140
141 static bool isImmSExti32i8Value(uint64_t Value) {
142   return ((                                  Value <= 0x000000000000007FULL)||
143           (0x00000000FFFFFF80ULL <= Value && Value <= 0x00000000FFFFFFFFULL)||
144           (0xFFFFFFFFFFFFFF80ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
145 }
146
147 static bool isImmZExtu32u8Value(uint64_t Value) {
148     return (Value <= 0x00000000000000FFULL);
149 }
150
151 static bool isImmSExti64i8Value(uint64_t Value) {
152   return ((                                  Value <= 0x000000000000007FULL)||
153           (0xFFFFFFFFFFFFFF80ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
154 }
155
156 static bool isImmSExti64i32Value(uint64_t Value) {
157   return ((                                  Value <= 0x000000007FFFFFFFULL)||
158           (0xFFFFFFFF80000000ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));
159 }
160 namespace {
161
162 /// X86Operand - Instances of this class represent a parsed X86 machine
163 /// instruction.
164 struct X86Operand : public MCParsedAsmOperand {
165   enum KindTy {
166     Token,
167     Register,
168     Immediate,
169     Memory
170   } Kind;
171
172   SMLoc StartLoc, EndLoc;
173   SMLoc OffsetOfLoc;
174   bool AddressOf;
175
176   struct TokOp {
177     const char *Data;
178     unsigned Length;
179   };
180
181   struct RegOp {
182     unsigned RegNo;
183   };
184
185   struct ImmOp {
186     const MCExpr *Val;
187   };
188
189   struct MemOp {
190     unsigned SegReg;
191     const MCExpr *Disp;
192     unsigned BaseReg;
193     unsigned IndexReg;
194     unsigned Scale;
195     unsigned Size;
196   };
197
198   union {
199     struct TokOp Tok;
200     struct RegOp Reg;
201     struct ImmOp Imm;
202     struct MemOp Mem;
203   };
204
205   X86Operand(KindTy K, SMLoc Start, SMLoc End)
206     : Kind(K), StartLoc(Start), EndLoc(End) {}
207
208   /// getStartLoc - Get the location of the first token of this operand.
209   SMLoc getStartLoc() const { return StartLoc; }
210   /// getEndLoc - Get the location of the last token of this operand.
211   SMLoc getEndLoc() const { return EndLoc; }
212   /// getLocRange - Get the range between the first and last token of this
213   /// operand.
214   SMRange getLocRange() const { return SMRange(StartLoc, EndLoc); }
215   /// getOffsetOfLoc - Get the location of the offset operator.
216   SMLoc getOffsetOfLoc() const { return OffsetOfLoc; }
217
218   virtual void print(raw_ostream &OS) const {}
219
220   StringRef getToken() const {
221     assert(Kind == Token && "Invalid access!");
222     return StringRef(Tok.Data, Tok.Length);
223   }
224   void setTokenValue(StringRef Value) {
225     assert(Kind == Token && "Invalid access!");
226     Tok.Data = Value.data();
227     Tok.Length = Value.size();
228   }
229
230   unsigned getReg() const {
231     assert(Kind == Register && "Invalid access!");
232     return Reg.RegNo;
233   }
234
235   const MCExpr *getImm() const {
236     assert(Kind == Immediate && "Invalid access!");
237     return Imm.Val;
238   }
239
240   const MCExpr *getMemDisp() const {
241     assert(Kind == Memory && "Invalid access!");
242     return Mem.Disp;
243   }
244   unsigned getMemSegReg() const {
245     assert(Kind == Memory && "Invalid access!");
246     return Mem.SegReg;
247   }
248   unsigned getMemBaseReg() const {
249     assert(Kind == Memory && "Invalid access!");
250     return Mem.BaseReg;
251   }
252   unsigned getMemIndexReg() const {
253     assert(Kind == Memory && "Invalid access!");
254     return Mem.IndexReg;
255   }
256   unsigned getMemScale() const {
257     assert(Kind == Memory && "Invalid access!");
258     return Mem.Scale;
259   }
260
261   bool isToken() const {return Kind == Token; }
262
263   bool isImm() const { return Kind == Immediate; }
264
265   bool isImmSExti16i8() const {
266     if (!isImm())
267       return false;
268
269     // If this isn't a constant expr, just assume it fits and let relaxation
270     // handle it.
271     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
272     if (!CE)
273       return true;
274
275     // Otherwise, check the value is in a range that makes sense for this
276     // extension.
277     return isImmSExti16i8Value(CE->getValue());
278   }
279   bool isImmSExti32i8() const {
280     if (!isImm())
281       return false;
282
283     // If this isn't a constant expr, just assume it fits and let relaxation
284     // handle it.
285     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
286     if (!CE)
287       return true;
288
289     // Otherwise, check the value is in a range that makes sense for this
290     // extension.
291     return isImmSExti32i8Value(CE->getValue());
292   }
293   bool isImmZExtu32u8() const {
294     if (!isImm())
295       return false;
296
297     // If this isn't a constant expr, just assume it fits and let relaxation
298     // handle it.
299     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
300     if (!CE)
301       return true;
302
303     // Otherwise, check the value is in a range that makes sense for this
304     // extension.
305     return isImmZExtu32u8Value(CE->getValue());
306   }
307   bool isImmSExti64i8() const {
308     if (!isImm())
309       return false;
310
311     // If this isn't a constant expr, just assume it fits and let relaxation
312     // handle it.
313     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
314     if (!CE)
315       return true;
316
317     // Otherwise, check the value is in a range that makes sense for this
318     // extension.
319     return isImmSExti64i8Value(CE->getValue());
320   }
321   bool isImmSExti64i32() const {
322     if (!isImm())
323       return false;
324
325     // If this isn't a constant expr, just assume it fits and let relaxation
326     // handle it.
327     const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm());
328     if (!CE)
329       return true;
330
331     // Otherwise, check the value is in a range that makes sense for this
332     // extension.
333     return isImmSExti64i32Value(CE->getValue());
334   }
335
336   bool isOffsetOf() const {
337     return OffsetOfLoc.getPointer();
338   }
339
340   bool needAddressOf() const {
341     return AddressOf;
342   }
343
344   bool isMem() const { return Kind == Memory; }
345   bool isMem8() const {
346     return Kind == Memory && (!Mem.Size || Mem.Size == 8);
347   }
348   bool isMem16() const {
349     return Kind == Memory && (!Mem.Size || Mem.Size == 16);
350   }
351   bool isMem32() const {
352     return Kind == Memory && (!Mem.Size || Mem.Size == 32);
353   }
354   bool isMem64() const {
355     return Kind == Memory && (!Mem.Size || Mem.Size == 64);
356   }
357   bool isMem80() const {
358     return Kind == Memory && (!Mem.Size || Mem.Size == 80);
359   }
360   bool isMem128() const {
361     return Kind == Memory && (!Mem.Size || Mem.Size == 128);
362   }
363   bool isMem256() const {
364     return Kind == Memory && (!Mem.Size || Mem.Size == 256);
365   }
366
367   bool isMemVX32() const {
368     return Kind == Memory && (!Mem.Size || Mem.Size == 32) &&
369       getMemIndexReg() >= X86::XMM0 && getMemIndexReg() <= X86::XMM15;
370   }
371   bool isMemVY32() const {
372     return Kind == Memory && (!Mem.Size || Mem.Size == 32) &&
373       getMemIndexReg() >= X86::YMM0 && getMemIndexReg() <= X86::YMM15;
374   }
375   bool isMemVX64() const {
376     return Kind == Memory && (!Mem.Size || Mem.Size == 64) &&
377       getMemIndexReg() >= X86::XMM0 && getMemIndexReg() <= X86::XMM15;
378   }
379   bool isMemVY64() const {
380     return Kind == Memory && (!Mem.Size || Mem.Size == 64) &&
381       getMemIndexReg() >= X86::YMM0 && getMemIndexReg() <= X86::YMM15;
382   }
383
384   bool isAbsMem() const {
385     return Kind == Memory && !getMemSegReg() && !getMemBaseReg() &&
386       !getMemIndexReg() && getMemScale() == 1;
387   }
388
389   bool isReg() const { return Kind == Register; }
390
391   void addExpr(MCInst &Inst, const MCExpr *Expr) const {
392     // Add as immediates when possible.
393     if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
394       Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
395     else
396       Inst.addOperand(MCOperand::CreateExpr(Expr));
397   }
398
399   void addRegOperands(MCInst &Inst, unsigned N) const {
400     assert(N == 1 && "Invalid number of operands!");
401     Inst.addOperand(MCOperand::CreateReg(getReg()));
402   }
403
404   void addImmOperands(MCInst &Inst, unsigned N) const {
405     assert(N == 1 && "Invalid number of operands!");
406     addExpr(Inst, getImm());
407   }
408
409   void addMem8Operands(MCInst &Inst, unsigned N) const {
410     addMemOperands(Inst, N);
411   }
412   void addMem16Operands(MCInst &Inst, unsigned N) const {
413     addMemOperands(Inst, N);
414   }
415   void addMem32Operands(MCInst &Inst, unsigned N) const {
416     addMemOperands(Inst, N);
417   }
418   void addMem64Operands(MCInst &Inst, unsigned N) const {
419     addMemOperands(Inst, N);
420   }
421   void addMem80Operands(MCInst &Inst, unsigned N) const {
422     addMemOperands(Inst, N);
423   }
424   void addMem128Operands(MCInst &Inst, unsigned N) const {
425     addMemOperands(Inst, N);
426   }
427   void addMem256Operands(MCInst &Inst, unsigned N) const {
428     addMemOperands(Inst, N);
429   }
430   void addMemVX32Operands(MCInst &Inst, unsigned N) const {
431     addMemOperands(Inst, N);
432   }
433   void addMemVY32Operands(MCInst &Inst, unsigned N) const {
434     addMemOperands(Inst, N);
435   }
436   void addMemVX64Operands(MCInst &Inst, unsigned N) const {
437     addMemOperands(Inst, N);
438   }
439   void addMemVY64Operands(MCInst &Inst, unsigned N) const {
440     addMemOperands(Inst, N);
441   }
442
443   void addMemOperands(MCInst &Inst, unsigned N) const {
444     assert((N == 5) && "Invalid number of operands!");
445     Inst.addOperand(MCOperand::CreateReg(getMemBaseReg()));
446     Inst.addOperand(MCOperand::CreateImm(getMemScale()));
447     Inst.addOperand(MCOperand::CreateReg(getMemIndexReg()));
448     addExpr(Inst, getMemDisp());
449     Inst.addOperand(MCOperand::CreateReg(getMemSegReg()));
450   }
451
452   void addAbsMemOperands(MCInst &Inst, unsigned N) const {
453     assert((N == 1) && "Invalid number of operands!");
454     // Add as immediates when possible.
455     if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getMemDisp()))
456       Inst.addOperand(MCOperand::CreateImm(CE->getValue()));
457     else
458       Inst.addOperand(MCOperand::CreateExpr(getMemDisp()));
459   }
460
461   static X86Operand *CreateToken(StringRef Str, SMLoc Loc) {
462     SMLoc EndLoc = SMLoc::getFromPointer(Loc.getPointer() + Str.size());
463     X86Operand *Res = new X86Operand(Token, Loc, EndLoc);
464     Res->Tok.Data = Str.data();
465     Res->Tok.Length = Str.size();
466     return Res;
467   }
468
469   static X86Operand *CreateReg(unsigned RegNo, SMLoc StartLoc, SMLoc EndLoc,
470                                bool AddressOf = false,
471                                SMLoc OffsetOfLoc = SMLoc()) {
472     X86Operand *Res = new X86Operand(Register, StartLoc, EndLoc);
473     Res->Reg.RegNo = RegNo;
474     Res->AddressOf = AddressOf;
475     Res->OffsetOfLoc = OffsetOfLoc;
476     return Res;
477   }
478
479   static X86Operand *CreateImm(const MCExpr *Val, SMLoc StartLoc, SMLoc EndLoc){
480     X86Operand *Res = new X86Operand(Immediate, StartLoc, EndLoc);
481     Res->Imm.Val = Val;
482     return Res;
483   }
484
485   /// Create an absolute memory operand.
486   static X86Operand *CreateMem(const MCExpr *Disp, SMLoc StartLoc, SMLoc EndLoc,
487                                unsigned Size = 0) {
488     X86Operand *Res = new X86Operand(Memory, StartLoc, EndLoc);
489     Res->Mem.SegReg   = 0;
490     Res->Mem.Disp     = Disp;
491     Res->Mem.BaseReg  = 0;
492     Res->Mem.IndexReg = 0;
493     Res->Mem.Scale    = 1;
494     Res->Mem.Size     = Size;
495     Res->AddressOf = false;
496     return Res;
497   }
498
499   /// Create a generalized memory operand.
500   static X86Operand *CreateMem(unsigned SegReg, const MCExpr *Disp,
501                                unsigned BaseReg, unsigned IndexReg,
502                                unsigned Scale, SMLoc StartLoc, SMLoc EndLoc,
503                                unsigned Size = 0) {
504     // We should never just have a displacement, that should be parsed as an
505     // absolute memory operand.
506     assert((SegReg || BaseReg || IndexReg) && "Invalid memory operand!");
507
508     // The scale should always be one of {1,2,4,8}.
509     assert(((Scale == 1 || Scale == 2 || Scale == 4 || Scale == 8)) &&
510            "Invalid scale!");
511     X86Operand *Res = new X86Operand(Memory, StartLoc, EndLoc);
512     Res->Mem.SegReg   = SegReg;
513     Res->Mem.Disp     = Disp;
514     Res->Mem.BaseReg  = BaseReg;
515     Res->Mem.IndexReg = IndexReg;
516     Res->Mem.Scale    = Scale;
517     Res->Mem.Size     = Size;
518     Res->AddressOf = false;
519     return Res;
520   }
521 };
522
523 } // end anonymous namespace.
524
525 bool X86AsmParser::isSrcOp(X86Operand &Op) {
526   unsigned basereg = is64BitMode() ? X86::RSI : X86::ESI;
527
528   return (Op.isMem() &&
529     (Op.Mem.SegReg == 0 || Op.Mem.SegReg == X86::DS) &&
530     isa<MCConstantExpr>(Op.Mem.Disp) &&
531     cast<MCConstantExpr>(Op.Mem.Disp)->getValue() == 0 &&
532     Op.Mem.BaseReg == basereg && Op.Mem.IndexReg == 0);
533 }
534
535 bool X86AsmParser::isDstOp(X86Operand &Op) {
536   unsigned basereg = is64BitMode() ? X86::RDI : X86::EDI;
537
538   return Op.isMem() &&
539     (Op.Mem.SegReg == 0 || Op.Mem.SegReg == X86::ES) &&
540     isa<MCConstantExpr>(Op.Mem.Disp) &&
541     cast<MCConstantExpr>(Op.Mem.Disp)->getValue() == 0 &&
542     Op.Mem.BaseReg == basereg && Op.Mem.IndexReg == 0;
543 }
544
545 bool X86AsmParser::ParseRegister(unsigned &RegNo,
546                                  SMLoc &StartLoc, SMLoc &EndLoc) {
547   RegNo = 0;
548   const AsmToken &PercentTok = Parser.getTok();
549   StartLoc = PercentTok.getLoc();
550
551   // If we encounter a %, ignore it. This code handles registers with and
552   // without the prefix, unprefixed registers can occur in cfi directives.
553   if (!isParsingIntelSyntax() && PercentTok.is(AsmToken::Percent))
554     Parser.Lex(); // Eat percent token.
555
556   const AsmToken &Tok = Parser.getTok();
557   EndLoc = Tok.getEndLoc();
558
559   if (Tok.isNot(AsmToken::Identifier)) {
560     if (isParsingIntelSyntax()) return true;
561     return Error(StartLoc, "invalid register name",
562                  SMRange(StartLoc, EndLoc));
563   }
564
565   RegNo = MatchRegisterName(Tok.getString());
566
567   // If the match failed, try the register name as lowercase.
568   if (RegNo == 0)
569     RegNo = MatchRegisterName(Tok.getString().lower());
570
571   if (!is64BitMode()) {
572     // FIXME: This should be done using Requires<In32BitMode> and
573     // Requires<In64BitMode> so "eiz" usage in 64-bit instructions can be also
574     // checked.
575     // FIXME: Check AH, CH, DH, BH cannot be used in an instruction requiring a
576     // REX prefix.
577     if (RegNo == X86::RIZ ||
578         X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo) ||
579         X86II::isX86_64NonExtLowByteReg(RegNo) ||
580         X86II::isX86_64ExtendedReg(RegNo))
581       return Error(StartLoc, "register %"
582                    + Tok.getString() + " is only available in 64-bit mode",
583                    SMRange(StartLoc, EndLoc));
584   }
585
586   // Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens.
587   if (RegNo == 0 && (Tok.getString() == "st" || Tok.getString() == "ST")) {
588     RegNo = X86::ST0;
589     Parser.Lex(); // Eat 'st'
590
591     // Check to see if we have '(4)' after %st.
592     if (getLexer().isNot(AsmToken::LParen))
593       return false;
594     // Lex the paren.
595     getParser().Lex();
596
597     const AsmToken &IntTok = Parser.getTok();
598     if (IntTok.isNot(AsmToken::Integer))
599       return Error(IntTok.getLoc(), "expected stack index");
600     switch (IntTok.getIntVal()) {
601     case 0: RegNo = X86::ST0; break;
602     case 1: RegNo = X86::ST1; break;
603     case 2: RegNo = X86::ST2; break;
604     case 3: RegNo = X86::ST3; break;
605     case 4: RegNo = X86::ST4; break;
606     case 5: RegNo = X86::ST5; break;
607     case 6: RegNo = X86::ST6; break;
608     case 7: RegNo = X86::ST7; break;
609     default: return Error(IntTok.getLoc(), "invalid stack index");
610     }
611
612     if (getParser().Lex().isNot(AsmToken::RParen))
613       return Error(Parser.getTok().getLoc(), "expected ')'");
614
615     EndLoc = Parser.getTok().getEndLoc();
616     Parser.Lex(); // Eat ')'
617     return false;
618   }
619
620   EndLoc = Parser.getTok().getEndLoc();
621
622   // If this is "db[0-7]", match it as an alias
623   // for dr[0-7].
624   if (RegNo == 0 && Tok.getString().size() == 3 &&
625       Tok.getString().startswith("db")) {
626     switch (Tok.getString()[2]) {
627     case '0': RegNo = X86::DR0; break;
628     case '1': RegNo = X86::DR1; break;
629     case '2': RegNo = X86::DR2; break;
630     case '3': RegNo = X86::DR3; break;
631     case '4': RegNo = X86::DR4; break;
632     case '5': RegNo = X86::DR5; break;
633     case '6': RegNo = X86::DR6; break;
634     case '7': RegNo = X86::DR7; break;
635     }
636
637     if (RegNo != 0) {
638       EndLoc = Parser.getTok().getEndLoc();
639       Parser.Lex(); // Eat it.
640       return false;
641     }
642   }
643
644   if (RegNo == 0) {
645     if (isParsingIntelSyntax()) return true;
646     return Error(StartLoc, "invalid register name",
647                  SMRange(StartLoc, EndLoc));
648   }
649
650   Parser.Lex(); // Eat identifier token.
651   return false;
652 }
653
654 X86Operand *X86AsmParser::ParseOperand() {
655   if (isParsingIntelSyntax())
656     return ParseIntelOperand();
657   return ParseATTOperand();
658 }
659
660 /// getIntelMemOperandSize - Return intel memory operand size.
661 static unsigned getIntelMemOperandSize(StringRef OpStr) {
662   unsigned Size = StringSwitch<unsigned>(OpStr)
663     .Cases("BYTE", "byte", 8)
664     .Cases("WORD", "word", 16)
665     .Cases("DWORD", "dword", 32)
666     .Cases("QWORD", "qword", 64)
667     .Cases("XWORD", "xword", 80)
668     .Cases("XMMWORD", "xmmword", 128)
669     .Cases("YMMWORD", "ymmword", 256)
670     .Default(0);
671   return Size;
672 }
673
674 enum IntelBracExprState {
675   IBES_START,
676   IBES_LBRAC,
677   IBES_RBRAC,
678   IBES_REGISTER,
679   IBES_REGISTER_STAR,
680   IBES_REGISTER_STAR_INTEGER,
681   IBES_INTEGER,
682   IBES_INTEGER_STAR,
683   IBES_INDEX_REGISTER,
684   IBES_IDENTIFIER,
685   IBES_DISP_EXPR,
686   IBES_MINUS,
687   IBES_ERROR
688 };
689
690 class IntelBracExprStateMachine {
691   IntelBracExprState State;
692   unsigned BaseReg, IndexReg, Scale;
693   int64_t Disp;
694
695   unsigned TmpReg;
696   int64_t TmpInteger;
697
698   bool isPlus;
699
700 public:
701   IntelBracExprStateMachine(MCAsmParser &parser) :
702     State(IBES_START), BaseReg(0), IndexReg(0), Scale(1), Disp(0),
703     TmpReg(0), TmpInteger(0), isPlus(true) {}
704
705   unsigned getBaseReg() { return BaseReg; }
706   unsigned getIndexReg() { return IndexReg; }
707   unsigned getScale() { return Scale; }
708   int64_t getDisp() { return Disp; }
709   bool isValidEndState() { return State == IBES_RBRAC; }
710
711   void onPlus() {
712     switch (State) {
713     default:
714       State = IBES_ERROR;
715       break;
716     case IBES_INTEGER:
717       State = IBES_START;
718       if (isPlus)
719         Disp += TmpInteger;
720       else
721         Disp -= TmpInteger;
722       break;
723     case IBES_REGISTER:
724       State = IBES_START;
725       // If we already have a BaseReg, then assume this is the IndexReg with a
726       // scale of 1.
727       if (!BaseReg) {
728         BaseReg = TmpReg;
729       } else {
730         assert (!IndexReg && "BaseReg/IndexReg already set!");
731         IndexReg = TmpReg;
732         Scale = 1;
733       }
734       break;
735     case IBES_INDEX_REGISTER:
736       State = IBES_START;
737       break;
738     }
739     isPlus = true;
740   }
741   void onMinus() {
742     switch (State) {
743     default:
744       State = IBES_ERROR;
745       break;
746     case IBES_START:
747       State = IBES_MINUS;
748       break;
749     case IBES_INTEGER:
750       State = IBES_START;
751       if (isPlus)
752         Disp += TmpInteger;
753       else
754         Disp -= TmpInteger;
755       break;
756     case IBES_REGISTER:
757       State = IBES_START;
758       // If we already have a BaseReg, then assume this is the IndexReg with a
759       // scale of 1.
760       if (!BaseReg) {
761         BaseReg = TmpReg;
762       } else {
763         assert (!IndexReg && "BaseReg/IndexReg already set!");
764         IndexReg = TmpReg;
765         Scale = 1;
766       }
767       break;
768     case IBES_INDEX_REGISTER:
769       State = IBES_START;
770       break;
771     }
772     isPlus = false;
773   }
774   void onRegister(unsigned Reg) {
775     switch (State) {
776     default:
777       State = IBES_ERROR;
778       break;
779     case IBES_START:
780       State = IBES_REGISTER;
781       TmpReg = Reg;
782       break;
783     case IBES_INTEGER_STAR:
784       assert (!IndexReg && "IndexReg already set!");
785       State = IBES_INDEX_REGISTER;
786       IndexReg = Reg;
787       Scale = TmpInteger;
788       break;
789     }
790   }
791   void onDispExpr() {
792     switch (State) {
793     default:
794       State = IBES_ERROR;
795       break;
796     case IBES_START:
797       State = IBES_DISP_EXPR;
798       break;
799     }
800   }
801   void onInteger(int64_t TmpInt) {
802     switch (State) {
803     default:
804       State = IBES_ERROR;
805       break;
806     case IBES_START:
807       State = IBES_INTEGER;
808       TmpInteger = TmpInt;
809       break;
810     case IBES_MINUS:
811       State = IBES_INTEGER;
812       TmpInteger = TmpInt;
813       break;
814     case IBES_REGISTER_STAR:
815       assert (!IndexReg && "IndexReg already set!");
816       State = IBES_INDEX_REGISTER;
817       IndexReg = TmpReg;
818       Scale = TmpInt;
819       break;
820     }
821   }
822   void onStar() {
823     switch (State) {
824     default:
825       State = IBES_ERROR;
826       break;
827     case IBES_INTEGER:
828       State = IBES_INTEGER_STAR;
829       break;
830     case IBES_REGISTER:
831       State = IBES_REGISTER_STAR;
832       break;
833     }
834   }
835   void onLBrac() {
836     switch (State) {
837     default:
838       State = IBES_ERROR;
839       break;
840     case IBES_RBRAC:
841       State = IBES_START;
842       isPlus = true;
843       break;
844     }
845   }
846   void onRBrac() {
847     switch (State) {
848     default:
849       State = IBES_ERROR;
850       break;
851     case IBES_DISP_EXPR:
852       State = IBES_RBRAC;
853       break;
854     case IBES_INTEGER:
855       State = IBES_RBRAC;
856       if (isPlus)
857         Disp += TmpInteger;
858       else
859         Disp -= TmpInteger;
860       break;
861     case IBES_REGISTER:
862       State = IBES_RBRAC;
863       // If we already have a BaseReg, then assume this is the IndexReg with a
864       // scale of 1.
865       if (!BaseReg) {
866         BaseReg = TmpReg;
867       } else {
868         assert (!IndexReg && "BaseReg/IndexReg already set!");
869         IndexReg = TmpReg;
870         Scale = 1;
871       }
872       break;
873     case IBES_INDEX_REGISTER:
874       State = IBES_RBRAC;
875       break;
876     }
877   }
878 };
879
880 X86Operand *X86AsmParser::CreateMemForInlineAsm(const MCExpr *Disp, SMLoc Start,
881                                                 SMLoc End, SMLoc SizeDirLoc,
882                                                 unsigned Size) {
883   bool NeedSizeDir = false;
884   bool IsVarDecl = false;
885   if (const MCSymbolRefExpr *SymRef = dyn_cast<MCSymbolRefExpr>(Disp)) {
886     const MCSymbol &Sym = SymRef->getSymbol();
887     // FIXME: The SemaLookup will fail if the name is anything other then an
888     // identifier.
889     // FIXME: Pass a valid SMLoc.
890     unsigned tLength, tSize, tType;
891     SemaCallback->LookupInlineAsmIdentifier(Sym.getName(), NULL, tLength,
892                                             tSize, tType, IsVarDecl);
893     if (!Size) {
894       Size = tType * 8; // Size is in terms of bits in this context.
895       NeedSizeDir = Size > 0;
896     }
897   }
898
899   // If this is not a VarDecl then assume it is a FuncDecl or some other label
900   // reference.  We need an 'r' constraint here, so we need to create register
901   // operand to ensure proper matching.  Just pick a GPR based on the size of
902   // a pointer.
903   if (!IsVarDecl) {
904     unsigned RegNo = is64BitMode() ? X86::RBX : X86::EBX;
905     return X86Operand::CreateReg(RegNo, Start, End, /*AddressOf=*/true);
906   }
907
908   if (NeedSizeDir)
909     InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_SizeDirective, SizeDirLoc,
910                                                 /*Len*/0, Size));  
911
912   // When parsing inline assembly we set the base register to a non-zero value
913   // as we don't know the actual value at this time.  This is necessary to
914   // get the matching correct in some cases.
915   return X86Operand::CreateMem(/*SegReg*/0, Disp, /*BaseReg*/1, /*IndexReg*/0,
916                                /*Scale*/1, Start, End, Size);
917 }
918
919 X86Operand *X86AsmParser::ParseIntelBracExpression(unsigned SegReg, 
920                                                    unsigned Size) {
921   const AsmToken &Tok = Parser.getTok();
922   SMLoc Start = Tok.getLoc(), End = Tok.getEndLoc();
923
924   // Eat '['
925   if (getLexer().isNot(AsmToken::LBrac))
926     return ErrorOperand(Start, "Expected '[' token!");
927   Parser.Lex();
928
929   unsigned TmpReg = 0;
930
931   // Try to handle '[' 'symbol' ']'
932   if (getLexer().is(AsmToken::Identifier)) {
933     if (ParseRegister(TmpReg, Start, End)) {
934       const MCExpr *Disp;
935       if (getParser().parseExpression(Disp, End))
936         return 0;
937
938       if (getLexer().isNot(AsmToken::RBrac))
939         return ErrorOperand(Parser.getTok().getLoc(), "Expected ']' token!");
940       // Adjust the EndLoc due to the ']'.
941       End = SMLoc::getFromPointer(Parser.getTok().getEndLoc().getPointer()-1);
942       Parser.Lex();
943       if (!isParsingInlineAsm())
944         return X86Operand::CreateMem(Disp, Start, End, Size);
945
946       // We want the size directive before the '['.
947       SMLoc SizeDirLoc = SMLoc::getFromPointer(Start.getPointer()-1);
948       return CreateMemForInlineAsm(Disp, Start, End, SizeDirLoc, Size);
949     }
950   }
951
952   // Parse [ BaseReg + Scale*IndexReg + Disp ].
953   bool Done = false;
954   IntelBracExprStateMachine SM(Parser);
955
956   // If we parsed a register, then the end loc has already been set and
957   // the identifier has already been lexed.  We also need to update the
958   // state.
959   if (TmpReg)
960     SM.onRegister(TmpReg);
961
962   const MCExpr *Disp = 0;
963   while (!Done) {
964     bool UpdateLocLex = true;
965
966     // The period in the dot operator (e.g., [ebx].foo.bar) is parsed as an
967     // identifier.  Don't try an parse it as a register.
968     if (Tok.getString().startswith("."))
969       break;
970
971     switch (getLexer().getKind()) {
972     default: {
973       if (SM.isValidEndState()) {
974         Done = true;
975         break;
976       }
977       return ErrorOperand(Tok.getLoc(), "Unexpected token!");
978     }
979     case AsmToken::Identifier: {
980       // This could be a register or a displacement expression.
981       if(!ParseRegister(TmpReg, Start, End)) {
982         SM.onRegister(TmpReg);
983         UpdateLocLex = false;
984         break;
985       } else if (!getParser().parseExpression(Disp, End)) {
986         SM.onDispExpr();
987         UpdateLocLex = false;
988         break;
989       }
990       return ErrorOperand(Tok.getLoc(), "Unexpected identifier!");
991     }
992     case AsmToken::Integer: {
993       int64_t Val = Tok.getIntVal();
994       SM.onInteger(Val);
995       break;
996     }
997     case AsmToken::Plus:    SM.onPlus(); break;
998     case AsmToken::Minus:   SM.onMinus(); break;
999     case AsmToken::Star:    SM.onStar(); break;
1000     case AsmToken::LBrac:   SM.onLBrac(); break;
1001     case AsmToken::RBrac:   SM.onRBrac(); break;
1002     }
1003     if (!Done && UpdateLocLex) {
1004       End = Tok.getLoc();
1005       Parser.Lex(); // Consume the token.
1006     }
1007   }
1008
1009   if (!Disp)
1010     Disp = MCConstantExpr::Create(SM.getDisp(), getContext());
1011
1012   // Parse the dot operator (e.g., [ebx].foo.bar).
1013   if (Tok.getString().startswith(".")) {
1014     SmallString<64> Err;
1015     const MCExpr *NewDisp;
1016     if (ParseIntelDotOperator(Disp, &NewDisp, Err))
1017       return ErrorOperand(Tok.getLoc(), Err);
1018     
1019     End = Parser.getTok().getEndLoc();
1020     Parser.Lex();  // Eat the field.
1021     Disp = NewDisp;
1022   }
1023
1024   int BaseReg = SM.getBaseReg();
1025   int IndexReg = SM.getIndexReg();
1026
1027   // handle [-42]
1028   if (!BaseReg && !IndexReg) {
1029     if (!SegReg)
1030       return X86Operand::CreateMem(Disp, Start, End);
1031     else
1032       return X86Operand::CreateMem(SegReg, Disp, 0, 0, 1, Start, End, Size);
1033   }
1034
1035   int Scale = SM.getScale();
1036   return X86Operand::CreateMem(SegReg, Disp, BaseReg, IndexReg, Scale,
1037                                Start, End, Size);
1038 }
1039
1040 /// ParseIntelMemOperand - Parse intel style memory operand.
1041 X86Operand *X86AsmParser::ParseIntelMemOperand(unsigned SegReg, SMLoc Start) {
1042   const AsmToken &Tok = Parser.getTok();
1043   SMLoc End;
1044
1045   unsigned Size = getIntelMemOperandSize(Tok.getString());
1046   if (Size) {
1047     Parser.Lex();
1048     assert ((Tok.getString() == "PTR" || Tok.getString() == "ptr") &&
1049             "Unexpected token!");
1050     Parser.Lex();
1051   }
1052
1053   if (getLexer().is(AsmToken::LBrac))
1054     return ParseIntelBracExpression(SegReg, Size);
1055
1056   if (!ParseRegister(SegReg, Start, End)) {
1057     // Handel SegReg : [ ... ]
1058     if (getLexer().isNot(AsmToken::Colon))
1059       return ErrorOperand(Start, "Expected ':' token!");
1060     Parser.Lex(); // Eat :
1061     if (getLexer().isNot(AsmToken::LBrac))
1062       return ErrorOperand(Start, "Expected '[' token!");
1063     return ParseIntelBracExpression(SegReg, Size);
1064   }
1065
1066   const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
1067   if (getParser().parseExpression(Disp, End))
1068     return 0;
1069
1070   if (!isParsingInlineAsm())
1071     return X86Operand::CreateMem(Disp, Start, End, Size);
1072   return CreateMemForInlineAsm(Disp, Start, End, Start, Size);
1073 }
1074
1075 /// Parse the '.' operator.
1076 bool X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp,
1077                                          const MCExpr **NewDisp,
1078                                          SmallString<64> &Err) {
1079   AsmToken Tok = *&Parser.getTok();
1080   uint64_t OrigDispVal, DotDispVal;
1081
1082   // FIXME: Handle non-constant expressions.
1083   if (const MCConstantExpr *OrigDisp = dyn_cast<MCConstantExpr>(Disp)) {
1084     OrigDispVal = OrigDisp->getValue();
1085   } else {
1086     Err = "Non-constant offsets are not supported!";
1087     return true;
1088   }
1089
1090   // Drop the '.'.
1091   StringRef DotDispStr = Tok.getString().drop_front(1);
1092
1093   // .Imm gets lexed as a real.
1094   if (Tok.is(AsmToken::Real)) {
1095     APInt DotDisp;
1096     DotDispStr.getAsInteger(10, DotDisp);
1097     DotDispVal = DotDisp.getZExtValue();
1098   } else if (Tok.is(AsmToken::Identifier)) {
1099     // We should only see an identifier when parsing the original inline asm.
1100     // The front-end should rewrite this in terms of immediates.
1101     assert (isParsingInlineAsm() && "Unexpected field name!");
1102
1103     unsigned DotDisp;
1104     std::pair<StringRef, StringRef> BaseMember = DotDispStr.split('.');
1105     if (SemaCallback->LookupInlineAsmField(BaseMember.first, BaseMember.second,
1106                                            DotDisp)) {
1107       Err = "Unable to lookup field reference!";
1108       return true;
1109     }
1110     DotDispVal = DotDisp;
1111   } else {
1112     Err = "Unexpected token type!";
1113     return true;
1114   }
1115
1116   if (isParsingInlineAsm() && Tok.is(AsmToken::Identifier)) {
1117     SMLoc Loc = SMLoc::getFromPointer(DotDispStr.data());
1118     unsigned Len = DotDispStr.size();
1119     unsigned Val = OrigDispVal + DotDispVal;
1120     InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_DotOperator, Loc, Len,
1121                                                 Val));
1122   }
1123
1124   *NewDisp = MCConstantExpr::Create(OrigDispVal + DotDispVal, getContext());
1125   return false;
1126 }
1127
1128 /// Parse the 'offset' operator.  This operator is used to specify the
1129 /// location rather then the content of a variable.
1130 X86Operand *X86AsmParser::ParseIntelOffsetOfOperator(SMLoc Start) {
1131   SMLoc OffsetOfLoc = Start;
1132   Parser.Lex(); // Eat offset.
1133   Start = Parser.getTok().getLoc();
1134   assert (Parser.getTok().is(AsmToken::Identifier) && "Expected an identifier");
1135
1136   SMLoc End;
1137   const MCExpr *Val;
1138   if (getParser().parseExpression(Val, End))
1139     return ErrorOperand(Start, "Unable to parse expression!");
1140
1141   // Don't emit the offset operator.
1142   InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Skip, OffsetOfLoc, 7));
1143
1144   // The offset operator will have an 'r' constraint, thus we need to create
1145   // register operand to ensure proper matching.  Just pick a GPR based on
1146   // the size of a pointer.
1147   unsigned RegNo = is64BitMode() ? X86::RBX : X86::EBX;
1148   return X86Operand::CreateReg(RegNo, Start, End, /*GetAddress=*/true,
1149                                OffsetOfLoc);
1150 }
1151
1152 enum IntelOperatorKind {
1153   IOK_LENGTH,
1154   IOK_SIZE,
1155   IOK_TYPE
1156 };
1157
1158 /// Parse the 'LENGTH', 'TYPE' and 'SIZE' operators.  The LENGTH operator
1159 /// returns the number of elements in an array.  It returns the value 1 for
1160 /// non-array variables.  The SIZE operator returns the size of a C or C++
1161 /// variable.  A variable's size is the product of its LENGTH and TYPE.  The
1162 /// TYPE operator returns the size of a C or C++ type or variable. If the
1163 /// variable is an array, TYPE returns the size of a single element.
1164 X86Operand *X86AsmParser::ParseIntelOperator(SMLoc Start, unsigned OpKind) {
1165   SMLoc TypeLoc = Start;
1166   Parser.Lex(); // Eat offset.
1167   Start = Parser.getTok().getLoc();
1168   assert (Parser.getTok().is(AsmToken::Identifier) && "Expected an identifier");
1169
1170   SMLoc End;
1171   const MCExpr *Val;
1172   if (getParser().parseExpression(Val, End))
1173     return 0;
1174
1175   unsigned Length = 0, Size = 0, Type = 0;
1176   if (const MCSymbolRefExpr *SymRef = dyn_cast<MCSymbolRefExpr>(Val)) {
1177     const MCSymbol &Sym = SymRef->getSymbol();
1178     // FIXME: The SemaLookup will fail if the name is anything other then an
1179     // identifier.
1180     // FIXME: Pass a valid SMLoc.
1181     bool IsVarDecl;
1182     if (!SemaCallback->LookupInlineAsmIdentifier(Sym.getName(), NULL, Length,
1183                                                  Size, Type, IsVarDecl))
1184       return ErrorOperand(Start, "Unable to lookup expr!");
1185   }
1186   unsigned CVal;
1187   switch(OpKind) {
1188   default: llvm_unreachable("Unexpected operand kind!");
1189   case IOK_LENGTH: CVal = Length; break;
1190   case IOK_SIZE: CVal = Size; break;
1191   case IOK_TYPE: CVal = Type; break;
1192   }
1193
1194   // Rewrite the type operator and the C or C++ type or variable in terms of an
1195   // immediate.  E.g. TYPE foo -> $$4
1196   unsigned Len = End.getPointer() - TypeLoc.getPointer();
1197   InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Imm, TypeLoc, Len, CVal));
1198
1199   const MCExpr *Imm = MCConstantExpr::Create(CVal, getContext());
1200   return X86Operand::CreateImm(Imm, Start, End);
1201 }
1202
1203 X86Operand *X86AsmParser::ParseIntelOperand() {
1204   SMLoc Start = Parser.getTok().getLoc(), End;
1205   StringRef AsmTokStr = Parser.getTok().getString();
1206
1207   // Offset, length, type and size operators.
1208   if (isParsingInlineAsm()) {
1209     if (AsmTokStr == "offset" || AsmTokStr == "OFFSET")
1210       return ParseIntelOffsetOfOperator(Start);
1211     if (AsmTokStr == "length" || AsmTokStr == "LENGTH")
1212       return ParseIntelOperator(Start, IOK_LENGTH);
1213     if (AsmTokStr == "size" || AsmTokStr == "SIZE")
1214       return ParseIntelOperator(Start, IOK_SIZE);
1215     if (AsmTokStr == "type" || AsmTokStr == "TYPE")
1216       return ParseIntelOperator(Start, IOK_TYPE);
1217   }
1218
1219   // Immediate.
1220   if (getLexer().is(AsmToken::Integer) || getLexer().is(AsmToken::Real) ||
1221       getLexer().is(AsmToken::Minus)) {
1222     const MCExpr *Val;
1223     if (!getParser().parseExpression(Val, End)) {
1224       if (isParsingInlineAsm())
1225         InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_ImmPrefix, Start));
1226       return X86Operand::CreateImm(Val, Start, End);
1227     }
1228   }
1229
1230   // Register.
1231   unsigned RegNo = 0;
1232   if (!ParseRegister(RegNo, Start, End)) {
1233     // If this is a segment register followed by a ':', then this is the start
1234     // of a memory reference, otherwise this is a normal register reference.
1235     if (getLexer().isNot(AsmToken::Colon))
1236       return X86Operand::CreateReg(RegNo, Start, End);
1237
1238     getParser().Lex(); // Eat the colon.
1239     return ParseIntelMemOperand(RegNo, Start);
1240   }
1241
1242   // Memory operand.
1243   return ParseIntelMemOperand(0, Start);
1244 }
1245
1246 X86Operand *X86AsmParser::ParseATTOperand() {
1247   switch (getLexer().getKind()) {
1248   default:
1249     // Parse a memory operand with no segment register.
1250     return ParseMemOperand(0, Parser.getTok().getLoc());
1251   case AsmToken::Percent: {
1252     // Read the register.
1253     unsigned RegNo;
1254     SMLoc Start, End;
1255     if (ParseRegister(RegNo, Start, End)) return 0;
1256     if (RegNo == X86::EIZ || RegNo == X86::RIZ) {
1257       Error(Start, "%eiz and %riz can only be used as index registers",
1258             SMRange(Start, End));
1259       return 0;
1260     }
1261
1262     // If this is a segment register followed by a ':', then this is the start
1263     // of a memory reference, otherwise this is a normal register reference.
1264     if (getLexer().isNot(AsmToken::Colon))
1265       return X86Operand::CreateReg(RegNo, Start, End);
1266
1267
1268     getParser().Lex(); // Eat the colon.
1269     return ParseMemOperand(RegNo, Start);
1270   }
1271   case AsmToken::Dollar: {
1272     // $42 -> immediate.
1273     SMLoc Start = Parser.getTok().getLoc(), End;
1274     Parser.Lex();
1275     const MCExpr *Val;
1276     if (getParser().parseExpression(Val, End))
1277       return 0;
1278     return X86Operand::CreateImm(Val, Start, End);
1279   }
1280   }
1281 }
1282
1283 /// ParseMemOperand: segment: disp(basereg, indexreg, scale).  The '%ds:' prefix
1284 /// has already been parsed if present.
1285 X86Operand *X86AsmParser::ParseMemOperand(unsigned SegReg, SMLoc MemStart) {
1286
1287   // We have to disambiguate a parenthesized expression "(4+5)" from the start
1288   // of a memory operand with a missing displacement "(%ebx)" or "(,%eax)".  The
1289   // only way to do this without lookahead is to eat the '(' and see what is
1290   // after it.
1291   const MCExpr *Disp = MCConstantExpr::Create(0, getParser().getContext());
1292   if (getLexer().isNot(AsmToken::LParen)) {
1293     SMLoc ExprEnd;
1294     if (getParser().parseExpression(Disp, ExprEnd)) return 0;
1295
1296     // After parsing the base expression we could either have a parenthesized
1297     // memory address or not.  If not, return now.  If so, eat the (.
1298     if (getLexer().isNot(AsmToken::LParen)) {
1299       // Unless we have a segment register, treat this as an immediate.
1300       if (SegReg == 0)
1301         return X86Operand::CreateMem(Disp, MemStart, ExprEnd);
1302       return X86Operand::CreateMem(SegReg, Disp, 0, 0, 1, MemStart, ExprEnd);
1303     }
1304
1305     // Eat the '('.
1306     Parser.Lex();
1307   } else {
1308     // Okay, we have a '('.  We don't know if this is an expression or not, but
1309     // so we have to eat the ( to see beyond it.
1310     SMLoc LParenLoc = Parser.getTok().getLoc();
1311     Parser.Lex(); // Eat the '('.
1312
1313     if (getLexer().is(AsmToken::Percent) || getLexer().is(AsmToken::Comma)) {
1314       // Nothing to do here, fall into the code below with the '(' part of the
1315       // memory operand consumed.
1316     } else {
1317       SMLoc ExprEnd;
1318
1319       // It must be an parenthesized expression, parse it now.
1320       if (getParser().parseParenExpression(Disp, ExprEnd))
1321         return 0;
1322
1323       // After parsing the base expression we could either have a parenthesized
1324       // memory address or not.  If not, return now.  If so, eat the (.
1325       if (getLexer().isNot(AsmToken::LParen)) {
1326         // Unless we have a segment register, treat this as an immediate.
1327         if (SegReg == 0)
1328           return X86Operand::CreateMem(Disp, LParenLoc, ExprEnd);
1329         return X86Operand::CreateMem(SegReg, Disp, 0, 0, 1, MemStart, ExprEnd);
1330       }
1331
1332       // Eat the '('.
1333       Parser.Lex();
1334     }
1335   }
1336
1337   // If we reached here, then we just ate the ( of the memory operand.  Process
1338   // the rest of the memory operand.
1339   unsigned BaseReg = 0, IndexReg = 0, Scale = 1;
1340   SMLoc IndexLoc;
1341
1342   if (getLexer().is(AsmToken::Percent)) {
1343     SMLoc StartLoc, EndLoc;
1344     if (ParseRegister(BaseReg, StartLoc, EndLoc)) return 0;
1345     if (BaseReg == X86::EIZ || BaseReg == X86::RIZ) {
1346       Error(StartLoc, "eiz and riz can only be used as index registers",
1347             SMRange(StartLoc, EndLoc));
1348       return 0;
1349     }
1350   }
1351
1352   if (getLexer().is(AsmToken::Comma)) {
1353     Parser.Lex(); // Eat the comma.
1354     IndexLoc = Parser.getTok().getLoc();
1355
1356     // Following the comma we should have either an index register, or a scale
1357     // value. We don't support the later form, but we want to parse it
1358     // correctly.
1359     //
1360     // Not that even though it would be completely consistent to support syntax
1361     // like "1(%eax,,1)", the assembler doesn't. Use "eiz" or "riz" for this.
1362     if (getLexer().is(AsmToken::Percent)) {
1363       SMLoc L;
1364       if (ParseRegister(IndexReg, L, L)) return 0;
1365
1366       if (getLexer().isNot(AsmToken::RParen)) {
1367         // Parse the scale amount:
1368         //  ::= ',' [scale-expression]
1369         if (getLexer().isNot(AsmToken::Comma)) {
1370           Error(Parser.getTok().getLoc(),
1371                 "expected comma in scale expression");
1372           return 0;
1373         }
1374         Parser.Lex(); // Eat the comma.
1375
1376         if (getLexer().isNot(AsmToken::RParen)) {
1377           SMLoc Loc = Parser.getTok().getLoc();
1378
1379           int64_t ScaleVal;
1380           if (getParser().parseAbsoluteExpression(ScaleVal)){
1381             Error(Loc, "expected scale expression");
1382             return 0;
1383           }
1384
1385           // Validate the scale amount.
1386           if (ScaleVal != 1 && ScaleVal != 2 && ScaleVal != 4 && ScaleVal != 8){
1387             Error(Loc, "scale factor in address must be 1, 2, 4 or 8");
1388             return 0;
1389           }
1390           Scale = (unsigned)ScaleVal;
1391         }
1392       }
1393     } else if (getLexer().isNot(AsmToken::RParen)) {
1394       // A scale amount without an index is ignored.
1395       // index.
1396       SMLoc Loc = Parser.getTok().getLoc();
1397
1398       int64_t Value;
1399       if (getParser().parseAbsoluteExpression(Value))
1400         return 0;
1401
1402       if (Value != 1)
1403         Warning(Loc, "scale factor without index register is ignored");
1404       Scale = 1;
1405     }
1406   }
1407
1408   // Ok, we've eaten the memory operand, verify we have a ')' and eat it too.
1409   if (getLexer().isNot(AsmToken::RParen)) {
1410     Error(Parser.getTok().getLoc(), "unexpected token in memory operand");
1411     return 0;
1412   }
1413   SMLoc MemEnd = Parser.getTok().getEndLoc();
1414   Parser.Lex(); // Eat the ')'.
1415
1416   // If we have both a base register and an index register make sure they are
1417   // both 64-bit or 32-bit registers.
1418   // To support VSIB, IndexReg can be 128-bit or 256-bit registers.
1419   if (BaseReg != 0 && IndexReg != 0) {
1420     if (X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg) &&
1421         (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) ||
1422          X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg)) &&
1423         IndexReg != X86::RIZ) {
1424       Error(IndexLoc, "index register is 32-bit, but base register is 64-bit");
1425       return 0;
1426     }
1427     if (X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg) &&
1428         (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) ||
1429          X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg)) &&
1430         IndexReg != X86::EIZ){
1431       Error(IndexLoc, "index register is 64-bit, but base register is 32-bit");
1432       return 0;
1433     }
1434   }
1435
1436   return X86Operand::CreateMem(SegReg, Disp, BaseReg, IndexReg, Scale,
1437                                MemStart, MemEnd);
1438 }
1439
1440 bool X86AsmParser::
1441 ParseInstruction(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc,
1442                  SmallVectorImpl<MCParsedAsmOperand*> &Operands) {
1443   InstInfo = &Info;
1444   StringRef PatchedName = Name;
1445
1446   // FIXME: Hack to recognize setneb as setne.
1447   if (PatchedName.startswith("set") && PatchedName.endswith("b") &&
1448       PatchedName != "setb" && PatchedName != "setnb")
1449     PatchedName = PatchedName.substr(0, Name.size()-1);
1450
1451   // FIXME: Hack to recognize cmp<comparison code>{ss,sd,ps,pd}.
1452   const MCExpr *ExtraImmOp = 0;
1453   if ((PatchedName.startswith("cmp") || PatchedName.startswith("vcmp")) &&
1454       (PatchedName.endswith("ss") || PatchedName.endswith("sd") ||
1455        PatchedName.endswith("ps") || PatchedName.endswith("pd"))) {
1456     bool IsVCMP = PatchedName[0] == 'v';
1457     unsigned SSECCIdx = IsVCMP ? 4 : 3;
1458     unsigned SSEComparisonCode = StringSwitch<unsigned>(
1459       PatchedName.slice(SSECCIdx, PatchedName.size() - 2))
1460       .Case("eq",       0x00)
1461       .Case("lt",       0x01)
1462       .Case("le",       0x02)
1463       .Case("unord",    0x03)
1464       .Case("neq",      0x04)
1465       .Case("nlt",      0x05)
1466       .Case("nle",      0x06)
1467       .Case("ord",      0x07)
1468       /* AVX only from here */
1469       .Case("eq_uq",    0x08)
1470       .Case("nge",      0x09)
1471       .Case("ngt",      0x0A)
1472       .Case("false",    0x0B)
1473       .Case("neq_oq",   0x0C)
1474       .Case("ge",       0x0D)
1475       .Case("gt",       0x0E)
1476       .Case("true",     0x0F)
1477       .Case("eq_os",    0x10)
1478       .Case("lt_oq",    0x11)
1479       .Case("le_oq",    0x12)
1480       .Case("unord_s",  0x13)
1481       .Case("neq_us",   0x14)
1482       .Case("nlt_uq",   0x15)
1483       .Case("nle_uq",   0x16)
1484       .Case("ord_s",    0x17)
1485       .Case("eq_us",    0x18)
1486       .Case("nge_uq",   0x19)
1487       .Case("ngt_uq",   0x1A)
1488       .Case("false_os", 0x1B)
1489       .Case("neq_os",   0x1C)
1490       .Case("ge_oq",    0x1D)
1491       .Case("gt_oq",    0x1E)
1492       .Case("true_us",  0x1F)
1493       .Default(~0U);
1494     if (SSEComparisonCode != ~0U && (IsVCMP || SSEComparisonCode < 8)) {
1495       ExtraImmOp = MCConstantExpr::Create(SSEComparisonCode,
1496                                           getParser().getContext());
1497       if (PatchedName.endswith("ss")) {
1498         PatchedName = IsVCMP ? "vcmpss" : "cmpss";
1499       } else if (PatchedName.endswith("sd")) {
1500         PatchedName = IsVCMP ? "vcmpsd" : "cmpsd";
1501       } else if (PatchedName.endswith("ps")) {
1502         PatchedName = IsVCMP ? "vcmpps" : "cmpps";
1503       } else {
1504         assert(PatchedName.endswith("pd") && "Unexpected mnemonic!");
1505         PatchedName = IsVCMP ? "vcmppd" : "cmppd";
1506       }
1507     }
1508   }
1509
1510   Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc));
1511
1512   if (ExtraImmOp && !isParsingIntelSyntax())
1513     Operands.push_back(X86Operand::CreateImm(ExtraImmOp, NameLoc, NameLoc));
1514
1515   // Determine whether this is an instruction prefix.
1516   bool isPrefix =
1517     Name == "lock" || Name == "rep" ||
1518     Name == "repe" || Name == "repz" ||
1519     Name == "repne" || Name == "repnz" ||
1520     Name == "rex64" || Name == "data16";
1521
1522
1523   // This does the actual operand parsing.  Don't parse any more if we have a
1524   // prefix juxtaposed with an operation like "lock incl 4(%rax)", because we
1525   // just want to parse the "lock" as the first instruction and the "incl" as
1526   // the next one.
1527   if (getLexer().isNot(AsmToken::EndOfStatement) && !isPrefix) {
1528
1529     // Parse '*' modifier.
1530     if (getLexer().is(AsmToken::Star)) {
1531       SMLoc Loc = Parser.getTok().getLoc();
1532       Operands.push_back(X86Operand::CreateToken("*", Loc));
1533       Parser.Lex(); // Eat the star.
1534     }
1535
1536     // Read the first operand.
1537     if (X86Operand *Op = ParseOperand())
1538       Operands.push_back(Op);
1539     else {
1540       Parser.eatToEndOfStatement();
1541       return true;
1542     }
1543
1544     while (getLexer().is(AsmToken::Comma)) {
1545       Parser.Lex();  // Eat the comma.
1546
1547       // Parse and remember the operand.
1548       if (X86Operand *Op = ParseOperand())
1549         Operands.push_back(Op);
1550       else {
1551         Parser.eatToEndOfStatement();
1552         return true;
1553       }
1554     }
1555
1556     if (getLexer().isNot(AsmToken::EndOfStatement)) {
1557       SMLoc Loc = getLexer().getLoc();
1558       Parser.eatToEndOfStatement();
1559       return Error(Loc, "unexpected token in argument list");
1560     }
1561   }
1562
1563   if (getLexer().is(AsmToken::EndOfStatement))
1564     Parser.Lex(); // Consume the EndOfStatement
1565   else if (isPrefix && getLexer().is(AsmToken::Slash))
1566     Parser.Lex(); // Consume the prefix separator Slash
1567
1568   if (ExtraImmOp && isParsingIntelSyntax())
1569     Operands.push_back(X86Operand::CreateImm(ExtraImmOp, NameLoc, NameLoc));
1570
1571   // This is a terrible hack to handle "out[bwl]? %al, (%dx)" ->
1572   // "outb %al, %dx".  Out doesn't take a memory form, but this is a widely
1573   // documented form in various unofficial manuals, so a lot of code uses it.
1574   if ((Name == "outb" || Name == "outw" || Name == "outl" || Name == "out") &&
1575       Operands.size() == 3) {
1576     X86Operand &Op = *(X86Operand*)Operands.back();
1577     if (Op.isMem() && Op.Mem.SegReg == 0 &&
1578         isa<MCConstantExpr>(Op.Mem.Disp) &&
1579         cast<MCConstantExpr>(Op.Mem.Disp)->getValue() == 0 &&
1580         Op.Mem.BaseReg == MatchRegisterName("dx") && Op.Mem.IndexReg == 0) {
1581       SMLoc Loc = Op.getEndLoc();
1582       Operands.back() = X86Operand::CreateReg(Op.Mem.BaseReg, Loc, Loc);
1583       delete &Op;
1584     }
1585   }
1586   // Same hack for "in[bwl]? (%dx), %al" -> "inb %dx, %al".
1587   if ((Name == "inb" || Name == "inw" || Name == "inl" || Name == "in") &&
1588       Operands.size() == 3) {
1589     X86Operand &Op = *(X86Operand*)Operands.begin()[1];
1590     if (Op.isMem() && Op.Mem.SegReg == 0 &&
1591         isa<MCConstantExpr>(Op.Mem.Disp) &&
1592         cast<MCConstantExpr>(Op.Mem.Disp)->getValue() == 0 &&
1593         Op.Mem.BaseReg == MatchRegisterName("dx") && Op.Mem.IndexReg == 0) {
1594       SMLoc Loc = Op.getEndLoc();
1595       Operands.begin()[1] = X86Operand::CreateReg(Op.Mem.BaseReg, Loc, Loc);
1596       delete &Op;
1597     }
1598   }
1599   // Transform "ins[bwl] %dx, %es:(%edi)" into "ins[bwl]"
1600   if (Name.startswith("ins") && Operands.size() == 3 &&
1601       (Name == "insb" || Name == "insw" || Name == "insl")) {
1602     X86Operand &Op = *(X86Operand*)Operands.begin()[1];
1603     X86Operand &Op2 = *(X86Operand*)Operands.begin()[2];
1604     if (Op.isReg() && Op.getReg() == X86::DX && isDstOp(Op2)) {
1605       Operands.pop_back();
1606       Operands.pop_back();
1607       delete &Op;
1608       delete &Op2;
1609     }
1610   }
1611
1612   // Transform "outs[bwl] %ds:(%esi), %dx" into "out[bwl]"
1613   if (Name.startswith("outs") && Operands.size() == 3 &&
1614       (Name == "outsb" || Name == "outsw" || Name == "outsl")) {
1615     X86Operand &Op = *(X86Operand*)Operands.begin()[1];
1616     X86Operand &Op2 = *(X86Operand*)Operands.begin()[2];
1617     if (isSrcOp(Op) && Op2.isReg() && Op2.getReg() == X86::DX) {
1618       Operands.pop_back();
1619       Operands.pop_back();
1620       delete &Op;
1621       delete &Op2;
1622     }
1623   }
1624
1625   // Transform "movs[bwl] %ds:(%esi), %es:(%edi)" into "movs[bwl]"
1626   if (Name.startswith("movs") && Operands.size() == 3 &&
1627       (Name == "movsb" || Name == "movsw" || Name == "movsl" ||
1628        (is64BitMode() && Name == "movsq"))) {
1629     X86Operand &Op = *(X86Operand*)Operands.begin()[1];
1630     X86Operand &Op2 = *(X86Operand*)Operands.begin()[2];
1631     if (isSrcOp(Op) && isDstOp(Op2)) {
1632       Operands.pop_back();
1633       Operands.pop_back();
1634       delete &Op;
1635       delete &Op2;
1636     }
1637   }
1638   // Transform "lods[bwl] %ds:(%esi),{%al,%ax,%eax,%rax}" into "lods[bwl]"
1639   if (Name.startswith("lods") && Operands.size() == 3 &&
1640       (Name == "lods" || Name == "lodsb" || Name == "lodsw" ||
1641        Name == "lodsl" || (is64BitMode() && Name == "lodsq"))) {
1642     X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]);
1643     X86Operand *Op2 = static_cast<X86Operand*>(Operands[2]);
1644     if (isSrcOp(*Op1) && Op2->isReg()) {
1645       const char *ins;
1646       unsigned reg = Op2->getReg();
1647       bool isLods = Name == "lods";
1648       if (reg == X86::AL && (isLods || Name == "lodsb"))
1649         ins = "lodsb";
1650       else if (reg == X86::AX && (isLods || Name == "lodsw"))
1651         ins = "lodsw";
1652       else if (reg == X86::EAX && (isLods || Name == "lodsl"))
1653         ins = "lodsl";
1654       else if (reg == X86::RAX && (isLods || Name == "lodsq"))
1655         ins = "lodsq";
1656       else
1657         ins = NULL;
1658       if (ins != NULL) {
1659         Operands.pop_back();
1660         Operands.pop_back();
1661         delete Op1;
1662         delete Op2;
1663         if (Name != ins)
1664           static_cast<X86Operand*>(Operands[0])->setTokenValue(ins);
1665       }
1666     }
1667   }
1668   // Transform "stos[bwl] {%al,%ax,%eax,%rax},%es:(%edi)" into "stos[bwl]"
1669   if (Name.startswith("stos") && Operands.size() == 3 &&
1670       (Name == "stos" || Name == "stosb" || Name == "stosw" ||
1671        Name == "stosl" || (is64BitMode() && Name == "stosq"))) {
1672     X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]);
1673     X86Operand *Op2 = static_cast<X86Operand*>(Operands[2]);
1674     if (isDstOp(*Op2) && Op1->isReg()) {
1675       const char *ins;
1676       unsigned reg = Op1->getReg();
1677       bool isStos = Name == "stos";
1678       if (reg == X86::AL && (isStos || Name == "stosb"))
1679         ins = "stosb";
1680       else if (reg == X86::AX && (isStos || Name == "stosw"))
1681         ins = "stosw";
1682       else if (reg == X86::EAX && (isStos || Name == "stosl"))
1683         ins = "stosl";
1684       else if (reg == X86::RAX && (isStos || Name == "stosq"))
1685         ins = "stosq";
1686       else
1687         ins = NULL;
1688       if (ins != NULL) {
1689         Operands.pop_back();
1690         Operands.pop_back();
1691         delete Op1;
1692         delete Op2;
1693         if (Name != ins)
1694           static_cast<X86Operand*>(Operands[0])->setTokenValue(ins);
1695       }
1696     }
1697   }
1698
1699   // FIXME: Hack to handle recognize s{hr,ar,hl} $1, <op>.  Canonicalize to
1700   // "shift <op>".
1701   if ((Name.startswith("shr") || Name.startswith("sar") ||
1702        Name.startswith("shl") || Name.startswith("sal") ||
1703        Name.startswith("rcl") || Name.startswith("rcr") ||
1704        Name.startswith("rol") || Name.startswith("ror")) &&
1705       Operands.size() == 3) {
1706     if (isParsingIntelSyntax()) {
1707       // Intel syntax
1708       X86Operand *Op1 = static_cast<X86Operand*>(Operands[2]);
1709       if (Op1->isImm() && isa<MCConstantExpr>(Op1->getImm()) &&
1710           cast<MCConstantExpr>(Op1->getImm())->getValue() == 1) {
1711         delete Operands[2];
1712         Operands.pop_back();
1713       }
1714     } else {
1715       X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]);
1716       if (Op1->isImm() && isa<MCConstantExpr>(Op1->getImm()) &&
1717           cast<MCConstantExpr>(Op1->getImm())->getValue() == 1) {
1718         delete Operands[1];
1719         Operands.erase(Operands.begin() + 1);
1720       }
1721     }
1722   }
1723
1724   // Transforms "int $3" into "int3" as a size optimization.  We can't write an
1725   // instalias with an immediate operand yet.
1726   if (Name == "int" && Operands.size() == 2) {
1727     X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]);
1728     if (Op1->isImm() && isa<MCConstantExpr>(Op1->getImm()) &&
1729         cast<MCConstantExpr>(Op1->getImm())->getValue() == 3) {
1730       delete Operands[1];
1731       Operands.erase(Operands.begin() + 1);
1732       static_cast<X86Operand*>(Operands[0])->setTokenValue("int3");
1733     }
1734   }
1735
1736   return false;
1737 }
1738
1739 static bool convertToSExti8(MCInst &Inst, unsigned Opcode, unsigned Reg,
1740                             bool isCmp) {
1741   MCInst TmpInst;
1742   TmpInst.setOpcode(Opcode);
1743   if (!isCmp)
1744     TmpInst.addOperand(MCOperand::CreateReg(Reg));
1745   TmpInst.addOperand(MCOperand::CreateReg(Reg));
1746   TmpInst.addOperand(Inst.getOperand(0));
1747   Inst = TmpInst;
1748   return true;
1749 }
1750
1751 static bool convert16i16to16ri8(MCInst &Inst, unsigned Opcode,
1752                                 bool isCmp = false) {
1753   if (!Inst.getOperand(0).isImm() ||
1754       !isImmSExti16i8Value(Inst.getOperand(0).getImm()))
1755     return false;
1756
1757   return convertToSExti8(Inst, Opcode, X86::AX, isCmp);
1758 }
1759
1760 static bool convert32i32to32ri8(MCInst &Inst, unsigned Opcode,
1761                                 bool isCmp = false) {
1762   if (!Inst.getOperand(0).isImm() ||
1763       !isImmSExti32i8Value(Inst.getOperand(0).getImm()))
1764     return false;
1765
1766   return convertToSExti8(Inst, Opcode, X86::EAX, isCmp);
1767 }
1768
1769 static bool convert64i32to64ri8(MCInst &Inst, unsigned Opcode,
1770                                 bool isCmp = false) {
1771   if (!Inst.getOperand(0).isImm() ||
1772       !isImmSExti64i8Value(Inst.getOperand(0).getImm()))
1773     return false;
1774
1775   return convertToSExti8(Inst, Opcode, X86::RAX, isCmp);
1776 }
1777
1778 bool X86AsmParser::
1779 processInstruction(MCInst &Inst,
1780                    const SmallVectorImpl<MCParsedAsmOperand*> &Ops) {
1781   switch (Inst.getOpcode()) {
1782   default: return false;
1783   case X86::AND16i16: return convert16i16to16ri8(Inst, X86::AND16ri8);
1784   case X86::AND32i32: return convert32i32to32ri8(Inst, X86::AND32ri8);
1785   case X86::AND64i32: return convert64i32to64ri8(Inst, X86::AND64ri8);
1786   case X86::XOR16i16: return convert16i16to16ri8(Inst, X86::XOR16ri8);
1787   case X86::XOR32i32: return convert32i32to32ri8(Inst, X86::XOR32ri8);
1788   case X86::XOR64i32: return convert64i32to64ri8(Inst, X86::XOR64ri8);
1789   case X86::OR16i16:  return convert16i16to16ri8(Inst, X86::OR16ri8);
1790   case X86::OR32i32:  return convert32i32to32ri8(Inst, X86::OR32ri8);
1791   case X86::OR64i32:  return convert64i32to64ri8(Inst, X86::OR64ri8);
1792   case X86::CMP16i16: return convert16i16to16ri8(Inst, X86::CMP16ri8, true);
1793   case X86::CMP32i32: return convert32i32to32ri8(Inst, X86::CMP32ri8, true);
1794   case X86::CMP64i32: return convert64i32to64ri8(Inst, X86::CMP64ri8, true);
1795   case X86::ADD16i16: return convert16i16to16ri8(Inst, X86::ADD16ri8);
1796   case X86::ADD32i32: return convert32i32to32ri8(Inst, X86::ADD32ri8);
1797   case X86::ADD64i32: return convert64i32to64ri8(Inst, X86::ADD64ri8);
1798   case X86::SUB16i16: return convert16i16to16ri8(Inst, X86::SUB16ri8);
1799   case X86::SUB32i32: return convert32i32to32ri8(Inst, X86::SUB32ri8);
1800   case X86::SUB64i32: return convert64i32to64ri8(Inst, X86::SUB64ri8);
1801   case X86::ADC16i16: return convert16i16to16ri8(Inst, X86::ADC16ri8);
1802   case X86::ADC32i32: return convert32i32to32ri8(Inst, X86::ADC32ri8);
1803   case X86::ADC64i32: return convert64i32to64ri8(Inst, X86::ADC64ri8);
1804   case X86::SBB16i16: return convert16i16to16ri8(Inst, X86::SBB16ri8);
1805   case X86::SBB32i32: return convert32i32to32ri8(Inst, X86::SBB32ri8);
1806   case X86::SBB64i32: return convert64i32to64ri8(Inst, X86::SBB64ri8);
1807   }
1808 }
1809
1810 static const char *getSubtargetFeatureName(unsigned Val);
1811 bool X86AsmParser::
1812 MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
1813                         SmallVectorImpl<MCParsedAsmOperand*> &Operands,
1814                         MCStreamer &Out, unsigned &ErrorInfo,
1815                         bool MatchingInlineAsm) {
1816   assert(!Operands.empty() && "Unexpect empty operand list!");
1817   X86Operand *Op = static_cast<X86Operand*>(Operands[0]);
1818   assert(Op->isToken() && "Leading operand should always be a mnemonic!");
1819   ArrayRef<SMRange> EmptyRanges = ArrayRef<SMRange>();
1820
1821   // First, handle aliases that expand to multiple instructions.
1822   // FIXME: This should be replaced with a real .td file alias mechanism.
1823   // Also, MatchInstructionImpl should actually *do* the EmitInstruction
1824   // call.
1825   if (Op->getToken() == "fstsw" || Op->getToken() == "fstcw" ||
1826       Op->getToken() == "fstsww" || Op->getToken() == "fstcww" ||
1827       Op->getToken() == "finit" || Op->getToken() == "fsave" ||
1828       Op->getToken() == "fstenv" || Op->getToken() == "fclex") {
1829     MCInst Inst;
1830     Inst.setOpcode(X86::WAIT);
1831     Inst.setLoc(IDLoc);
1832     if (!MatchingInlineAsm)
1833       Out.EmitInstruction(Inst);
1834
1835     const char *Repl =
1836       StringSwitch<const char*>(Op->getToken())
1837         .Case("finit",  "fninit")
1838         .Case("fsave",  "fnsave")
1839         .Case("fstcw",  "fnstcw")
1840         .Case("fstcww",  "fnstcw")
1841         .Case("fstenv", "fnstenv")
1842         .Case("fstsw",  "fnstsw")
1843         .Case("fstsww", "fnstsw")
1844         .Case("fclex",  "fnclex")
1845         .Default(0);
1846     assert(Repl && "Unknown wait-prefixed instruction");
1847     delete Operands[0];
1848     Operands[0] = X86Operand::CreateToken(Repl, IDLoc);
1849   }
1850
1851   bool WasOriginallyInvalidOperand = false;
1852   MCInst Inst;
1853
1854   // First, try a direct match.
1855   switch (MatchInstructionImpl(Operands, Inst,
1856                                ErrorInfo, MatchingInlineAsm,
1857                                isParsingIntelSyntax())) {
1858   default: break;
1859   case Match_Success:
1860     // Some instructions need post-processing to, for example, tweak which
1861     // encoding is selected. Loop on it while changes happen so the
1862     // individual transformations can chain off each other.
1863     if (!MatchingInlineAsm)
1864       while (processInstruction(Inst, Operands))
1865         ;
1866
1867     Inst.setLoc(IDLoc);
1868     if (!MatchingInlineAsm)
1869       Out.EmitInstruction(Inst);
1870     Opcode = Inst.getOpcode();
1871     return false;
1872   case Match_MissingFeature: {
1873     assert(ErrorInfo && "Unknown missing feature!");
1874     // Special case the error message for the very common case where only
1875     // a single subtarget feature is missing.
1876     std::string Msg = "instruction requires:";
1877     unsigned Mask = 1;
1878     for (unsigned i = 0; i < (sizeof(ErrorInfo)*8-1); ++i) {
1879       if (ErrorInfo & Mask) {
1880         Msg += " ";
1881         Msg += getSubtargetFeatureName(ErrorInfo & Mask);
1882       }
1883       Mask <<= 1;
1884     }
1885     return Error(IDLoc, Msg, EmptyRanges, MatchingInlineAsm);
1886   }
1887   case Match_InvalidOperand:
1888     WasOriginallyInvalidOperand = true;
1889     break;
1890   case Match_MnemonicFail:
1891     break;
1892   }
1893
1894   // FIXME: Ideally, we would only attempt suffix matches for things which are
1895   // valid prefixes, and we could just infer the right unambiguous
1896   // type. However, that requires substantially more matcher support than the
1897   // following hack.
1898
1899   // Change the operand to point to a temporary token.
1900   StringRef Base = Op->getToken();
1901   SmallString<16> Tmp;
1902   Tmp += Base;
1903   Tmp += ' ';
1904   Op->setTokenValue(Tmp.str());
1905
1906   // If this instruction starts with an 'f', then it is a floating point stack
1907   // instruction.  These come in up to three forms for 32-bit, 64-bit, and
1908   // 80-bit floating point, which use the suffixes s,l,t respectively.
1909   //
1910   // Otherwise, we assume that this may be an integer instruction, which comes
1911   // in 8/16/32/64-bit forms using the b,w,l,q suffixes respectively.
1912   const char *Suffixes = Base[0] != 'f' ? "bwlq" : "slt\0";
1913
1914   // Check for the various suffix matches.
1915   Tmp[Base.size()] = Suffixes[0];
1916   unsigned ErrorInfoIgnore;
1917   unsigned ErrorInfoMissingFeature = 0; // Init suppresses compiler warnings.
1918   unsigned Match1, Match2, Match3, Match4;
1919
1920   Match1 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
1921                                 isParsingIntelSyntax());
1922   // If this returned as a missing feature failure, remember that.
1923   if (Match1 == Match_MissingFeature)
1924     ErrorInfoMissingFeature = ErrorInfoIgnore;
1925   Tmp[Base.size()] = Suffixes[1];
1926   Match2 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
1927                                 isParsingIntelSyntax());
1928   // If this returned as a missing feature failure, remember that.
1929   if (Match2 == Match_MissingFeature)
1930     ErrorInfoMissingFeature = ErrorInfoIgnore;
1931   Tmp[Base.size()] = Suffixes[2];
1932   Match3 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
1933                                 isParsingIntelSyntax());
1934   // If this returned as a missing feature failure, remember that.
1935   if (Match3 == Match_MissingFeature)
1936     ErrorInfoMissingFeature = ErrorInfoIgnore;
1937   Tmp[Base.size()] = Suffixes[3];
1938   Match4 = MatchInstructionImpl(Operands, Inst, ErrorInfoIgnore,
1939                                 isParsingIntelSyntax());
1940   // If this returned as a missing feature failure, remember that.
1941   if (Match4 == Match_MissingFeature)
1942     ErrorInfoMissingFeature = ErrorInfoIgnore;
1943
1944   // Restore the old token.
1945   Op->setTokenValue(Base);
1946
1947   // If exactly one matched, then we treat that as a successful match (and the
1948   // instruction will already have been filled in correctly, since the failing
1949   // matches won't have modified it).
1950   unsigned NumSuccessfulMatches =
1951     (Match1 == Match_Success) + (Match2 == Match_Success) +
1952     (Match3 == Match_Success) + (Match4 == Match_Success);
1953   if (NumSuccessfulMatches == 1) {
1954     Inst.setLoc(IDLoc);
1955     if (!MatchingInlineAsm)
1956       Out.EmitInstruction(Inst);
1957     Opcode = Inst.getOpcode();
1958     return false;
1959   }
1960
1961   // Otherwise, the match failed, try to produce a decent error message.
1962
1963   // If we had multiple suffix matches, then identify this as an ambiguous
1964   // match.
1965   if (NumSuccessfulMatches > 1) {
1966     char MatchChars[4];
1967     unsigned NumMatches = 0;
1968     if (Match1 == Match_Success) MatchChars[NumMatches++] = Suffixes[0];
1969     if (Match2 == Match_Success) MatchChars[NumMatches++] = Suffixes[1];
1970     if (Match3 == Match_Success) MatchChars[NumMatches++] = Suffixes[2];
1971     if (Match4 == Match_Success) MatchChars[NumMatches++] = Suffixes[3];
1972
1973     SmallString<126> Msg;
1974     raw_svector_ostream OS(Msg);
1975     OS << "ambiguous instructions require an explicit suffix (could be ";
1976     for (unsigned i = 0; i != NumMatches; ++i) {
1977       if (i != 0)
1978         OS << ", ";
1979       if (i + 1 == NumMatches)
1980         OS << "or ";
1981       OS << "'" << Base << MatchChars[i] << "'";
1982     }
1983     OS << ")";
1984     Error(IDLoc, OS.str(), EmptyRanges, MatchingInlineAsm);
1985     return true;
1986   }
1987
1988   // Okay, we know that none of the variants matched successfully.
1989
1990   // If all of the instructions reported an invalid mnemonic, then the original
1991   // mnemonic was invalid.
1992   if ((Match1 == Match_MnemonicFail) && (Match2 == Match_MnemonicFail) &&
1993       (Match3 == Match_MnemonicFail) && (Match4 == Match_MnemonicFail)) {
1994     if (!WasOriginallyInvalidOperand) {
1995       ArrayRef<SMRange> Ranges = MatchingInlineAsm ? EmptyRanges :
1996         Op->getLocRange();
1997       return Error(IDLoc, "invalid instruction mnemonic '" + Base + "'",
1998                    Ranges, MatchingInlineAsm);
1999     }
2000
2001     // Recover location info for the operand if we know which was the problem.
2002     if (ErrorInfo != ~0U) {
2003       if (ErrorInfo >= Operands.size())
2004         return Error(IDLoc, "too few operands for instruction",
2005                      EmptyRanges, MatchingInlineAsm);
2006
2007       X86Operand *Operand = (X86Operand*)Operands[ErrorInfo];
2008       if (Operand->getStartLoc().isValid()) {
2009         SMRange OperandRange = Operand->getLocRange();
2010         return Error(Operand->getStartLoc(), "invalid operand for instruction",
2011                      OperandRange, MatchingInlineAsm);
2012       }
2013     }
2014
2015     return Error(IDLoc, "invalid operand for instruction", EmptyRanges,
2016                  MatchingInlineAsm);
2017   }
2018
2019   // If one instruction matched with a missing feature, report this as a
2020   // missing feature.
2021   if ((Match1 == Match_MissingFeature) + (Match2 == Match_MissingFeature) +
2022       (Match3 == Match_MissingFeature) + (Match4 == Match_MissingFeature) == 1){
2023     std::string Msg = "instruction requires:";
2024     unsigned Mask = 1;
2025     for (unsigned i = 0; i < (sizeof(ErrorInfoMissingFeature)*8-1); ++i) {
2026       if (ErrorInfoMissingFeature & Mask) {
2027         Msg += " ";
2028         Msg += getSubtargetFeatureName(ErrorInfoMissingFeature & Mask);
2029       }
2030       Mask <<= 1;
2031     }
2032     return Error(IDLoc, Msg, EmptyRanges, MatchingInlineAsm);
2033   }
2034
2035   // If one instruction matched with an invalid operand, report this as an
2036   // operand failure.
2037   if ((Match1 == Match_InvalidOperand) + (Match2 == Match_InvalidOperand) +
2038       (Match3 == Match_InvalidOperand) + (Match4 == Match_InvalidOperand) == 1){
2039     Error(IDLoc, "invalid operand for instruction", EmptyRanges,
2040           MatchingInlineAsm);
2041     return true;
2042   }
2043
2044   // If all of these were an outright failure, report it in a useless way.
2045   Error(IDLoc, "unknown use of instruction mnemonic without a size suffix",
2046         EmptyRanges, MatchingInlineAsm);
2047   return true;
2048 }
2049
2050
2051 bool X86AsmParser::ParseDirective(AsmToken DirectiveID) {
2052   StringRef IDVal = DirectiveID.getIdentifier();
2053   if (IDVal == ".word")
2054     return ParseDirectiveWord(2, DirectiveID.getLoc());
2055   else if (IDVal.startswith(".code"))
2056     return ParseDirectiveCode(IDVal, DirectiveID.getLoc());
2057   else if (IDVal.startswith(".att_syntax")) {
2058     getParser().setAssemblerDialect(0);
2059     return false;
2060   } else if (IDVal.startswith(".intel_syntax")) {
2061     getParser().setAssemblerDialect(1);
2062     if (getLexer().isNot(AsmToken::EndOfStatement)) {
2063       if(Parser.getTok().getString() == "noprefix") {
2064         // FIXME : Handle noprefix
2065         Parser.Lex();
2066       } else
2067         return true;
2068     }
2069     return false;
2070   }
2071   return true;
2072 }
2073
2074 /// ParseDirectiveWord
2075 ///  ::= .word [ expression (, expression)* ]
2076 bool X86AsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) {
2077   if (getLexer().isNot(AsmToken::EndOfStatement)) {
2078     for (;;) {
2079       const MCExpr *Value;
2080       if (getParser().parseExpression(Value))
2081         return true;
2082
2083       getParser().getStreamer().EmitValue(Value, Size);
2084
2085       if (getLexer().is(AsmToken::EndOfStatement))
2086         break;
2087
2088       // FIXME: Improve diagnostic.
2089       if (getLexer().isNot(AsmToken::Comma))
2090         return Error(L, "unexpected token in directive");
2091       Parser.Lex();
2092     }
2093   }
2094
2095   Parser.Lex();
2096   return false;
2097 }
2098
2099 /// ParseDirectiveCode
2100 ///  ::= .code32 | .code64
2101 bool X86AsmParser::ParseDirectiveCode(StringRef IDVal, SMLoc L) {
2102   if (IDVal == ".code32") {
2103     Parser.Lex();
2104     if (is64BitMode()) {
2105       SwitchMode();
2106       getParser().getStreamer().EmitAssemblerFlag(MCAF_Code32);
2107     }
2108   } else if (IDVal == ".code64") {
2109     Parser.Lex();
2110     if (!is64BitMode()) {
2111       SwitchMode();
2112       getParser().getStreamer().EmitAssemblerFlag(MCAF_Code64);
2113     }
2114   } else {
2115     return Error(L, "unexpected directive " + IDVal);
2116   }
2117
2118   return false;
2119 }
2120
2121 // Force static initialization.
2122 extern "C" void LLVMInitializeX86AsmParser() {
2123   RegisterMCAsmParser<X86AsmParser> X(TheX86_32Target);
2124   RegisterMCAsmParser<X86AsmParser> Y(TheX86_64Target);
2125 }
2126
2127 #define GET_REGISTER_MATCHER
2128 #define GET_MATCHER_IMPLEMENTATION
2129 #define GET_SUBTARGET_FEATURE_NAME
2130 #include "X86GenAsmMatcher.inc"