1 //===-- X86AsmParser.cpp - Parse X86 assembly to MCInst instructions ------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "MCTargetDesc/X86BaseInfo.h" 10 #include "MCTargetDesc/X86IntelInstPrinter.h" 11 #include "MCTargetDesc/X86MCExpr.h" 12 #include "MCTargetDesc/X86TargetStreamer.h" 13 #include "TargetInfo/X86TargetInfo.h" 14 #include "X86AsmParserCommon.h" 15 #include "X86Operand.h" 16 #include "llvm/ADT/STLExtras.h" 17 #include "llvm/ADT/SmallString.h" 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/StringSwitch.h" 20 #include "llvm/ADT/Twine.h" 21 #include "llvm/MC/MCContext.h" 22 #include "llvm/MC/MCExpr.h" 23 #include "llvm/MC/MCInst.h" 24 #include "llvm/MC/MCInstrInfo.h" 25 #include "llvm/MC/MCParser/MCAsmLexer.h" 26 #include "llvm/MC/MCParser/MCAsmParser.h" 27 #include "llvm/MC/MCParser/MCParsedAsmOperand.h" 28 #include "llvm/MC/MCParser/MCTargetAsmParser.h" 29 #include "llvm/MC/MCRegisterInfo.h" 30 #include "llvm/MC/MCSection.h" 31 #include "llvm/MC/MCStreamer.h" 32 #include "llvm/MC/MCSubtargetInfo.h" 33 #include "llvm/MC/MCSymbol.h" 34 #include "llvm/MC/TargetRegistry.h" 35 #include "llvm/Support/CommandLine.h" 36 #include "llvm/Support/Compiler.h" 37 #include "llvm/Support/SourceMgr.h" 38 #include "llvm/Support/raw_ostream.h" 39 #include <algorithm> 40 #include <memory> 41 42 using namespace llvm; 43 44 static cl::opt<bool> LVIInlineAsmHardening( 45 "x86-experimental-lvi-inline-asm-hardening", 46 cl::desc("Harden inline assembly code that may be vulnerable to Load Value" 47 " Injection (LVI). This feature is experimental."), cl::Hidden); 48 49 static bool checkScale(unsigned Scale, StringRef &ErrMsg) { 50 if (Scale != 1 && Scale != 2 && Scale != 4 && Scale != 8) { 51 ErrMsg = "scale factor in address must be 1, 2, 4 or 8"; 52 return true; 53 } 54 return false; 55 } 56 57 namespace { 58 59 static const char OpPrecedence[] = { 60 0, // IC_OR 61 1, // IC_XOR 62 2, // IC_AND 63 4, // IC_LSHIFT 64 4, // IC_RSHIFT 65 5, // IC_PLUS 66 5, // IC_MINUS 67 6, // IC_MULTIPLY 68 6, // IC_DIVIDE 69 6, // IC_MOD 70 7, // IC_NOT 71 8, // IC_NEG 72 9, // IC_RPAREN 73 10, // IC_LPAREN 74 0, // IC_IMM 75 0, // IC_REGISTER 76 3, // IC_EQ 77 3, // IC_NE 78 3, // IC_LT 79 3, // IC_LE 80 3, // IC_GT 81 3 // IC_GE 82 }; 83 84 class X86AsmParser : public MCTargetAsmParser { 85 ParseInstructionInfo *InstInfo; 86 bool Code16GCC; 87 unsigned ForcedDataPrefix = 0; 88 89 enum VEXEncoding { 90 VEXEncoding_Default, 91 VEXEncoding_VEX, 92 VEXEncoding_VEX2, 93 VEXEncoding_VEX3, 94 VEXEncoding_EVEX, 95 }; 96 97 VEXEncoding ForcedVEXEncoding = VEXEncoding_Default; 98 99 enum DispEncoding { 100 DispEncoding_Default, 101 DispEncoding_Disp8, 102 DispEncoding_Disp32, 103 }; 104 105 DispEncoding ForcedDispEncoding = DispEncoding_Default; 106 107 private: 108 SMLoc consumeToken() { 109 MCAsmParser &Parser = getParser(); 110 SMLoc Result = Parser.getTok().getLoc(); 111 Parser.Lex(); 112 return Result; 113 } 114 115 X86TargetStreamer &getTargetStreamer() { 116 assert(getParser().getStreamer().getTargetStreamer() && 117 "do not have a target streamer"); 118 MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer(); 119 return static_cast<X86TargetStreamer &>(TS); 120 } 121 122 unsigned MatchInstruction(const OperandVector &Operands, MCInst &Inst, 123 uint64_t &ErrorInfo, FeatureBitset &MissingFeatures, 124 bool matchingInlineAsm, unsigned VariantID = 0) { 125 // In Code16GCC mode, match as 32-bit. 126 if (Code16GCC) 127 SwitchMode(X86::Mode32Bit); 128 unsigned rv = MatchInstructionImpl(Operands, Inst, ErrorInfo, 129 MissingFeatures, matchingInlineAsm, 130 VariantID); 131 if (Code16GCC) 132 SwitchMode(X86::Mode16Bit); 133 return rv; 134 } 135 136 enum InfixCalculatorTok { 137 IC_OR = 0, 138 IC_XOR, 139 IC_AND, 140 IC_LSHIFT, 141 IC_RSHIFT, 142 IC_PLUS, 143 IC_MINUS, 144 IC_MULTIPLY, 145 IC_DIVIDE, 146 IC_MOD, 147 IC_NOT, 148 IC_NEG, 149 IC_RPAREN, 150 IC_LPAREN, 151 IC_IMM, 152 IC_REGISTER, 153 IC_EQ, 154 IC_NE, 155 IC_LT, 156 IC_LE, 157 IC_GT, 158 IC_GE 159 }; 160 161 enum IntelOperatorKind { 162 IOK_INVALID = 0, 163 IOK_LENGTH, 164 IOK_SIZE, 165 IOK_TYPE, 166 }; 167 168 enum MasmOperatorKind { 169 MOK_INVALID = 0, 170 MOK_LENGTHOF, 171 MOK_SIZEOF, 172 MOK_TYPE, 173 }; 174 175 class InfixCalculator { 176 typedef std::pair< InfixCalculatorTok, int64_t > ICToken; 177 SmallVector<InfixCalculatorTok, 4> InfixOperatorStack; 178 SmallVector<ICToken, 4> PostfixStack; 179 180 bool isUnaryOperator(InfixCalculatorTok Op) const { 181 return Op == IC_NEG || Op == IC_NOT; 182 } 183 184 public: 185 int64_t popOperand() { 186 assert (!PostfixStack.empty() && "Poped an empty stack!"); 187 ICToken Op = PostfixStack.pop_back_val(); 188 if (!(Op.first == IC_IMM || Op.first == IC_REGISTER)) 189 return -1; // The invalid Scale value will be caught later by checkScale 190 return Op.second; 191 } 192 void pushOperand(InfixCalculatorTok Op, int64_t Val = 0) { 193 assert ((Op == IC_IMM || Op == IC_REGISTER) && 194 "Unexpected operand!"); 195 PostfixStack.push_back(std::make_pair(Op, Val)); 196 } 197 198 void popOperator() { InfixOperatorStack.pop_back(); } 199 void pushOperator(InfixCalculatorTok Op) { 200 // Push the new operator if the stack is empty. 201 if (InfixOperatorStack.empty()) { 202 InfixOperatorStack.push_back(Op); 203 return; 204 } 205 206 // Push the new operator if it has a higher precedence than the operator 207 // on the top of the stack or the operator on the top of the stack is a 208 // left parentheses. 209 unsigned Idx = InfixOperatorStack.size() - 1; 210 InfixCalculatorTok StackOp = InfixOperatorStack[Idx]; 211 if (OpPrecedence[Op] > OpPrecedence[StackOp] || StackOp == IC_LPAREN) { 212 InfixOperatorStack.push_back(Op); 213 return; 214 } 215 216 // The operator on the top of the stack has higher precedence than the 217 // new operator. 218 unsigned ParenCount = 0; 219 while (true) { 220 // Nothing to process. 221 if (InfixOperatorStack.empty()) 222 break; 223 224 Idx = InfixOperatorStack.size() - 1; 225 StackOp = InfixOperatorStack[Idx]; 226 if (!(OpPrecedence[StackOp] >= OpPrecedence[Op] || ParenCount)) 227 break; 228 229 // If we have an even parentheses count and we see a left parentheses, 230 // then stop processing. 231 if (!ParenCount && StackOp == IC_LPAREN) 232 break; 233 234 if (StackOp == IC_RPAREN) { 235 ++ParenCount; 236 InfixOperatorStack.pop_back(); 237 } else if (StackOp == IC_LPAREN) { 238 --ParenCount; 239 InfixOperatorStack.pop_back(); 240 } else { 241 InfixOperatorStack.pop_back(); 242 PostfixStack.push_back(std::make_pair(StackOp, 0)); 243 } 244 } 245 // Push the new operator. 246 InfixOperatorStack.push_back(Op); 247 } 248 249 int64_t execute() { 250 // Push any remaining operators onto the postfix stack. 251 while (!InfixOperatorStack.empty()) { 252 InfixCalculatorTok StackOp = InfixOperatorStack.pop_back_val(); 253 if (StackOp != IC_LPAREN && StackOp != IC_RPAREN) 254 PostfixStack.push_back(std::make_pair(StackOp, 0)); 255 } 256 257 if (PostfixStack.empty()) 258 return 0; 259 260 SmallVector<ICToken, 16> OperandStack; 261 for (unsigned i = 0, e = PostfixStack.size(); i != e; ++i) { 262 ICToken Op = PostfixStack[i]; 263 if (Op.first == IC_IMM || Op.first == IC_REGISTER) { 264 OperandStack.push_back(Op); 265 } else if (isUnaryOperator(Op.first)) { 266 assert (OperandStack.size() > 0 && "Too few operands."); 267 ICToken Operand = OperandStack.pop_back_val(); 268 assert (Operand.first == IC_IMM && 269 "Unary operation with a register!"); 270 switch (Op.first) { 271 default: 272 report_fatal_error("Unexpected operator!"); 273 break; 274 case IC_NEG: 275 OperandStack.push_back(std::make_pair(IC_IMM, -Operand.second)); 276 break; 277 case IC_NOT: 278 OperandStack.push_back(std::make_pair(IC_IMM, ~Operand.second)); 279 break; 280 } 281 } else { 282 assert (OperandStack.size() > 1 && "Too few operands."); 283 int64_t Val; 284 ICToken Op2 = OperandStack.pop_back_val(); 285 ICToken Op1 = OperandStack.pop_back_val(); 286 switch (Op.first) { 287 default: 288 report_fatal_error("Unexpected operator!"); 289 break; 290 case IC_PLUS: 291 Val = Op1.second + Op2.second; 292 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 293 break; 294 case IC_MINUS: 295 Val = Op1.second - Op2.second; 296 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 297 break; 298 case IC_MULTIPLY: 299 assert (Op1.first == IC_IMM && Op2.first == IC_IMM && 300 "Multiply operation with an immediate and a register!"); 301 Val = Op1.second * Op2.second; 302 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 303 break; 304 case IC_DIVIDE: 305 assert (Op1.first == IC_IMM && Op2.first == IC_IMM && 306 "Divide operation with an immediate and a register!"); 307 assert (Op2.second != 0 && "Division by zero!"); 308 Val = Op1.second / Op2.second; 309 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 310 break; 311 case IC_MOD: 312 assert (Op1.first == IC_IMM && Op2.first == IC_IMM && 313 "Modulo operation with an immediate and a register!"); 314 Val = Op1.second % Op2.second; 315 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 316 break; 317 case IC_OR: 318 assert (Op1.first == IC_IMM && Op2.first == IC_IMM && 319 "Or operation with an immediate and a register!"); 320 Val = Op1.second | Op2.second; 321 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 322 break; 323 case IC_XOR: 324 assert(Op1.first == IC_IMM && Op2.first == IC_IMM && 325 "Xor operation with an immediate and a register!"); 326 Val = Op1.second ^ Op2.second; 327 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 328 break; 329 case IC_AND: 330 assert (Op1.first == IC_IMM && Op2.first == IC_IMM && 331 "And operation with an immediate and a register!"); 332 Val = Op1.second & Op2.second; 333 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 334 break; 335 case IC_LSHIFT: 336 assert (Op1.first == IC_IMM && Op2.first == IC_IMM && 337 "Left shift operation with an immediate and a register!"); 338 Val = Op1.second << Op2.second; 339 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 340 break; 341 case IC_RSHIFT: 342 assert (Op1.first == IC_IMM && Op2.first == IC_IMM && 343 "Right shift operation with an immediate and a register!"); 344 Val = Op1.second >> Op2.second; 345 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 346 break; 347 case IC_EQ: 348 assert(Op1.first == IC_IMM && Op2.first == IC_IMM && 349 "Equals operation with an immediate and a register!"); 350 Val = (Op1.second == Op2.second) ? -1 : 0; 351 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 352 break; 353 case IC_NE: 354 assert(Op1.first == IC_IMM && Op2.first == IC_IMM && 355 "Not-equals operation with an immediate and a register!"); 356 Val = (Op1.second != Op2.second) ? -1 : 0; 357 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 358 break; 359 case IC_LT: 360 assert(Op1.first == IC_IMM && Op2.first == IC_IMM && 361 "Less-than operation with an immediate and a register!"); 362 Val = (Op1.second < Op2.second) ? -1 : 0; 363 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 364 break; 365 case IC_LE: 366 assert(Op1.first == IC_IMM && Op2.first == IC_IMM && 367 "Less-than-or-equal operation with an immediate and a " 368 "register!"); 369 Val = (Op1.second <= Op2.second) ? -1 : 0; 370 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 371 break; 372 case IC_GT: 373 assert(Op1.first == IC_IMM && Op2.first == IC_IMM && 374 "Greater-than operation with an immediate and a register!"); 375 Val = (Op1.second > Op2.second) ? -1 : 0; 376 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 377 break; 378 case IC_GE: 379 assert(Op1.first == IC_IMM && Op2.first == IC_IMM && 380 "Greater-than-or-equal operation with an immediate and a " 381 "register!"); 382 Val = (Op1.second >= Op2.second) ? -1 : 0; 383 OperandStack.push_back(std::make_pair(IC_IMM, Val)); 384 break; 385 } 386 } 387 } 388 assert (OperandStack.size() == 1 && "Expected a single result."); 389 return OperandStack.pop_back_val().second; 390 } 391 }; 392 393 enum IntelExprState { 394 IES_INIT, 395 IES_OR, 396 IES_XOR, 397 IES_AND, 398 IES_EQ, 399 IES_NE, 400 IES_LT, 401 IES_LE, 402 IES_GT, 403 IES_GE, 404 IES_LSHIFT, 405 IES_RSHIFT, 406 IES_PLUS, 407 IES_MINUS, 408 IES_OFFSET, 409 IES_CAST, 410 IES_NOT, 411 IES_MULTIPLY, 412 IES_DIVIDE, 413 IES_MOD, 414 IES_LBRAC, 415 IES_RBRAC, 416 IES_LPAREN, 417 IES_RPAREN, 418 IES_REGISTER, 419 IES_INTEGER, 420 IES_IDENTIFIER, 421 IES_ERROR 422 }; 423 424 class IntelExprStateMachine { 425 IntelExprState State, PrevState; 426 unsigned BaseReg, IndexReg, TmpReg, Scale; 427 int64_t Imm; 428 const MCExpr *Sym; 429 StringRef SymName; 430 InfixCalculator IC; 431 InlineAsmIdentifierInfo Info; 432 short BracCount; 433 bool MemExpr; 434 bool OffsetOperator; 435 SMLoc OffsetOperatorLoc; 436 AsmTypeInfo CurType; 437 438 bool setSymRef(const MCExpr *Val, StringRef ID, StringRef &ErrMsg) { 439 if (Sym) { 440 ErrMsg = "cannot use more than one symbol in memory operand"; 441 return true; 442 } 443 Sym = Val; 444 SymName = ID; 445 return false; 446 } 447 448 public: 449 IntelExprStateMachine() 450 : State(IES_INIT), PrevState(IES_ERROR), BaseReg(0), IndexReg(0), 451 TmpReg(0), Scale(0), Imm(0), Sym(nullptr), BracCount(0), 452 MemExpr(false), OffsetOperator(false) {} 453 454 void addImm(int64_t imm) { Imm += imm; } 455 short getBracCount() const { return BracCount; } 456 bool isMemExpr() const { return MemExpr; } 457 bool isOffsetOperator() const { return OffsetOperator; } 458 SMLoc getOffsetLoc() const { return OffsetOperatorLoc; } 459 unsigned getBaseReg() const { return BaseReg; } 460 unsigned getIndexReg() const { return IndexReg; } 461 unsigned getScale() const { return Scale; } 462 const MCExpr *getSym() const { return Sym; } 463 StringRef getSymName() const { return SymName; } 464 StringRef getType() const { return CurType.Name; } 465 unsigned getSize() const { return CurType.Size; } 466 unsigned getElementSize() const { return CurType.ElementSize; } 467 unsigned getLength() const { return CurType.Length; } 468 int64_t getImm() { return Imm + IC.execute(); } 469 bool isValidEndState() const { 470 return State == IES_RBRAC || State == IES_INTEGER; 471 } 472 bool hadError() const { return State == IES_ERROR; } 473 const InlineAsmIdentifierInfo &getIdentifierInfo() const { return Info; } 474 475 void onOr() { 476 IntelExprState CurrState = State; 477 switch (State) { 478 default: 479 State = IES_ERROR; 480 break; 481 case IES_INTEGER: 482 case IES_RPAREN: 483 case IES_REGISTER: 484 State = IES_OR; 485 IC.pushOperator(IC_OR); 486 break; 487 } 488 PrevState = CurrState; 489 } 490 void onXor() { 491 IntelExprState CurrState = State; 492 switch (State) { 493 default: 494 State = IES_ERROR; 495 break; 496 case IES_INTEGER: 497 case IES_RPAREN: 498 case IES_REGISTER: 499 State = IES_XOR; 500 IC.pushOperator(IC_XOR); 501 break; 502 } 503 PrevState = CurrState; 504 } 505 void onAnd() { 506 IntelExprState CurrState = State; 507 switch (State) { 508 default: 509 State = IES_ERROR; 510 break; 511 case IES_INTEGER: 512 case IES_RPAREN: 513 case IES_REGISTER: 514 State = IES_AND; 515 IC.pushOperator(IC_AND); 516 break; 517 } 518 PrevState = CurrState; 519 } 520 void onEq() { 521 IntelExprState CurrState = State; 522 switch (State) { 523 default: 524 State = IES_ERROR; 525 break; 526 case IES_INTEGER: 527 case IES_RPAREN: 528 case IES_REGISTER: 529 State = IES_EQ; 530 IC.pushOperator(IC_EQ); 531 break; 532 } 533 PrevState = CurrState; 534 } 535 void onNE() { 536 IntelExprState CurrState = State; 537 switch (State) { 538 default: 539 State = IES_ERROR; 540 break; 541 case IES_INTEGER: 542 case IES_RPAREN: 543 case IES_REGISTER: 544 State = IES_NE; 545 IC.pushOperator(IC_NE); 546 break; 547 } 548 PrevState = CurrState; 549 } 550 void onLT() { 551 IntelExprState CurrState = State; 552 switch (State) { 553 default: 554 State = IES_ERROR; 555 break; 556 case IES_INTEGER: 557 case IES_RPAREN: 558 case IES_REGISTER: 559 State = IES_LT; 560 IC.pushOperator(IC_LT); 561 break; 562 } 563 PrevState = CurrState; 564 } 565 void onLE() { 566 IntelExprState CurrState = State; 567 switch (State) { 568 default: 569 State = IES_ERROR; 570 break; 571 case IES_INTEGER: 572 case IES_RPAREN: 573 case IES_REGISTER: 574 State = IES_LE; 575 IC.pushOperator(IC_LE); 576 break; 577 } 578 PrevState = CurrState; 579 } 580 void onGT() { 581 IntelExprState CurrState = State; 582 switch (State) { 583 default: 584 State = IES_ERROR; 585 break; 586 case IES_INTEGER: 587 case IES_RPAREN: 588 case IES_REGISTER: 589 State = IES_GT; 590 IC.pushOperator(IC_GT); 591 break; 592 } 593 PrevState = CurrState; 594 } 595 void onGE() { 596 IntelExprState CurrState = State; 597 switch (State) { 598 default: 599 State = IES_ERROR; 600 break; 601 case IES_INTEGER: 602 case IES_RPAREN: 603 case IES_REGISTER: 604 State = IES_GE; 605 IC.pushOperator(IC_GE); 606 break; 607 } 608 PrevState = CurrState; 609 } 610 void onLShift() { 611 IntelExprState CurrState = State; 612 switch (State) { 613 default: 614 State = IES_ERROR; 615 break; 616 case IES_INTEGER: 617 case IES_RPAREN: 618 case IES_REGISTER: 619 State = IES_LSHIFT; 620 IC.pushOperator(IC_LSHIFT); 621 break; 622 } 623 PrevState = CurrState; 624 } 625 void onRShift() { 626 IntelExprState CurrState = State; 627 switch (State) { 628 default: 629 State = IES_ERROR; 630 break; 631 case IES_INTEGER: 632 case IES_RPAREN: 633 case IES_REGISTER: 634 State = IES_RSHIFT; 635 IC.pushOperator(IC_RSHIFT); 636 break; 637 } 638 PrevState = CurrState; 639 } 640 bool onPlus(StringRef &ErrMsg) { 641 IntelExprState CurrState = State; 642 switch (State) { 643 default: 644 State = IES_ERROR; 645 break; 646 case IES_INTEGER: 647 case IES_RPAREN: 648 case IES_REGISTER: 649 case IES_OFFSET: 650 State = IES_PLUS; 651 IC.pushOperator(IC_PLUS); 652 if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) { 653 // If we already have a BaseReg, then assume this is the IndexReg with 654 // no explicit scale. 655 if (!BaseReg) { 656 BaseReg = TmpReg; 657 } else { 658 if (IndexReg) { 659 ErrMsg = "BaseReg/IndexReg already set!"; 660 return true; 661 } 662 IndexReg = TmpReg; 663 Scale = 0; 664 } 665 } 666 break; 667 } 668 PrevState = CurrState; 669 return false; 670 } 671 bool onMinus(StringRef &ErrMsg) { 672 IntelExprState CurrState = State; 673 switch (State) { 674 default: 675 State = IES_ERROR; 676 break; 677 case IES_OR: 678 case IES_XOR: 679 case IES_AND: 680 case IES_EQ: 681 case IES_NE: 682 case IES_LT: 683 case IES_LE: 684 case IES_GT: 685 case IES_GE: 686 case IES_LSHIFT: 687 case IES_RSHIFT: 688 case IES_PLUS: 689 case IES_NOT: 690 case IES_MULTIPLY: 691 case IES_DIVIDE: 692 case IES_MOD: 693 case IES_LPAREN: 694 case IES_RPAREN: 695 case IES_LBRAC: 696 case IES_RBRAC: 697 case IES_INTEGER: 698 case IES_REGISTER: 699 case IES_INIT: 700 case IES_OFFSET: 701 State = IES_MINUS; 702 // push minus operator if it is not a negate operator 703 if (CurrState == IES_REGISTER || CurrState == IES_RPAREN || 704 CurrState == IES_INTEGER || CurrState == IES_RBRAC || 705 CurrState == IES_OFFSET) 706 IC.pushOperator(IC_MINUS); 707 else if (PrevState == IES_REGISTER && CurrState == IES_MULTIPLY) { 708 // We have negate operator for Scale: it's illegal 709 ErrMsg = "Scale can't be negative"; 710 return true; 711 } else 712 IC.pushOperator(IC_NEG); 713 if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) { 714 // If we already have a BaseReg, then assume this is the IndexReg with 715 // no explicit scale. 716 if (!BaseReg) { 717 BaseReg = TmpReg; 718 } else { 719 if (IndexReg) { 720 ErrMsg = "BaseReg/IndexReg already set!"; 721 return true; 722 } 723 IndexReg = TmpReg; 724 Scale = 0; 725 } 726 } 727 break; 728 } 729 PrevState = CurrState; 730 return false; 731 } 732 void onNot() { 733 IntelExprState CurrState = State; 734 switch (State) { 735 default: 736 State = IES_ERROR; 737 break; 738 case IES_OR: 739 case IES_XOR: 740 case IES_AND: 741 case IES_EQ: 742 case IES_NE: 743 case IES_LT: 744 case IES_LE: 745 case IES_GT: 746 case IES_GE: 747 case IES_LSHIFT: 748 case IES_RSHIFT: 749 case IES_PLUS: 750 case IES_MINUS: 751 case IES_NOT: 752 case IES_MULTIPLY: 753 case IES_DIVIDE: 754 case IES_MOD: 755 case IES_LPAREN: 756 case IES_LBRAC: 757 case IES_INIT: 758 State = IES_NOT; 759 IC.pushOperator(IC_NOT); 760 break; 761 } 762 PrevState = CurrState; 763 } 764 bool onRegister(unsigned Reg, StringRef &ErrMsg) { 765 IntelExprState CurrState = State; 766 switch (State) { 767 default: 768 State = IES_ERROR; 769 break; 770 case IES_PLUS: 771 case IES_LPAREN: 772 case IES_LBRAC: 773 State = IES_REGISTER; 774 TmpReg = Reg; 775 IC.pushOperand(IC_REGISTER); 776 break; 777 case IES_MULTIPLY: 778 // Index Register - Scale * Register 779 if (PrevState == IES_INTEGER) { 780 if (IndexReg) { 781 ErrMsg = "BaseReg/IndexReg already set!"; 782 return true; 783 } 784 State = IES_REGISTER; 785 IndexReg = Reg; 786 // Get the scale and replace the 'Scale * Register' with '0'. 787 Scale = IC.popOperand(); 788 if (checkScale(Scale, ErrMsg)) 789 return true; 790 IC.pushOperand(IC_IMM); 791 IC.popOperator(); 792 } else { 793 State = IES_ERROR; 794 } 795 break; 796 } 797 PrevState = CurrState; 798 return false; 799 } 800 bool onIdentifierExpr(const MCExpr *SymRef, StringRef SymRefName, 801 const InlineAsmIdentifierInfo &IDInfo, 802 const AsmTypeInfo &Type, bool ParsingMSInlineAsm, 803 StringRef &ErrMsg) { 804 // InlineAsm: Treat an enum value as an integer 805 if (ParsingMSInlineAsm) 806 if (IDInfo.isKind(InlineAsmIdentifierInfo::IK_EnumVal)) 807 return onInteger(IDInfo.Enum.EnumVal, ErrMsg); 808 // Treat a symbolic constant like an integer 809 if (auto *CE = dyn_cast<MCConstantExpr>(SymRef)) 810 return onInteger(CE->getValue(), ErrMsg); 811 PrevState = State; 812 switch (State) { 813 default: 814 State = IES_ERROR; 815 break; 816 case IES_CAST: 817 case IES_PLUS: 818 case IES_MINUS: 819 case IES_NOT: 820 case IES_INIT: 821 case IES_LBRAC: 822 case IES_LPAREN: 823 if (setSymRef(SymRef, SymRefName, ErrMsg)) 824 return true; 825 MemExpr = true; 826 State = IES_INTEGER; 827 IC.pushOperand(IC_IMM); 828 if (ParsingMSInlineAsm) 829 Info = IDInfo; 830 setTypeInfo(Type); 831 break; 832 } 833 return false; 834 } 835 bool onInteger(int64_t TmpInt, StringRef &ErrMsg) { 836 IntelExprState CurrState = State; 837 switch (State) { 838 default: 839 State = IES_ERROR; 840 break; 841 case IES_PLUS: 842 case IES_MINUS: 843 case IES_NOT: 844 case IES_OR: 845 case IES_XOR: 846 case IES_AND: 847 case IES_EQ: 848 case IES_NE: 849 case IES_LT: 850 case IES_LE: 851 case IES_GT: 852 case IES_GE: 853 case IES_LSHIFT: 854 case IES_RSHIFT: 855 case IES_DIVIDE: 856 case IES_MOD: 857 case IES_MULTIPLY: 858 case IES_LPAREN: 859 case IES_INIT: 860 case IES_LBRAC: 861 State = IES_INTEGER; 862 if (PrevState == IES_REGISTER && CurrState == IES_MULTIPLY) { 863 // Index Register - Register * Scale 864 if (IndexReg) { 865 ErrMsg = "BaseReg/IndexReg already set!"; 866 return true; 867 } 868 IndexReg = TmpReg; 869 Scale = TmpInt; 870 if (checkScale(Scale, ErrMsg)) 871 return true; 872 // Get the scale and replace the 'Register * Scale' with '0'. 873 IC.popOperator(); 874 } else { 875 IC.pushOperand(IC_IMM, TmpInt); 876 } 877 break; 878 } 879 PrevState = CurrState; 880 return false; 881 } 882 void onStar() { 883 PrevState = State; 884 switch (State) { 885 default: 886 State = IES_ERROR; 887 break; 888 case IES_INTEGER: 889 case IES_REGISTER: 890 case IES_RPAREN: 891 State = IES_MULTIPLY; 892 IC.pushOperator(IC_MULTIPLY); 893 break; 894 } 895 } 896 void onDivide() { 897 PrevState = State; 898 switch (State) { 899 default: 900 State = IES_ERROR; 901 break; 902 case IES_INTEGER: 903 case IES_RPAREN: 904 State = IES_DIVIDE; 905 IC.pushOperator(IC_DIVIDE); 906 break; 907 } 908 } 909 void onMod() { 910 PrevState = State; 911 switch (State) { 912 default: 913 State = IES_ERROR; 914 break; 915 case IES_INTEGER: 916 case IES_RPAREN: 917 State = IES_MOD; 918 IC.pushOperator(IC_MOD); 919 break; 920 } 921 } 922 bool onLBrac() { 923 if (BracCount) 924 return true; 925 PrevState = State; 926 switch (State) { 927 default: 928 State = IES_ERROR; 929 break; 930 case IES_RBRAC: 931 case IES_INTEGER: 932 case IES_RPAREN: 933 State = IES_PLUS; 934 IC.pushOperator(IC_PLUS); 935 CurType.Length = 1; 936 CurType.Size = CurType.ElementSize; 937 break; 938 case IES_INIT: 939 case IES_CAST: 940 assert(!BracCount && "BracCount should be zero on parsing's start"); 941 State = IES_LBRAC; 942 break; 943 } 944 MemExpr = true; 945 BracCount++; 946 return false; 947 } 948 bool onRBrac() { 949 IntelExprState CurrState = State; 950 switch (State) { 951 default: 952 State = IES_ERROR; 953 break; 954 case IES_INTEGER: 955 case IES_OFFSET: 956 case IES_REGISTER: 957 case IES_RPAREN: 958 if (BracCount-- != 1) 959 return true; 960 State = IES_RBRAC; 961 if (CurrState == IES_REGISTER && PrevState != IES_MULTIPLY) { 962 // If we already have a BaseReg, then assume this is the IndexReg with 963 // no explicit scale. 964 if (!BaseReg) { 965 BaseReg = TmpReg; 966 } else { 967 assert (!IndexReg && "BaseReg/IndexReg already set!"); 968 IndexReg = TmpReg; 969 Scale = 0; 970 } 971 } 972 break; 973 } 974 PrevState = CurrState; 975 return false; 976 } 977 void onLParen() { 978 IntelExprState CurrState = State; 979 switch (State) { 980 default: 981 State = IES_ERROR; 982 break; 983 case IES_PLUS: 984 case IES_MINUS: 985 case IES_NOT: 986 case IES_OR: 987 case IES_XOR: 988 case IES_AND: 989 case IES_EQ: 990 case IES_NE: 991 case IES_LT: 992 case IES_LE: 993 case IES_GT: 994 case IES_GE: 995 case IES_LSHIFT: 996 case IES_RSHIFT: 997 case IES_MULTIPLY: 998 case IES_DIVIDE: 999 case IES_MOD: 1000 case IES_LPAREN: 1001 case IES_INIT: 1002 case IES_LBRAC: 1003 State = IES_LPAREN; 1004 IC.pushOperator(IC_LPAREN); 1005 break; 1006 } 1007 PrevState = CurrState; 1008 } 1009 void onRParen() { 1010 PrevState = State; 1011 switch (State) { 1012 default: 1013 State = IES_ERROR; 1014 break; 1015 case IES_INTEGER: 1016 case IES_OFFSET: 1017 case IES_REGISTER: 1018 case IES_RBRAC: 1019 case IES_RPAREN: 1020 State = IES_RPAREN; 1021 IC.pushOperator(IC_RPAREN); 1022 break; 1023 } 1024 } 1025 bool onOffset(const MCExpr *Val, SMLoc OffsetLoc, StringRef ID, 1026 const InlineAsmIdentifierInfo &IDInfo, 1027 bool ParsingMSInlineAsm, StringRef &ErrMsg) { 1028 PrevState = State; 1029 switch (State) { 1030 default: 1031 ErrMsg = "unexpected offset operator expression"; 1032 return true; 1033 case IES_PLUS: 1034 case IES_INIT: 1035 case IES_LBRAC: 1036 if (setSymRef(Val, ID, ErrMsg)) 1037 return true; 1038 OffsetOperator = true; 1039 OffsetOperatorLoc = OffsetLoc; 1040 State = IES_OFFSET; 1041 // As we cannot yet resolve the actual value (offset), we retain 1042 // the requested semantics by pushing a '0' to the operands stack 1043 IC.pushOperand(IC_IMM); 1044 if (ParsingMSInlineAsm) { 1045 Info = IDInfo; 1046 } 1047 break; 1048 } 1049 return false; 1050 } 1051 void onCast(AsmTypeInfo Info) { 1052 PrevState = State; 1053 switch (State) { 1054 default: 1055 State = IES_ERROR; 1056 break; 1057 case IES_LPAREN: 1058 setTypeInfo(Info); 1059 State = IES_CAST; 1060 break; 1061 } 1062 } 1063 void setTypeInfo(AsmTypeInfo Type) { CurType = Type; } 1064 }; 1065 1066 bool Error(SMLoc L, const Twine &Msg, SMRange Range = None, 1067 bool MatchingInlineAsm = false) { 1068 MCAsmParser &Parser = getParser(); 1069 if (MatchingInlineAsm) { 1070 if (!getLexer().isAtStartOfStatement()) 1071 Parser.eatToEndOfStatement(); 1072 return false; 1073 } 1074 return Parser.Error(L, Msg, Range); 1075 } 1076 1077 bool MatchRegisterByName(unsigned &RegNo, StringRef RegName, SMLoc StartLoc, 1078 SMLoc EndLoc); 1079 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc, 1080 bool RestoreOnFailure); 1081 1082 std::unique_ptr<X86Operand> DefaultMemSIOperand(SMLoc Loc); 1083 std::unique_ptr<X86Operand> DefaultMemDIOperand(SMLoc Loc); 1084 bool IsSIReg(unsigned Reg); 1085 unsigned GetSIDIForRegClass(unsigned RegClassID, unsigned Reg, bool IsSIReg); 1086 void 1087 AddDefaultSrcDestOperands(OperandVector &Operands, 1088 std::unique_ptr<llvm::MCParsedAsmOperand> &&Src, 1089 std::unique_ptr<llvm::MCParsedAsmOperand> &&Dst); 1090 bool VerifyAndAdjustOperands(OperandVector &OrigOperands, 1091 OperandVector &FinalOperands); 1092 bool ParseOperand(OperandVector &Operands); 1093 bool ParseATTOperand(OperandVector &Operands); 1094 bool ParseIntelOperand(OperandVector &Operands); 1095 bool ParseIntelOffsetOperator(const MCExpr *&Val, StringRef &ID, 1096 InlineAsmIdentifierInfo &Info, SMLoc &End); 1097 bool ParseIntelDotOperator(IntelExprStateMachine &SM, SMLoc &End); 1098 unsigned IdentifyIntelInlineAsmOperator(StringRef Name); 1099 unsigned ParseIntelInlineAsmOperator(unsigned OpKind); 1100 unsigned IdentifyMasmOperator(StringRef Name); 1101 bool ParseMasmOperator(unsigned OpKind, int64_t &Val); 1102 bool ParseRoundingModeOp(SMLoc Start, OperandVector &Operands); 1103 bool ParseIntelNamedOperator(StringRef Name, IntelExprStateMachine &SM, 1104 bool &ParseError, SMLoc &End); 1105 bool ParseMasmNamedOperator(StringRef Name, IntelExprStateMachine &SM, 1106 bool &ParseError, SMLoc &End); 1107 void RewriteIntelExpression(IntelExprStateMachine &SM, SMLoc Start, 1108 SMLoc End); 1109 bool ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End); 1110 bool ParseIntelInlineAsmIdentifier(const MCExpr *&Val, StringRef &Identifier, 1111 InlineAsmIdentifierInfo &Info, 1112 bool IsUnevaluatedOperand, SMLoc &End, 1113 bool IsParsingOffsetOperator = false); 1114 1115 bool ParseMemOperand(unsigned SegReg, const MCExpr *Disp, SMLoc StartLoc, 1116 SMLoc EndLoc, OperandVector &Operands); 1117 1118 X86::CondCode ParseConditionCode(StringRef CCode); 1119 1120 bool ParseIntelMemoryOperandSize(unsigned &Size); 1121 bool CreateMemForMSInlineAsm(unsigned SegReg, const MCExpr *Disp, 1122 unsigned BaseReg, unsigned IndexReg, 1123 unsigned Scale, SMLoc Start, SMLoc End, 1124 unsigned Size, StringRef Identifier, 1125 const InlineAsmIdentifierInfo &Info, 1126 OperandVector &Operands); 1127 1128 bool parseDirectiveArch(); 1129 bool parseDirectiveNops(SMLoc L); 1130 bool parseDirectiveEven(SMLoc L); 1131 bool ParseDirectiveCode(StringRef IDVal, SMLoc L); 1132 1133 /// CodeView FPO data directives. 1134 bool parseDirectiveFPOProc(SMLoc L); 1135 bool parseDirectiveFPOSetFrame(SMLoc L); 1136 bool parseDirectiveFPOPushReg(SMLoc L); 1137 bool parseDirectiveFPOStackAlloc(SMLoc L); 1138 bool parseDirectiveFPOStackAlign(SMLoc L); 1139 bool parseDirectiveFPOEndPrologue(SMLoc L); 1140 bool parseDirectiveFPOEndProc(SMLoc L); 1141 1142 /// SEH directives. 1143 bool parseSEHRegisterNumber(unsigned RegClassID, unsigned &RegNo); 1144 bool parseDirectiveSEHPushReg(SMLoc); 1145 bool parseDirectiveSEHSetFrame(SMLoc); 1146 bool parseDirectiveSEHSaveReg(SMLoc); 1147 bool parseDirectiveSEHSaveXMM(SMLoc); 1148 bool parseDirectiveSEHPushFrame(SMLoc); 1149 1150 unsigned checkTargetMatchPredicate(MCInst &Inst) override; 1151 1152 bool validateInstruction(MCInst &Inst, const OperandVector &Ops); 1153 bool processInstruction(MCInst &Inst, const OperandVector &Ops); 1154 1155 // Load Value Injection (LVI) Mitigations for machine code 1156 void emitWarningForSpecialLVIInstruction(SMLoc Loc); 1157 void applyLVICFIMitigation(MCInst &Inst, MCStreamer &Out); 1158 void applyLVILoadHardeningMitigation(MCInst &Inst, MCStreamer &Out); 1159 1160 /// Wrapper around MCStreamer::emitInstruction(). Possibly adds 1161 /// instrumentation around Inst. 1162 void emitInstruction(MCInst &Inst, OperandVector &Operands, MCStreamer &Out); 1163 1164 bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 1165 OperandVector &Operands, MCStreamer &Out, 1166 uint64_t &ErrorInfo, 1167 bool MatchingInlineAsm) override; 1168 1169 void MatchFPUWaitAlias(SMLoc IDLoc, X86Operand &Op, OperandVector &Operands, 1170 MCStreamer &Out, bool MatchingInlineAsm); 1171 1172 bool ErrorMissingFeature(SMLoc IDLoc, const FeatureBitset &MissingFeatures, 1173 bool MatchingInlineAsm); 1174 1175 bool MatchAndEmitATTInstruction(SMLoc IDLoc, unsigned &Opcode, 1176 OperandVector &Operands, MCStreamer &Out, 1177 uint64_t &ErrorInfo, 1178 bool MatchingInlineAsm); 1179 1180 bool MatchAndEmitIntelInstruction(SMLoc IDLoc, unsigned &Opcode, 1181 OperandVector &Operands, MCStreamer &Out, 1182 uint64_t &ErrorInfo, 1183 bool MatchingInlineAsm); 1184 1185 bool OmitRegisterFromClobberLists(unsigned RegNo) override; 1186 1187 /// Parses AVX512 specific operand primitives: masked registers ({%k<NUM>}, {z}) 1188 /// and memory broadcasting ({1to<NUM>}) primitives, updating Operands vector if required. 1189 /// return false if no parsing errors occurred, true otherwise. 1190 bool HandleAVX512Operand(OperandVector &Operands); 1191 1192 bool ParseZ(std::unique_ptr<X86Operand> &Z, const SMLoc &StartLoc); 1193 1194 bool is64BitMode() const { 1195 // FIXME: Can tablegen auto-generate this? 1196 return getSTI().getFeatureBits()[X86::Mode64Bit]; 1197 } 1198 bool is32BitMode() const { 1199 // FIXME: Can tablegen auto-generate this? 1200 return getSTI().getFeatureBits()[X86::Mode32Bit]; 1201 } 1202 bool is16BitMode() const { 1203 // FIXME: Can tablegen auto-generate this? 1204 return getSTI().getFeatureBits()[X86::Mode16Bit]; 1205 } 1206 void SwitchMode(unsigned mode) { 1207 MCSubtargetInfo &STI = copySTI(); 1208 FeatureBitset AllModes({X86::Mode64Bit, X86::Mode32Bit, X86::Mode16Bit}); 1209 FeatureBitset OldMode = STI.getFeatureBits() & AllModes; 1210 FeatureBitset FB = ComputeAvailableFeatures( 1211 STI.ToggleFeature(OldMode.flip(mode))); 1212 setAvailableFeatures(FB); 1213 1214 assert(FeatureBitset({mode}) == (STI.getFeatureBits() & AllModes)); 1215 } 1216 1217 unsigned getPointerWidth() { 1218 if (is16BitMode()) return 16; 1219 if (is32BitMode()) return 32; 1220 if (is64BitMode()) return 64; 1221 llvm_unreachable("invalid mode"); 1222 } 1223 1224 bool isParsingIntelSyntax() { 1225 return getParser().getAssemblerDialect(); 1226 } 1227 1228 /// @name Auto-generated Matcher Functions 1229 /// { 1230 1231 #define GET_ASSEMBLER_HEADER 1232 #include "X86GenAsmMatcher.inc" 1233 1234 /// } 1235 1236 public: 1237 enum X86MatchResultTy { 1238 Match_Unsupported = FIRST_TARGET_MATCH_RESULT_TY, 1239 #define GET_OPERAND_DIAGNOSTIC_TYPES 1240 #include "X86GenAsmMatcher.inc" 1241 }; 1242 1243 X86AsmParser(const MCSubtargetInfo &sti, MCAsmParser &Parser, 1244 const MCInstrInfo &mii, const MCTargetOptions &Options) 1245 : MCTargetAsmParser(Options, sti, mii), InstInfo(nullptr), 1246 Code16GCC(false) { 1247 1248 Parser.addAliasForDirective(".word", ".2byte"); 1249 1250 // Initialize the set of available features. 1251 setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits())); 1252 } 1253 1254 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override; 1255 OperandMatchResultTy tryParseRegister(unsigned &RegNo, SMLoc &StartLoc, 1256 SMLoc &EndLoc) override; 1257 1258 bool parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) override; 1259 1260 bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name, 1261 SMLoc NameLoc, OperandVector &Operands) override; 1262 1263 bool ParseDirective(AsmToken DirectiveID) override; 1264 }; 1265 } // end anonymous namespace 1266 1267 /// @name Auto-generated Match Functions 1268 /// { 1269 1270 static unsigned MatchRegisterName(StringRef Name); 1271 1272 /// } 1273 1274 static bool CheckBaseRegAndIndexRegAndScale(unsigned BaseReg, unsigned IndexReg, 1275 unsigned Scale, bool Is64BitMode, 1276 StringRef &ErrMsg) { 1277 // If we have both a base register and an index register make sure they are 1278 // both 64-bit or 32-bit registers. 1279 // To support VSIB, IndexReg can be 128-bit or 256-bit registers. 1280 1281 if (BaseReg != 0 && 1282 !(BaseReg == X86::RIP || BaseReg == X86::EIP || 1283 X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) || 1284 X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg) || 1285 X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg))) { 1286 ErrMsg = "invalid base+index expression"; 1287 return true; 1288 } 1289 1290 if (IndexReg != 0 && 1291 !(IndexReg == X86::EIZ || IndexReg == X86::RIZ || 1292 X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) || 1293 X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg) || 1294 X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg) || 1295 X86MCRegisterClasses[X86::VR128XRegClassID].contains(IndexReg) || 1296 X86MCRegisterClasses[X86::VR256XRegClassID].contains(IndexReg) || 1297 X86MCRegisterClasses[X86::VR512RegClassID].contains(IndexReg))) { 1298 ErrMsg = "invalid base+index expression"; 1299 return true; 1300 } 1301 1302 if (((BaseReg == X86::RIP || BaseReg == X86::EIP) && IndexReg != 0) || 1303 IndexReg == X86::EIP || IndexReg == X86::RIP || 1304 IndexReg == X86::ESP || IndexReg == X86::RSP) { 1305 ErrMsg = "invalid base+index expression"; 1306 return true; 1307 } 1308 1309 // Check for use of invalid 16-bit registers. Only BX/BP/SI/DI are allowed, 1310 // and then only in non-64-bit modes. 1311 if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) && 1312 (Is64BitMode || (BaseReg != X86::BX && BaseReg != X86::BP && 1313 BaseReg != X86::SI && BaseReg != X86::DI))) { 1314 ErrMsg = "invalid 16-bit base register"; 1315 return true; 1316 } 1317 1318 if (BaseReg == 0 && 1319 X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg)) { 1320 ErrMsg = "16-bit memory operand may not include only index register"; 1321 return true; 1322 } 1323 1324 if (BaseReg != 0 && IndexReg != 0) { 1325 if (X86MCRegisterClasses[X86::GR64RegClassID].contains(BaseReg) && 1326 (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) || 1327 X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg) || 1328 IndexReg == X86::EIZ)) { 1329 ErrMsg = "base register is 64-bit, but index register is not"; 1330 return true; 1331 } 1332 if (X86MCRegisterClasses[X86::GR32RegClassID].contains(BaseReg) && 1333 (X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg) || 1334 X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg) || 1335 IndexReg == X86::RIZ)) { 1336 ErrMsg = "base register is 32-bit, but index register is not"; 1337 return true; 1338 } 1339 if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg)) { 1340 if (X86MCRegisterClasses[X86::GR32RegClassID].contains(IndexReg) || 1341 X86MCRegisterClasses[X86::GR64RegClassID].contains(IndexReg)) { 1342 ErrMsg = "base register is 16-bit, but index register is not"; 1343 return true; 1344 } 1345 if ((BaseReg != X86::BX && BaseReg != X86::BP) || 1346 (IndexReg != X86::SI && IndexReg != X86::DI)) { 1347 ErrMsg = "invalid 16-bit base/index register combination"; 1348 return true; 1349 } 1350 } 1351 } 1352 1353 // RIP/EIP-relative addressing is only supported in 64-bit mode. 1354 if (!Is64BitMode && BaseReg != 0 && 1355 (BaseReg == X86::RIP || BaseReg == X86::EIP)) { 1356 ErrMsg = "IP-relative addressing requires 64-bit mode"; 1357 return true; 1358 } 1359 1360 return checkScale(Scale, ErrMsg); 1361 } 1362 1363 bool X86AsmParser::MatchRegisterByName(unsigned &RegNo, StringRef RegName, 1364 SMLoc StartLoc, SMLoc EndLoc) { 1365 // If we encounter a %, ignore it. This code handles registers with and 1366 // without the prefix, unprefixed registers can occur in cfi directives. 1367 RegName.consume_front("%"); 1368 1369 RegNo = MatchRegisterName(RegName); 1370 1371 // If the match failed, try the register name as lowercase. 1372 if (RegNo == 0) 1373 RegNo = MatchRegisterName(RegName.lower()); 1374 1375 // The "flags" and "mxcsr" registers cannot be referenced directly. 1376 // Treat it as an identifier instead. 1377 if (isParsingMSInlineAsm() && isParsingIntelSyntax() && 1378 (RegNo == X86::EFLAGS || RegNo == X86::MXCSR)) 1379 RegNo = 0; 1380 1381 if (!is64BitMode()) { 1382 // FIXME: This should be done using Requires<Not64BitMode> and 1383 // Requires<In64BitMode> so "eiz" usage in 64-bit instructions can be also 1384 // checked. 1385 if (RegNo == X86::RIZ || RegNo == X86::RIP || 1386 X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo) || 1387 X86II::isX86_64NonExtLowByteReg(RegNo) || 1388 X86II::isX86_64ExtendedReg(RegNo)) { 1389 return Error(StartLoc, 1390 "register %" + RegName + " is only available in 64-bit mode", 1391 SMRange(StartLoc, EndLoc)); 1392 } 1393 } 1394 1395 // If this is "db[0-15]", match it as an alias 1396 // for dr[0-15]. 1397 if (RegNo == 0 && RegName.startswith("db")) { 1398 if (RegName.size() == 3) { 1399 switch (RegName[2]) { 1400 case '0': 1401 RegNo = X86::DR0; 1402 break; 1403 case '1': 1404 RegNo = X86::DR1; 1405 break; 1406 case '2': 1407 RegNo = X86::DR2; 1408 break; 1409 case '3': 1410 RegNo = X86::DR3; 1411 break; 1412 case '4': 1413 RegNo = X86::DR4; 1414 break; 1415 case '5': 1416 RegNo = X86::DR5; 1417 break; 1418 case '6': 1419 RegNo = X86::DR6; 1420 break; 1421 case '7': 1422 RegNo = X86::DR7; 1423 break; 1424 case '8': 1425 RegNo = X86::DR8; 1426 break; 1427 case '9': 1428 RegNo = X86::DR9; 1429 break; 1430 } 1431 } else if (RegName.size() == 4 && RegName[2] == '1') { 1432 switch (RegName[3]) { 1433 case '0': 1434 RegNo = X86::DR10; 1435 break; 1436 case '1': 1437 RegNo = X86::DR11; 1438 break; 1439 case '2': 1440 RegNo = X86::DR12; 1441 break; 1442 case '3': 1443 RegNo = X86::DR13; 1444 break; 1445 case '4': 1446 RegNo = X86::DR14; 1447 break; 1448 case '5': 1449 RegNo = X86::DR15; 1450 break; 1451 } 1452 } 1453 } 1454 1455 if (RegNo == 0) { 1456 if (isParsingIntelSyntax()) 1457 return true; 1458 return Error(StartLoc, "invalid register name", SMRange(StartLoc, EndLoc)); 1459 } 1460 return false; 1461 } 1462 1463 bool X86AsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, 1464 SMLoc &EndLoc, bool RestoreOnFailure) { 1465 MCAsmParser &Parser = getParser(); 1466 MCAsmLexer &Lexer = getLexer(); 1467 RegNo = 0; 1468 1469 SmallVector<AsmToken, 5> Tokens; 1470 auto OnFailure = [RestoreOnFailure, &Lexer, &Tokens]() { 1471 if (RestoreOnFailure) { 1472 while (!Tokens.empty()) { 1473 Lexer.UnLex(Tokens.pop_back_val()); 1474 } 1475 } 1476 }; 1477 1478 const AsmToken &PercentTok = Parser.getTok(); 1479 StartLoc = PercentTok.getLoc(); 1480 1481 // If we encounter a %, ignore it. This code handles registers with and 1482 // without the prefix, unprefixed registers can occur in cfi directives. 1483 if (!isParsingIntelSyntax() && PercentTok.is(AsmToken::Percent)) { 1484 Tokens.push_back(PercentTok); 1485 Parser.Lex(); // Eat percent token. 1486 } 1487 1488 const AsmToken &Tok = Parser.getTok(); 1489 EndLoc = Tok.getEndLoc(); 1490 1491 if (Tok.isNot(AsmToken::Identifier)) { 1492 OnFailure(); 1493 if (isParsingIntelSyntax()) return true; 1494 return Error(StartLoc, "invalid register name", 1495 SMRange(StartLoc, EndLoc)); 1496 } 1497 1498 if (MatchRegisterByName(RegNo, Tok.getString(), StartLoc, EndLoc)) { 1499 OnFailure(); 1500 return true; 1501 } 1502 1503 // Parse "%st" as "%st(0)" and "%st(1)", which is multiple tokens. 1504 if (RegNo == X86::ST0) { 1505 Tokens.push_back(Tok); 1506 Parser.Lex(); // Eat 'st' 1507 1508 // Check to see if we have '(4)' after %st. 1509 if (Lexer.isNot(AsmToken::LParen)) 1510 return false; 1511 // Lex the paren. 1512 Tokens.push_back(Parser.getTok()); 1513 Parser.Lex(); 1514 1515 const AsmToken &IntTok = Parser.getTok(); 1516 if (IntTok.isNot(AsmToken::Integer)) { 1517 OnFailure(); 1518 return Error(IntTok.getLoc(), "expected stack index"); 1519 } 1520 switch (IntTok.getIntVal()) { 1521 case 0: RegNo = X86::ST0; break; 1522 case 1: RegNo = X86::ST1; break; 1523 case 2: RegNo = X86::ST2; break; 1524 case 3: RegNo = X86::ST3; break; 1525 case 4: RegNo = X86::ST4; break; 1526 case 5: RegNo = X86::ST5; break; 1527 case 6: RegNo = X86::ST6; break; 1528 case 7: RegNo = X86::ST7; break; 1529 default: 1530 OnFailure(); 1531 return Error(IntTok.getLoc(), "invalid stack index"); 1532 } 1533 1534 // Lex IntTok 1535 Tokens.push_back(IntTok); 1536 Parser.Lex(); 1537 if (Lexer.isNot(AsmToken::RParen)) { 1538 OnFailure(); 1539 return Error(Parser.getTok().getLoc(), "expected ')'"); 1540 } 1541 1542 EndLoc = Parser.getTok().getEndLoc(); 1543 Parser.Lex(); // Eat ')' 1544 return false; 1545 } 1546 1547 EndLoc = Parser.getTok().getEndLoc(); 1548 1549 if (RegNo == 0) { 1550 OnFailure(); 1551 if (isParsingIntelSyntax()) return true; 1552 return Error(StartLoc, "invalid register name", 1553 SMRange(StartLoc, EndLoc)); 1554 } 1555 1556 Parser.Lex(); // Eat identifier token. 1557 return false; 1558 } 1559 1560 bool X86AsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, 1561 SMLoc &EndLoc) { 1562 return ParseRegister(RegNo, StartLoc, EndLoc, /*RestoreOnFailure=*/false); 1563 } 1564 1565 OperandMatchResultTy X86AsmParser::tryParseRegister(unsigned &RegNo, 1566 SMLoc &StartLoc, 1567 SMLoc &EndLoc) { 1568 bool Result = 1569 ParseRegister(RegNo, StartLoc, EndLoc, /*RestoreOnFailure=*/true); 1570 bool PendingErrors = getParser().hasPendingError(); 1571 getParser().clearPendingErrors(); 1572 if (PendingErrors) 1573 return MatchOperand_ParseFail; 1574 if (Result) 1575 return MatchOperand_NoMatch; 1576 return MatchOperand_Success; 1577 } 1578 1579 std::unique_ptr<X86Operand> X86AsmParser::DefaultMemSIOperand(SMLoc Loc) { 1580 bool Parse32 = is32BitMode() || Code16GCC; 1581 unsigned Basereg = is64BitMode() ? X86::RSI : (Parse32 ? X86::ESI : X86::SI); 1582 const MCExpr *Disp = MCConstantExpr::create(0, getContext()); 1583 return X86Operand::CreateMem(getPointerWidth(), /*SegReg=*/0, Disp, 1584 /*BaseReg=*/Basereg, /*IndexReg=*/0, /*Scale=*/1, 1585 Loc, Loc, 0); 1586 } 1587 1588 std::unique_ptr<X86Operand> X86AsmParser::DefaultMemDIOperand(SMLoc Loc) { 1589 bool Parse32 = is32BitMode() || Code16GCC; 1590 unsigned Basereg = is64BitMode() ? X86::RDI : (Parse32 ? X86::EDI : X86::DI); 1591 const MCExpr *Disp = MCConstantExpr::create(0, getContext()); 1592 return X86Operand::CreateMem(getPointerWidth(), /*SegReg=*/0, Disp, 1593 /*BaseReg=*/Basereg, /*IndexReg=*/0, /*Scale=*/1, 1594 Loc, Loc, 0); 1595 } 1596 1597 bool X86AsmParser::IsSIReg(unsigned Reg) { 1598 switch (Reg) { 1599 default: llvm_unreachable("Only (R|E)SI and (R|E)DI are expected!"); 1600 case X86::RSI: 1601 case X86::ESI: 1602 case X86::SI: 1603 return true; 1604 case X86::RDI: 1605 case X86::EDI: 1606 case X86::DI: 1607 return false; 1608 } 1609 } 1610 1611 unsigned X86AsmParser::GetSIDIForRegClass(unsigned RegClassID, unsigned Reg, 1612 bool IsSIReg) { 1613 switch (RegClassID) { 1614 default: llvm_unreachable("Unexpected register class"); 1615 case X86::GR64RegClassID: 1616 return IsSIReg ? X86::RSI : X86::RDI; 1617 case X86::GR32RegClassID: 1618 return IsSIReg ? X86::ESI : X86::EDI; 1619 case X86::GR16RegClassID: 1620 return IsSIReg ? X86::SI : X86::DI; 1621 } 1622 } 1623 1624 void X86AsmParser::AddDefaultSrcDestOperands( 1625 OperandVector& Operands, std::unique_ptr<llvm::MCParsedAsmOperand> &&Src, 1626 std::unique_ptr<llvm::MCParsedAsmOperand> &&Dst) { 1627 if (isParsingIntelSyntax()) { 1628 Operands.push_back(std::move(Dst)); 1629 Operands.push_back(std::move(Src)); 1630 } 1631 else { 1632 Operands.push_back(std::move(Src)); 1633 Operands.push_back(std::move(Dst)); 1634 } 1635 } 1636 1637 bool X86AsmParser::VerifyAndAdjustOperands(OperandVector &OrigOperands, 1638 OperandVector &FinalOperands) { 1639 1640 if (OrigOperands.size() > 1) { 1641 // Check if sizes match, OrigOperands also contains the instruction name 1642 assert(OrigOperands.size() == FinalOperands.size() + 1 && 1643 "Operand size mismatch"); 1644 1645 SmallVector<std::pair<SMLoc, std::string>, 2> Warnings; 1646 // Verify types match 1647 int RegClassID = -1; 1648 for (unsigned int i = 0; i < FinalOperands.size(); ++i) { 1649 X86Operand &OrigOp = static_cast<X86Operand &>(*OrigOperands[i + 1]); 1650 X86Operand &FinalOp = static_cast<X86Operand &>(*FinalOperands[i]); 1651 1652 if (FinalOp.isReg() && 1653 (!OrigOp.isReg() || FinalOp.getReg() != OrigOp.getReg())) 1654 // Return false and let a normal complaint about bogus operands happen 1655 return false; 1656 1657 if (FinalOp.isMem()) { 1658 1659 if (!OrigOp.isMem()) 1660 // Return false and let a normal complaint about bogus operands happen 1661 return false; 1662 1663 unsigned OrigReg = OrigOp.Mem.BaseReg; 1664 unsigned FinalReg = FinalOp.Mem.BaseReg; 1665 1666 // If we've already encounterd a register class, make sure all register 1667 // bases are of the same register class 1668 if (RegClassID != -1 && 1669 !X86MCRegisterClasses[RegClassID].contains(OrigReg)) { 1670 return Error(OrigOp.getStartLoc(), 1671 "mismatching source and destination index registers"); 1672 } 1673 1674 if (X86MCRegisterClasses[X86::GR64RegClassID].contains(OrigReg)) 1675 RegClassID = X86::GR64RegClassID; 1676 else if (X86MCRegisterClasses[X86::GR32RegClassID].contains(OrigReg)) 1677 RegClassID = X86::GR32RegClassID; 1678 else if (X86MCRegisterClasses[X86::GR16RegClassID].contains(OrigReg)) 1679 RegClassID = X86::GR16RegClassID; 1680 else 1681 // Unexpected register class type 1682 // Return false and let a normal complaint about bogus operands happen 1683 return false; 1684 1685 bool IsSI = IsSIReg(FinalReg); 1686 FinalReg = GetSIDIForRegClass(RegClassID, FinalReg, IsSI); 1687 1688 if (FinalReg != OrigReg) { 1689 std::string RegName = IsSI ? "ES:(R|E)SI" : "ES:(R|E)DI"; 1690 Warnings.push_back(std::make_pair( 1691 OrigOp.getStartLoc(), 1692 "memory operand is only for determining the size, " + RegName + 1693 " will be used for the location")); 1694 } 1695 1696 FinalOp.Mem.Size = OrigOp.Mem.Size; 1697 FinalOp.Mem.SegReg = OrigOp.Mem.SegReg; 1698 FinalOp.Mem.BaseReg = FinalReg; 1699 } 1700 } 1701 1702 // Produce warnings only if all the operands passed the adjustment - prevent 1703 // legal cases like "movsd (%rax), %xmm0" mistakenly produce warnings 1704 for (auto &WarningMsg : Warnings) { 1705 Warning(WarningMsg.first, WarningMsg.second); 1706 } 1707 1708 // Remove old operands 1709 for (unsigned int i = 0; i < FinalOperands.size(); ++i) 1710 OrigOperands.pop_back(); 1711 } 1712 // OrigOperands.append(FinalOperands.begin(), FinalOperands.end()); 1713 for (unsigned int i = 0; i < FinalOperands.size(); ++i) 1714 OrigOperands.push_back(std::move(FinalOperands[i])); 1715 1716 return false; 1717 } 1718 1719 bool X86AsmParser::ParseOperand(OperandVector &Operands) { 1720 if (isParsingIntelSyntax()) 1721 return ParseIntelOperand(Operands); 1722 1723 return ParseATTOperand(Operands); 1724 } 1725 1726 bool X86AsmParser::CreateMemForMSInlineAsm( 1727 unsigned SegReg, const MCExpr *Disp, unsigned BaseReg, unsigned IndexReg, 1728 unsigned Scale, SMLoc Start, SMLoc End, unsigned Size, StringRef Identifier, 1729 const InlineAsmIdentifierInfo &Info, OperandVector &Operands) { 1730 // If we found a decl other than a VarDecl, then assume it is a FuncDecl or 1731 // some other label reference. 1732 if (Info.isKind(InlineAsmIdentifierInfo::IK_Label)) { 1733 // Insert an explicit size if the user didn't have one. 1734 if (!Size) { 1735 Size = getPointerWidth(); 1736 InstInfo->AsmRewrites->emplace_back(AOK_SizeDirective, Start, 1737 /*Len=*/0, Size); 1738 } 1739 // Create an absolute memory reference in order to match against 1740 // instructions taking a PC relative operand. 1741 Operands.push_back(X86Operand::CreateMem(getPointerWidth(), Disp, Start, 1742 End, Size, Identifier, 1743 Info.Label.Decl)); 1744 return false; 1745 } 1746 // We either have a direct symbol reference, or an offset from a symbol. The 1747 // parser always puts the symbol on the LHS, so look there for size 1748 // calculation purposes. 1749 unsigned FrontendSize = 0; 1750 void *Decl = nullptr; 1751 bool IsGlobalLV = false; 1752 if (Info.isKind(InlineAsmIdentifierInfo::IK_Var)) { 1753 // Size is in terms of bits in this context. 1754 FrontendSize = Info.Var.Type * 8; 1755 Decl = Info.Var.Decl; 1756 IsGlobalLV = Info.Var.IsGlobalLV; 1757 } 1758 // It is widely common for MS InlineAsm to use a global variable and one/two 1759 // registers in a mmory expression, and though unaccessible via rip/eip. 1760 if (IsGlobalLV && (BaseReg || IndexReg)) { 1761 Operands.push_back(X86Operand::CreateMem(getPointerWidth(), Disp, Start, 1762 End, Size, Identifier, Decl, 1763 FrontendSize)); 1764 return false; 1765 } 1766 // Otherwise, we set the base register to a non-zero value 1767 // if we don't know the actual value at this time. This is necessary to 1768 // get the matching correct in some cases. 1769 BaseReg = BaseReg ? BaseReg : 1; 1770 Operands.push_back(X86Operand::CreateMem( 1771 getPointerWidth(), SegReg, Disp, BaseReg, IndexReg, Scale, Start, End, 1772 Size, 1773 /*DefaultBaseReg=*/X86::RIP, Identifier, Decl, FrontendSize)); 1774 return false; 1775 } 1776 1777 // Some binary bitwise operators have a named synonymous 1778 // Query a candidate string for being such a named operator 1779 // and if so - invoke the appropriate handler 1780 bool X86AsmParser::ParseIntelNamedOperator(StringRef Name, 1781 IntelExprStateMachine &SM, 1782 bool &ParseError, SMLoc &End) { 1783 // A named operator should be either lower or upper case, but not a mix... 1784 // except in MASM, which uses full case-insensitivity. 1785 if (Name.compare(Name.lower()) && Name.compare(Name.upper()) && 1786 !getParser().isParsingMasm()) 1787 return false; 1788 if (Name.equals_insensitive("not")) { 1789 SM.onNot(); 1790 } else if (Name.equals_insensitive("or")) { 1791 SM.onOr(); 1792 } else if (Name.equals_insensitive("shl")) { 1793 SM.onLShift(); 1794 } else if (Name.equals_insensitive("shr")) { 1795 SM.onRShift(); 1796 } else if (Name.equals_insensitive("xor")) { 1797 SM.onXor(); 1798 } else if (Name.equals_insensitive("and")) { 1799 SM.onAnd(); 1800 } else if (Name.equals_insensitive("mod")) { 1801 SM.onMod(); 1802 } else if (Name.equals_insensitive("offset")) { 1803 SMLoc OffsetLoc = getTok().getLoc(); 1804 const MCExpr *Val = nullptr; 1805 StringRef ID; 1806 InlineAsmIdentifierInfo Info; 1807 ParseError = ParseIntelOffsetOperator(Val, ID, Info, End); 1808 if (ParseError) 1809 return true; 1810 StringRef ErrMsg; 1811 ParseError = 1812 SM.onOffset(Val, OffsetLoc, ID, Info, isParsingMSInlineAsm(), ErrMsg); 1813 if (ParseError) 1814 return Error(SMLoc::getFromPointer(Name.data()), ErrMsg); 1815 } else { 1816 return false; 1817 } 1818 if (!Name.equals_insensitive("offset")) 1819 End = consumeToken(); 1820 return true; 1821 } 1822 bool X86AsmParser::ParseMasmNamedOperator(StringRef Name, 1823 IntelExprStateMachine &SM, 1824 bool &ParseError, SMLoc &End) { 1825 if (Name.equals_insensitive("eq")) { 1826 SM.onEq(); 1827 } else if (Name.equals_insensitive("ne")) { 1828 SM.onNE(); 1829 } else if (Name.equals_insensitive("lt")) { 1830 SM.onLT(); 1831 } else if (Name.equals_insensitive("le")) { 1832 SM.onLE(); 1833 } else if (Name.equals_insensitive("gt")) { 1834 SM.onGT(); 1835 } else if (Name.equals_insensitive("ge")) { 1836 SM.onGE(); 1837 } else { 1838 return false; 1839 } 1840 End = consumeToken(); 1841 return true; 1842 } 1843 1844 bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) { 1845 MCAsmParser &Parser = getParser(); 1846 StringRef ErrMsg; 1847 1848 AsmToken::TokenKind PrevTK = AsmToken::Error; 1849 bool Done = false; 1850 while (!Done) { 1851 // Get a fresh reference on each loop iteration in case the previous 1852 // iteration moved the token storage during UnLex(). 1853 const AsmToken &Tok = Parser.getTok(); 1854 1855 bool UpdateLocLex = true; 1856 AsmToken::TokenKind TK = getLexer().getKind(); 1857 1858 switch (TK) { 1859 default: 1860 if ((Done = SM.isValidEndState())) 1861 break; 1862 return Error(Tok.getLoc(), "unknown token in expression"); 1863 case AsmToken::Error: 1864 return Error(getLexer().getErrLoc(), getLexer().getErr()); 1865 break; 1866 case AsmToken::EndOfStatement: 1867 Done = true; 1868 break; 1869 case AsmToken::Real: 1870 // DotOperator: [ebx].0 1871 UpdateLocLex = false; 1872 if (ParseIntelDotOperator(SM, End)) 1873 return true; 1874 break; 1875 case AsmToken::Dot: 1876 if (!Parser.isParsingMasm()) { 1877 if ((Done = SM.isValidEndState())) 1878 break; 1879 return Error(Tok.getLoc(), "unknown token in expression"); 1880 } 1881 // MASM allows spaces around the dot operator (e.g., "var . x") 1882 Lex(); 1883 UpdateLocLex = false; 1884 if (ParseIntelDotOperator(SM, End)) 1885 return true; 1886 break; 1887 case AsmToken::Dollar: 1888 if (!Parser.isParsingMasm()) { 1889 if ((Done = SM.isValidEndState())) 1890 break; 1891 return Error(Tok.getLoc(), "unknown token in expression"); 1892 } 1893 LLVM_FALLTHROUGH; 1894 case AsmToken::String: { 1895 if (Parser.isParsingMasm()) { 1896 // MASM parsers handle strings in expressions as constants. 1897 SMLoc ValueLoc = Tok.getLoc(); 1898 int64_t Res; 1899 const MCExpr *Val; 1900 if (Parser.parsePrimaryExpr(Val, End, nullptr)) 1901 return true; 1902 UpdateLocLex = false; 1903 if (!Val->evaluateAsAbsolute(Res, getStreamer().getAssemblerPtr())) 1904 return Error(ValueLoc, "expected absolute value"); 1905 if (SM.onInteger(Res, ErrMsg)) 1906 return Error(ValueLoc, ErrMsg); 1907 break; 1908 } 1909 LLVM_FALLTHROUGH; 1910 } 1911 case AsmToken::At: 1912 case AsmToken::Identifier: { 1913 SMLoc IdentLoc = Tok.getLoc(); 1914 StringRef Identifier = Tok.getString(); 1915 UpdateLocLex = false; 1916 if (Parser.isParsingMasm()) { 1917 size_t DotOffset = Identifier.find_first_of('.'); 1918 if (DotOffset != StringRef::npos) { 1919 consumeToken(); 1920 StringRef LHS = Identifier.slice(0, DotOffset); 1921 StringRef Dot = Identifier.slice(DotOffset, DotOffset + 1); 1922 StringRef RHS = Identifier.slice(DotOffset + 1, StringRef::npos); 1923 if (!RHS.empty()) { 1924 getLexer().UnLex(AsmToken(AsmToken::Identifier, RHS)); 1925 } 1926 getLexer().UnLex(AsmToken(AsmToken::Dot, Dot)); 1927 if (!LHS.empty()) { 1928 getLexer().UnLex(AsmToken(AsmToken::Identifier, LHS)); 1929 } 1930 break; 1931 } 1932 } 1933 // (MASM only) <TYPE> PTR operator 1934 if (Parser.isParsingMasm()) { 1935 const AsmToken &NextTok = getLexer().peekTok(); 1936 if (NextTok.is(AsmToken::Identifier) && 1937 NextTok.getIdentifier().equals_insensitive("ptr")) { 1938 AsmTypeInfo Info; 1939 if (Parser.lookUpType(Identifier, Info)) 1940 return Error(Tok.getLoc(), "unknown type"); 1941 SM.onCast(Info); 1942 // Eat type and PTR. 1943 consumeToken(); 1944 End = consumeToken(); 1945 break; 1946 } 1947 } 1948 // Register, or (MASM only) <register>.<field> 1949 unsigned Reg; 1950 if (Tok.is(AsmToken::Identifier)) { 1951 if (!ParseRegister(Reg, IdentLoc, End, /*RestoreOnFailure=*/true)) { 1952 if (SM.onRegister(Reg, ErrMsg)) 1953 return Error(IdentLoc, ErrMsg); 1954 break; 1955 } 1956 if (Parser.isParsingMasm()) { 1957 const std::pair<StringRef, StringRef> IDField = 1958 Tok.getString().split('.'); 1959 const StringRef ID = IDField.first, Field = IDField.second; 1960 SMLoc IDEndLoc = SMLoc::getFromPointer(ID.data() + ID.size()); 1961 if (!Field.empty() && 1962 !MatchRegisterByName(Reg, ID, IdentLoc, IDEndLoc)) { 1963 if (SM.onRegister(Reg, ErrMsg)) 1964 return Error(IdentLoc, ErrMsg); 1965 1966 AsmFieldInfo Info; 1967 SMLoc FieldStartLoc = SMLoc::getFromPointer(Field.data()); 1968 if (Parser.lookUpField(Field, Info)) 1969 return Error(FieldStartLoc, "unknown offset"); 1970 else if (SM.onPlus(ErrMsg)) 1971 return Error(getTok().getLoc(), ErrMsg); 1972 else if (SM.onInteger(Info.Offset, ErrMsg)) 1973 return Error(IdentLoc, ErrMsg); 1974 SM.setTypeInfo(Info.Type); 1975 1976 End = consumeToken(); 1977 break; 1978 } 1979 } 1980 } 1981 // Operator synonymous ("not", "or" etc.) 1982 bool ParseError = false; 1983 if (ParseIntelNamedOperator(Identifier, SM, ParseError, End)) { 1984 if (ParseError) 1985 return true; 1986 break; 1987 } 1988 if (Parser.isParsingMasm() && 1989 ParseMasmNamedOperator(Identifier, SM, ParseError, End)) { 1990 if (ParseError) 1991 return true; 1992 break; 1993 } 1994 // Symbol reference, when parsing assembly content 1995 InlineAsmIdentifierInfo Info; 1996 AsmFieldInfo FieldInfo; 1997 const MCExpr *Val; 1998 if (isParsingMSInlineAsm() || Parser.isParsingMasm()) { 1999 // MS Dot Operator expression 2000 if (Identifier.count('.') && 2001 (PrevTK == AsmToken::RBrac || PrevTK == AsmToken::RParen)) { 2002 if (ParseIntelDotOperator(SM, End)) 2003 return true; 2004 break; 2005 } 2006 } 2007 if (isParsingMSInlineAsm()) { 2008 // MS InlineAsm operators (TYPE/LENGTH/SIZE) 2009 if (unsigned OpKind = IdentifyIntelInlineAsmOperator(Identifier)) { 2010 if (int64_t Val = ParseIntelInlineAsmOperator(OpKind)) { 2011 if (SM.onInteger(Val, ErrMsg)) 2012 return Error(IdentLoc, ErrMsg); 2013 } else { 2014 return true; 2015 } 2016 break; 2017 } 2018 // MS InlineAsm identifier 2019 // Call parseIdentifier() to combine @ with the identifier behind it. 2020 if (TK == AsmToken::At && Parser.parseIdentifier(Identifier)) 2021 return Error(IdentLoc, "expected identifier"); 2022 if (ParseIntelInlineAsmIdentifier(Val, Identifier, Info, false, End)) 2023 return true; 2024 else if (SM.onIdentifierExpr(Val, Identifier, Info, FieldInfo.Type, 2025 true, ErrMsg)) 2026 return Error(IdentLoc, ErrMsg); 2027 break; 2028 } 2029 if (Parser.isParsingMasm()) { 2030 if (unsigned OpKind = IdentifyMasmOperator(Identifier)) { 2031 int64_t Val; 2032 if (ParseMasmOperator(OpKind, Val)) 2033 return true; 2034 if (SM.onInteger(Val, ErrMsg)) 2035 return Error(IdentLoc, ErrMsg); 2036 break; 2037 } 2038 if (!getParser().lookUpType(Identifier, FieldInfo.Type)) { 2039 // Field offset immediate; <TYPE>.<field specification> 2040 Lex(); // eat type 2041 bool EndDot = parseOptionalToken(AsmToken::Dot); 2042 while (EndDot || (getTok().is(AsmToken::Identifier) && 2043 getTok().getString().startswith("."))) { 2044 getParser().parseIdentifier(Identifier); 2045 if (!EndDot) 2046 Identifier.consume_front("."); 2047 EndDot = Identifier.consume_back("."); 2048 if (getParser().lookUpField(FieldInfo.Type.Name, Identifier, 2049 FieldInfo)) { 2050 SMLoc IDEnd = 2051 SMLoc::getFromPointer(Identifier.data() + Identifier.size()); 2052 return Error(IdentLoc, "Unable to lookup field reference!", 2053 SMRange(IdentLoc, IDEnd)); 2054 } 2055 if (!EndDot) 2056 EndDot = parseOptionalToken(AsmToken::Dot); 2057 } 2058 if (SM.onInteger(FieldInfo.Offset, ErrMsg)) 2059 return Error(IdentLoc, ErrMsg); 2060 break; 2061 } 2062 } 2063 if (getParser().parsePrimaryExpr(Val, End, &FieldInfo.Type)) { 2064 return Error(Tok.getLoc(), "Unexpected identifier!"); 2065 } else if (SM.onIdentifierExpr(Val, Identifier, Info, FieldInfo.Type, 2066 false, ErrMsg)) { 2067 return Error(IdentLoc, ErrMsg); 2068 } 2069 break; 2070 } 2071 case AsmToken::Integer: { 2072 // Look for 'b' or 'f' following an Integer as a directional label 2073 SMLoc Loc = getTok().getLoc(); 2074 int64_t IntVal = getTok().getIntVal(); 2075 End = consumeToken(); 2076 UpdateLocLex = false; 2077 if (getLexer().getKind() == AsmToken::Identifier) { 2078 StringRef IDVal = getTok().getString(); 2079 if (IDVal == "f" || IDVal == "b") { 2080 MCSymbol *Sym = 2081 getContext().getDirectionalLocalSymbol(IntVal, IDVal == "b"); 2082 MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; 2083 const MCExpr *Val = 2084 MCSymbolRefExpr::create(Sym, Variant, getContext()); 2085 if (IDVal == "b" && Sym->isUndefined()) 2086 return Error(Loc, "invalid reference to undefined symbol"); 2087 StringRef Identifier = Sym->getName(); 2088 InlineAsmIdentifierInfo Info; 2089 AsmTypeInfo Type; 2090 if (SM.onIdentifierExpr(Val, Identifier, Info, Type, 2091 isParsingMSInlineAsm(), ErrMsg)) 2092 return Error(Loc, ErrMsg); 2093 End = consumeToken(); 2094 } else { 2095 if (SM.onInteger(IntVal, ErrMsg)) 2096 return Error(Loc, ErrMsg); 2097 } 2098 } else { 2099 if (SM.onInteger(IntVal, ErrMsg)) 2100 return Error(Loc, ErrMsg); 2101 } 2102 break; 2103 } 2104 case AsmToken::Plus: 2105 if (SM.onPlus(ErrMsg)) 2106 return Error(getTok().getLoc(), ErrMsg); 2107 break; 2108 case AsmToken::Minus: 2109 if (SM.onMinus(ErrMsg)) 2110 return Error(getTok().getLoc(), ErrMsg); 2111 break; 2112 case AsmToken::Tilde: SM.onNot(); break; 2113 case AsmToken::Star: SM.onStar(); break; 2114 case AsmToken::Slash: SM.onDivide(); break; 2115 case AsmToken::Percent: SM.onMod(); break; 2116 case AsmToken::Pipe: SM.onOr(); break; 2117 case AsmToken::Caret: SM.onXor(); break; 2118 case AsmToken::Amp: SM.onAnd(); break; 2119 case AsmToken::LessLess: 2120 SM.onLShift(); break; 2121 case AsmToken::GreaterGreater: 2122 SM.onRShift(); break; 2123 case AsmToken::LBrac: 2124 if (SM.onLBrac()) 2125 return Error(Tok.getLoc(), "unexpected bracket encountered"); 2126 break; 2127 case AsmToken::RBrac: 2128 if (SM.onRBrac()) 2129 return Error(Tok.getLoc(), "unexpected bracket encountered"); 2130 break; 2131 case AsmToken::LParen: SM.onLParen(); break; 2132 case AsmToken::RParen: SM.onRParen(); break; 2133 } 2134 if (SM.hadError()) 2135 return Error(Tok.getLoc(), "unknown token in expression"); 2136 2137 if (!Done && UpdateLocLex) 2138 End = consumeToken(); 2139 2140 PrevTK = TK; 2141 } 2142 return false; 2143 } 2144 2145 void X86AsmParser::RewriteIntelExpression(IntelExprStateMachine &SM, 2146 SMLoc Start, SMLoc End) { 2147 SMLoc Loc = Start; 2148 unsigned ExprLen = End.getPointer() - Start.getPointer(); 2149 // Skip everything before a symbol displacement (if we have one) 2150 if (SM.getSym() && !SM.isOffsetOperator()) { 2151 StringRef SymName = SM.getSymName(); 2152 if (unsigned Len = SymName.data() - Start.getPointer()) 2153 InstInfo->AsmRewrites->emplace_back(AOK_Skip, Start, Len); 2154 Loc = SMLoc::getFromPointer(SymName.data() + SymName.size()); 2155 ExprLen = End.getPointer() - (SymName.data() + SymName.size()); 2156 // If we have only a symbol than there's no need for complex rewrite, 2157 // simply skip everything after it 2158 if (!(SM.getBaseReg() || SM.getIndexReg() || SM.getImm())) { 2159 if (ExprLen) 2160 InstInfo->AsmRewrites->emplace_back(AOK_Skip, Loc, ExprLen); 2161 return; 2162 } 2163 } 2164 // Build an Intel Expression rewrite 2165 StringRef BaseRegStr; 2166 StringRef IndexRegStr; 2167 StringRef OffsetNameStr; 2168 if (SM.getBaseReg()) 2169 BaseRegStr = X86IntelInstPrinter::getRegisterName(SM.getBaseReg()); 2170 if (SM.getIndexReg()) 2171 IndexRegStr = X86IntelInstPrinter::getRegisterName(SM.getIndexReg()); 2172 if (SM.isOffsetOperator()) 2173 OffsetNameStr = SM.getSymName(); 2174 // Emit it 2175 IntelExpr Expr(BaseRegStr, IndexRegStr, SM.getScale(), OffsetNameStr, 2176 SM.getImm(), SM.isMemExpr()); 2177 InstInfo->AsmRewrites->emplace_back(Loc, ExprLen, Expr); 2178 } 2179 2180 // Inline assembly may use variable names with namespace alias qualifiers. 2181 bool X86AsmParser::ParseIntelInlineAsmIdentifier( 2182 const MCExpr *&Val, StringRef &Identifier, InlineAsmIdentifierInfo &Info, 2183 bool IsUnevaluatedOperand, SMLoc &End, bool IsParsingOffsetOperator) { 2184 MCAsmParser &Parser = getParser(); 2185 assert(isParsingMSInlineAsm() && "Expected to be parsing inline assembly."); 2186 Val = nullptr; 2187 2188 StringRef LineBuf(Identifier.data()); 2189 SemaCallback->LookupInlineAsmIdentifier(LineBuf, Info, IsUnevaluatedOperand); 2190 2191 const AsmToken &Tok = Parser.getTok(); 2192 SMLoc Loc = Tok.getLoc(); 2193 2194 // Advance the token stream until the end of the current token is 2195 // after the end of what the frontend claimed. 2196 const char *EndPtr = Tok.getLoc().getPointer() + LineBuf.size(); 2197 do { 2198 End = Tok.getEndLoc(); 2199 getLexer().Lex(); 2200 } while (End.getPointer() < EndPtr); 2201 Identifier = LineBuf; 2202 2203 // The frontend should end parsing on an assembler token boundary, unless it 2204 // failed parsing. 2205 assert((End.getPointer() == EndPtr || 2206 Info.isKind(InlineAsmIdentifierInfo::IK_Invalid)) && 2207 "frontend claimed part of a token?"); 2208 2209 // If the identifier lookup was unsuccessful, assume that we are dealing with 2210 // a label. 2211 if (Info.isKind(InlineAsmIdentifierInfo::IK_Invalid)) { 2212 StringRef InternalName = 2213 SemaCallback->LookupInlineAsmLabel(Identifier, getSourceManager(), 2214 Loc, false); 2215 assert(InternalName.size() && "We should have an internal name here."); 2216 // Push a rewrite for replacing the identifier name with the internal name, 2217 // unless we are parsing the operand of an offset operator 2218 if (!IsParsingOffsetOperator) 2219 InstInfo->AsmRewrites->emplace_back(AOK_Label, Loc, Identifier.size(), 2220 InternalName); 2221 else 2222 Identifier = InternalName; 2223 } else if (Info.isKind(InlineAsmIdentifierInfo::IK_EnumVal)) 2224 return false; 2225 // Create the symbol reference. 2226 MCSymbol *Sym = getContext().getOrCreateSymbol(Identifier); 2227 MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; 2228 Val = MCSymbolRefExpr::create(Sym, Variant, getParser().getContext()); 2229 return false; 2230 } 2231 2232 //ParseRoundingModeOp - Parse AVX-512 rounding mode operand 2233 bool X86AsmParser::ParseRoundingModeOp(SMLoc Start, OperandVector &Operands) { 2234 MCAsmParser &Parser = getParser(); 2235 const AsmToken &Tok = Parser.getTok(); 2236 // Eat "{" and mark the current place. 2237 const SMLoc consumedToken = consumeToken(); 2238 if (Tok.isNot(AsmToken::Identifier)) 2239 return Error(Tok.getLoc(), "Expected an identifier after {"); 2240 if (Tok.getIdentifier().startswith("r")){ 2241 int rndMode = StringSwitch<int>(Tok.getIdentifier()) 2242 .Case("rn", X86::STATIC_ROUNDING::TO_NEAREST_INT) 2243 .Case("rd", X86::STATIC_ROUNDING::TO_NEG_INF) 2244 .Case("ru", X86::STATIC_ROUNDING::TO_POS_INF) 2245 .Case("rz", X86::STATIC_ROUNDING::TO_ZERO) 2246 .Default(-1); 2247 if (-1 == rndMode) 2248 return Error(Tok.getLoc(), "Invalid rounding mode."); 2249 Parser.Lex(); // Eat "r*" of r*-sae 2250 if (!getLexer().is(AsmToken::Minus)) 2251 return Error(Tok.getLoc(), "Expected - at this point"); 2252 Parser.Lex(); // Eat "-" 2253 Parser.Lex(); // Eat the sae 2254 if (!getLexer().is(AsmToken::RCurly)) 2255 return Error(Tok.getLoc(), "Expected } at this point"); 2256 SMLoc End = Tok.getEndLoc(); 2257 Parser.Lex(); // Eat "}" 2258 const MCExpr *RndModeOp = 2259 MCConstantExpr::create(rndMode, Parser.getContext()); 2260 Operands.push_back(X86Operand::CreateImm(RndModeOp, Start, End)); 2261 return false; 2262 } 2263 if(Tok.getIdentifier().equals("sae")){ 2264 Parser.Lex(); // Eat the sae 2265 if (!getLexer().is(AsmToken::RCurly)) 2266 return Error(Tok.getLoc(), "Expected } at this point"); 2267 Parser.Lex(); // Eat "}" 2268 Operands.push_back(X86Operand::CreateToken("{sae}", consumedToken)); 2269 return false; 2270 } 2271 return Error(Tok.getLoc(), "unknown token in expression"); 2272 } 2273 2274 /// Parse the '.' operator. 2275 bool X86AsmParser::ParseIntelDotOperator(IntelExprStateMachine &SM, 2276 SMLoc &End) { 2277 const AsmToken &Tok = getTok(); 2278 AsmFieldInfo Info; 2279 2280 // Drop the optional '.'. 2281 StringRef DotDispStr = Tok.getString(); 2282 if (DotDispStr.startswith(".")) 2283 DotDispStr = DotDispStr.drop_front(1); 2284 StringRef TrailingDot; 2285 2286 // .Imm gets lexed as a real. 2287 if (Tok.is(AsmToken::Real)) { 2288 APInt DotDisp; 2289 DotDispStr.getAsInteger(10, DotDisp); 2290 Info.Offset = DotDisp.getZExtValue(); 2291 } else if ((isParsingMSInlineAsm() || getParser().isParsingMasm()) && 2292 Tok.is(AsmToken::Identifier)) { 2293 if (DotDispStr.endswith(".")) { 2294 TrailingDot = DotDispStr.substr(DotDispStr.size() - 1); 2295 DotDispStr = DotDispStr.drop_back(1); 2296 } 2297 const std::pair<StringRef, StringRef> BaseMember = DotDispStr.split('.'); 2298 const StringRef Base = BaseMember.first, Member = BaseMember.second; 2299 if (getParser().lookUpField(SM.getType(), DotDispStr, Info) && 2300 getParser().lookUpField(SM.getSymName(), DotDispStr, Info) && 2301 getParser().lookUpField(DotDispStr, Info) && 2302 (!SemaCallback || 2303 SemaCallback->LookupInlineAsmField(Base, Member, Info.Offset))) 2304 return Error(Tok.getLoc(), "Unable to lookup field reference!"); 2305 } else { 2306 return Error(Tok.getLoc(), "Unexpected token type!"); 2307 } 2308 2309 // Eat the DotExpression and update End 2310 End = SMLoc::getFromPointer(DotDispStr.data()); 2311 const char *DotExprEndLoc = DotDispStr.data() + DotDispStr.size(); 2312 while (Tok.getLoc().getPointer() < DotExprEndLoc) 2313 Lex(); 2314 if (!TrailingDot.empty()) 2315 getLexer().UnLex(AsmToken(AsmToken::Dot, TrailingDot)); 2316 SM.addImm(Info.Offset); 2317 SM.setTypeInfo(Info.Type); 2318 return false; 2319 } 2320 2321 /// Parse the 'offset' operator. 2322 /// This operator is used to specify the location of a given operand 2323 bool X86AsmParser::ParseIntelOffsetOperator(const MCExpr *&Val, StringRef &ID, 2324 InlineAsmIdentifierInfo &Info, 2325 SMLoc &End) { 2326 // Eat offset, mark start of identifier. 2327 SMLoc Start = Lex().getLoc(); 2328 ID = getTok().getString(); 2329 if (!isParsingMSInlineAsm()) { 2330 if ((getTok().isNot(AsmToken::Identifier) && 2331 getTok().isNot(AsmToken::String)) || 2332 getParser().parsePrimaryExpr(Val, End, nullptr)) 2333 return Error(Start, "unexpected token!"); 2334 } else if (ParseIntelInlineAsmIdentifier(Val, ID, Info, false, End, true)) { 2335 return Error(Start, "unable to lookup expression"); 2336 } else if (Info.isKind(InlineAsmIdentifierInfo::IK_EnumVal)) { 2337 return Error(Start, "offset operator cannot yet handle constants"); 2338 } 2339 return false; 2340 } 2341 2342 // Query a candidate string for being an Intel assembly operator 2343 // Report back its kind, or IOK_INVALID if does not evaluated as a known one 2344 unsigned X86AsmParser::IdentifyIntelInlineAsmOperator(StringRef Name) { 2345 return StringSwitch<unsigned>(Name) 2346 .Cases("TYPE","type",IOK_TYPE) 2347 .Cases("SIZE","size",IOK_SIZE) 2348 .Cases("LENGTH","length",IOK_LENGTH) 2349 .Default(IOK_INVALID); 2350 } 2351 2352 /// Parse the 'LENGTH', 'TYPE' and 'SIZE' operators. The LENGTH operator 2353 /// returns the number of elements in an array. It returns the value 1 for 2354 /// non-array variables. The SIZE operator returns the size of a C or C++ 2355 /// variable. A variable's size is the product of its LENGTH and TYPE. The 2356 /// TYPE operator returns the size of a C or C++ type or variable. If the 2357 /// variable is an array, TYPE returns the size of a single element. 2358 unsigned X86AsmParser::ParseIntelInlineAsmOperator(unsigned OpKind) { 2359 MCAsmParser &Parser = getParser(); 2360 const AsmToken &Tok = Parser.getTok(); 2361 Parser.Lex(); // Eat operator. 2362 2363 const MCExpr *Val = nullptr; 2364 InlineAsmIdentifierInfo Info; 2365 SMLoc Start = Tok.getLoc(), End; 2366 StringRef Identifier = Tok.getString(); 2367 if (ParseIntelInlineAsmIdentifier(Val, Identifier, Info, 2368 /*IsUnevaluatedOperand=*/true, End)) 2369 return 0; 2370 2371 if (!Info.isKind(InlineAsmIdentifierInfo::IK_Var)) { 2372 Error(Start, "unable to lookup expression"); 2373 return 0; 2374 } 2375 2376 unsigned CVal = 0; 2377 switch(OpKind) { 2378 default: llvm_unreachable("Unexpected operand kind!"); 2379 case IOK_LENGTH: CVal = Info.Var.Length; break; 2380 case IOK_SIZE: CVal = Info.Var.Size; break; 2381 case IOK_TYPE: CVal = Info.Var.Type; break; 2382 } 2383 2384 return CVal; 2385 } 2386 2387 // Query a candidate string for being an Intel assembly operator 2388 // Report back its kind, or IOK_INVALID if does not evaluated as a known one 2389 unsigned X86AsmParser::IdentifyMasmOperator(StringRef Name) { 2390 return StringSwitch<unsigned>(Name.lower()) 2391 .Case("type", MOK_TYPE) 2392 .Cases("size", "sizeof", MOK_SIZEOF) 2393 .Cases("length", "lengthof", MOK_LENGTHOF) 2394 .Default(MOK_INVALID); 2395 } 2396 2397 /// Parse the 'LENGTHOF', 'SIZEOF', and 'TYPE' operators. The LENGTHOF operator 2398 /// returns the number of elements in an array. It returns the value 1 for 2399 /// non-array variables. The SIZEOF operator returns the size of a type or 2400 /// variable in bytes. A variable's size is the product of its LENGTH and TYPE. 2401 /// The TYPE operator returns the size of a variable. If the variable is an 2402 /// array, TYPE returns the size of a single element. 2403 bool X86AsmParser::ParseMasmOperator(unsigned OpKind, int64_t &Val) { 2404 MCAsmParser &Parser = getParser(); 2405 SMLoc OpLoc = Parser.getTok().getLoc(); 2406 Parser.Lex(); // Eat operator. 2407 2408 Val = 0; 2409 if (OpKind == MOK_SIZEOF || OpKind == MOK_TYPE) { 2410 // Check for SIZEOF(<type>) and TYPE(<type>). 2411 bool InParens = Parser.getTok().is(AsmToken::LParen); 2412 const AsmToken &IDTok = InParens ? getLexer().peekTok() : Parser.getTok(); 2413 AsmTypeInfo Type; 2414 if (IDTok.is(AsmToken::Identifier) && 2415 !Parser.lookUpType(IDTok.getIdentifier(), Type)) { 2416 Val = Type.Size; 2417 2418 // Eat tokens. 2419 if (InParens) 2420 parseToken(AsmToken::LParen); 2421 parseToken(AsmToken::Identifier); 2422 if (InParens) 2423 parseToken(AsmToken::RParen); 2424 } 2425 } 2426 2427 if (!Val) { 2428 IntelExprStateMachine SM; 2429 SMLoc End, Start = Parser.getTok().getLoc(); 2430 if (ParseIntelExpression(SM, End)) 2431 return true; 2432 2433 switch (OpKind) { 2434 default: 2435 llvm_unreachable("Unexpected operand kind!"); 2436 case MOK_SIZEOF: 2437 Val = SM.getSize(); 2438 break; 2439 case MOK_LENGTHOF: 2440 Val = SM.getLength(); 2441 break; 2442 case MOK_TYPE: 2443 Val = SM.getElementSize(); 2444 break; 2445 } 2446 2447 if (!Val) 2448 return Error(OpLoc, "expression has unknown type", SMRange(Start, End)); 2449 } 2450 2451 return false; 2452 } 2453 2454 bool X86AsmParser::ParseIntelMemoryOperandSize(unsigned &Size) { 2455 Size = StringSwitch<unsigned>(getTok().getString()) 2456 .Cases("BYTE", "byte", 8) 2457 .Cases("WORD", "word", 16) 2458 .Cases("DWORD", "dword", 32) 2459 .Cases("FLOAT", "float", 32) 2460 .Cases("LONG", "long", 32) 2461 .Cases("FWORD", "fword", 48) 2462 .Cases("DOUBLE", "double", 64) 2463 .Cases("QWORD", "qword", 64) 2464 .Cases("MMWORD","mmword", 64) 2465 .Cases("XWORD", "xword", 80) 2466 .Cases("TBYTE", "tbyte", 80) 2467 .Cases("XMMWORD", "xmmword", 128) 2468 .Cases("YMMWORD", "ymmword", 256) 2469 .Cases("ZMMWORD", "zmmword", 512) 2470 .Default(0); 2471 if (Size) { 2472 const AsmToken &Tok = Lex(); // Eat operand size (e.g., byte, word). 2473 if (!(Tok.getString().equals("PTR") || Tok.getString().equals("ptr"))) 2474 return Error(Tok.getLoc(), "Expected 'PTR' or 'ptr' token!"); 2475 Lex(); // Eat ptr. 2476 } 2477 return false; 2478 } 2479 2480 bool X86AsmParser::ParseIntelOperand(OperandVector &Operands) { 2481 MCAsmParser &Parser = getParser(); 2482 const AsmToken &Tok = Parser.getTok(); 2483 SMLoc Start, End; 2484 2485 // Parse optional Size directive. 2486 unsigned Size; 2487 if (ParseIntelMemoryOperandSize(Size)) 2488 return true; 2489 bool PtrInOperand = bool(Size); 2490 2491 Start = Tok.getLoc(); 2492 2493 // Rounding mode operand. 2494 if (getLexer().is(AsmToken::LCurly)) 2495 return ParseRoundingModeOp(Start, Operands); 2496 2497 // Register operand. 2498 unsigned RegNo = 0; 2499 if (Tok.is(AsmToken::Identifier) && !ParseRegister(RegNo, Start, End)) { 2500 if (RegNo == X86::RIP) 2501 return Error(Start, "rip can only be used as a base register"); 2502 // A Register followed by ':' is considered a segment override 2503 if (Tok.isNot(AsmToken::Colon)) { 2504 if (PtrInOperand) 2505 return Error(Start, "expected memory operand after 'ptr', " 2506 "found register operand instead"); 2507 Operands.push_back(X86Operand::CreateReg(RegNo, Start, End)); 2508 return false; 2509 } 2510 // An alleged segment override. check if we have a valid segment register 2511 if (!X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(RegNo)) 2512 return Error(Start, "invalid segment register"); 2513 // Eat ':' and update Start location 2514 Start = Lex().getLoc(); 2515 } 2516 2517 // Immediates and Memory 2518 IntelExprStateMachine SM; 2519 if (ParseIntelExpression(SM, End)) 2520 return true; 2521 2522 if (isParsingMSInlineAsm()) 2523 RewriteIntelExpression(SM, Start, Tok.getLoc()); 2524 2525 int64_t Imm = SM.getImm(); 2526 const MCExpr *Disp = SM.getSym(); 2527 const MCExpr *ImmDisp = MCConstantExpr::create(Imm, getContext()); 2528 if (Disp && Imm) 2529 Disp = MCBinaryExpr::createAdd(Disp, ImmDisp, getContext()); 2530 if (!Disp) 2531 Disp = ImmDisp; 2532 2533 // RegNo != 0 specifies a valid segment register, 2534 // and we are parsing a segment override 2535 if (!SM.isMemExpr() && !RegNo) { 2536 if (isParsingMSInlineAsm() && SM.isOffsetOperator()) { 2537 const InlineAsmIdentifierInfo &Info = SM.getIdentifierInfo(); 2538 if (Info.isKind(InlineAsmIdentifierInfo::IK_Var)) { 2539 // Disp includes the address of a variable; make sure this is recorded 2540 // for later handling. 2541 Operands.push_back(X86Operand::CreateImm(Disp, Start, End, 2542 SM.getSymName(), Info.Var.Decl, 2543 Info.Var.IsGlobalLV)); 2544 return false; 2545 } 2546 } 2547 2548 Operands.push_back(X86Operand::CreateImm(Disp, Start, End)); 2549 return false; 2550 } 2551 2552 StringRef ErrMsg; 2553 unsigned BaseReg = SM.getBaseReg(); 2554 unsigned IndexReg = SM.getIndexReg(); 2555 unsigned Scale = SM.getScale(); 2556 if (!PtrInOperand) 2557 Size = SM.getElementSize() << 3; 2558 2559 if (Scale == 0 && BaseReg != X86::ESP && BaseReg != X86::RSP && 2560 (IndexReg == X86::ESP || IndexReg == X86::RSP)) 2561 std::swap(BaseReg, IndexReg); 2562 2563 // If BaseReg is a vector register and IndexReg is not, swap them unless 2564 // Scale was specified in which case it would be an error. 2565 if (Scale == 0 && 2566 !(X86MCRegisterClasses[X86::VR128XRegClassID].contains(IndexReg) || 2567 X86MCRegisterClasses[X86::VR256XRegClassID].contains(IndexReg) || 2568 X86MCRegisterClasses[X86::VR512RegClassID].contains(IndexReg)) && 2569 (X86MCRegisterClasses[X86::VR128XRegClassID].contains(BaseReg) || 2570 X86MCRegisterClasses[X86::VR256XRegClassID].contains(BaseReg) || 2571 X86MCRegisterClasses[X86::VR512RegClassID].contains(BaseReg))) 2572 std::swap(BaseReg, IndexReg); 2573 2574 if (Scale != 0 && 2575 X86MCRegisterClasses[X86::GR16RegClassID].contains(IndexReg)) 2576 return Error(Start, "16-bit addresses cannot have a scale"); 2577 2578 // If there was no explicit scale specified, change it to 1. 2579 if (Scale == 0) 2580 Scale = 1; 2581 2582 // If this is a 16-bit addressing mode with the base and index in the wrong 2583 // order, swap them so CheckBaseRegAndIndexRegAndScale doesn't fail. It is 2584 // shared with att syntax where order matters. 2585 if ((BaseReg == X86::SI || BaseReg == X86::DI) && 2586 (IndexReg == X86::BX || IndexReg == X86::BP)) 2587 std::swap(BaseReg, IndexReg); 2588 2589 if ((BaseReg || IndexReg) && 2590 CheckBaseRegAndIndexRegAndScale(BaseReg, IndexReg, Scale, is64BitMode(), 2591 ErrMsg)) 2592 return Error(Start, ErrMsg); 2593 if (isParsingMSInlineAsm()) 2594 return CreateMemForMSInlineAsm(RegNo, Disp, BaseReg, IndexReg, Scale, Start, 2595 End, Size, SM.getSymName(), 2596 SM.getIdentifierInfo(), Operands); 2597 2598 // When parsing x64 MS-style assembly, all non-absolute references to a named 2599 // variable default to RIP-relative. 2600 if (Parser.isParsingMasm() && is64BitMode() && SM.getElementSize() > 0) { 2601 Operands.push_back(X86Operand::CreateMem(getPointerWidth(), RegNo, Disp, 2602 BaseReg, IndexReg, Scale, Start, 2603 End, Size, 2604 /*DefaultBaseReg=*/X86::RIP)); 2605 return false; 2606 } 2607 2608 if ((BaseReg || IndexReg || RegNo)) 2609 Operands.push_back(X86Operand::CreateMem(getPointerWidth(), RegNo, Disp, 2610 BaseReg, IndexReg, Scale, Start, 2611 End, Size)); 2612 else 2613 Operands.push_back( 2614 X86Operand::CreateMem(getPointerWidth(), Disp, Start, End, Size)); 2615 return false; 2616 } 2617 2618 bool X86AsmParser::ParseATTOperand(OperandVector &Operands) { 2619 MCAsmParser &Parser = getParser(); 2620 switch (getLexer().getKind()) { 2621 case AsmToken::Dollar: { 2622 // $42 or $ID -> immediate. 2623 SMLoc Start = Parser.getTok().getLoc(), End; 2624 Parser.Lex(); 2625 const MCExpr *Val; 2626 // This is an immediate, so we should not parse a register. Do a precheck 2627 // for '%' to supercede intra-register parse errors. 2628 SMLoc L = Parser.getTok().getLoc(); 2629 if (check(getLexer().is(AsmToken::Percent), L, 2630 "expected immediate expression") || 2631 getParser().parseExpression(Val, End) || 2632 check(isa<X86MCExpr>(Val), L, "expected immediate expression")) 2633 return true; 2634 Operands.push_back(X86Operand::CreateImm(Val, Start, End)); 2635 return false; 2636 } 2637 case AsmToken::LCurly: { 2638 SMLoc Start = Parser.getTok().getLoc(); 2639 return ParseRoundingModeOp(Start, Operands); 2640 } 2641 default: { 2642 // This a memory operand or a register. We have some parsing complications 2643 // as a '(' may be part of an immediate expression or the addressing mode 2644 // block. This is complicated by the fact that an assembler-level variable 2645 // may refer either to a register or an immediate expression. 2646 2647 SMLoc Loc = Parser.getTok().getLoc(), EndLoc; 2648 const MCExpr *Expr = nullptr; 2649 unsigned Reg = 0; 2650 if (getLexer().isNot(AsmToken::LParen)) { 2651 // No '(' so this is either a displacement expression or a register. 2652 if (Parser.parseExpression(Expr, EndLoc)) 2653 return true; 2654 if (auto *RE = dyn_cast<X86MCExpr>(Expr)) { 2655 // Segment Register. Reset Expr and copy value to register. 2656 Expr = nullptr; 2657 Reg = RE->getRegNo(); 2658 2659 // Check the register. 2660 if (Reg == X86::EIZ || Reg == X86::RIZ) 2661 return Error( 2662 Loc, "%eiz and %riz can only be used as index registers", 2663 SMRange(Loc, EndLoc)); 2664 if (Reg == X86::RIP) 2665 return Error(Loc, "%rip can only be used as a base register", 2666 SMRange(Loc, EndLoc)); 2667 // Return register that are not segment prefixes immediately. 2668 if (!Parser.parseOptionalToken(AsmToken::Colon)) { 2669 Operands.push_back(X86Operand::CreateReg(Reg, Loc, EndLoc)); 2670 return false; 2671 } 2672 if (!X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(Reg)) 2673 return Error(Loc, "invalid segment register"); 2674 // Accept a '*' absolute memory reference after the segment. Place it 2675 // before the full memory operand. 2676 if (getLexer().is(AsmToken::Star)) 2677 Operands.push_back(X86Operand::CreateToken("*", consumeToken())); 2678 } 2679 } 2680 // This is a Memory operand. 2681 return ParseMemOperand(Reg, Expr, Loc, EndLoc, Operands); 2682 } 2683 } 2684 } 2685 2686 // X86::COND_INVALID if not a recognized condition code or alternate mnemonic, 2687 // otherwise the EFLAGS Condition Code enumerator. 2688 X86::CondCode X86AsmParser::ParseConditionCode(StringRef CC) { 2689 return StringSwitch<X86::CondCode>(CC) 2690 .Case("o", X86::COND_O) // Overflow 2691 .Case("no", X86::COND_NO) // No Overflow 2692 .Cases("b", "nae", X86::COND_B) // Below/Neither Above nor Equal 2693 .Cases("ae", "nb", X86::COND_AE) // Above or Equal/Not Below 2694 .Cases("e", "z", X86::COND_E) // Equal/Zero 2695 .Cases("ne", "nz", X86::COND_NE) // Not Equal/Not Zero 2696 .Cases("be", "na", X86::COND_BE) // Below or Equal/Not Above 2697 .Cases("a", "nbe", X86::COND_A) // Above/Neither Below nor Equal 2698 .Case("s", X86::COND_S) // Sign 2699 .Case("ns", X86::COND_NS) // No Sign 2700 .Cases("p", "pe", X86::COND_P) // Parity/Parity Even 2701 .Cases("np", "po", X86::COND_NP) // No Parity/Parity Odd 2702 .Cases("l", "nge", X86::COND_L) // Less/Neither Greater nor Equal 2703 .Cases("ge", "nl", X86::COND_GE) // Greater or Equal/Not Less 2704 .Cases("le", "ng", X86::COND_LE) // Less or Equal/Not Greater 2705 .Cases("g", "nle", X86::COND_G) // Greater/Neither Less nor Equal 2706 .Default(X86::COND_INVALID); 2707 } 2708 2709 // true on failure, false otherwise 2710 // If no {z} mark was found - Parser doesn't advance 2711 bool X86AsmParser::ParseZ(std::unique_ptr<X86Operand> &Z, 2712 const SMLoc &StartLoc) { 2713 MCAsmParser &Parser = getParser(); 2714 // Assuming we are just pass the '{' mark, quering the next token 2715 // Searched for {z}, but none was found. Return false, as no parsing error was 2716 // encountered 2717 if (!(getLexer().is(AsmToken::Identifier) && 2718 (getLexer().getTok().getIdentifier() == "z"))) 2719 return false; 2720 Parser.Lex(); // Eat z 2721 // Query and eat the '}' mark 2722 if (!getLexer().is(AsmToken::RCurly)) 2723 return Error(getLexer().getLoc(), "Expected } at this point"); 2724 Parser.Lex(); // Eat '}' 2725 // Assign Z with the {z} mark opernad 2726 Z = X86Operand::CreateToken("{z}", StartLoc); 2727 return false; 2728 } 2729 2730 // true on failure, false otherwise 2731 bool X86AsmParser::HandleAVX512Operand(OperandVector &Operands) { 2732 MCAsmParser &Parser = getParser(); 2733 if (getLexer().is(AsmToken::LCurly)) { 2734 // Eat "{" and mark the current place. 2735 const SMLoc consumedToken = consumeToken(); 2736 // Distinguish {1to<NUM>} from {%k<NUM>}. 2737 if(getLexer().is(AsmToken::Integer)) { 2738 // Parse memory broadcasting ({1to<NUM>}). 2739 if (getLexer().getTok().getIntVal() != 1) 2740 return TokError("Expected 1to<NUM> at this point"); 2741 StringRef Prefix = getLexer().getTok().getString(); 2742 Parser.Lex(); // Eat first token of 1to8 2743 if (!getLexer().is(AsmToken::Identifier)) 2744 return TokError("Expected 1to<NUM> at this point"); 2745 // Recognize only reasonable suffixes. 2746 SmallVector<char, 5> BroadcastVector; 2747 StringRef BroadcastString = (Prefix + getLexer().getTok().getIdentifier()) 2748 .toStringRef(BroadcastVector); 2749 if (!BroadcastString.startswith("1to")) 2750 return TokError("Expected 1to<NUM> at this point"); 2751 const char *BroadcastPrimitive = 2752 StringSwitch<const char *>(BroadcastString) 2753 .Case("1to2", "{1to2}") 2754 .Case("1to4", "{1to4}") 2755 .Case("1to8", "{1to8}") 2756 .Case("1to16", "{1to16}") 2757 .Case("1to32", "{1to32}") 2758 .Default(nullptr); 2759 if (!BroadcastPrimitive) 2760 return TokError("Invalid memory broadcast primitive."); 2761 Parser.Lex(); // Eat trailing token of 1toN 2762 if (!getLexer().is(AsmToken::RCurly)) 2763 return TokError("Expected } at this point"); 2764 Parser.Lex(); // Eat "}" 2765 Operands.push_back(X86Operand::CreateToken(BroadcastPrimitive, 2766 consumedToken)); 2767 // No AVX512 specific primitives can pass 2768 // after memory broadcasting, so return. 2769 return false; 2770 } else { 2771 // Parse either {k}{z}, {z}{k}, {k} or {z} 2772 // last one have no meaning, but GCC accepts it 2773 // Currently, we're just pass a '{' mark 2774 std::unique_ptr<X86Operand> Z; 2775 if (ParseZ(Z, consumedToken)) 2776 return true; 2777 // Reaching here means that parsing of the allegadly '{z}' mark yielded 2778 // no errors. 2779 // Query for the need of further parsing for a {%k<NUM>} mark 2780 if (!Z || getLexer().is(AsmToken::LCurly)) { 2781 SMLoc StartLoc = Z ? consumeToken() : consumedToken; 2782 // Parse an op-mask register mark ({%k<NUM>}), which is now to be 2783 // expected 2784 unsigned RegNo; 2785 SMLoc RegLoc; 2786 if (!ParseRegister(RegNo, RegLoc, StartLoc) && 2787 X86MCRegisterClasses[X86::VK1RegClassID].contains(RegNo)) { 2788 if (RegNo == X86::K0) 2789 return Error(RegLoc, "Register k0 can't be used as write mask"); 2790 if (!getLexer().is(AsmToken::RCurly)) 2791 return Error(getLexer().getLoc(), "Expected } at this point"); 2792 Operands.push_back(X86Operand::CreateToken("{", StartLoc)); 2793 Operands.push_back( 2794 X86Operand::CreateReg(RegNo, StartLoc, StartLoc)); 2795 Operands.push_back(X86Operand::CreateToken("}", consumeToken())); 2796 } else 2797 return Error(getLexer().getLoc(), 2798 "Expected an op-mask register at this point"); 2799 // {%k<NUM>} mark is found, inquire for {z} 2800 if (getLexer().is(AsmToken::LCurly) && !Z) { 2801 // Have we've found a parsing error, or found no (expected) {z} mark 2802 // - report an error 2803 if (ParseZ(Z, consumeToken()) || !Z) 2804 return Error(getLexer().getLoc(), 2805 "Expected a {z} mark at this point"); 2806 2807 } 2808 // '{z}' on its own is meaningless, hence should be ignored. 2809 // on the contrary - have it been accompanied by a K register, 2810 // allow it. 2811 if (Z) 2812 Operands.push_back(std::move(Z)); 2813 } 2814 } 2815 } 2816 return false; 2817 } 2818 2819 /// ParseMemOperand: 'seg : disp(basereg, indexreg, scale)'. The '%ds:' prefix 2820 /// has already been parsed if present. disp may be provided as well. 2821 bool X86AsmParser::ParseMemOperand(unsigned SegReg, const MCExpr *Disp, 2822 SMLoc StartLoc, SMLoc EndLoc, 2823 OperandVector &Operands) { 2824 MCAsmParser &Parser = getParser(); 2825 SMLoc Loc; 2826 // Based on the initial passed values, we may be in any of these cases, we are 2827 // in one of these cases (with current position (*)): 2828 2829 // 1. seg : * disp (base-index-scale-expr) 2830 // 2. seg : *(disp) (base-index-scale-expr) 2831 // 3. seg : *(base-index-scale-expr) 2832 // 4. disp *(base-index-scale-expr) 2833 // 5. *(disp) (base-index-scale-expr) 2834 // 6. *(base-index-scale-expr) 2835 // 7. disp * 2836 // 8. *(disp) 2837 2838 // If we do not have an displacement yet, check if we're in cases 4 or 6 by 2839 // checking if the first object after the parenthesis is a register (or an 2840 // identifier referring to a register) and parse the displacement or default 2841 // to 0 as appropriate. 2842 auto isAtMemOperand = [this]() { 2843 if (this->getLexer().isNot(AsmToken::LParen)) 2844 return false; 2845 AsmToken Buf[2]; 2846 StringRef Id; 2847 auto TokCount = this->getLexer().peekTokens(Buf, true); 2848 if (TokCount == 0) 2849 return false; 2850 switch (Buf[0].getKind()) { 2851 case AsmToken::Percent: 2852 case AsmToken::Comma: 2853 return true; 2854 // These lower cases are doing a peekIdentifier. 2855 case AsmToken::At: 2856 case AsmToken::Dollar: 2857 if ((TokCount > 1) && 2858 (Buf[1].is(AsmToken::Identifier) || Buf[1].is(AsmToken::String)) && 2859 (Buf[0].getLoc().getPointer() + 1 == Buf[1].getLoc().getPointer())) 2860 Id = StringRef(Buf[0].getLoc().getPointer(), 2861 Buf[1].getIdentifier().size() + 1); 2862 break; 2863 case AsmToken::Identifier: 2864 case AsmToken::String: 2865 Id = Buf[0].getIdentifier(); 2866 break; 2867 default: 2868 return false; 2869 } 2870 // We have an ID. Check if it is bound to a register. 2871 if (!Id.empty()) { 2872 MCSymbol *Sym = this->getContext().getOrCreateSymbol(Id); 2873 if (Sym->isVariable()) { 2874 auto V = Sym->getVariableValue(/*SetUsed*/ false); 2875 return isa<X86MCExpr>(V); 2876 } 2877 } 2878 return false; 2879 }; 2880 2881 if (!Disp) { 2882 // Parse immediate if we're not at a mem operand yet. 2883 if (!isAtMemOperand()) { 2884 if (Parser.parseTokenLoc(Loc) || Parser.parseExpression(Disp, EndLoc)) 2885 return true; 2886 assert(!isa<X86MCExpr>(Disp) && "Expected non-register here."); 2887 } else { 2888 // Disp is implicitly zero if we haven't parsed it yet. 2889 Disp = MCConstantExpr::create(0, Parser.getContext()); 2890 } 2891 } 2892 2893 // We are now either at the end of the operand or at the '(' at the start of a 2894 // base-index-scale-expr. 2895 2896 if (!parseOptionalToken(AsmToken::LParen)) { 2897 if (SegReg == 0) 2898 Operands.push_back( 2899 X86Operand::CreateMem(getPointerWidth(), Disp, StartLoc, EndLoc)); 2900 else 2901 Operands.push_back(X86Operand::CreateMem(getPointerWidth(), SegReg, Disp, 2902 0, 0, 1, StartLoc, EndLoc)); 2903 return false; 2904 } 2905 2906 // If we reached here, then eat the '(' and Process 2907 // the rest of the memory operand. 2908 unsigned BaseReg = 0, IndexReg = 0, Scale = 1; 2909 SMLoc BaseLoc = getLexer().getLoc(); 2910 const MCExpr *E; 2911 StringRef ErrMsg; 2912 2913 // Parse BaseReg if one is provided. 2914 if (getLexer().isNot(AsmToken::Comma) && getLexer().isNot(AsmToken::RParen)) { 2915 if (Parser.parseExpression(E, EndLoc) || 2916 check(!isa<X86MCExpr>(E), BaseLoc, "expected register here")) 2917 return true; 2918 2919 // Check the register. 2920 BaseReg = cast<X86MCExpr>(E)->getRegNo(); 2921 if (BaseReg == X86::EIZ || BaseReg == X86::RIZ) 2922 return Error(BaseLoc, "eiz and riz can only be used as index registers", 2923 SMRange(BaseLoc, EndLoc)); 2924 } 2925 2926 if (parseOptionalToken(AsmToken::Comma)) { 2927 // Following the comma we should have either an index register, or a scale 2928 // value. We don't support the later form, but we want to parse it 2929 // correctly. 2930 // 2931 // Even though it would be completely consistent to support syntax like 2932 // "1(%eax,,1)", the assembler doesn't. Use "eiz" or "riz" for this. 2933 if (getLexer().isNot(AsmToken::RParen)) { 2934 if (Parser.parseTokenLoc(Loc) || Parser.parseExpression(E, EndLoc)) 2935 return true; 2936 2937 if (!isa<X86MCExpr>(E)) { 2938 // We've parsed an unexpected Scale Value instead of an index 2939 // register. Interpret it as an absolute. 2940 int64_t ScaleVal; 2941 if (!E->evaluateAsAbsolute(ScaleVal, getStreamer().getAssemblerPtr())) 2942 return Error(Loc, "expected absolute expression"); 2943 if (ScaleVal != 1) 2944 Warning(Loc, "scale factor without index register is ignored"); 2945 Scale = 1; 2946 } else { // IndexReg Found. 2947 IndexReg = cast<X86MCExpr>(E)->getRegNo(); 2948 2949 if (BaseReg == X86::RIP) 2950 return Error(Loc, 2951 "%rip as base register can not have an index register"); 2952 if (IndexReg == X86::RIP) 2953 return Error(Loc, "%rip is not allowed as an index register"); 2954 2955 if (parseOptionalToken(AsmToken::Comma)) { 2956 // Parse the scale amount: 2957 // ::= ',' [scale-expression] 2958 2959 // A scale amount without an index is ignored. 2960 if (getLexer().isNot(AsmToken::RParen)) { 2961 int64_t ScaleVal; 2962 if (Parser.parseTokenLoc(Loc) || 2963 Parser.parseAbsoluteExpression(ScaleVal)) 2964 return Error(Loc, "expected scale expression"); 2965 Scale = (unsigned)ScaleVal; 2966 // Validate the scale amount. 2967 if (X86MCRegisterClasses[X86::GR16RegClassID].contains(BaseReg) && 2968 Scale != 1) 2969 return Error(Loc, "scale factor in 16-bit address must be 1"); 2970 if (checkScale(Scale, ErrMsg)) 2971 return Error(Loc, ErrMsg); 2972 } 2973 } 2974 } 2975 } 2976 } 2977 2978 // Ok, we've eaten the memory operand, verify we have a ')' and eat it too. 2979 if (parseToken(AsmToken::RParen, "unexpected token in memory operand")) 2980 return true; 2981 2982 // This is to support otherwise illegal operand (%dx) found in various 2983 // unofficial manuals examples (e.g. "out[s]?[bwl]? %al, (%dx)") and must now 2984 // be supported. Mark such DX variants separately fix only in special cases. 2985 if (BaseReg == X86::DX && IndexReg == 0 && Scale == 1 && SegReg == 0 && 2986 isa<MCConstantExpr>(Disp) && 2987 cast<MCConstantExpr>(Disp)->getValue() == 0) { 2988 Operands.push_back(X86Operand::CreateDXReg(BaseLoc, BaseLoc)); 2989 return false; 2990 } 2991 2992 if (CheckBaseRegAndIndexRegAndScale(BaseReg, IndexReg, Scale, is64BitMode(), 2993 ErrMsg)) 2994 return Error(BaseLoc, ErrMsg); 2995 2996 if (SegReg || BaseReg || IndexReg) 2997 Operands.push_back(X86Operand::CreateMem(getPointerWidth(), SegReg, Disp, 2998 BaseReg, IndexReg, Scale, StartLoc, 2999 EndLoc)); 3000 else 3001 Operands.push_back( 3002 X86Operand::CreateMem(getPointerWidth(), Disp, StartLoc, EndLoc)); 3003 return false; 3004 } 3005 3006 // Parse either a standard primary expression or a register. 3007 bool X86AsmParser::parsePrimaryExpr(const MCExpr *&Res, SMLoc &EndLoc) { 3008 MCAsmParser &Parser = getParser(); 3009 // See if this is a register first. 3010 if (getTok().is(AsmToken::Percent) || 3011 (isParsingIntelSyntax() && getTok().is(AsmToken::Identifier) && 3012 MatchRegisterName(Parser.getTok().getString()))) { 3013 SMLoc StartLoc = Parser.getTok().getLoc(); 3014 unsigned RegNo; 3015 if (ParseRegister(RegNo, StartLoc, EndLoc)) 3016 return true; 3017 Res = X86MCExpr::create(RegNo, Parser.getContext()); 3018 return false; 3019 } 3020 return Parser.parsePrimaryExpr(Res, EndLoc, nullptr); 3021 } 3022 3023 bool X86AsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name, 3024 SMLoc NameLoc, OperandVector &Operands) { 3025 MCAsmParser &Parser = getParser(); 3026 InstInfo = &Info; 3027 3028 // Reset the forced VEX encoding. 3029 ForcedVEXEncoding = VEXEncoding_Default; 3030 ForcedDispEncoding = DispEncoding_Default; 3031 3032 // Parse pseudo prefixes. 3033 while (true) { 3034 if (Name == "{") { 3035 if (getLexer().isNot(AsmToken::Identifier)) 3036 return Error(Parser.getTok().getLoc(), "Unexpected token after '{'"); 3037 std::string Prefix = Parser.getTok().getString().lower(); 3038 Parser.Lex(); // Eat identifier. 3039 if (getLexer().isNot(AsmToken::RCurly)) 3040 return Error(Parser.getTok().getLoc(), "Expected '}'"); 3041 Parser.Lex(); // Eat curly. 3042 3043 if (Prefix == "vex") 3044 ForcedVEXEncoding = VEXEncoding_VEX; 3045 else if (Prefix == "vex2") 3046 ForcedVEXEncoding = VEXEncoding_VEX2; 3047 else if (Prefix == "vex3") 3048 ForcedVEXEncoding = VEXEncoding_VEX3; 3049 else if (Prefix == "evex") 3050 ForcedVEXEncoding = VEXEncoding_EVEX; 3051 else if (Prefix == "disp8") 3052 ForcedDispEncoding = DispEncoding_Disp8; 3053 else if (Prefix == "disp32") 3054 ForcedDispEncoding = DispEncoding_Disp32; 3055 else 3056 return Error(NameLoc, "unknown prefix"); 3057 3058 NameLoc = Parser.getTok().getLoc(); 3059 if (getLexer().is(AsmToken::LCurly)) { 3060 Parser.Lex(); 3061 Name = "{"; 3062 } else { 3063 if (getLexer().isNot(AsmToken::Identifier)) 3064 return Error(Parser.getTok().getLoc(), "Expected identifier"); 3065 // FIXME: The mnemonic won't match correctly if its not in lower case. 3066 Name = Parser.getTok().getString(); 3067 Parser.Lex(); 3068 } 3069 continue; 3070 } 3071 // Parse MASM style pseudo prefixes. 3072 if (isParsingMSInlineAsm()) { 3073 if (Name.equals_insensitive("vex")) 3074 ForcedVEXEncoding = VEXEncoding_VEX; 3075 else if (Name.equals_insensitive("vex2")) 3076 ForcedVEXEncoding = VEXEncoding_VEX2; 3077 else if (Name.equals_insensitive("vex3")) 3078 ForcedVEXEncoding = VEXEncoding_VEX3; 3079 else if (Name.equals_insensitive("evex")) 3080 ForcedVEXEncoding = VEXEncoding_EVEX; 3081 3082 if (ForcedVEXEncoding != VEXEncoding_Default) { 3083 if (getLexer().isNot(AsmToken::Identifier)) 3084 return Error(Parser.getTok().getLoc(), "Expected identifier"); 3085 // FIXME: The mnemonic won't match correctly if its not in lower case. 3086 Name = Parser.getTok().getString(); 3087 NameLoc = Parser.getTok().getLoc(); 3088 Parser.Lex(); 3089 } 3090 } 3091 break; 3092 } 3093 3094 // Support the suffix syntax for overriding displacement size as well. 3095 if (Name.consume_back(".d32")) { 3096 ForcedDispEncoding = DispEncoding_Disp32; 3097 } else if (Name.consume_back(".d8")) { 3098 ForcedDispEncoding = DispEncoding_Disp8; 3099 } 3100 3101 StringRef PatchedName = Name; 3102 3103 // Hack to skip "short" following Jcc. 3104 if (isParsingIntelSyntax() && 3105 (PatchedName == "jmp" || PatchedName == "jc" || PatchedName == "jnc" || 3106 PatchedName == "jcxz" || PatchedName == "jecxz" || 3107 (PatchedName.startswith("j") && 3108 ParseConditionCode(PatchedName.substr(1)) != X86::COND_INVALID))) { 3109 StringRef NextTok = Parser.getTok().getString(); 3110 if (Parser.isParsingMasm() ? NextTok.equals_insensitive("short") 3111 : NextTok == "short") { 3112 SMLoc NameEndLoc = 3113 NameLoc.getFromPointer(NameLoc.getPointer() + Name.size()); 3114 // Eat the short keyword. 3115 Parser.Lex(); 3116 // MS and GAS ignore the short keyword; they both determine the jmp type 3117 // based on the distance of the label. (NASM does emit different code with 3118 // and without "short," though.) 3119 InstInfo->AsmRewrites->emplace_back(AOK_Skip, NameEndLoc, 3120 NextTok.size() + 1); 3121 } 3122 } 3123 3124 // FIXME: Hack to recognize setneb as setne. 3125 if (PatchedName.startswith("set") && PatchedName.endswith("b") && 3126 PatchedName != "setb" && PatchedName != "setnb") 3127 PatchedName = PatchedName.substr(0, Name.size()-1); 3128 3129 unsigned ComparisonPredicate = ~0U; 3130 3131 // FIXME: Hack to recognize cmp<comparison code>{sh,ss,sd,ph,ps,pd}. 3132 if ((PatchedName.startswith("cmp") || PatchedName.startswith("vcmp")) && 3133 (PatchedName.endswith("ss") || PatchedName.endswith("sd") || 3134 PatchedName.endswith("sh") || PatchedName.endswith("ph") || 3135 PatchedName.endswith("ps") || PatchedName.endswith("pd"))) { 3136 bool IsVCMP = PatchedName[0] == 'v'; 3137 unsigned CCIdx = IsVCMP ? 4 : 3; 3138 unsigned CC = StringSwitch<unsigned>( 3139 PatchedName.slice(CCIdx, PatchedName.size() - 2)) 3140 .Case("eq", 0x00) 3141 .Case("eq_oq", 0x00) 3142 .Case("lt", 0x01) 3143 .Case("lt_os", 0x01) 3144 .Case("le", 0x02) 3145 .Case("le_os", 0x02) 3146 .Case("unord", 0x03) 3147 .Case("unord_q", 0x03) 3148 .Case("neq", 0x04) 3149 .Case("neq_uq", 0x04) 3150 .Case("nlt", 0x05) 3151 .Case("nlt_us", 0x05) 3152 .Case("nle", 0x06) 3153 .Case("nle_us", 0x06) 3154 .Case("ord", 0x07) 3155 .Case("ord_q", 0x07) 3156 /* AVX only from here */ 3157 .Case("eq_uq", 0x08) 3158 .Case("nge", 0x09) 3159 .Case("nge_us", 0x09) 3160 .Case("ngt", 0x0A) 3161 .Case("ngt_us", 0x0A) 3162 .Case("false", 0x0B) 3163 .Case("false_oq", 0x0B) 3164 .Case("neq_oq", 0x0C) 3165 .Case("ge", 0x0D) 3166 .Case("ge_os", 0x0D) 3167 .Case("gt", 0x0E) 3168 .Case("gt_os", 0x0E) 3169 .Case("true", 0x0F) 3170 .Case("true_uq", 0x0F) 3171 .Case("eq_os", 0x10) 3172 .Case("lt_oq", 0x11) 3173 .Case("le_oq", 0x12) 3174 .Case("unord_s", 0x13) 3175 .Case("neq_us", 0x14) 3176 .Case("nlt_uq", 0x15) 3177 .Case("nle_uq", 0x16) 3178 .Case("ord_s", 0x17) 3179 .Case("eq_us", 0x18) 3180 .Case("nge_uq", 0x19) 3181 .Case("ngt_uq", 0x1A) 3182 .Case("false_os", 0x1B) 3183 .Case("neq_os", 0x1C) 3184 .Case("ge_oq", 0x1D) 3185 .Case("gt_oq", 0x1E) 3186 .Case("true_us", 0x1F) 3187 .Default(~0U); 3188 if (CC != ~0U && (IsVCMP || CC < 8) && 3189 (IsVCMP || PatchedName.back() != 'h')) { 3190 if (PatchedName.endswith("ss")) 3191 PatchedName = IsVCMP ? "vcmpss" : "cmpss"; 3192 else if (PatchedName.endswith("sd")) 3193 PatchedName = IsVCMP ? "vcmpsd" : "cmpsd"; 3194 else if (PatchedName.endswith("ps")) 3195 PatchedName = IsVCMP ? "vcmpps" : "cmpps"; 3196 else if (PatchedName.endswith("pd")) 3197 PatchedName = IsVCMP ? "vcmppd" : "cmppd"; 3198 else if (PatchedName.endswith("sh")) 3199 PatchedName = "vcmpsh"; 3200 else if (PatchedName.endswith("ph")) 3201 PatchedName = "vcmpph"; 3202 else 3203 llvm_unreachable("Unexpected suffix!"); 3204 3205 ComparisonPredicate = CC; 3206 } 3207 } 3208 3209 // FIXME: Hack to recognize vpcmp<comparison code>{ub,uw,ud,uq,b,w,d,q}. 3210 if (PatchedName.startswith("vpcmp") && 3211 (PatchedName.back() == 'b' || PatchedName.back() == 'w' || 3212 PatchedName.back() == 'd' || PatchedName.back() == 'q')) { 3213 unsigned SuffixSize = PatchedName.drop_back().back() == 'u' ? 2 : 1; 3214 unsigned CC = StringSwitch<unsigned>( 3215 PatchedName.slice(5, PatchedName.size() - SuffixSize)) 3216 .Case("eq", 0x0) // Only allowed on unsigned. Checked below. 3217 .Case("lt", 0x1) 3218 .Case("le", 0x2) 3219 //.Case("false", 0x3) // Not a documented alias. 3220 .Case("neq", 0x4) 3221 .Case("nlt", 0x5) 3222 .Case("nle", 0x6) 3223 //.Case("true", 0x7) // Not a documented alias. 3224 .Default(~0U); 3225 if (CC != ~0U && (CC != 0 || SuffixSize == 2)) { 3226 switch (PatchedName.back()) { 3227 default: llvm_unreachable("Unexpected character!"); 3228 case 'b': PatchedName = SuffixSize == 2 ? "vpcmpub" : "vpcmpb"; break; 3229 case 'w': PatchedName = SuffixSize == 2 ? "vpcmpuw" : "vpcmpw"; break; 3230 case 'd': PatchedName = SuffixSize == 2 ? "vpcmpud" : "vpcmpd"; break; 3231 case 'q': PatchedName = SuffixSize == 2 ? "vpcmpuq" : "vpcmpq"; break; 3232 } 3233 // Set up the immediate to push into the operands later. 3234 ComparisonPredicate = CC; 3235 } 3236 } 3237 3238 // FIXME: Hack to recognize vpcom<comparison code>{ub,uw,ud,uq,b,w,d,q}. 3239 if (PatchedName.startswith("vpcom") && 3240 (PatchedName.back() == 'b' || PatchedName.back() == 'w' || 3241 PatchedName.back() == 'd' || PatchedName.back() == 'q')) { 3242 unsigned SuffixSize = PatchedName.drop_back().back() == 'u' ? 2 : 1; 3243 unsigned CC = StringSwitch<unsigned>( 3244 PatchedName.slice(5, PatchedName.size() - SuffixSize)) 3245 .Case("lt", 0x0) 3246 .Case("le", 0x1) 3247 .Case("gt", 0x2) 3248 .Case("ge", 0x3) 3249 .Case("eq", 0x4) 3250 .Case("neq", 0x5) 3251 .Case("false", 0x6) 3252 .Case("true", 0x7) 3253 .Default(~0U); 3254 if (CC != ~0U) { 3255 switch (PatchedName.back()) { 3256 default: llvm_unreachable("Unexpected character!"); 3257 case 'b': PatchedName = SuffixSize == 2 ? "vpcomub" : "vpcomb"; break; 3258 case 'w': PatchedName = SuffixSize == 2 ? "vpcomuw" : "vpcomw"; break; 3259 case 'd': PatchedName = SuffixSize == 2 ? "vpcomud" : "vpcomd"; break; 3260 case 'q': PatchedName = SuffixSize == 2 ? "vpcomuq" : "vpcomq"; break; 3261 } 3262 // Set up the immediate to push into the operands later. 3263 ComparisonPredicate = CC; 3264 } 3265 } 3266 3267 3268 // Determine whether this is an instruction prefix. 3269 // FIXME: 3270 // Enhance prefixes integrity robustness. for example, following forms 3271 // are currently tolerated: 3272 // repz repnz <insn> ; GAS errors for the use of two similar prefixes 3273 // lock addq %rax, %rbx ; Destination operand must be of memory type 3274 // xacquire <insn> ; xacquire must be accompanied by 'lock' 3275 bool IsPrefix = 3276 StringSwitch<bool>(Name) 3277 .Cases("cs", "ds", "es", "fs", "gs", "ss", true) 3278 .Cases("rex64", "data32", "data16", "addr32", "addr16", true) 3279 .Cases("xacquire", "xrelease", true) 3280 .Cases("acquire", "release", isParsingIntelSyntax()) 3281 .Default(false); 3282 3283 auto isLockRepeatNtPrefix = [](StringRef N) { 3284 return StringSwitch<bool>(N) 3285 .Cases("lock", "rep", "repe", "repz", "repne", "repnz", "notrack", true) 3286 .Default(false); 3287 }; 3288 3289 bool CurlyAsEndOfStatement = false; 3290 3291 unsigned Flags = X86::IP_NO_PREFIX; 3292 while (isLockRepeatNtPrefix(Name.lower())) { 3293 unsigned Prefix = 3294 StringSwitch<unsigned>(Name) 3295 .Cases("lock", "lock", X86::IP_HAS_LOCK) 3296 .Cases("rep", "repe", "repz", X86::IP_HAS_REPEAT) 3297 .Cases("repne", "repnz", X86::IP_HAS_REPEAT_NE) 3298 .Cases("notrack", "notrack", X86::IP_HAS_NOTRACK) 3299 .Default(X86::IP_NO_PREFIX); // Invalid prefix (impossible) 3300 Flags |= Prefix; 3301 if (getLexer().is(AsmToken::EndOfStatement)) { 3302 // We don't have real instr with the given prefix 3303 // let's use the prefix as the instr. 3304 // TODO: there could be several prefixes one after another 3305 Flags = X86::IP_NO_PREFIX; 3306 break; 3307 } 3308 // FIXME: The mnemonic won't match correctly if its not in lower case. 3309 Name = Parser.getTok().getString(); 3310 Parser.Lex(); // eat the prefix 3311 // Hack: we could have something like "rep # some comment" or 3312 // "lock; cmpxchg16b $1" or "lock\0A\09incl" or "lock/incl" 3313 while (Name.startswith(";") || Name.startswith("\n") || 3314 Name.startswith("#") || Name.startswith("\t") || 3315 Name.startswith("/")) { 3316 // FIXME: The mnemonic won't match correctly if its not in lower case. 3317 Name = Parser.getTok().getString(); 3318 Parser.Lex(); // go to next prefix or instr 3319 } 3320 } 3321 3322 if (Flags) 3323 PatchedName = Name; 3324 3325 // Hacks to handle 'data16' and 'data32' 3326 if (PatchedName == "data16" && is16BitMode()) { 3327 return Error(NameLoc, "redundant data16 prefix"); 3328 } 3329 if (PatchedName == "data32") { 3330 if (is32BitMode()) 3331 return Error(NameLoc, "redundant data32 prefix"); 3332 if (is64BitMode()) 3333 return Error(NameLoc, "'data32' is not supported in 64-bit mode"); 3334 // Hack to 'data16' for the table lookup. 3335 PatchedName = "data16"; 3336 3337 if (getLexer().isNot(AsmToken::EndOfStatement)) { 3338 StringRef Next = Parser.getTok().getString(); 3339 getLexer().Lex(); 3340 // data32 effectively changes the instruction suffix. 3341 // TODO Generalize. 3342 if (Next == "callw") 3343 Next = "calll"; 3344 if (Next == "ljmpw") 3345 Next = "ljmpl"; 3346 3347 Name = Next; 3348 PatchedName = Name; 3349 ForcedDataPrefix = X86::Mode32Bit; 3350 IsPrefix = false; 3351 } 3352 } 3353 3354 Operands.push_back(X86Operand::CreateToken(PatchedName, NameLoc)); 3355 3356 // Push the immediate if we extracted one from the mnemonic. 3357 if (ComparisonPredicate != ~0U && !isParsingIntelSyntax()) { 3358 const MCExpr *ImmOp = MCConstantExpr::create(ComparisonPredicate, 3359 getParser().getContext()); 3360 Operands.push_back(X86Operand::CreateImm(ImmOp, NameLoc, NameLoc)); 3361 } 3362 3363 // This does the actual operand parsing. Don't parse any more if we have a 3364 // prefix juxtaposed with an operation like "lock incl 4(%rax)", because we 3365 // just want to parse the "lock" as the first instruction and the "incl" as 3366 // the next one. 3367 if (getLexer().isNot(AsmToken::EndOfStatement) && !IsPrefix) { 3368 // Parse '*' modifier. 3369 if (getLexer().is(AsmToken::Star)) 3370 Operands.push_back(X86Operand::CreateToken("*", consumeToken())); 3371 3372 // Read the operands. 3373 while (true) { 3374 if (ParseOperand(Operands)) 3375 return true; 3376 if (HandleAVX512Operand(Operands)) 3377 return true; 3378 3379 // check for comma and eat it 3380 if (getLexer().is(AsmToken::Comma)) 3381 Parser.Lex(); 3382 else 3383 break; 3384 } 3385 3386 // In MS inline asm curly braces mark the beginning/end of a block, 3387 // therefore they should be interepreted as end of statement 3388 CurlyAsEndOfStatement = 3389 isParsingIntelSyntax() && isParsingMSInlineAsm() && 3390 (getLexer().is(AsmToken::LCurly) || getLexer().is(AsmToken::RCurly)); 3391 if (getLexer().isNot(AsmToken::EndOfStatement) && !CurlyAsEndOfStatement) 3392 return TokError("unexpected token in argument list"); 3393 } 3394 3395 // Push the immediate if we extracted one from the mnemonic. 3396 if (ComparisonPredicate != ~0U && isParsingIntelSyntax()) { 3397 const MCExpr *ImmOp = MCConstantExpr::create(ComparisonPredicate, 3398 getParser().getContext()); 3399 Operands.push_back(X86Operand::CreateImm(ImmOp, NameLoc, NameLoc)); 3400 } 3401 3402 // Consume the EndOfStatement or the prefix separator Slash 3403 if (getLexer().is(AsmToken::EndOfStatement) || 3404 (IsPrefix && getLexer().is(AsmToken::Slash))) 3405 Parser.Lex(); 3406 else if (CurlyAsEndOfStatement) 3407 // Add an actual EndOfStatement before the curly brace 3408 Info.AsmRewrites->emplace_back(AOK_EndOfStatement, 3409 getLexer().getTok().getLoc(), 0); 3410 3411 // This is for gas compatibility and cannot be done in td. 3412 // Adding "p" for some floating point with no argument. 3413 // For example: fsub --> fsubp 3414 bool IsFp = 3415 Name == "fsub" || Name == "fdiv" || Name == "fsubr" || Name == "fdivr"; 3416 if (IsFp && Operands.size() == 1) { 3417 const char *Repl = StringSwitch<const char *>(Name) 3418 .Case("fsub", "fsubp") 3419 .Case("fdiv", "fdivp") 3420 .Case("fsubr", "fsubrp") 3421 .Case("fdivr", "fdivrp"); 3422 static_cast<X86Operand &>(*Operands[0]).setTokenValue(Repl); 3423 } 3424 3425 if ((Name == "mov" || Name == "movw" || Name == "movl") && 3426 (Operands.size() == 3)) { 3427 X86Operand &Op1 = (X86Operand &)*Operands[1]; 3428 X86Operand &Op2 = (X86Operand &)*Operands[2]; 3429 SMLoc Loc = Op1.getEndLoc(); 3430 // Moving a 32 or 16 bit value into a segment register has the same 3431 // behavior. Modify such instructions to always take shorter form. 3432 if (Op1.isReg() && Op2.isReg() && 3433 X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains( 3434 Op2.getReg()) && 3435 (X86MCRegisterClasses[X86::GR16RegClassID].contains(Op1.getReg()) || 3436 X86MCRegisterClasses[X86::GR32RegClassID].contains(Op1.getReg()))) { 3437 // Change instruction name to match new instruction. 3438 if (Name != "mov" && Name[3] == (is16BitMode() ? 'l' : 'w')) { 3439 Name = is16BitMode() ? "movw" : "movl"; 3440 Operands[0] = X86Operand::CreateToken(Name, NameLoc); 3441 } 3442 // Select the correct equivalent 16-/32-bit source register. 3443 unsigned Reg = 3444 getX86SubSuperRegisterOrZero(Op1.getReg(), is16BitMode() ? 16 : 32); 3445 Operands[1] = X86Operand::CreateReg(Reg, Loc, Loc); 3446 } 3447 } 3448 3449 // This is a terrible hack to handle "out[s]?[bwl]? %al, (%dx)" -> 3450 // "outb %al, %dx". Out doesn't take a memory form, but this is a widely 3451 // documented form in various unofficial manuals, so a lot of code uses it. 3452 if ((Name == "outb" || Name == "outsb" || Name == "outw" || Name == "outsw" || 3453 Name == "outl" || Name == "outsl" || Name == "out" || Name == "outs") && 3454 Operands.size() == 3) { 3455 X86Operand &Op = (X86Operand &)*Operands.back(); 3456 if (Op.isDXReg()) 3457 Operands.back() = X86Operand::CreateReg(X86::DX, Op.getStartLoc(), 3458 Op.getEndLoc()); 3459 } 3460 // Same hack for "in[s]?[bwl]? (%dx), %al" -> "inb %dx, %al". 3461 if ((Name == "inb" || Name == "insb" || Name == "inw" || Name == "insw" || 3462 Name == "inl" || Name == "insl" || Name == "in" || Name == "ins") && 3463 Operands.size() == 3) { 3464 X86Operand &Op = (X86Operand &)*Operands[1]; 3465 if (Op.isDXReg()) 3466 Operands[1] = X86Operand::CreateReg(X86::DX, Op.getStartLoc(), 3467 Op.getEndLoc()); 3468 } 3469 3470 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 2> TmpOperands; 3471 bool HadVerifyError = false; 3472 3473 // Append default arguments to "ins[bwld]" 3474 if (Name.startswith("ins") && 3475 (Operands.size() == 1 || Operands.size() == 3) && 3476 (Name == "insb" || Name == "insw" || Name == "insl" || Name == "insd" || 3477 Name == "ins")) { 3478 3479 AddDefaultSrcDestOperands(TmpOperands, 3480 X86Operand::CreateReg(X86::DX, NameLoc, NameLoc), 3481 DefaultMemDIOperand(NameLoc)); 3482 HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands); 3483 } 3484 3485 // Append default arguments to "outs[bwld]" 3486 if (Name.startswith("outs") && 3487 (Operands.size() == 1 || Operands.size() == 3) && 3488 (Name == "outsb" || Name == "outsw" || Name == "outsl" || 3489 Name == "outsd" || Name == "outs")) { 3490 AddDefaultSrcDestOperands(TmpOperands, DefaultMemSIOperand(NameLoc), 3491 X86Operand::CreateReg(X86::DX, NameLoc, NameLoc)); 3492 HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands); 3493 } 3494 3495 // Transform "lods[bwlq]" into "lods[bwlq] ($SIREG)" for appropriate 3496 // values of $SIREG according to the mode. It would be nice if this 3497 // could be achieved with InstAlias in the tables. 3498 if (Name.startswith("lods") && 3499 (Operands.size() == 1 || Operands.size() == 2) && 3500 (Name == "lods" || Name == "lodsb" || Name == "lodsw" || 3501 Name == "lodsl" || Name == "lodsd" || Name == "lodsq")) { 3502 TmpOperands.push_back(DefaultMemSIOperand(NameLoc)); 3503 HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands); 3504 } 3505 3506 // Transform "stos[bwlq]" into "stos[bwlq] ($DIREG)" for appropriate 3507 // values of $DIREG according to the mode. It would be nice if this 3508 // could be achieved with InstAlias in the tables. 3509 if (Name.startswith("stos") && 3510 (Operands.size() == 1 || Operands.size() == 2) && 3511 (Name == "stos" || Name == "stosb" || Name == "stosw" || 3512 Name == "stosl" || Name == "stosd" || Name == "stosq")) { 3513 TmpOperands.push_back(DefaultMemDIOperand(NameLoc)); 3514 HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands); 3515 } 3516 3517 // Transform "scas[bwlq]" into "scas[bwlq] ($DIREG)" for appropriate 3518 // values of $DIREG according to the mode. It would be nice if this 3519 // could be achieved with InstAlias in the tables. 3520 if (Name.startswith("scas") && 3521 (Operands.size() == 1 || Operands.size() == 2) && 3522 (Name == "scas" || Name == "scasb" || Name == "scasw" || 3523 Name == "scasl" || Name == "scasd" || Name == "scasq")) { 3524 TmpOperands.push_back(DefaultMemDIOperand(NameLoc)); 3525 HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands); 3526 } 3527 3528 // Add default SI and DI operands to "cmps[bwlq]". 3529 if (Name.startswith("cmps") && 3530 (Operands.size() == 1 || Operands.size() == 3) && 3531 (Name == "cmps" || Name == "cmpsb" || Name == "cmpsw" || 3532 Name == "cmpsl" || Name == "cmpsd" || Name == "cmpsq")) { 3533 AddDefaultSrcDestOperands(TmpOperands, DefaultMemDIOperand(NameLoc), 3534 DefaultMemSIOperand(NameLoc)); 3535 HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands); 3536 } 3537 3538 // Add default SI and DI operands to "movs[bwlq]". 3539 if (((Name.startswith("movs") && 3540 (Name == "movs" || Name == "movsb" || Name == "movsw" || 3541 Name == "movsl" || Name == "movsd" || Name == "movsq")) || 3542 (Name.startswith("smov") && 3543 (Name == "smov" || Name == "smovb" || Name == "smovw" || 3544 Name == "smovl" || Name == "smovd" || Name == "smovq"))) && 3545 (Operands.size() == 1 || Operands.size() == 3)) { 3546 if (Name == "movsd" && Operands.size() == 1 && !isParsingIntelSyntax()) 3547 Operands.back() = X86Operand::CreateToken("movsl", NameLoc); 3548 AddDefaultSrcDestOperands(TmpOperands, DefaultMemSIOperand(NameLoc), 3549 DefaultMemDIOperand(NameLoc)); 3550 HadVerifyError = VerifyAndAdjustOperands(Operands, TmpOperands); 3551 } 3552 3553 // Check if we encountered an error for one the string insturctions 3554 if (HadVerifyError) { 3555 return HadVerifyError; 3556 } 3557 3558 // Transforms "xlat mem8" into "xlatb" 3559 if ((Name == "xlat" || Name == "xlatb") && Operands.size() == 2) { 3560 X86Operand &Op1 = static_cast<X86Operand &>(*Operands[1]); 3561 if (Op1.isMem8()) { 3562 Warning(Op1.getStartLoc(), "memory operand is only for determining the " 3563 "size, (R|E)BX will be used for the location"); 3564 Operands.pop_back(); 3565 static_cast<X86Operand &>(*Operands[0]).setTokenValue("xlatb"); 3566 } 3567 } 3568 3569 if (Flags) 3570 Operands.push_back(X86Operand::CreatePrefix(Flags, NameLoc, NameLoc)); 3571 return false; 3572 } 3573 3574 bool X86AsmParser::processInstruction(MCInst &Inst, const OperandVector &Ops) { 3575 const MCRegisterInfo *MRI = getContext().getRegisterInfo(); 3576 3577 switch (Inst.getOpcode()) { 3578 default: return false; 3579 case X86::JMP_1: 3580 // {disp32} forces a larger displacement as if the instruction was relaxed. 3581 // NOTE: 16-bit mode uses 16-bit displacement even though it says {disp32}. 3582 // This matches GNU assembler. 3583 if (ForcedDispEncoding == DispEncoding_Disp32) { 3584 Inst.setOpcode(is16BitMode() ? X86::JMP_2 : X86::JMP_4); 3585 return true; 3586 } 3587 3588 return false; 3589 case X86::JCC_1: 3590 // {disp32} forces a larger displacement as if the instruction was relaxed. 3591 // NOTE: 16-bit mode uses 16-bit displacement even though it says {disp32}. 3592 // This matches GNU assembler. 3593 if (ForcedDispEncoding == DispEncoding_Disp32) { 3594 Inst.setOpcode(is16BitMode() ? X86::JCC_2 : X86::JCC_4); 3595 return true; 3596 } 3597 3598 return false; 3599 case X86::VMOVZPQILo2PQIrr: 3600 case X86::VMOVAPDrr: 3601 case X86::VMOVAPDYrr: 3602 case X86::VMOVAPSrr: 3603 case X86::VMOVAPSYrr: 3604 case X86::VMOVDQArr: 3605 case X86::VMOVDQAYrr: 3606 case X86::VMOVDQUrr: 3607 case X86::VMOVDQUYrr: 3608 case X86::VMOVUPDrr: 3609 case X86::VMOVUPDYrr: 3610 case X86::VMOVUPSrr: 3611 case X86::VMOVUPSYrr: { 3612 // We can get a smaller encoding by using VEX.R instead of VEX.B if one of 3613 // the registers is extended, but other isn't. 3614 if (ForcedVEXEncoding == VEXEncoding_VEX3 || 3615 MRI->getEncodingValue(Inst.getOperand(0).getReg()) >= 8 || 3616 MRI->getEncodingValue(Inst.getOperand(1).getReg()) < 8) 3617 return false; 3618 3619 unsigned NewOpc; 3620 switch (Inst.getOpcode()) { 3621 default: llvm_unreachable("Invalid opcode"); 3622 case X86::VMOVZPQILo2PQIrr: NewOpc = X86::VMOVPQI2QIrr; break; 3623 case X86::VMOVAPDrr: NewOpc = X86::VMOVAPDrr_REV; break; 3624 case X86::VMOVAPDYrr: NewOpc = X86::VMOVAPDYrr_REV; break; 3625 case X86::VMOVAPSrr: NewOpc = X86::VMOVAPSrr_REV; break; 3626 case X86::VMOVAPSYrr: NewOpc = X86::VMOVAPSYrr_REV; break; 3627 case X86::VMOVDQArr: NewOpc = X86::VMOVDQArr_REV; break; 3628 case X86::VMOVDQAYrr: NewOpc = X86::VMOVDQAYrr_REV; break; 3629 case X86::VMOVDQUrr: NewOpc = X86::VMOVDQUrr_REV; break; 3630 case X86::VMOVDQUYrr: NewOpc = X86::VMOVDQUYrr_REV; break; 3631 case X86::VMOVUPDrr: NewOpc = X86::VMOVUPDrr_REV; break; 3632 case X86::VMOVUPDYrr: NewOpc = X86::VMOVUPDYrr_REV; break; 3633 case X86::VMOVUPSrr: NewOpc = X86::VMOVUPSrr_REV; break; 3634 case X86::VMOVUPSYrr: NewOpc = X86::VMOVUPSYrr_REV; break; 3635 } 3636 Inst.setOpcode(NewOpc); 3637 return true; 3638 } 3639 case X86::VMOVSDrr: 3640 case X86::VMOVSSrr: { 3641 // We can get a smaller encoding by using VEX.R instead of VEX.B if one of 3642 // the registers is extended, but other isn't. 3643 if (ForcedVEXEncoding == VEXEncoding_VEX3 || 3644 MRI->getEncodingValue(Inst.getOperand(0).getReg()) >= 8 || 3645 MRI->getEncodingValue(Inst.getOperand(2).getReg()) < 8) 3646 return false; 3647 3648 unsigned NewOpc; 3649 switch (Inst.getOpcode()) { 3650 default: llvm_unreachable("Invalid opcode"); 3651 case X86::VMOVSDrr: NewOpc = X86::VMOVSDrr_REV; break; 3652 case X86::VMOVSSrr: NewOpc = X86::VMOVSSrr_REV; break; 3653 } 3654 Inst.setOpcode(NewOpc); 3655 return true; 3656 } 3657 case X86::RCR8ri: case X86::RCR16ri: case X86::RCR32ri: case X86::RCR64ri: 3658 case X86::RCL8ri: case X86::RCL16ri: case X86::RCL32ri: case X86::RCL64ri: 3659 case X86::ROR8ri: case X86::ROR16ri: case X86::ROR32ri: case X86::ROR64ri: 3660 case X86::ROL8ri: case X86::ROL16ri: case X86::ROL32ri: case X86::ROL64ri: 3661 case X86::SAR8ri: case X86::SAR16ri: case X86::SAR32ri: case X86::SAR64ri: 3662 case X86::SHR8ri: case X86::SHR16ri: case X86::SHR32ri: case X86::SHR64ri: 3663 case X86::SHL8ri: case X86::SHL16ri: case X86::SHL32ri: case X86::SHL64ri: { 3664 // Optimize s{hr,ar,hl} $1, <op> to "shift <op>". Similar for rotate. 3665 // FIXME: It would be great if we could just do this with an InstAlias. 3666 if (!Inst.getOperand(2).isImm() || Inst.getOperand(2).getImm() != 1) 3667 return false; 3668 3669 unsigned NewOpc; 3670 switch (Inst.getOpcode()) { 3671 default: llvm_unreachable("Invalid opcode"); 3672 case X86::RCR8ri: NewOpc = X86::RCR8r1; break; 3673 case X86::RCR16ri: NewOpc = X86::RCR16r1; break; 3674 case X86::RCR32ri: NewOpc = X86::RCR32r1; break; 3675 case X86::RCR64ri: NewOpc = X86::RCR64r1; break; 3676 case X86::RCL8ri: NewOpc = X86::RCL8r1; break; 3677 case X86::RCL16ri: NewOpc = X86::RCL16r1; break; 3678 case X86::RCL32ri: NewOpc = X86::RCL32r1; break; 3679 case X86::RCL64ri: NewOpc = X86::RCL64r1; break; 3680 case X86::ROR8ri: NewOpc = X86::ROR8r1; break; 3681 case X86::ROR16ri: NewOpc = X86::ROR16r1; break; 3682 case X86::ROR32ri: NewOpc = X86::ROR32r1; break; 3683 case X86::ROR64ri: NewOpc = X86::ROR64r1; break; 3684 case X86::ROL8ri: NewOpc = X86::ROL8r1; break; 3685 case X86::ROL16ri: NewOpc = X86::ROL16r1; break; 3686 case X86::ROL32ri: NewOpc = X86::ROL32r1; break; 3687 case X86::ROL64ri: NewOpc = X86::ROL64r1; break; 3688 case X86::SAR8ri: NewOpc = X86::SAR8r1; break; 3689 case X86::SAR16ri: NewOpc = X86::SAR16r1; break; 3690 case X86::SAR32ri: NewOpc = X86::SAR32r1; break; 3691 case X86::SAR64ri: NewOpc = X86::SAR64r1; break; 3692 case X86::SHR8ri: NewOpc = X86::SHR8r1; break; 3693 case X86::SHR16ri: NewOpc = X86::SHR16r1; break; 3694 case X86::SHR32ri: NewOpc = X86::SHR32r1; break; 3695 case X86::SHR64ri: NewOpc = X86::SHR64r1; break; 3696 case X86::SHL8ri: NewOpc = X86::SHL8r1; break; 3697 case X86::SHL16ri: NewOpc = X86::SHL16r1; break; 3698 case X86::SHL32ri: NewOpc = X86::SHL32r1; break; 3699 case X86::SHL64ri: NewOpc = X86::SHL64r1; break; 3700 } 3701 3702 MCInst TmpInst; 3703 TmpInst.setOpcode(NewOpc); 3704 TmpInst.addOperand(Inst.getOperand(0)); 3705 TmpInst.addOperand(Inst.getOperand(1)); 3706 Inst = TmpInst; 3707 return true; 3708 } 3709 case X86::RCR8mi: case X86::RCR16mi: case X86::RCR32mi: case X86::RCR64mi: 3710 case X86::RCL8mi: case X86::RCL16mi: case X86::RCL32mi: case X86::RCL64mi: 3711 case X86::ROR8mi: case X86::ROR16mi: case X86::ROR32mi: case X86::ROR64mi: 3712 case X86::ROL8mi: case X86::ROL16mi: case X86::ROL32mi: case X86::ROL64mi: 3713 case X86::SAR8mi: case X86::SAR16mi: case X86::SAR32mi: case X86::SAR64mi: 3714 case X86::SHR8mi: case X86::SHR16mi: case X86::SHR32mi: case X86::SHR64mi: 3715 case X86::SHL8mi: case X86::SHL16mi: case X86::SHL32mi: case X86::SHL64mi: { 3716 // Optimize s{hr,ar,hl} $1, <op> to "shift <op>". Similar for rotate. 3717 // FIXME: It would be great if we could just do this with an InstAlias. 3718 if (!Inst.getOperand(X86::AddrNumOperands).isImm() || 3719 Inst.getOperand(X86::AddrNumOperands).getImm() != 1) 3720 return false; 3721 3722 unsigned NewOpc; 3723 switch (Inst.getOpcode()) { 3724 default: llvm_unreachable("Invalid opcode"); 3725 case X86::RCR8mi: NewOpc = X86::RCR8m1; break; 3726 case X86::RCR16mi: NewOpc = X86::RCR16m1; break; 3727 case X86::RCR32mi: NewOpc = X86::RCR32m1; break; 3728 case X86::RCR64mi: NewOpc = X86::RCR64m1; break; 3729 case X86::RCL8mi: NewOpc = X86::RCL8m1; break; 3730 case X86::RCL16mi: NewOpc = X86::RCL16m1; break; 3731 case X86::RCL32mi: NewOpc = X86::RCL32m1; break; 3732 case X86::RCL64mi: NewOpc = X86::RCL64m1; break; 3733 case X86::ROR8mi: NewOpc = X86::ROR8m1; break; 3734 case X86::ROR16mi: NewOpc = X86::ROR16m1; break; 3735 case X86::ROR32mi: NewOpc = X86::ROR32m1; break; 3736 case X86::ROR64mi: NewOpc = X86::ROR64m1; break; 3737 case X86::ROL8mi: NewOpc = X86::ROL8m1; break; 3738 case X86::ROL16mi: NewOpc = X86::ROL16m1; break; 3739 case X86::ROL32mi: NewOpc = X86::ROL32m1; break; 3740 case X86::ROL64mi: NewOpc = X86::ROL64m1; break; 3741 case X86::SAR8mi: NewOpc = X86::SAR8m1; break; 3742 case X86::SAR16mi: NewOpc = X86::SAR16m1; break; 3743 case X86::SAR32mi: NewOpc = X86::SAR32m1; break; 3744 case X86::SAR64mi: NewOpc = X86::SAR64m1; break; 3745 case X86::SHR8mi: NewOpc = X86::SHR8m1; break; 3746 case X86::SHR16mi: NewOpc = X86::SHR16m1; break; 3747 case X86::SHR32mi: NewOpc = X86::SHR32m1; break; 3748 case X86::SHR64mi: NewOpc = X86::SHR64m1; break; 3749 case X86::SHL8mi: NewOpc = X86::SHL8m1; break; 3750 case X86::SHL16mi: NewOpc = X86::SHL16m1; break; 3751 case X86::SHL32mi: NewOpc = X86::SHL32m1; break; 3752 case X86::SHL64mi: NewOpc = X86::SHL64m1; break; 3753 } 3754 3755 MCInst TmpInst; 3756 TmpInst.setOpcode(NewOpc); 3757 for (int i = 0; i != X86::AddrNumOperands; ++i) 3758 TmpInst.addOperand(Inst.getOperand(i)); 3759 Inst = TmpInst; 3760 return true; 3761 } 3762 case X86::INT: { 3763 // Transforms "int $3" into "int3" as a size optimization. We can't write an 3764 // instalias with an immediate operand yet. 3765 if (!Inst.getOperand(0).isImm() || Inst.getOperand(0).getImm() != 3) 3766 return false; 3767 3768 MCInst TmpInst; 3769 TmpInst.setOpcode(X86::INT3); 3770 Inst = TmpInst; 3771 return true; 3772 } 3773 } 3774 } 3775 3776 bool X86AsmParser::validateInstruction(MCInst &Inst, const OperandVector &Ops) { 3777 const MCRegisterInfo *MRI = getContext().getRegisterInfo(); 3778 3779 switch (Inst.getOpcode()) { 3780 case X86::VGATHERDPDYrm: 3781 case X86::VGATHERDPDrm: 3782 case X86::VGATHERDPSYrm: 3783 case X86::VGATHERDPSrm: 3784 case X86::VGATHERQPDYrm: 3785 case X86::VGATHERQPDrm: 3786 case X86::VGATHERQPSYrm: 3787 case X86::VGATHERQPSrm: 3788 case X86::VPGATHERDDYrm: 3789 case X86::VPGATHERDDrm: 3790 case X86::VPGATHERDQYrm: 3791 case X86::VPGATHERDQrm: 3792 case X86::VPGATHERQDYrm: 3793 case X86::VPGATHERQDrm: 3794 case X86::VPGATHERQQYrm: 3795 case X86::VPGATHERQQrm: { 3796 unsigned Dest = MRI->getEncodingValue(Inst.getOperand(0).getReg()); 3797 unsigned Mask = MRI->getEncodingValue(Inst.getOperand(1).getReg()); 3798 unsigned Index = 3799 MRI->getEncodingValue(Inst.getOperand(3 + X86::AddrIndexReg).getReg()); 3800 if (Dest == Mask || Dest == Index || Mask == Index) 3801 return Warning(Ops[0]->getStartLoc(), "mask, index, and destination " 3802 "registers should be distinct"); 3803 break; 3804 } 3805 case X86::VGATHERDPDZ128rm: 3806 case X86::VGATHERDPDZ256rm: 3807 case X86::VGATHERDPDZrm: 3808 case X86::VGATHERDPSZ128rm: 3809 case X86::VGATHERDPSZ256rm: 3810 case X86::VGATHERDPSZrm: 3811 case X86::VGATHERQPDZ128rm: 3812 case X86::VGATHERQPDZ256rm: 3813 case X86::VGATHERQPDZrm: 3814 case X86::VGATHERQPSZ128rm: 3815 case X86::VGATHERQPSZ256rm: 3816 case X86::VGATHERQPSZrm: 3817 case X86::VPGATHERDDZ128rm: 3818 case X86::VPGATHERDDZ256rm: 3819 case X86::VPGATHERDDZrm: 3820 case X86::VPGATHERDQZ128rm: 3821 case X86::VPGATHERDQZ256rm: 3822 case X86::VPGATHERDQZrm: 3823 case X86::VPGATHERQDZ128rm: 3824 case X86::VPGATHERQDZ256rm: 3825 case X86::VPGATHERQDZrm: 3826 case X86::VPGATHERQQZ128rm: 3827 case X86::VPGATHERQQZ256rm: 3828 case X86::VPGATHERQQZrm: { 3829 unsigned Dest = MRI->getEncodingValue(Inst.getOperand(0).getReg()); 3830 unsigned Index = 3831 MRI->getEncodingValue(Inst.getOperand(4 + X86::AddrIndexReg).getReg()); 3832 if (Dest == Index) 3833 return Warning(Ops[0]->getStartLoc(), "index and destination registers " 3834 "should be distinct"); 3835 break; 3836 } 3837 case X86::V4FMADDPSrm: 3838 case X86::V4FMADDPSrmk: 3839 case X86::V4FMADDPSrmkz: 3840 case X86::V4FMADDSSrm: 3841 case X86::V4FMADDSSrmk: 3842 case X86::V4FMADDSSrmkz: 3843 case X86::V4FNMADDPSrm: 3844 case X86::V4FNMADDPSrmk: 3845 case X86::V4FNMADDPSrmkz: 3846 case X86::V4FNMADDSSrm: 3847 case X86::V4FNMADDSSrmk: 3848 case X86::V4FNMADDSSrmkz: 3849 case X86::VP4DPWSSDSrm: 3850 case X86::VP4DPWSSDSrmk: 3851 case X86::VP4DPWSSDSrmkz: 3852 case X86::VP4DPWSSDrm: 3853 case X86::VP4DPWSSDrmk: 3854 case X86::VP4DPWSSDrmkz: { 3855 unsigned Src2 = Inst.getOperand(Inst.getNumOperands() - 3856 X86::AddrNumOperands - 1).getReg(); 3857 unsigned Src2Enc = MRI->getEncodingValue(Src2); 3858 if (Src2Enc % 4 != 0) { 3859 StringRef RegName = X86IntelInstPrinter::getRegisterName(Src2); 3860 unsigned GroupStart = (Src2Enc / 4) * 4; 3861 unsigned GroupEnd = GroupStart + 3; 3862 return Warning(Ops[0]->getStartLoc(), 3863 "source register '" + RegName + "' implicitly denotes '" + 3864 RegName.take_front(3) + Twine(GroupStart) + "' to '" + 3865 RegName.take_front(3) + Twine(GroupEnd) + 3866 "' source group"); 3867 } 3868 break; 3869 } 3870 case X86::VFCMADDCPHZ128m: 3871 case X86::VFCMADDCPHZ256m: 3872 case X86::VFCMADDCPHZm: 3873 case X86::VFCMADDCPHZ128mb: 3874 case X86::VFCMADDCPHZ256mb: 3875 case X86::VFCMADDCPHZmb: 3876 case X86::VFCMADDCPHZ128mbk: 3877 case X86::VFCMADDCPHZ256mbk: 3878 case X86::VFCMADDCPHZmbk: 3879 case X86::VFCMADDCPHZ128mbkz: 3880 case X86::VFCMADDCPHZ256mbkz: 3881 case X86::VFCMADDCPHZmbkz: 3882 case X86::VFCMADDCPHZ128mk: 3883 case X86::VFCMADDCPHZ256mk: 3884 case X86::VFCMADDCPHZmk: 3885 case X86::VFCMADDCPHZ128mkz: 3886 case X86::VFCMADDCPHZ256mkz: 3887 case X86::VFCMADDCPHZmkz: 3888 case X86::VFCMADDCPHZ128r: 3889 case X86::VFCMADDCPHZ256r: 3890 case X86::VFCMADDCPHZr: 3891 case X86::VFCMADDCPHZ128rk: 3892 case X86::VFCMADDCPHZ256rk: 3893 case X86::VFCMADDCPHZrk: 3894 case X86::VFCMADDCPHZ128rkz: 3895 case X86::VFCMADDCPHZ256rkz: 3896 case X86::VFCMADDCPHZrkz: 3897 case X86::VFCMADDCPHZrb: 3898 case X86::VFCMADDCPHZrbk: 3899 case X86::VFCMADDCPHZrbkz: 3900 case X86::VFCMADDCSHZm: 3901 case X86::VFCMADDCSHZmk: 3902 case X86::VFCMADDCSHZmkz: 3903 case X86::VFCMADDCSHZr: 3904 case X86::VFCMADDCSHZrb: 3905 case X86::VFCMADDCSHZrbk: 3906 case X86::VFCMADDCSHZrbkz: 3907 case X86::VFCMADDCSHZrk: 3908 case X86::VFCMADDCSHZrkz: 3909 case X86::VFMADDCPHZ128m: 3910 case X86::VFMADDCPHZ256m: 3911 case X86::VFMADDCPHZm: 3912 case X86::VFMADDCPHZ128mb: 3913 case X86::VFMADDCPHZ256mb: 3914 case X86::VFMADDCPHZmb: 3915 case X86::VFMADDCPHZ128mbk: 3916 case X86::VFMADDCPHZ256mbk: 3917 case X86::VFMADDCPHZmbk: 3918 case X86::VFMADDCPHZ128mbkz: 3919 case X86::VFMADDCPHZ256mbkz: 3920 case X86::VFMADDCPHZmbkz: 3921 case X86::VFMADDCPHZ128mk: 3922 case X86::VFMADDCPHZ256mk: 3923 case X86::VFMADDCPHZmk: 3924 case X86::VFMADDCPHZ128mkz: 3925 case X86::VFMADDCPHZ256mkz: 3926 case X86::VFMADDCPHZmkz: 3927 case X86::VFMADDCPHZ128r: 3928 case X86::VFMADDCPHZ256r: 3929 case X86::VFMADDCPHZr: 3930 case X86::VFMADDCPHZ128rk: 3931 case X86::VFMADDCPHZ256rk: 3932 case X86::VFMADDCPHZrk: 3933 case X86::VFMADDCPHZ128rkz: 3934 case X86::VFMADDCPHZ256rkz: 3935 case X86::VFMADDCPHZrkz: 3936 case X86::VFMADDCPHZrb: 3937 case X86::VFMADDCPHZrbk: 3938 case X86::VFMADDCPHZrbkz: 3939 case X86::VFMADDCSHZm: 3940 case X86::VFMADDCSHZmk: 3941 case X86::VFMADDCSHZmkz: 3942 case X86::VFMADDCSHZr: 3943 case X86::VFMADDCSHZrb: 3944 case X86::VFMADDCSHZrbk: 3945 case X86::VFMADDCSHZrbkz: 3946 case X86::VFMADDCSHZrk: 3947 case X86::VFMADDCSHZrkz: { 3948 unsigned Dest = Inst.getOperand(0).getReg(); 3949 for (unsigned i = 2; i < Inst.getNumOperands(); i++) 3950 if (Inst.getOperand(i).isReg() && Dest == Inst.getOperand(i).getReg()) 3951 return Warning(Ops[0]->getStartLoc(), "Destination register should be " 3952 "distinct from source registers"); 3953 break; 3954 } 3955 case X86::VFCMULCPHZ128rm: 3956 case X86::VFCMULCPHZ256rm: 3957 case X86::VFCMULCPHZrm: 3958 case X86::VFCMULCPHZ128rmb: 3959 case X86::VFCMULCPHZ256rmb: 3960 case X86::VFCMULCPHZrmb: 3961 case X86::VFCMULCPHZ128rmbk: 3962 case X86::VFCMULCPHZ256rmbk: 3963 case X86::VFCMULCPHZrmbk: 3964 case X86::VFCMULCPHZ128rmbkz: 3965 case X86::VFCMULCPHZ256rmbkz: 3966 case X86::VFCMULCPHZrmbkz: 3967 case X86::VFCMULCPHZ128rmk: 3968 case X86::VFCMULCPHZ256rmk: 3969 case X86::VFCMULCPHZrmk: 3970 case X86::VFCMULCPHZ128rmkz: 3971 case X86::VFCMULCPHZ256rmkz: 3972 case X86::VFCMULCPHZrmkz: 3973 case X86::VFCMULCPHZ128rr: 3974 case X86::VFCMULCPHZ256rr: 3975 case X86::VFCMULCPHZrr: 3976 case X86::VFCMULCPHZ128rrk: 3977 case X86::VFCMULCPHZ256rrk: 3978 case X86::VFCMULCPHZrrk: 3979 case X86::VFCMULCPHZ128rrkz: 3980 case X86::VFCMULCPHZ256rrkz: 3981 case X86::VFCMULCPHZrrkz: 3982 case X86::VFCMULCPHZrrb: 3983 case X86::VFCMULCPHZrrbk: 3984 case X86::VFCMULCPHZrrbkz: 3985 case X86::VFCMULCSHZrm: 3986 case X86::VFCMULCSHZrmk: 3987 case X86::VFCMULCSHZrmkz: 3988 case X86::VFCMULCSHZrr: 3989 case X86::VFCMULCSHZrrb: 3990 case X86::VFCMULCSHZrrbk: 3991 case X86::VFCMULCSHZrrbkz: 3992 case X86::VFCMULCSHZrrk: 3993 case X86::VFCMULCSHZrrkz: 3994 case X86::VFMULCPHZ128rm: 3995 case X86::VFMULCPHZ256rm: 3996 case X86::VFMULCPHZrm: 3997 case X86::VFMULCPHZ128rmb: 3998 case X86::VFMULCPHZ256rmb: 3999 case X86::VFMULCPHZrmb: 4000 case X86::VFMULCPHZ128rmbk: 4001 case X86::VFMULCPHZ256rmbk: 4002 case X86::VFMULCPHZrmbk: 4003 case X86::VFMULCPHZ128rmbkz: 4004 case X86::VFMULCPHZ256rmbkz: 4005 case X86::VFMULCPHZrmbkz: 4006 case X86::VFMULCPHZ128rmk: 4007 case X86::VFMULCPHZ256rmk: 4008 case X86::VFMULCPHZrmk: 4009 case X86::VFMULCPHZ128rmkz: 4010 case X86::VFMULCPHZ256rmkz: 4011 case X86::VFMULCPHZrmkz: 4012 case X86::VFMULCPHZ128rr: 4013 case X86::VFMULCPHZ256rr: 4014 case X86::VFMULCPHZrr: 4015 case X86::VFMULCPHZ128rrk: 4016 case X86::VFMULCPHZ256rrk: 4017 case X86::VFMULCPHZrrk: 4018 case X86::VFMULCPHZ128rrkz: 4019 case X86::VFMULCPHZ256rrkz: 4020 case X86::VFMULCPHZrrkz: 4021 case X86::VFMULCPHZrrb: 4022 case X86::VFMULCPHZrrbk: 4023 case X86::VFMULCPHZrrbkz: 4024 case X86::VFMULCSHZrm: 4025 case X86::VFMULCSHZrmk: 4026 case X86::VFMULCSHZrmkz: 4027 case X86::VFMULCSHZrr: 4028 case X86::VFMULCSHZrrb: 4029 case X86::VFMULCSHZrrbk: 4030 case X86::VFMULCSHZrrbkz: 4031 case X86::VFMULCSHZrrk: 4032 case X86::VFMULCSHZrrkz: { 4033 unsigned Dest = Inst.getOperand(0).getReg(); 4034 for (unsigned i = 1; i < Inst.getNumOperands(); i++) 4035 if (Inst.getOperand(i).isReg() && Dest == Inst.getOperand(i).getReg()) 4036 return Warning(Ops[0]->getStartLoc(), "Destination register should be " 4037 "distinct from source registers"); 4038 break; 4039 } 4040 } 4041 4042 const MCInstrDesc &MCID = MII.get(Inst.getOpcode()); 4043 // Check that we aren't mixing AH/BH/CH/DH with REX prefix. We only need to 4044 // check this with the legacy encoding, VEX/EVEX/XOP don't use REX. 4045 if ((MCID.TSFlags & X86II::EncodingMask) == 0) { 4046 MCPhysReg HReg = X86::NoRegister; 4047 bool UsesRex = MCID.TSFlags & X86II::REX_W; 4048 unsigned NumOps = Inst.getNumOperands(); 4049 for (unsigned i = 0; i != NumOps; ++i) { 4050 const MCOperand &MO = Inst.getOperand(i); 4051 if (!MO.isReg()) 4052 continue; 4053 unsigned Reg = MO.getReg(); 4054 if (Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH) 4055 HReg = Reg; 4056 if (X86II::isX86_64NonExtLowByteReg(Reg) || 4057 X86II::isX86_64ExtendedReg(Reg)) 4058 UsesRex = true; 4059 } 4060 4061 if (UsesRex && HReg != X86::NoRegister) { 4062 StringRef RegName = X86IntelInstPrinter::getRegisterName(HReg); 4063 return Error(Ops[0]->getStartLoc(), 4064 "can't encode '" + RegName + "' in an instruction requiring " 4065 "REX prefix"); 4066 } 4067 } 4068 4069 return false; 4070 } 4071 4072 static const char *getSubtargetFeatureName(uint64_t Val); 4073 4074 void X86AsmParser::emitWarningForSpecialLVIInstruction(SMLoc Loc) { 4075 Warning(Loc, "Instruction may be vulnerable to LVI and " 4076 "requires manual mitigation"); 4077 Note(SMLoc(), "See https://software.intel.com/" 4078 "security-software-guidance/insights/" 4079 "deep-dive-load-value-injection#specialinstructions" 4080 " for more information"); 4081 } 4082 4083 /// RET instructions and also instructions that indirect calls/jumps from memory 4084 /// combine a load and a branch within a single instruction. To mitigate these 4085 /// instructions against LVI, they must be decomposed into separate load and 4086 /// branch instructions, with an LFENCE in between. For more details, see: 4087 /// - X86LoadValueInjectionRetHardening.cpp 4088 /// - X86LoadValueInjectionIndirectThunks.cpp 4089 /// - https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection 4090 /// 4091 /// Returns `true` if a mitigation was applied or warning was emitted. 4092 void X86AsmParser::applyLVICFIMitigation(MCInst &Inst, MCStreamer &Out) { 4093 // Information on control-flow instructions that require manual mitigation can 4094 // be found here: 4095 // https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection#specialinstructions 4096 switch (Inst.getOpcode()) { 4097 case X86::RET16: 4098 case X86::RET32: 4099 case X86::RET64: 4100 case X86::RETI16: 4101 case X86::RETI32: 4102 case X86::RETI64: { 4103 MCInst ShlInst, FenceInst; 4104 bool Parse32 = is32BitMode() || Code16GCC; 4105 unsigned Basereg = 4106 is64BitMode() ? X86::RSP : (Parse32 ? X86::ESP : X86::SP); 4107 const MCExpr *Disp = MCConstantExpr::create(0, getContext()); 4108 auto ShlMemOp = X86Operand::CreateMem(getPointerWidth(), /*SegReg=*/0, Disp, 4109 /*BaseReg=*/Basereg, /*IndexReg=*/0, 4110 /*Scale=*/1, SMLoc{}, SMLoc{}, 0); 4111 ShlInst.setOpcode(X86::SHL64mi); 4112 ShlMemOp->addMemOperands(ShlInst, 5); 4113 ShlInst.addOperand(MCOperand::createImm(0)); 4114 FenceInst.setOpcode(X86::LFENCE); 4115 Out.emitInstruction(ShlInst, getSTI()); 4116 Out.emitInstruction(FenceInst, getSTI()); 4117 return; 4118 } 4119 case X86::JMP16m: 4120 case X86::JMP32m: 4121 case X86::JMP64m: 4122 case X86::CALL16m: 4123 case X86::CALL32m: 4124 case X86::CALL64m: 4125 emitWarningForSpecialLVIInstruction(Inst.getLoc()); 4126 return; 4127 } 4128 } 4129 4130 /// To mitigate LVI, every instruction that performs a load can be followed by 4131 /// an LFENCE instruction to squash any potential mis-speculation. There are 4132 /// some instructions that require additional considerations, and may requre 4133 /// manual mitigation. For more details, see: 4134 /// https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection 4135 /// 4136 /// Returns `true` if a mitigation was applied or warning was emitted. 4137 void X86AsmParser::applyLVILoadHardeningMitigation(MCInst &Inst, 4138 MCStreamer &Out) { 4139 auto Opcode = Inst.getOpcode(); 4140 auto Flags = Inst.getFlags(); 4141 if ((Flags & X86::IP_HAS_REPEAT) || (Flags & X86::IP_HAS_REPEAT_NE)) { 4142 // Information on REP string instructions that require manual mitigation can 4143 // be found here: 4144 // https://software.intel.com/security-software-guidance/insights/deep-dive-load-value-injection#specialinstructions 4145 switch (Opcode) { 4146 case X86::CMPSB: 4147 case X86::CMPSW: 4148 case X86::CMPSL: 4149 case X86::CMPSQ: 4150 case X86::SCASB: 4151 case X86::SCASW: 4152 case X86::SCASL: 4153 case X86::SCASQ: 4154 emitWarningForSpecialLVIInstruction(Inst.getLoc()); 4155 return; 4156 } 4157 } else if (Opcode == X86::REP_PREFIX || Opcode == X86::REPNE_PREFIX) { 4158 // If a REP instruction is found on its own line, it may or may not be 4159 // followed by a vulnerable instruction. Emit a warning just in case. 4160 emitWarningForSpecialLVIInstruction(Inst.getLoc()); 4161 return; 4162 } 4163 4164 const MCInstrDesc &MCID = MII.get(Inst.getOpcode()); 4165 4166 // Can't mitigate after terminators or calls. A control flow change may have 4167 // already occurred. 4168 if (MCID.isTerminator() || MCID.isCall()) 4169 return; 4170 4171 // LFENCE has the mayLoad property, don't double fence. 4172 if (MCID.mayLoad() && Inst.getOpcode() != X86::LFENCE) { 4173 MCInst FenceInst; 4174 FenceInst.setOpcode(X86::LFENCE); 4175 Out.emitInstruction(FenceInst, getSTI()); 4176 } 4177 } 4178 4179 void X86AsmParser::emitInstruction(MCInst &Inst, OperandVector &Operands, 4180 MCStreamer &Out) { 4181 if (LVIInlineAsmHardening && 4182 getSTI().getFeatureBits()[X86::FeatureLVIControlFlowIntegrity]) 4183 applyLVICFIMitigation(Inst, Out); 4184 4185 Out.emitInstruction(Inst, getSTI()); 4186 4187 if (LVIInlineAsmHardening && 4188 getSTI().getFeatureBits()[X86::FeatureLVILoadHardening]) 4189 applyLVILoadHardeningMitigation(Inst, Out); 4190 } 4191 4192 bool X86AsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 4193 OperandVector &Operands, 4194 MCStreamer &Out, uint64_t &ErrorInfo, 4195 bool MatchingInlineAsm) { 4196 if (isParsingIntelSyntax()) 4197 return MatchAndEmitIntelInstruction(IDLoc, Opcode, Operands, Out, ErrorInfo, 4198 MatchingInlineAsm); 4199 return MatchAndEmitATTInstruction(IDLoc, Opcode, Operands, Out, ErrorInfo, 4200 MatchingInlineAsm); 4201 } 4202 4203 void X86AsmParser::MatchFPUWaitAlias(SMLoc IDLoc, X86Operand &Op, 4204 OperandVector &Operands, MCStreamer &Out, 4205 bool MatchingInlineAsm) { 4206 // FIXME: This should be replaced with a real .td file alias mechanism. 4207 // Also, MatchInstructionImpl should actually *do* the EmitInstruction 4208 // call. 4209 const char *Repl = StringSwitch<const char *>(Op.getToken()) 4210 .Case("finit", "fninit") 4211 .Case("fsave", "fnsave") 4212 .Case("fstcw", "fnstcw") 4213 .Case("fstcww", "fnstcw") 4214 .Case("fstenv", "fnstenv") 4215 .Case("fstsw", "fnstsw") 4216 .Case("fstsww", "fnstsw") 4217 .Case("fclex", "fnclex") 4218 .Default(nullptr); 4219 if (Repl) { 4220 MCInst Inst; 4221 Inst.setOpcode(X86::WAIT); 4222 Inst.setLoc(IDLoc); 4223 if (!MatchingInlineAsm) 4224 emitInstruction(Inst, Operands, Out); 4225 Operands[0] = X86Operand::CreateToken(Repl, IDLoc); 4226 } 4227 } 4228 4229 bool X86AsmParser::ErrorMissingFeature(SMLoc IDLoc, 4230 const FeatureBitset &MissingFeatures, 4231 bool MatchingInlineAsm) { 4232 assert(MissingFeatures.any() && "Unknown missing feature!"); 4233 SmallString<126> Msg; 4234 raw_svector_ostream OS(Msg); 4235 OS << "instruction requires:"; 4236 for (unsigned i = 0, e = MissingFeatures.size(); i != e; ++i) { 4237 if (MissingFeatures[i]) 4238 OS << ' ' << getSubtargetFeatureName(i); 4239 } 4240 return Error(IDLoc, OS.str(), SMRange(), MatchingInlineAsm); 4241 } 4242 4243 static unsigned getPrefixes(OperandVector &Operands) { 4244 unsigned Result = 0; 4245 X86Operand &Prefix = static_cast<X86Operand &>(*Operands.back()); 4246 if (Prefix.isPrefix()) { 4247 Result = Prefix.getPrefix(); 4248 Operands.pop_back(); 4249 } 4250 return Result; 4251 } 4252 4253 unsigned X86AsmParser::checkTargetMatchPredicate(MCInst &Inst) { 4254 unsigned Opc = Inst.getOpcode(); 4255 const MCInstrDesc &MCID = MII.get(Opc); 4256 4257 if (ForcedVEXEncoding == VEXEncoding_EVEX && 4258 (MCID.TSFlags & X86II::EncodingMask) != X86II::EVEX) 4259 return Match_Unsupported; 4260 4261 if ((ForcedVEXEncoding == VEXEncoding_VEX || 4262 ForcedVEXEncoding == VEXEncoding_VEX2 || 4263 ForcedVEXEncoding == VEXEncoding_VEX3) && 4264 (MCID.TSFlags & X86II::EncodingMask) != X86II::VEX) 4265 return Match_Unsupported; 4266 4267 // These instructions are only available with {vex}, {vex2} or {vex3} prefix 4268 if (MCID.TSFlags & X86II::ExplicitVEXPrefix && 4269 (ForcedVEXEncoding != VEXEncoding_VEX && 4270 ForcedVEXEncoding != VEXEncoding_VEX2 && 4271 ForcedVEXEncoding != VEXEncoding_VEX3)) 4272 return Match_Unsupported; 4273 4274 return Match_Success; 4275 } 4276 4277 bool X86AsmParser::MatchAndEmitATTInstruction(SMLoc IDLoc, unsigned &Opcode, 4278 OperandVector &Operands, 4279 MCStreamer &Out, 4280 uint64_t &ErrorInfo, 4281 bool MatchingInlineAsm) { 4282 assert(!Operands.empty() && "Unexpect empty operand list!"); 4283 assert((*Operands[0]).isToken() && "Leading operand should always be a mnemonic!"); 4284 SMRange EmptyRange = None; 4285 4286 // First, handle aliases that expand to multiple instructions. 4287 MatchFPUWaitAlias(IDLoc, static_cast<X86Operand &>(*Operands[0]), Operands, 4288 Out, MatchingInlineAsm); 4289 X86Operand &Op = static_cast<X86Operand &>(*Operands[0]); 4290 unsigned Prefixes = getPrefixes(Operands); 4291 4292 MCInst Inst; 4293 4294 // If VEX/EVEX encoding is forced, we need to pass the USE_* flag to the 4295 // encoder and printer. 4296 if (ForcedVEXEncoding == VEXEncoding_VEX) 4297 Prefixes |= X86::IP_USE_VEX; 4298 else if (ForcedVEXEncoding == VEXEncoding_VEX2) 4299 Prefixes |= X86::IP_USE_VEX2; 4300 else if (ForcedVEXEncoding == VEXEncoding_VEX3) 4301 Prefixes |= X86::IP_USE_VEX3; 4302 else if (ForcedVEXEncoding == VEXEncoding_EVEX) 4303 Prefixes |= X86::IP_USE_EVEX; 4304 4305 // Set encoded flags for {disp8} and {disp32}. 4306 if (ForcedDispEncoding == DispEncoding_Disp8) 4307 Prefixes |= X86::IP_USE_DISP8; 4308 else if (ForcedDispEncoding == DispEncoding_Disp32) 4309 Prefixes |= X86::IP_USE_DISP32; 4310 4311 if (Prefixes) 4312 Inst.setFlags(Prefixes); 4313 4314 // In 16-bit mode, if data32 is specified, temporarily switch to 32-bit mode 4315 // when matching the instruction. 4316 if (ForcedDataPrefix == X86::Mode32Bit) 4317 SwitchMode(X86::Mode32Bit); 4318 // First, try a direct match. 4319 FeatureBitset MissingFeatures; 4320 unsigned OriginalError = MatchInstruction(Operands, Inst, ErrorInfo, 4321 MissingFeatures, MatchingInlineAsm, 4322 isParsingIntelSyntax()); 4323 if (ForcedDataPrefix == X86::Mode32Bit) { 4324 SwitchMode(X86::Mode16Bit); 4325 ForcedDataPrefix = 0; 4326 } 4327 switch (OriginalError) { 4328 default: llvm_unreachable("Unexpected match result!"); 4329 case Match_Success: 4330 if (!MatchingInlineAsm && validateInstruction(Inst, Operands)) 4331 return true; 4332 // Some instructions need post-processing to, for example, tweak which 4333 // encoding is selected. Loop on it while changes happen so the 4334 // individual transformations can chain off each other. 4335 if (!MatchingInlineAsm) 4336 while (processInstruction(Inst, Operands)) 4337 ; 4338 4339 Inst.setLoc(IDLoc); 4340 if (!MatchingInlineAsm) 4341 emitInstruction(Inst, Operands, Out); 4342 Opcode = Inst.getOpcode(); 4343 return false; 4344 case Match_InvalidImmUnsignedi4: { 4345 SMLoc ErrorLoc = ((X86Operand &)*Operands[ErrorInfo]).getStartLoc(); 4346 if (ErrorLoc == SMLoc()) 4347 ErrorLoc = IDLoc; 4348 return Error(ErrorLoc, "immediate must be an integer in range [0, 15]", 4349 EmptyRange, MatchingInlineAsm); 4350 } 4351 case Match_MissingFeature: 4352 return ErrorMissingFeature(IDLoc, MissingFeatures, MatchingInlineAsm); 4353 case Match_InvalidOperand: 4354 case Match_MnemonicFail: 4355 case Match_Unsupported: 4356 break; 4357 } 4358 if (Op.getToken().empty()) { 4359 Error(IDLoc, "instruction must have size higher than 0", EmptyRange, 4360 MatchingInlineAsm); 4361 return true; 4362 } 4363 4364 // FIXME: Ideally, we would only attempt suffix matches for things which are 4365 // valid prefixes, and we could just infer the right unambiguous 4366 // type. However, that requires substantially more matcher support than the 4367 // following hack. 4368 4369 // Change the operand to point to a temporary token. 4370 StringRef Base = Op.getToken(); 4371 SmallString<16> Tmp; 4372 Tmp += Base; 4373 Tmp += ' '; 4374 Op.setTokenValue(Tmp); 4375 4376 // If this instruction starts with an 'f', then it is a floating point stack 4377 // instruction. These come in up to three forms for 32-bit, 64-bit, and 4378 // 80-bit floating point, which use the suffixes s,l,t respectively. 4379 // 4380 // Otherwise, we assume that this may be an integer instruction, which comes 4381 // in 8/16/32/64-bit forms using the b,w,l,q suffixes respectively. 4382 const char *Suffixes = Base[0] != 'f' ? "bwlq" : "slt\0"; 4383 // MemSize corresponding to Suffixes. { 8, 16, 32, 64 } { 32, 64, 80, 0 } 4384 const char *MemSize = Base[0] != 'f' ? "\x08\x10\x20\x40" : "\x20\x40\x50\0"; 4385 4386 // Check for the various suffix matches. 4387 uint64_t ErrorInfoIgnore; 4388 FeatureBitset ErrorInfoMissingFeatures; // Init suppresses compiler warnings. 4389 unsigned Match[4]; 4390 4391 // Some instruction like VPMULDQ is NOT the variant of VPMULD but a new one. 4392 // So we should make sure the suffix matcher only works for memory variant 4393 // that has the same size with the suffix. 4394 // FIXME: This flag is a workaround for legacy instructions that didn't 4395 // declare non suffix variant assembly. 4396 bool HasVectorReg = false; 4397 X86Operand *MemOp = nullptr; 4398 for (const auto &Op : Operands) { 4399 X86Operand *X86Op = static_cast<X86Operand *>(Op.get()); 4400 if (X86Op->isVectorReg()) 4401 HasVectorReg = true; 4402 else if (X86Op->isMem()) { 4403 MemOp = X86Op; 4404 assert(MemOp->Mem.Size == 0 && "Memory size always 0 under ATT syntax"); 4405 // Have we found an unqualified memory operand, 4406 // break. IA allows only one memory operand. 4407 break; 4408 } 4409 } 4410 4411 for (unsigned I = 0, E = array_lengthof(Match); I != E; ++I) { 4412 Tmp.back() = Suffixes[I]; 4413 if (MemOp && HasVectorReg) 4414 MemOp->Mem.Size = MemSize[I]; 4415 Match[I] = Match_MnemonicFail; 4416 if (MemOp || !HasVectorReg) { 4417 Match[I] = 4418 MatchInstruction(Operands, Inst, ErrorInfoIgnore, MissingFeatures, 4419 MatchingInlineAsm, isParsingIntelSyntax()); 4420 // If this returned as a missing feature failure, remember that. 4421 if (Match[I] == Match_MissingFeature) 4422 ErrorInfoMissingFeatures = MissingFeatures; 4423 } 4424 } 4425 4426 // Restore the old token. 4427 Op.setTokenValue(Base); 4428 4429 // If exactly one matched, then we treat that as a successful match (and the 4430 // instruction will already have been filled in correctly, since the failing 4431 // matches won't have modified it). 4432 unsigned NumSuccessfulMatches = llvm::count(Match, Match_Success); 4433 if (NumSuccessfulMatches == 1) { 4434 if (!MatchingInlineAsm && validateInstruction(Inst, Operands)) 4435 return true; 4436 // Some instructions need post-processing to, for example, tweak which 4437 // encoding is selected. Loop on it while changes happen so the 4438 // individual transformations can chain off each other. 4439 if (!MatchingInlineAsm) 4440 while (processInstruction(Inst, Operands)) 4441 ; 4442 4443 Inst.setLoc(IDLoc); 4444 if (!MatchingInlineAsm) 4445 emitInstruction(Inst, Operands, Out); 4446 Opcode = Inst.getOpcode(); 4447 return false; 4448 } 4449 4450 // Otherwise, the match failed, try to produce a decent error message. 4451 4452 // If we had multiple suffix matches, then identify this as an ambiguous 4453 // match. 4454 if (NumSuccessfulMatches > 1) { 4455 char MatchChars[4]; 4456 unsigned NumMatches = 0; 4457 for (unsigned I = 0, E = array_lengthof(Match); I != E; ++I) 4458 if (Match[I] == Match_Success) 4459 MatchChars[NumMatches++] = Suffixes[I]; 4460 4461 SmallString<126> Msg; 4462 raw_svector_ostream OS(Msg); 4463 OS << "ambiguous instructions require an explicit suffix (could be "; 4464 for (unsigned i = 0; i != NumMatches; ++i) { 4465 if (i != 0) 4466 OS << ", "; 4467 if (i + 1 == NumMatches) 4468 OS << "or "; 4469 OS << "'" << Base << MatchChars[i] << "'"; 4470 } 4471 OS << ")"; 4472 Error(IDLoc, OS.str(), EmptyRange, MatchingInlineAsm); 4473 return true; 4474 } 4475 4476 // Okay, we know that none of the variants matched successfully. 4477 4478 // If all of the instructions reported an invalid mnemonic, then the original 4479 // mnemonic was invalid. 4480 if (llvm::count(Match, Match_MnemonicFail) == 4) { 4481 if (OriginalError == Match_MnemonicFail) 4482 return Error(IDLoc, "invalid instruction mnemonic '" + Base + "'", 4483 Op.getLocRange(), MatchingInlineAsm); 4484 4485 if (OriginalError == Match_Unsupported) 4486 return Error(IDLoc, "unsupported instruction", EmptyRange, 4487 MatchingInlineAsm); 4488 4489 assert(OriginalError == Match_InvalidOperand && "Unexpected error"); 4490 // Recover location info for the operand if we know which was the problem. 4491 if (ErrorInfo != ~0ULL) { 4492 if (ErrorInfo >= Operands.size()) 4493 return Error(IDLoc, "too few operands for instruction", EmptyRange, 4494 MatchingInlineAsm); 4495 4496 X86Operand &Operand = (X86Operand &)*Operands[ErrorInfo]; 4497 if (Operand.getStartLoc().isValid()) { 4498 SMRange OperandRange = Operand.getLocRange(); 4499 return Error(Operand.getStartLoc(), "invalid operand for instruction", 4500 OperandRange, MatchingInlineAsm); 4501 } 4502 } 4503 4504 return Error(IDLoc, "invalid operand for instruction", EmptyRange, 4505 MatchingInlineAsm); 4506 } 4507 4508 // If one instruction matched as unsupported, report this as unsupported. 4509 if (llvm::count(Match, Match_Unsupported) == 1) { 4510 return Error(IDLoc, "unsupported instruction", EmptyRange, 4511 MatchingInlineAsm); 4512 } 4513 4514 // If one instruction matched with a missing feature, report this as a 4515 // missing feature. 4516 if (llvm::count(Match, Match_MissingFeature) == 1) { 4517 ErrorInfo = Match_MissingFeature; 4518 return ErrorMissingFeature(IDLoc, ErrorInfoMissingFeatures, 4519 MatchingInlineAsm); 4520 } 4521 4522 // If one instruction matched with an invalid operand, report this as an 4523 // operand failure. 4524 if (llvm::count(Match, Match_InvalidOperand) == 1) { 4525 return Error(IDLoc, "invalid operand for instruction", EmptyRange, 4526 MatchingInlineAsm); 4527 } 4528 4529 // If all of these were an outright failure, report it in a useless way. 4530 Error(IDLoc, "unknown use of instruction mnemonic without a size suffix", 4531 EmptyRange, MatchingInlineAsm); 4532 return true; 4533 } 4534 4535 bool X86AsmParser::MatchAndEmitIntelInstruction(SMLoc IDLoc, unsigned &Opcode, 4536 OperandVector &Operands, 4537 MCStreamer &Out, 4538 uint64_t &ErrorInfo, 4539 bool MatchingInlineAsm) { 4540 assert(!Operands.empty() && "Unexpect empty operand list!"); 4541 assert((*Operands[0]).isToken() && "Leading operand should always be a mnemonic!"); 4542 StringRef Mnemonic = (static_cast<X86Operand &>(*Operands[0])).getToken(); 4543 SMRange EmptyRange = None; 4544 StringRef Base = (static_cast<X86Operand &>(*Operands[0])).getToken(); 4545 unsigned Prefixes = getPrefixes(Operands); 4546 4547 // First, handle aliases that expand to multiple instructions. 4548 MatchFPUWaitAlias(IDLoc, static_cast<X86Operand &>(*Operands[0]), Operands, Out, MatchingInlineAsm); 4549 X86Operand &Op = static_cast<X86Operand &>(*Operands[0]); 4550 4551 MCInst Inst; 4552 4553 // If VEX/EVEX encoding is forced, we need to pass the USE_* flag to the 4554 // encoder and printer. 4555 if (ForcedVEXEncoding == VEXEncoding_VEX) 4556 Prefixes |= X86::IP_USE_VEX; 4557 else if (ForcedVEXEncoding == VEXEncoding_VEX2) 4558 Prefixes |= X86::IP_USE_VEX2; 4559 else if (ForcedVEXEncoding == VEXEncoding_VEX3) 4560 Prefixes |= X86::IP_USE_VEX3; 4561 else if (ForcedVEXEncoding == VEXEncoding_EVEX) 4562 Prefixes |= X86::IP_USE_EVEX; 4563 4564 // Set encoded flags for {disp8} and {disp32}. 4565 if (ForcedDispEncoding == DispEncoding_Disp8) 4566 Prefixes |= X86::IP_USE_DISP8; 4567 else if (ForcedDispEncoding == DispEncoding_Disp32) 4568 Prefixes |= X86::IP_USE_DISP32; 4569 4570 if (Prefixes) 4571 Inst.setFlags(Prefixes); 4572 4573 // Find one unsized memory operand, if present. 4574 X86Operand *UnsizedMemOp = nullptr; 4575 for (const auto &Op : Operands) { 4576 X86Operand *X86Op = static_cast<X86Operand *>(Op.get()); 4577 if (X86Op->isMemUnsized()) { 4578 UnsizedMemOp = X86Op; 4579 // Have we found an unqualified memory operand, 4580 // break. IA allows only one memory operand. 4581 break; 4582 } 4583 } 4584 4585 // Allow some instructions to have implicitly pointer-sized operands. This is 4586 // compatible with gas. 4587 if (UnsizedMemOp) { 4588 static const char *const PtrSizedInstrs[] = {"call", "jmp", "push"}; 4589 for (const char *Instr : PtrSizedInstrs) { 4590 if (Mnemonic == Instr) { 4591 UnsizedMemOp->Mem.Size = getPointerWidth(); 4592 break; 4593 } 4594 } 4595 } 4596 4597 SmallVector<unsigned, 8> Match; 4598 FeatureBitset ErrorInfoMissingFeatures; 4599 FeatureBitset MissingFeatures; 4600 4601 // If unsized push has immediate operand we should default the default pointer 4602 // size for the size. 4603 if (Mnemonic == "push" && Operands.size() == 2) { 4604 auto *X86Op = static_cast<X86Operand *>(Operands[1].get()); 4605 if (X86Op->isImm()) { 4606 // If it's not a constant fall through and let remainder take care of it. 4607 const auto *CE = dyn_cast<MCConstantExpr>(X86Op->getImm()); 4608 unsigned Size = getPointerWidth(); 4609 if (CE && 4610 (isIntN(Size, CE->getValue()) || isUIntN(Size, CE->getValue()))) { 4611 SmallString<16> Tmp; 4612 Tmp += Base; 4613 Tmp += (is64BitMode()) 4614 ? "q" 4615 : (is32BitMode()) ? "l" : (is16BitMode()) ? "w" : " "; 4616 Op.setTokenValue(Tmp); 4617 // Do match in ATT mode to allow explicit suffix usage. 4618 Match.push_back(MatchInstruction(Operands, Inst, ErrorInfo, 4619 MissingFeatures, MatchingInlineAsm, 4620 false /*isParsingIntelSyntax()*/)); 4621 Op.setTokenValue(Base); 4622 } 4623 } 4624 } 4625 4626 // If an unsized memory operand is present, try to match with each memory 4627 // operand size. In Intel assembly, the size is not part of the instruction 4628 // mnemonic. 4629 if (UnsizedMemOp && UnsizedMemOp->isMemUnsized()) { 4630 static const unsigned MopSizes[] = {8, 16, 32, 64, 80, 128, 256, 512}; 4631 for (unsigned Size : MopSizes) { 4632 UnsizedMemOp->Mem.Size = Size; 4633 uint64_t ErrorInfoIgnore; 4634 unsigned LastOpcode = Inst.getOpcode(); 4635 unsigned M = MatchInstruction(Operands, Inst, ErrorInfoIgnore, 4636 MissingFeatures, MatchingInlineAsm, 4637 isParsingIntelSyntax()); 4638 if (Match.empty() || LastOpcode != Inst.getOpcode()) 4639 Match.push_back(M); 4640 4641 // If this returned as a missing feature failure, remember that. 4642 if (Match.back() == Match_MissingFeature) 4643 ErrorInfoMissingFeatures = MissingFeatures; 4644 } 4645 4646 // Restore the size of the unsized memory operand if we modified it. 4647 UnsizedMemOp->Mem.Size = 0; 4648 } 4649 4650 // If we haven't matched anything yet, this is not a basic integer or FPU 4651 // operation. There shouldn't be any ambiguity in our mnemonic table, so try 4652 // matching with the unsized operand. 4653 if (Match.empty()) { 4654 Match.push_back(MatchInstruction( 4655 Operands, Inst, ErrorInfo, MissingFeatures, MatchingInlineAsm, 4656 isParsingIntelSyntax())); 4657 // If this returned as a missing feature failure, remember that. 4658 if (Match.back() == Match_MissingFeature) 4659 ErrorInfoMissingFeatures = MissingFeatures; 4660 } 4661 4662 // Restore the size of the unsized memory operand if we modified it. 4663 if (UnsizedMemOp) 4664 UnsizedMemOp->Mem.Size = 0; 4665 4666 // If it's a bad mnemonic, all results will be the same. 4667 if (Match.back() == Match_MnemonicFail) { 4668 return Error(IDLoc, "invalid instruction mnemonic '" + Mnemonic + "'", 4669 Op.getLocRange(), MatchingInlineAsm); 4670 } 4671 4672 unsigned NumSuccessfulMatches = llvm::count(Match, Match_Success); 4673 4674 // If matching was ambiguous and we had size information from the frontend, 4675 // try again with that. This handles cases like "movxz eax, m8/m16". 4676 if (UnsizedMemOp && NumSuccessfulMatches > 1 && 4677 UnsizedMemOp->getMemFrontendSize()) { 4678 UnsizedMemOp->Mem.Size = UnsizedMemOp->getMemFrontendSize(); 4679 unsigned M = MatchInstruction( 4680 Operands, Inst, ErrorInfo, MissingFeatures, MatchingInlineAsm, 4681 isParsingIntelSyntax()); 4682 if (M == Match_Success) 4683 NumSuccessfulMatches = 1; 4684 4685 // Add a rewrite that encodes the size information we used from the 4686 // frontend. 4687 InstInfo->AsmRewrites->emplace_back( 4688 AOK_SizeDirective, UnsizedMemOp->getStartLoc(), 4689 /*Len=*/0, UnsizedMemOp->getMemFrontendSize()); 4690 } 4691 4692 // If exactly one matched, then we treat that as a successful match (and the 4693 // instruction will already have been filled in correctly, since the failing 4694 // matches won't have modified it). 4695 if (NumSuccessfulMatches == 1) { 4696 if (!MatchingInlineAsm && validateInstruction(Inst, Operands)) 4697 return true; 4698 // Some instructions need post-processing to, for example, tweak which 4699 // encoding is selected. Loop on it while changes happen so the individual 4700 // transformations can chain off each other. 4701 if (!MatchingInlineAsm) 4702 while (processInstruction(Inst, Operands)) 4703 ; 4704 Inst.setLoc(IDLoc); 4705 if (!MatchingInlineAsm) 4706 emitInstruction(Inst, Operands, Out); 4707 Opcode = Inst.getOpcode(); 4708 return false; 4709 } else if (NumSuccessfulMatches > 1) { 4710 assert(UnsizedMemOp && 4711 "multiple matches only possible with unsized memory operands"); 4712 return Error(UnsizedMemOp->getStartLoc(), 4713 "ambiguous operand size for instruction '" + Mnemonic + "\'", 4714 UnsizedMemOp->getLocRange()); 4715 } 4716 4717 // If one instruction matched as unsupported, report this as unsupported. 4718 if (llvm::count(Match, Match_Unsupported) == 1) { 4719 return Error(IDLoc, "unsupported instruction", EmptyRange, 4720 MatchingInlineAsm); 4721 } 4722 4723 // If one instruction matched with a missing feature, report this as a 4724 // missing feature. 4725 if (llvm::count(Match, Match_MissingFeature) == 1) { 4726 ErrorInfo = Match_MissingFeature; 4727 return ErrorMissingFeature(IDLoc, ErrorInfoMissingFeatures, 4728 MatchingInlineAsm); 4729 } 4730 4731 // If one instruction matched with an invalid operand, report this as an 4732 // operand failure. 4733 if (llvm::count(Match, Match_InvalidOperand) == 1) { 4734 return Error(IDLoc, "invalid operand for instruction", EmptyRange, 4735 MatchingInlineAsm); 4736 } 4737 4738 if (llvm::count(Match, Match_InvalidImmUnsignedi4) == 1) { 4739 SMLoc ErrorLoc = ((X86Operand &)*Operands[ErrorInfo]).getStartLoc(); 4740 if (ErrorLoc == SMLoc()) 4741 ErrorLoc = IDLoc; 4742 return Error(ErrorLoc, "immediate must be an integer in range [0, 15]", 4743 EmptyRange, MatchingInlineAsm); 4744 } 4745 4746 // If all of these were an outright failure, report it in a useless way. 4747 return Error(IDLoc, "unknown instruction mnemonic", EmptyRange, 4748 MatchingInlineAsm); 4749 } 4750 4751 bool X86AsmParser::OmitRegisterFromClobberLists(unsigned RegNo) { 4752 return X86MCRegisterClasses[X86::SEGMENT_REGRegClassID].contains(RegNo); 4753 } 4754 4755 bool X86AsmParser::ParseDirective(AsmToken DirectiveID) { 4756 MCAsmParser &Parser = getParser(); 4757 StringRef IDVal = DirectiveID.getIdentifier(); 4758 if (IDVal.startswith(".arch")) 4759 return parseDirectiveArch(); 4760 if (IDVal.startswith(".code")) 4761 return ParseDirectiveCode(IDVal, DirectiveID.getLoc()); 4762 else if (IDVal.startswith(".att_syntax")) { 4763 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4764 if (Parser.getTok().getString() == "prefix") 4765 Parser.Lex(); 4766 else if (Parser.getTok().getString() == "noprefix") 4767 return Error(DirectiveID.getLoc(), "'.att_syntax noprefix' is not " 4768 "supported: registers must have a " 4769 "'%' prefix in .att_syntax"); 4770 } 4771 getParser().setAssemblerDialect(0); 4772 return false; 4773 } else if (IDVal.startswith(".intel_syntax")) { 4774 getParser().setAssemblerDialect(1); 4775 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4776 if (Parser.getTok().getString() == "noprefix") 4777 Parser.Lex(); 4778 else if (Parser.getTok().getString() == "prefix") 4779 return Error(DirectiveID.getLoc(), "'.intel_syntax prefix' is not " 4780 "supported: registers must not have " 4781 "a '%' prefix in .intel_syntax"); 4782 } 4783 return false; 4784 } else if (IDVal == ".nops") 4785 return parseDirectiveNops(DirectiveID.getLoc()); 4786 else if (IDVal == ".even") 4787 return parseDirectiveEven(DirectiveID.getLoc()); 4788 else if (IDVal == ".cv_fpo_proc") 4789 return parseDirectiveFPOProc(DirectiveID.getLoc()); 4790 else if (IDVal == ".cv_fpo_setframe") 4791 return parseDirectiveFPOSetFrame(DirectiveID.getLoc()); 4792 else if (IDVal == ".cv_fpo_pushreg") 4793 return parseDirectiveFPOPushReg(DirectiveID.getLoc()); 4794 else if (IDVal == ".cv_fpo_stackalloc") 4795 return parseDirectiveFPOStackAlloc(DirectiveID.getLoc()); 4796 else if (IDVal == ".cv_fpo_stackalign") 4797 return parseDirectiveFPOStackAlign(DirectiveID.getLoc()); 4798 else if (IDVal == ".cv_fpo_endprologue") 4799 return parseDirectiveFPOEndPrologue(DirectiveID.getLoc()); 4800 else if (IDVal == ".cv_fpo_endproc") 4801 return parseDirectiveFPOEndProc(DirectiveID.getLoc()); 4802 else if (IDVal == ".seh_pushreg" || 4803 (Parser.isParsingMasm() && IDVal.equals_insensitive(".pushreg"))) 4804 return parseDirectiveSEHPushReg(DirectiveID.getLoc()); 4805 else if (IDVal == ".seh_setframe" || 4806 (Parser.isParsingMasm() && IDVal.equals_insensitive(".setframe"))) 4807 return parseDirectiveSEHSetFrame(DirectiveID.getLoc()); 4808 else if (IDVal == ".seh_savereg" || 4809 (Parser.isParsingMasm() && IDVal.equals_insensitive(".savereg"))) 4810 return parseDirectiveSEHSaveReg(DirectiveID.getLoc()); 4811 else if (IDVal == ".seh_savexmm" || 4812 (Parser.isParsingMasm() && IDVal.equals_insensitive(".savexmm128"))) 4813 return parseDirectiveSEHSaveXMM(DirectiveID.getLoc()); 4814 else if (IDVal == ".seh_pushframe" || 4815 (Parser.isParsingMasm() && IDVal.equals_insensitive(".pushframe"))) 4816 return parseDirectiveSEHPushFrame(DirectiveID.getLoc()); 4817 4818 return true; 4819 } 4820 4821 bool X86AsmParser::parseDirectiveArch() { 4822 // Ignore .arch for now. 4823 getParser().parseStringToEndOfStatement(); 4824 return false; 4825 } 4826 4827 /// parseDirectiveNops 4828 /// ::= .nops size[, control] 4829 bool X86AsmParser::parseDirectiveNops(SMLoc L) { 4830 int64_t NumBytes = 0, Control = 0; 4831 SMLoc NumBytesLoc, ControlLoc; 4832 const MCSubtargetInfo& STI = getSTI(); 4833 NumBytesLoc = getTok().getLoc(); 4834 if (getParser().checkForValidSection() || 4835 getParser().parseAbsoluteExpression(NumBytes)) 4836 return true; 4837 4838 if (parseOptionalToken(AsmToken::Comma)) { 4839 ControlLoc = getTok().getLoc(); 4840 if (getParser().parseAbsoluteExpression(Control)) 4841 return true; 4842 } 4843 if (getParser().parseToken(AsmToken::EndOfStatement, 4844 "unexpected token in '.nops' directive")) 4845 return true; 4846 4847 if (NumBytes <= 0) { 4848 Error(NumBytesLoc, "'.nops' directive with non-positive size"); 4849 return false; 4850 } 4851 4852 if (Control < 0) { 4853 Error(ControlLoc, "'.nops' directive with negative NOP size"); 4854 return false; 4855 } 4856 4857 /// Emit nops 4858 getParser().getStreamer().emitNops(NumBytes, Control, L, STI); 4859 4860 return false; 4861 } 4862 4863 /// parseDirectiveEven 4864 /// ::= .even 4865 bool X86AsmParser::parseDirectiveEven(SMLoc L) { 4866 if (parseToken(AsmToken::EndOfStatement, "unexpected token in directive")) 4867 return false; 4868 4869 const MCSection *Section = getStreamer().getCurrentSectionOnly(); 4870 if (!Section) { 4871 getStreamer().initSections(false, getSTI()); 4872 Section = getStreamer().getCurrentSectionOnly(); 4873 } 4874 if (Section->UseCodeAlign()) 4875 getStreamer().emitCodeAlignment(2, &getSTI(), 0); 4876 else 4877 getStreamer().emitValueToAlignment(2, 0, 1, 0); 4878 return false; 4879 } 4880 4881 /// ParseDirectiveCode 4882 /// ::= .code16 | .code32 | .code64 4883 bool X86AsmParser::ParseDirectiveCode(StringRef IDVal, SMLoc L) { 4884 MCAsmParser &Parser = getParser(); 4885 Code16GCC = false; 4886 if (IDVal == ".code16") { 4887 Parser.Lex(); 4888 if (!is16BitMode()) { 4889 SwitchMode(X86::Mode16Bit); 4890 getParser().getStreamer().emitAssemblerFlag(MCAF_Code16); 4891 } 4892 } else if (IDVal == ".code16gcc") { 4893 // .code16gcc parses as if in 32-bit mode, but emits code in 16-bit mode. 4894 Parser.Lex(); 4895 Code16GCC = true; 4896 if (!is16BitMode()) { 4897 SwitchMode(X86::Mode16Bit); 4898 getParser().getStreamer().emitAssemblerFlag(MCAF_Code16); 4899 } 4900 } else if (IDVal == ".code32") { 4901 Parser.Lex(); 4902 if (!is32BitMode()) { 4903 SwitchMode(X86::Mode32Bit); 4904 getParser().getStreamer().emitAssemblerFlag(MCAF_Code32); 4905 } 4906 } else if (IDVal == ".code64") { 4907 Parser.Lex(); 4908 if (!is64BitMode()) { 4909 SwitchMode(X86::Mode64Bit); 4910 getParser().getStreamer().emitAssemblerFlag(MCAF_Code64); 4911 } 4912 } else { 4913 Error(L, "unknown directive " + IDVal); 4914 return false; 4915 } 4916 4917 return false; 4918 } 4919 4920 // .cv_fpo_proc foo 4921 bool X86AsmParser::parseDirectiveFPOProc(SMLoc L) { 4922 MCAsmParser &Parser = getParser(); 4923 StringRef ProcName; 4924 int64_t ParamsSize; 4925 if (Parser.parseIdentifier(ProcName)) 4926 return Parser.TokError("expected symbol name"); 4927 if (Parser.parseIntToken(ParamsSize, "expected parameter byte count")) 4928 return true; 4929 if (!isUIntN(32, ParamsSize)) 4930 return Parser.TokError("parameters size out of range"); 4931 if (parseEOL()) 4932 return true; 4933 MCSymbol *ProcSym = getContext().getOrCreateSymbol(ProcName); 4934 return getTargetStreamer().emitFPOProc(ProcSym, ParamsSize, L); 4935 } 4936 4937 // .cv_fpo_setframe ebp 4938 bool X86AsmParser::parseDirectiveFPOSetFrame(SMLoc L) { 4939 unsigned Reg; 4940 SMLoc DummyLoc; 4941 if (ParseRegister(Reg, DummyLoc, DummyLoc) || parseEOL()) 4942 return true; 4943 return getTargetStreamer().emitFPOSetFrame(Reg, L); 4944 } 4945 4946 // .cv_fpo_pushreg ebx 4947 bool X86AsmParser::parseDirectiveFPOPushReg(SMLoc L) { 4948 unsigned Reg; 4949 SMLoc DummyLoc; 4950 if (ParseRegister(Reg, DummyLoc, DummyLoc) || parseEOL()) 4951 return true; 4952 return getTargetStreamer().emitFPOPushReg(Reg, L); 4953 } 4954 4955 // .cv_fpo_stackalloc 20 4956 bool X86AsmParser::parseDirectiveFPOStackAlloc(SMLoc L) { 4957 MCAsmParser &Parser = getParser(); 4958 int64_t Offset; 4959 if (Parser.parseIntToken(Offset, "expected offset") || parseEOL()) 4960 return true; 4961 return getTargetStreamer().emitFPOStackAlloc(Offset, L); 4962 } 4963 4964 // .cv_fpo_stackalign 8 4965 bool X86AsmParser::parseDirectiveFPOStackAlign(SMLoc L) { 4966 MCAsmParser &Parser = getParser(); 4967 int64_t Offset; 4968 if (Parser.parseIntToken(Offset, "expected offset") || parseEOL()) 4969 return true; 4970 return getTargetStreamer().emitFPOStackAlign(Offset, L); 4971 } 4972 4973 // .cv_fpo_endprologue 4974 bool X86AsmParser::parseDirectiveFPOEndPrologue(SMLoc L) { 4975 MCAsmParser &Parser = getParser(); 4976 if (Parser.parseEOL()) 4977 return true; 4978 return getTargetStreamer().emitFPOEndPrologue(L); 4979 } 4980 4981 // .cv_fpo_endproc 4982 bool X86AsmParser::parseDirectiveFPOEndProc(SMLoc L) { 4983 MCAsmParser &Parser = getParser(); 4984 if (Parser.parseEOL()) 4985 return true; 4986 return getTargetStreamer().emitFPOEndProc(L); 4987 } 4988 4989 bool X86AsmParser::parseSEHRegisterNumber(unsigned RegClassID, 4990 unsigned &RegNo) { 4991 SMLoc startLoc = getLexer().getLoc(); 4992 const MCRegisterInfo *MRI = getContext().getRegisterInfo(); 4993 4994 // Try parsing the argument as a register first. 4995 if (getLexer().getTok().isNot(AsmToken::Integer)) { 4996 SMLoc endLoc; 4997 if (ParseRegister(RegNo, startLoc, endLoc)) 4998 return true; 4999 5000 if (!X86MCRegisterClasses[RegClassID].contains(RegNo)) { 5001 return Error(startLoc, 5002 "register is not supported for use with this directive"); 5003 } 5004 } else { 5005 // Otherwise, an integer number matching the encoding of the desired 5006 // register may appear. 5007 int64_t EncodedReg; 5008 if (getParser().parseAbsoluteExpression(EncodedReg)) 5009 return true; 5010 5011 // The SEH register number is the same as the encoding register number. Map 5012 // from the encoding back to the LLVM register number. 5013 RegNo = 0; 5014 for (MCPhysReg Reg : X86MCRegisterClasses[RegClassID]) { 5015 if (MRI->getEncodingValue(Reg) == EncodedReg) { 5016 RegNo = Reg; 5017 break; 5018 } 5019 } 5020 if (RegNo == 0) { 5021 return Error(startLoc, 5022 "incorrect register number for use with this directive"); 5023 } 5024 } 5025 5026 return false; 5027 } 5028 5029 bool X86AsmParser::parseDirectiveSEHPushReg(SMLoc Loc) { 5030 unsigned Reg = 0; 5031 if (parseSEHRegisterNumber(X86::GR64RegClassID, Reg)) 5032 return true; 5033 5034 if (getLexer().isNot(AsmToken::EndOfStatement)) 5035 return TokError("unexpected token in directive"); 5036 5037 getParser().Lex(); 5038 getStreamer().EmitWinCFIPushReg(Reg, Loc); 5039 return false; 5040 } 5041 5042 bool X86AsmParser::parseDirectiveSEHSetFrame(SMLoc Loc) { 5043 unsigned Reg = 0; 5044 int64_t Off; 5045 if (parseSEHRegisterNumber(X86::GR64RegClassID, Reg)) 5046 return true; 5047 if (getLexer().isNot(AsmToken::Comma)) 5048 return TokError("you must specify a stack pointer offset"); 5049 5050 getParser().Lex(); 5051 if (getParser().parseAbsoluteExpression(Off)) 5052 return true; 5053 5054 if (getLexer().isNot(AsmToken::EndOfStatement)) 5055 return TokError("unexpected token in directive"); 5056 5057 getParser().Lex(); 5058 getStreamer().EmitWinCFISetFrame(Reg, Off, Loc); 5059 return false; 5060 } 5061 5062 bool X86AsmParser::parseDirectiveSEHSaveReg(SMLoc Loc) { 5063 unsigned Reg = 0; 5064 int64_t Off; 5065 if (parseSEHRegisterNumber(X86::GR64RegClassID, Reg)) 5066 return true; 5067 if (getLexer().isNot(AsmToken::Comma)) 5068 return TokError("you must specify an offset on the stack"); 5069 5070 getParser().Lex(); 5071 if (getParser().parseAbsoluteExpression(Off)) 5072 return true; 5073 5074 if (getLexer().isNot(AsmToken::EndOfStatement)) 5075 return TokError("unexpected token in directive"); 5076 5077 getParser().Lex(); 5078 getStreamer().EmitWinCFISaveReg(Reg, Off, Loc); 5079 return false; 5080 } 5081 5082 bool X86AsmParser::parseDirectiveSEHSaveXMM(SMLoc Loc) { 5083 unsigned Reg = 0; 5084 int64_t Off; 5085 if (parseSEHRegisterNumber(X86::VR128XRegClassID, Reg)) 5086 return true; 5087 if (getLexer().isNot(AsmToken::Comma)) 5088 return TokError("you must specify an offset on the stack"); 5089 5090 getParser().Lex(); 5091 if (getParser().parseAbsoluteExpression(Off)) 5092 return true; 5093 5094 if (getLexer().isNot(AsmToken::EndOfStatement)) 5095 return TokError("unexpected token in directive"); 5096 5097 getParser().Lex(); 5098 getStreamer().EmitWinCFISaveXMM(Reg, Off, Loc); 5099 return false; 5100 } 5101 5102 bool X86AsmParser::parseDirectiveSEHPushFrame(SMLoc Loc) { 5103 bool Code = false; 5104 StringRef CodeID; 5105 if (getLexer().is(AsmToken::At)) { 5106 SMLoc startLoc = getLexer().getLoc(); 5107 getParser().Lex(); 5108 if (!getParser().parseIdentifier(CodeID)) { 5109 if (CodeID != "code") 5110 return Error(startLoc, "expected @code"); 5111 Code = true; 5112 } 5113 } 5114 5115 if (getLexer().isNot(AsmToken::EndOfStatement)) 5116 return TokError("unexpected token in directive"); 5117 5118 getParser().Lex(); 5119 getStreamer().EmitWinCFIPushFrame(Code, Loc); 5120 return false; 5121 } 5122 5123 // Force static initialization. 5124 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86AsmParser() { 5125 RegisterMCAsmParser<X86AsmParser> X(getTheX86_32Target()); 5126 RegisterMCAsmParser<X86AsmParser> Y(getTheX86_64Target()); 5127 } 5128 5129 #define GET_REGISTER_MATCHER 5130 #define GET_MATCHER_IMPLEMENTATION 5131 #define GET_SUBTARGET_FEATURE_NAME 5132 #include "X86GenAsmMatcher.inc" 5133