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