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