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