1 //===-- PPCAsmParser.cpp - Parse PowerPC asm to MCInst instructions -------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "MCTargetDesc/PPCMCExpr.h" 10 #include "MCTargetDesc/PPCMCTargetDesc.h" 11 #include "PPCInstrInfo.h" 12 #include "PPCTargetStreamer.h" 13 #include "TargetInfo/PowerPCTargetInfo.h" 14 #include "llvm/ADT/STLExtras.h" 15 #include "llvm/ADT/Twine.h" 16 #include "llvm/MC/MCContext.h" 17 #include "llvm/MC/MCExpr.h" 18 #include "llvm/MC/MCInst.h" 19 #include "llvm/MC/MCInstrInfo.h" 20 #include "llvm/MC/MCParser/MCAsmLexer.h" 21 #include "llvm/MC/MCParser/MCAsmParser.h" 22 #include "llvm/MC/MCParser/MCParsedAsmOperand.h" 23 #include "llvm/MC/MCParser/MCTargetAsmParser.h" 24 #include "llvm/MC/MCStreamer.h" 25 #include "llvm/MC/MCSubtargetInfo.h" 26 #include "llvm/MC/MCSymbolELF.h" 27 #include "llvm/MC/TargetRegistry.h" 28 #include "llvm/Support/SourceMgr.h" 29 #include "llvm/Support/raw_ostream.h" 30 31 using namespace llvm; 32 33 DEFINE_PPC_REGCLASSES 34 35 // Evaluate an expression containing condition register 36 // or condition register field symbols. Returns positive 37 // value on success, or -1 on error. 38 static int64_t 39 EvaluateCRExpr(const MCExpr *E) { 40 switch (E->getKind()) { 41 case MCExpr::Target: 42 return -1; 43 44 case MCExpr::Constant: { 45 int64_t Res = cast<MCConstantExpr>(E)->getValue(); 46 return Res < 0 ? -1 : Res; 47 } 48 49 case MCExpr::SymbolRef: { 50 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 51 StringRef Name = SRE->getSymbol().getName(); 52 53 if (Name == "lt") return 0; 54 if (Name == "gt") return 1; 55 if (Name == "eq") return 2; 56 if (Name == "so") return 3; 57 if (Name == "un") return 3; 58 59 if (Name == "cr0") return 0; 60 if (Name == "cr1") return 1; 61 if (Name == "cr2") return 2; 62 if (Name == "cr3") return 3; 63 if (Name == "cr4") return 4; 64 if (Name == "cr5") return 5; 65 if (Name == "cr6") return 6; 66 if (Name == "cr7") return 7; 67 68 return -1; 69 } 70 71 case MCExpr::Unary: 72 return -1; 73 74 case MCExpr::Binary: { 75 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 76 int64_t LHSVal = EvaluateCRExpr(BE->getLHS()); 77 int64_t RHSVal = EvaluateCRExpr(BE->getRHS()); 78 int64_t Res; 79 80 if (LHSVal < 0 || RHSVal < 0) 81 return -1; 82 83 switch (BE->getOpcode()) { 84 default: return -1; 85 case MCBinaryExpr::Add: Res = LHSVal + RHSVal; break; 86 case MCBinaryExpr::Mul: Res = LHSVal * RHSVal; break; 87 } 88 89 return Res < 0 ? -1 : Res; 90 } 91 } 92 93 llvm_unreachable("Invalid expression kind!"); 94 } 95 96 namespace { 97 98 struct PPCOperand; 99 100 class PPCAsmParser : public MCTargetAsmParser { 101 const bool IsPPC64; 102 103 void Warning(SMLoc L, const Twine &Msg) { getParser().Warning(L, Msg); } 104 105 bool isPPC64() const { return IsPPC64; } 106 107 MCRegister matchRegisterName(int64_t &IntVal); 108 109 bool parseRegister(MCRegister &Reg, SMLoc &StartLoc, SMLoc &EndLoc) override; 110 ParseStatus tryParseRegister(MCRegister &Reg, SMLoc &StartLoc, 111 SMLoc &EndLoc) override; 112 113 const MCExpr *extractModifierFromExpr(const MCExpr *E, 114 PPCMCExpr::VariantKind &Variant); 115 const MCExpr *fixupVariantKind(const MCExpr *E); 116 bool parseExpression(const MCExpr *&EVal); 117 118 bool parseOperand(OperandVector &Operands); 119 120 bool parseDirectiveWord(unsigned Size, AsmToken ID); 121 bool parseDirectiveTC(unsigned Size, AsmToken ID); 122 bool parseDirectiveMachine(SMLoc L); 123 bool parseDirectiveAbiVersion(SMLoc L); 124 bool parseDirectiveLocalEntry(SMLoc L); 125 bool parseGNUAttribute(SMLoc L); 126 127 bool matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 128 OperandVector &Operands, MCStreamer &Out, 129 uint64_t &ErrorInfo, 130 bool MatchingInlineAsm) override; 131 132 void processInstruction(MCInst &Inst, const OperandVector &Ops); 133 134 /// @name Auto-generated Match Functions 135 /// { 136 137 #define GET_ASSEMBLER_HEADER 138 #include "PPCGenAsmMatcher.inc" 139 140 /// } 141 142 143 public: 144 PPCAsmParser(const MCSubtargetInfo &STI, MCAsmParser &, 145 const MCInstrInfo &MII, const MCTargetOptions &Options) 146 : MCTargetAsmParser(Options, STI, MII), 147 IsPPC64(STI.getTargetTriple().isPPC64()) { 148 // Initialize the set of available features. 149 setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); 150 } 151 152 bool parseInstruction(ParseInstructionInfo &Info, StringRef Name, 153 SMLoc NameLoc, OperandVector &Operands) override; 154 155 bool ParseDirective(AsmToken DirectiveID) override; 156 157 unsigned validateTargetOperandClass(MCParsedAsmOperand &Op, 158 unsigned Kind) override; 159 160 const MCExpr *applyModifierToExpr(const MCExpr *E, 161 MCSymbolRefExpr::VariantKind, 162 MCContext &Ctx) override; 163 }; 164 165 /// PPCOperand - Instances of this class represent a parsed PowerPC machine 166 /// instruction. 167 struct PPCOperand : public MCParsedAsmOperand { 168 enum KindTy { 169 Token, 170 Immediate, 171 ContextImmediate, 172 Expression, 173 TLSRegister 174 } Kind; 175 176 SMLoc StartLoc, EndLoc; 177 bool IsPPC64; 178 179 struct TokOp { 180 const char *Data; 181 unsigned Length; 182 }; 183 184 struct ImmOp { 185 int64_t Val; 186 bool IsMemOpBase; 187 }; 188 189 struct ExprOp { 190 const MCExpr *Val; 191 int64_t CRVal; // Cached result of EvaluateCRExpr(Val) 192 }; 193 194 struct TLSRegOp { 195 const MCSymbolRefExpr *Sym; 196 }; 197 198 union { 199 struct TokOp Tok; 200 struct ImmOp Imm; 201 struct ExprOp Expr; 202 struct TLSRegOp TLSReg; 203 }; 204 205 PPCOperand(KindTy K) : Kind(K) {} 206 207 public: 208 PPCOperand(const PPCOperand &o) : MCParsedAsmOperand() { 209 Kind = o.Kind; 210 StartLoc = o.StartLoc; 211 EndLoc = o.EndLoc; 212 IsPPC64 = o.IsPPC64; 213 switch (Kind) { 214 case Token: 215 Tok = o.Tok; 216 break; 217 case Immediate: 218 case ContextImmediate: 219 Imm = o.Imm; 220 break; 221 case Expression: 222 Expr = o.Expr; 223 break; 224 case TLSRegister: 225 TLSReg = o.TLSReg; 226 break; 227 } 228 } 229 230 // Disable use of sized deallocation due to overallocation of PPCOperand 231 // objects in CreateTokenWithStringCopy. 232 void operator delete(void *p) { ::operator delete(p); } 233 234 /// getStartLoc - Get the location of the first token of this operand. 235 SMLoc getStartLoc() const override { return StartLoc; } 236 237 /// getEndLoc - Get the location of the last token of this operand. 238 SMLoc getEndLoc() const override { return EndLoc; } 239 240 /// getLocRange - Get the range between the first and last token of this 241 /// operand. 242 SMRange getLocRange() const { return SMRange(StartLoc, EndLoc); } 243 244 /// isPPC64 - True if this operand is for an instruction in 64-bit mode. 245 bool isPPC64() const { return IsPPC64; } 246 247 /// isMemOpBase - True if this operand is the base of a memory operand. 248 bool isMemOpBase() const { return Kind == Immediate && Imm.IsMemOpBase; } 249 250 int64_t getImm() const { 251 assert(Kind == Immediate && "Invalid access!"); 252 return Imm.Val; 253 } 254 int64_t getImmS16Context() const { 255 assert((Kind == Immediate || Kind == ContextImmediate) && 256 "Invalid access!"); 257 if (Kind == Immediate) 258 return Imm.Val; 259 return static_cast<int16_t>(Imm.Val); 260 } 261 int64_t getImmU16Context() const { 262 assert((Kind == Immediate || Kind == ContextImmediate) && 263 "Invalid access!"); 264 return Imm.Val; 265 } 266 267 const MCExpr *getExpr() const { 268 assert(Kind == Expression && "Invalid access!"); 269 return Expr.Val; 270 } 271 272 int64_t getExprCRVal() const { 273 assert(Kind == Expression && "Invalid access!"); 274 return Expr.CRVal; 275 } 276 277 const MCExpr *getTLSReg() const { 278 assert(Kind == TLSRegister && "Invalid access!"); 279 return TLSReg.Sym; 280 } 281 282 MCRegister getReg() const override { llvm_unreachable("Not implemented"); } 283 284 unsigned getRegNum() const { 285 assert(isRegNumber() && "Invalid access!"); 286 return (unsigned)Imm.Val; 287 } 288 289 unsigned getFpReg() const { 290 assert(isEvenRegNumber() && "Invalid access!"); 291 return (unsigned)(Imm.Val >> 1); 292 } 293 294 unsigned getVSReg() const { 295 assert(isVSRegNumber() && "Invalid access!"); 296 return (unsigned) Imm.Val; 297 } 298 299 unsigned getACCReg() const { 300 assert(isACCRegNumber() && "Invalid access!"); 301 return (unsigned) Imm.Val; 302 } 303 304 unsigned getDMRROWReg() const { 305 assert(isDMRROWRegNumber() && "Invalid access!"); 306 return (unsigned)Imm.Val; 307 } 308 309 unsigned getDMRROWpReg() const { 310 assert(isDMRROWpRegNumber() && "Invalid access!"); 311 return (unsigned)Imm.Val; 312 } 313 314 unsigned getDMRReg() const { 315 assert(isDMRRegNumber() && "Invalid access!"); 316 return (unsigned)Imm.Val; 317 } 318 319 unsigned getDMRpReg() const { 320 assert(isDMRpRegNumber() && "Invalid access!"); 321 return (unsigned)Imm.Val; 322 } 323 324 unsigned getVSRpEvenReg() const { 325 assert(isVSRpEvenRegNumber() && "Invalid access!"); 326 return (unsigned) Imm.Val >> 1; 327 } 328 329 unsigned getG8pReg() const { 330 assert(isEvenRegNumber() && "Invalid access!"); 331 return (unsigned)Imm.Val; 332 } 333 334 unsigned getCCReg() const { 335 assert(isCCRegNumber() && "Invalid access!"); 336 return (unsigned) (Kind == Immediate ? Imm.Val : Expr.CRVal); 337 } 338 339 unsigned getCRBit() const { 340 assert(isCRBitNumber() && "Invalid access!"); 341 return (unsigned) (Kind == Immediate ? Imm.Val : Expr.CRVal); 342 } 343 344 unsigned getCRBitMask() const { 345 assert(isCRBitMask() && "Invalid access!"); 346 return 7 - llvm::countr_zero<uint64_t>(Imm.Val); 347 } 348 349 bool isToken() const override { return Kind == Token; } 350 bool isImm() const override { 351 return Kind == Immediate || Kind == Expression; 352 } 353 bool isU1Imm() const { return Kind == Immediate && isUInt<1>(getImm()); } 354 bool isU2Imm() const { return Kind == Immediate && isUInt<2>(getImm()); } 355 bool isU3Imm() const { return Kind == Immediate && isUInt<3>(getImm()); } 356 bool isU4Imm() const { return Kind == Immediate && isUInt<4>(getImm()); } 357 bool isU5Imm() const { return Kind == Immediate && isUInt<5>(getImm()); } 358 bool isS5Imm() const { return Kind == Immediate && isInt<5>(getImm()); } 359 bool isU6Imm() const { return Kind == Immediate && isUInt<6>(getImm()); } 360 bool isU6ImmX2() const { return Kind == Immediate && 361 isUInt<6>(getImm()) && 362 (getImm() & 1) == 0; } 363 bool isU7Imm() const { return Kind == Immediate && isUInt<7>(getImm()); } 364 bool isU7ImmX4() const { return Kind == Immediate && 365 isUInt<7>(getImm()) && 366 (getImm() & 3) == 0; } 367 bool isU8Imm() const { return Kind == Immediate && isUInt<8>(getImm()); } 368 bool isU8ImmX8() const { return Kind == Immediate && 369 isUInt<8>(getImm()) && 370 (getImm() & 7) == 0; } 371 372 bool isU10Imm() const { return Kind == Immediate && isUInt<10>(getImm()); } 373 bool isU12Imm() const { return Kind == Immediate && isUInt<12>(getImm()); } 374 bool isU16Imm() const { return isExtImm<16>(/*Signed*/ false, 1); } 375 bool isS16Imm() const { return isExtImm<16>(/*Signed*/ true, 1); } 376 bool isS16ImmX4() const { return isExtImm<16>(/*Signed*/ true, 4); } 377 bool isS16ImmX16() const { return isExtImm<16>(/*Signed*/ true, 16); } 378 bool isS17Imm() const { return isExtImm<17>(/*Signed*/ true, 1); } 379 380 bool isHashImmX8() const { 381 // The Hash Imm form is used for instructions that check or store a hash. 382 // These instructions have a small immediate range that spans between 383 // -8 and -512. 384 return (Kind == Immediate && getImm() <= -8 && getImm() >= -512 && 385 (getImm() & 7) == 0); 386 } 387 388 bool isS34ImmX16() const { 389 return Kind == Expression || 390 (Kind == Immediate && isInt<34>(getImm()) && (getImm() & 15) == 0); 391 } 392 bool isS34Imm() const { 393 // Once the PC-Rel ABI is finalized, evaluate whether a 34-bit 394 // ContextImmediate is needed. 395 return Kind == Expression || (Kind == Immediate && isInt<34>(getImm())); 396 } 397 398 bool isTLSReg() const { return Kind == TLSRegister; } 399 bool isDirectBr() const { 400 if (Kind == Expression) 401 return true; 402 if (Kind != Immediate) 403 return false; 404 // Operand must be 64-bit aligned, signed 27-bit immediate. 405 if ((getImm() & 3) != 0) 406 return false; 407 if (isInt<26>(getImm())) 408 return true; 409 if (!IsPPC64) { 410 // In 32-bit mode, large 32-bit quantities wrap around. 411 if (isUInt<32>(getImm()) && isInt<26>(static_cast<int32_t>(getImm()))) 412 return true; 413 } 414 return false; 415 } 416 bool isCondBr() const { return Kind == Expression || 417 (Kind == Immediate && isInt<16>(getImm()) && 418 (getImm() & 3) == 0); } 419 bool isImmZero() const { return Kind == Immediate && getImm() == 0; } 420 bool isRegNumber() const { return Kind == Immediate && isUInt<5>(getImm()); } 421 bool isACCRegNumber() const { 422 return Kind == Immediate && isUInt<3>(getImm()); 423 } 424 bool isDMRROWRegNumber() const { 425 return Kind == Immediate && isUInt<6>(getImm()); 426 } 427 bool isDMRROWpRegNumber() const { 428 return Kind == Immediate && isUInt<5>(getImm()); 429 } 430 bool isDMRRegNumber() const { 431 return Kind == Immediate && isUInt<3>(getImm()); 432 } 433 bool isDMRpRegNumber() const { 434 return Kind == Immediate && isUInt<2>(getImm()); 435 } 436 bool isVSRpEvenRegNumber() const { 437 return Kind == Immediate && isUInt<6>(getImm()) && ((getImm() & 1) == 0); 438 } 439 bool isVSRegNumber() const { 440 return Kind == Immediate && isUInt<6>(getImm()); 441 } 442 bool isCCRegNumber() const { return (Kind == Expression 443 && isUInt<3>(getExprCRVal())) || 444 (Kind == Immediate 445 && isUInt<3>(getImm())); } 446 bool isCRBitNumber() const { return (Kind == Expression 447 && isUInt<5>(getExprCRVal())) || 448 (Kind == Immediate 449 && isUInt<5>(getImm())); } 450 451 bool isEvenRegNumber() const { return isRegNumber() && (getImm() & 1) == 0; } 452 453 bool isCRBitMask() const { 454 return Kind == Immediate && isUInt<8>(getImm()) && 455 llvm::has_single_bit<uint32_t>(getImm()); 456 } 457 bool isATBitsAsHint() const { return false; } 458 bool isMem() const override { return false; } 459 bool isReg() const override { return false; } 460 461 void addRegOperands(MCInst &Inst, unsigned N) const { 462 llvm_unreachable("addRegOperands"); 463 } 464 465 void addRegGPRCOperands(MCInst &Inst, unsigned N) const { 466 assert(N == 1 && "Invalid number of operands!"); 467 Inst.addOperand(MCOperand::createReg(RRegs[getRegNum()])); 468 } 469 470 void addRegGPRCNoR0Operands(MCInst &Inst, unsigned N) const { 471 assert(N == 1 && "Invalid number of operands!"); 472 Inst.addOperand(MCOperand::createReg(RRegsNoR0[getRegNum()])); 473 } 474 475 void addRegG8RCOperands(MCInst &Inst, unsigned N) const { 476 assert(N == 1 && "Invalid number of operands!"); 477 Inst.addOperand(MCOperand::createReg(XRegs[getRegNum()])); 478 } 479 480 void addRegG8RCNoX0Operands(MCInst &Inst, unsigned N) const { 481 assert(N == 1 && "Invalid number of operands!"); 482 Inst.addOperand(MCOperand::createReg(XRegsNoX0[getRegNum()])); 483 } 484 485 void addRegG8pRCOperands(MCInst &Inst, unsigned N) const { 486 assert(N == 1 && "Invalid number of operands!"); 487 Inst.addOperand(MCOperand::createReg(XRegs[getG8pReg()])); 488 } 489 490 void addRegGxRCOperands(MCInst &Inst, unsigned N) const { 491 if (isPPC64()) 492 addRegG8RCOperands(Inst, N); 493 else 494 addRegGPRCOperands(Inst, N); 495 } 496 497 void addRegGxRCNoR0Operands(MCInst &Inst, unsigned N) const { 498 if (isPPC64()) 499 addRegG8RCNoX0Operands(Inst, N); 500 else 501 addRegGPRCNoR0Operands(Inst, N); 502 } 503 504 void addRegF4RCOperands(MCInst &Inst, unsigned N) const { 505 assert(N == 1 && "Invalid number of operands!"); 506 Inst.addOperand(MCOperand::createReg(FRegs[getRegNum()])); 507 } 508 509 void addRegF8RCOperands(MCInst &Inst, unsigned N) const { 510 assert(N == 1 && "Invalid number of operands!"); 511 Inst.addOperand(MCOperand::createReg(FRegs[getRegNum()])); 512 } 513 514 void addRegFpRCOperands(MCInst &Inst, unsigned N) const { 515 assert(N == 1 && "Invalid number of operands!"); 516 Inst.addOperand(MCOperand::createReg(FpRegs[getFpReg()])); 517 } 518 519 void addRegVFRCOperands(MCInst &Inst, unsigned N) const { 520 assert(N == 1 && "Invalid number of operands!"); 521 Inst.addOperand(MCOperand::createReg(VFRegs[getRegNum()])); 522 } 523 524 void addRegVRRCOperands(MCInst &Inst, unsigned N) const { 525 assert(N == 1 && "Invalid number of operands!"); 526 Inst.addOperand(MCOperand::createReg(VRegs[getRegNum()])); 527 } 528 529 void addRegVSRCOperands(MCInst &Inst, unsigned N) const { 530 assert(N == 1 && "Invalid number of operands!"); 531 Inst.addOperand(MCOperand::createReg(VSRegs[getVSReg()])); 532 } 533 534 void addRegVSFRCOperands(MCInst &Inst, unsigned N) const { 535 assert(N == 1 && "Invalid number of operands!"); 536 Inst.addOperand(MCOperand::createReg(VSFRegs[getVSReg()])); 537 } 538 539 void addRegVSSRCOperands(MCInst &Inst, unsigned N) const { 540 assert(N == 1 && "Invalid number of operands!"); 541 Inst.addOperand(MCOperand::createReg(VSSRegs[getVSReg()])); 542 } 543 544 void addRegSPE4RCOperands(MCInst &Inst, unsigned N) const { 545 assert(N == 1 && "Invalid number of operands!"); 546 Inst.addOperand(MCOperand::createReg(RRegs[getRegNum()])); 547 } 548 549 void addRegSPERCOperands(MCInst &Inst, unsigned N) const { 550 assert(N == 1 && "Invalid number of operands!"); 551 Inst.addOperand(MCOperand::createReg(SPERegs[getRegNum()])); 552 } 553 554 void addRegACCRCOperands(MCInst &Inst, unsigned N) const { 555 assert(N == 1 && "Invalid number of operands!"); 556 Inst.addOperand(MCOperand::createReg(ACCRegs[getACCReg()])); 557 } 558 559 void addRegDMRROWRCOperands(MCInst &Inst, unsigned N) const { 560 assert(N == 1 && "Invalid number of operands!"); 561 Inst.addOperand(MCOperand::createReg(DMRROWRegs[getDMRROWReg()])); 562 } 563 564 void addRegDMRROWpRCOperands(MCInst &Inst, unsigned N) const { 565 assert(N == 1 && "Invalid number of operands!"); 566 Inst.addOperand(MCOperand::createReg(DMRROWpRegs[getDMRROWpReg()])); 567 } 568 569 void addRegDMRRCOperands(MCInst &Inst, unsigned N) const { 570 assert(N == 1 && "Invalid number of operands!"); 571 Inst.addOperand(MCOperand::createReg(DMRRegs[getDMRReg()])); 572 } 573 574 void addRegDMRpRCOperands(MCInst &Inst, unsigned N) const { 575 assert(N == 1 && "Invalid number of operands!"); 576 Inst.addOperand(MCOperand::createReg(DMRpRegs[getDMRpReg()])); 577 } 578 579 void addRegWACCRCOperands(MCInst &Inst, unsigned N) const { 580 assert(N == 1 && "Invalid number of operands!"); 581 Inst.addOperand(MCOperand::createReg(WACCRegs[getACCReg()])); 582 } 583 584 void addRegWACC_HIRCOperands(MCInst &Inst, unsigned N) const { 585 assert(N == 1 && "Invalid number of operands!"); 586 Inst.addOperand(MCOperand::createReg(WACC_HIRegs[getACCReg()])); 587 } 588 589 void addRegVSRpRCOperands(MCInst &Inst, unsigned N) const { 590 assert(N == 1 && "Invalid number of operands!"); 591 Inst.addOperand(MCOperand::createReg(VSRpRegs[getVSRpEvenReg()])); 592 } 593 594 void addRegVSRpEvenRCOperands(MCInst &Inst, unsigned N) const { 595 assert(N == 1 && "Invalid number of operands!"); 596 Inst.addOperand(MCOperand::createReg(VSRpRegs[getVSRpEvenReg()])); 597 } 598 599 void addRegCRBITRCOperands(MCInst &Inst, unsigned N) const { 600 assert(N == 1 && "Invalid number of operands!"); 601 Inst.addOperand(MCOperand::createReg(CRBITRegs[getCRBit()])); 602 } 603 604 void addRegCRRCOperands(MCInst &Inst, unsigned N) const { 605 assert(N == 1 && "Invalid number of operands!"); 606 Inst.addOperand(MCOperand::createReg(CRRegs[getCCReg()])); 607 } 608 609 void addCRBitMaskOperands(MCInst &Inst, unsigned N) const { 610 assert(N == 1 && "Invalid number of operands!"); 611 Inst.addOperand(MCOperand::createReg(CRRegs[getCRBitMask()])); 612 } 613 614 void addImmOperands(MCInst &Inst, unsigned N) const { 615 assert(N == 1 && "Invalid number of operands!"); 616 if (Kind == Immediate) 617 Inst.addOperand(MCOperand::createImm(getImm())); 618 else 619 Inst.addOperand(MCOperand::createExpr(getExpr())); 620 } 621 622 void addS16ImmOperands(MCInst &Inst, unsigned N) const { 623 assert(N == 1 && "Invalid number of operands!"); 624 switch (Kind) { 625 case Immediate: 626 Inst.addOperand(MCOperand::createImm(getImm())); 627 break; 628 case ContextImmediate: 629 Inst.addOperand(MCOperand::createImm(getImmS16Context())); 630 break; 631 default: 632 Inst.addOperand(MCOperand::createExpr(getExpr())); 633 break; 634 } 635 } 636 637 void addU16ImmOperands(MCInst &Inst, unsigned N) const { 638 assert(N == 1 && "Invalid number of operands!"); 639 switch (Kind) { 640 case Immediate: 641 Inst.addOperand(MCOperand::createImm(getImm())); 642 break; 643 case ContextImmediate: 644 Inst.addOperand(MCOperand::createImm(getImmU16Context())); 645 break; 646 default: 647 Inst.addOperand(MCOperand::createExpr(getExpr())); 648 break; 649 } 650 } 651 652 void addBranchTargetOperands(MCInst &Inst, unsigned N) const { 653 assert(N == 1 && "Invalid number of operands!"); 654 if (Kind == Immediate) 655 Inst.addOperand(MCOperand::createImm(getImm() / 4)); 656 else 657 Inst.addOperand(MCOperand::createExpr(getExpr())); 658 } 659 660 void addTLSRegOperands(MCInst &Inst, unsigned N) const { 661 assert(N == 1 && "Invalid number of operands!"); 662 Inst.addOperand(MCOperand::createExpr(getTLSReg())); 663 } 664 665 StringRef getToken() const { 666 assert(Kind == Token && "Invalid access!"); 667 return StringRef(Tok.Data, Tok.Length); 668 } 669 670 void print(raw_ostream &OS) const override; 671 672 static std::unique_ptr<PPCOperand> CreateToken(StringRef Str, SMLoc S, 673 bool IsPPC64) { 674 auto Op = std::make_unique<PPCOperand>(Token); 675 Op->Tok.Data = Str.data(); 676 Op->Tok.Length = Str.size(); 677 Op->StartLoc = S; 678 Op->EndLoc = S; 679 Op->IsPPC64 = IsPPC64; 680 return Op; 681 } 682 683 static std::unique_ptr<PPCOperand> 684 CreateTokenWithStringCopy(StringRef Str, SMLoc S, bool IsPPC64) { 685 // Allocate extra memory for the string and copy it. 686 // FIXME: This is incorrect, Operands are owned by unique_ptr with a default 687 // deleter which will destroy them by simply using "delete", not correctly 688 // calling operator delete on this extra memory after calling the dtor 689 // explicitly. 690 void *Mem = ::operator new(sizeof(PPCOperand) + Str.size()); 691 std::unique_ptr<PPCOperand> Op(new (Mem) PPCOperand(Token)); 692 Op->Tok.Data = reinterpret_cast<const char *>(Op.get() + 1); 693 Op->Tok.Length = Str.size(); 694 std::memcpy(const_cast<char *>(Op->Tok.Data), Str.data(), Str.size()); 695 Op->StartLoc = S; 696 Op->EndLoc = S; 697 Op->IsPPC64 = IsPPC64; 698 return Op; 699 } 700 701 static std::unique_ptr<PPCOperand> CreateImm(int64_t Val, SMLoc S, SMLoc E, 702 bool IsPPC64, 703 bool IsMemOpBase = false) { 704 auto Op = std::make_unique<PPCOperand>(Immediate); 705 Op->Imm.Val = Val; 706 Op->Imm.IsMemOpBase = IsMemOpBase; 707 Op->StartLoc = S; 708 Op->EndLoc = E; 709 Op->IsPPC64 = IsPPC64; 710 return Op; 711 } 712 713 static std::unique_ptr<PPCOperand> CreateExpr(const MCExpr *Val, SMLoc S, 714 SMLoc E, bool IsPPC64) { 715 auto Op = std::make_unique<PPCOperand>(Expression); 716 Op->Expr.Val = Val; 717 Op->Expr.CRVal = EvaluateCRExpr(Val); 718 Op->StartLoc = S; 719 Op->EndLoc = E; 720 Op->IsPPC64 = IsPPC64; 721 return Op; 722 } 723 724 static std::unique_ptr<PPCOperand> 725 CreateTLSReg(const MCSymbolRefExpr *Sym, SMLoc S, SMLoc E, bool IsPPC64) { 726 auto Op = std::make_unique<PPCOperand>(TLSRegister); 727 Op->TLSReg.Sym = Sym; 728 Op->StartLoc = S; 729 Op->EndLoc = E; 730 Op->IsPPC64 = IsPPC64; 731 return Op; 732 } 733 734 static std::unique_ptr<PPCOperand> 735 CreateContextImm(int64_t Val, SMLoc S, SMLoc E, bool IsPPC64) { 736 auto Op = std::make_unique<PPCOperand>(ContextImmediate); 737 Op->Imm.Val = Val; 738 Op->StartLoc = S; 739 Op->EndLoc = E; 740 Op->IsPPC64 = IsPPC64; 741 return Op; 742 } 743 744 static std::unique_ptr<PPCOperand> 745 CreateFromMCExpr(const MCExpr *Val, SMLoc S, SMLoc E, bool IsPPC64) { 746 if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Val)) 747 return CreateImm(CE->getValue(), S, E, IsPPC64); 748 749 if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Val)) 750 if (SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS || 751 SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS_PCREL) 752 return CreateTLSReg(SRE, S, E, IsPPC64); 753 754 if (const PPCMCExpr *TE = dyn_cast<PPCMCExpr>(Val)) { 755 int64_t Res; 756 if (TE->evaluateAsConstant(Res)) 757 return CreateContextImm(Res, S, E, IsPPC64); 758 } 759 760 return CreateExpr(Val, S, E, IsPPC64); 761 } 762 763 private: 764 template <unsigned Width> 765 bool isExtImm(bool Signed, unsigned Multiple) const { 766 switch (Kind) { 767 default: 768 return false; 769 case Expression: 770 return true; 771 case Immediate: 772 case ContextImmediate: 773 if (Signed) 774 return isInt<Width>(getImmS16Context()) && 775 (getImmS16Context() & (Multiple - 1)) == 0; 776 else 777 return isUInt<Width>(getImmU16Context()) && 778 (getImmU16Context() & (Multiple - 1)) == 0; 779 } 780 } 781 }; 782 783 } // end anonymous namespace. 784 785 void PPCOperand::print(raw_ostream &OS) const { 786 switch (Kind) { 787 case Token: 788 OS << "'" << getToken() << "'"; 789 break; 790 case Immediate: 791 case ContextImmediate: 792 OS << getImm(); 793 break; 794 case Expression: 795 OS << *getExpr(); 796 break; 797 case TLSRegister: 798 OS << *getTLSReg(); 799 break; 800 } 801 } 802 803 static void 804 addNegOperand(MCInst &Inst, MCOperand &Op, MCContext &Ctx) { 805 if (Op.isImm()) { 806 Inst.addOperand(MCOperand::createImm(-Op.getImm())); 807 return; 808 } 809 const MCExpr *Expr = Op.getExpr(); 810 if (const MCUnaryExpr *UnExpr = dyn_cast<MCUnaryExpr>(Expr)) { 811 if (UnExpr->getOpcode() == MCUnaryExpr::Minus) { 812 Inst.addOperand(MCOperand::createExpr(UnExpr->getSubExpr())); 813 return; 814 } 815 } else if (const MCBinaryExpr *BinExpr = dyn_cast<MCBinaryExpr>(Expr)) { 816 if (BinExpr->getOpcode() == MCBinaryExpr::Sub) { 817 const MCExpr *NE = MCBinaryExpr::createSub(BinExpr->getRHS(), 818 BinExpr->getLHS(), Ctx); 819 Inst.addOperand(MCOperand::createExpr(NE)); 820 return; 821 } 822 } 823 Inst.addOperand(MCOperand::createExpr(MCUnaryExpr::createMinus(Expr, Ctx))); 824 } 825 826 void PPCAsmParser::processInstruction(MCInst &Inst, 827 const OperandVector &Operands) { 828 int Opcode = Inst.getOpcode(); 829 switch (Opcode) { 830 case PPC::DCBTx: 831 case PPC::DCBTT: 832 case PPC::DCBTSTx: 833 case PPC::DCBTSTT: { 834 MCInst TmpInst; 835 TmpInst.setOpcode((Opcode == PPC::DCBTx || Opcode == PPC::DCBTT) ? 836 PPC::DCBT : PPC::DCBTST); 837 TmpInst.addOperand(MCOperand::createImm( 838 (Opcode == PPC::DCBTx || Opcode == PPC::DCBTSTx) ? 0 : 16)); 839 TmpInst.addOperand(Inst.getOperand(0)); 840 TmpInst.addOperand(Inst.getOperand(1)); 841 Inst = TmpInst; 842 break; 843 } 844 case PPC::DCBTCT: 845 case PPC::DCBTDS: { 846 MCInst TmpInst; 847 TmpInst.setOpcode(PPC::DCBT); 848 TmpInst.addOperand(Inst.getOperand(2)); 849 TmpInst.addOperand(Inst.getOperand(0)); 850 TmpInst.addOperand(Inst.getOperand(1)); 851 Inst = TmpInst; 852 break; 853 } 854 case PPC::DCBTSTCT: 855 case PPC::DCBTSTDS: { 856 MCInst TmpInst; 857 TmpInst.setOpcode(PPC::DCBTST); 858 TmpInst.addOperand(Inst.getOperand(2)); 859 TmpInst.addOperand(Inst.getOperand(0)); 860 TmpInst.addOperand(Inst.getOperand(1)); 861 Inst = TmpInst; 862 break; 863 } 864 case PPC::DCBFx: 865 case PPC::DCBFL: 866 case PPC::DCBFLP: 867 case PPC::DCBFPS: 868 case PPC::DCBSTPS: { 869 int L = 0; 870 if (Opcode == PPC::DCBFL) 871 L = 1; 872 else if (Opcode == PPC::DCBFLP) 873 L = 3; 874 else if (Opcode == PPC::DCBFPS) 875 L = 4; 876 else if (Opcode == PPC::DCBSTPS) 877 L = 6; 878 879 MCInst TmpInst; 880 TmpInst.setOpcode(PPC::DCBF); 881 TmpInst.addOperand(MCOperand::createImm(L)); 882 TmpInst.addOperand(Inst.getOperand(0)); 883 TmpInst.addOperand(Inst.getOperand(1)); 884 Inst = TmpInst; 885 break; 886 } 887 case PPC::LAx: { 888 MCInst TmpInst; 889 TmpInst.setOpcode(PPC::LA); 890 TmpInst.addOperand(Inst.getOperand(0)); 891 TmpInst.addOperand(Inst.getOperand(2)); 892 TmpInst.addOperand(Inst.getOperand(1)); 893 Inst = TmpInst; 894 break; 895 } 896 case PPC::PLA8: 897 case PPC::PLA: { 898 MCInst TmpInst; 899 TmpInst.setOpcode(Opcode == PPC::PLA ? PPC::PADDI : PPC::PADDI8); 900 TmpInst.addOperand(Inst.getOperand(0)); 901 TmpInst.addOperand(Inst.getOperand(1)); 902 TmpInst.addOperand(Inst.getOperand(2)); 903 Inst = TmpInst; 904 break; 905 } 906 case PPC::PLA8pc: 907 case PPC::PLApc: { 908 MCInst TmpInst; 909 TmpInst.setOpcode(Opcode == PPC::PLApc ? PPC::PADDIpc : PPC::PADDI8pc); 910 TmpInst.addOperand(Inst.getOperand(0)); 911 TmpInst.addOperand(MCOperand::createImm(0)); 912 TmpInst.addOperand(Inst.getOperand(1)); 913 Inst = TmpInst; 914 break; 915 } 916 case PPC::SUBI: { 917 MCInst TmpInst; 918 TmpInst.setOpcode(PPC::ADDI); 919 TmpInst.addOperand(Inst.getOperand(0)); 920 TmpInst.addOperand(Inst.getOperand(1)); 921 addNegOperand(TmpInst, Inst.getOperand(2), getContext()); 922 Inst = TmpInst; 923 break; 924 } 925 case PPC::PSUBI: { 926 MCInst TmpInst; 927 TmpInst.setOpcode(PPC::PADDI); 928 TmpInst.addOperand(Inst.getOperand(0)); 929 TmpInst.addOperand(Inst.getOperand(1)); 930 addNegOperand(TmpInst, Inst.getOperand(2), getContext()); 931 Inst = TmpInst; 932 break; 933 } 934 case PPC::SUBIS: { 935 MCInst TmpInst; 936 TmpInst.setOpcode(PPC::ADDIS); 937 TmpInst.addOperand(Inst.getOperand(0)); 938 TmpInst.addOperand(Inst.getOperand(1)); 939 addNegOperand(TmpInst, Inst.getOperand(2), getContext()); 940 Inst = TmpInst; 941 break; 942 } 943 case PPC::SUBIC: { 944 MCInst TmpInst; 945 TmpInst.setOpcode(PPC::ADDIC); 946 TmpInst.addOperand(Inst.getOperand(0)); 947 TmpInst.addOperand(Inst.getOperand(1)); 948 addNegOperand(TmpInst, Inst.getOperand(2), getContext()); 949 Inst = TmpInst; 950 break; 951 } 952 case PPC::SUBIC_rec: { 953 MCInst TmpInst; 954 TmpInst.setOpcode(PPC::ADDIC_rec); 955 TmpInst.addOperand(Inst.getOperand(0)); 956 TmpInst.addOperand(Inst.getOperand(1)); 957 addNegOperand(TmpInst, Inst.getOperand(2), getContext()); 958 Inst = TmpInst; 959 break; 960 } 961 case PPC::EXTLWI: 962 case PPC::EXTLWI_rec: { 963 MCInst TmpInst; 964 int64_t N = Inst.getOperand(2).getImm(); 965 int64_t B = Inst.getOperand(3).getImm(); 966 TmpInst.setOpcode(Opcode == PPC::EXTLWI ? PPC::RLWINM : PPC::RLWINM_rec); 967 TmpInst.addOperand(Inst.getOperand(0)); 968 TmpInst.addOperand(Inst.getOperand(1)); 969 TmpInst.addOperand(MCOperand::createImm(B)); 970 TmpInst.addOperand(MCOperand::createImm(0)); 971 TmpInst.addOperand(MCOperand::createImm(N - 1)); 972 Inst = TmpInst; 973 break; 974 } 975 case PPC::EXTRWI: 976 case PPC::EXTRWI_rec: { 977 MCInst TmpInst; 978 int64_t N = Inst.getOperand(2).getImm(); 979 int64_t B = Inst.getOperand(3).getImm(); 980 TmpInst.setOpcode(Opcode == PPC::EXTRWI ? PPC::RLWINM : PPC::RLWINM_rec); 981 TmpInst.addOperand(Inst.getOperand(0)); 982 TmpInst.addOperand(Inst.getOperand(1)); 983 TmpInst.addOperand(MCOperand::createImm(B + N)); 984 TmpInst.addOperand(MCOperand::createImm(32 - N)); 985 TmpInst.addOperand(MCOperand::createImm(31)); 986 Inst = TmpInst; 987 break; 988 } 989 case PPC::INSLWI: 990 case PPC::INSLWI_rec: { 991 MCInst TmpInst; 992 int64_t N = Inst.getOperand(2).getImm(); 993 int64_t B = Inst.getOperand(3).getImm(); 994 TmpInst.setOpcode(Opcode == PPC::INSLWI ? PPC::RLWIMI : PPC::RLWIMI_rec); 995 TmpInst.addOperand(Inst.getOperand(0)); 996 TmpInst.addOperand(Inst.getOperand(0)); 997 TmpInst.addOperand(Inst.getOperand(1)); 998 TmpInst.addOperand(MCOperand::createImm(32 - B)); 999 TmpInst.addOperand(MCOperand::createImm(B)); 1000 TmpInst.addOperand(MCOperand::createImm((B + N) - 1)); 1001 Inst = TmpInst; 1002 break; 1003 } 1004 case PPC::INSRWI: 1005 case PPC::INSRWI_rec: { 1006 MCInst TmpInst; 1007 int64_t N = Inst.getOperand(2).getImm(); 1008 int64_t B = Inst.getOperand(3).getImm(); 1009 TmpInst.setOpcode(Opcode == PPC::INSRWI ? PPC::RLWIMI : PPC::RLWIMI_rec); 1010 TmpInst.addOperand(Inst.getOperand(0)); 1011 TmpInst.addOperand(Inst.getOperand(0)); 1012 TmpInst.addOperand(Inst.getOperand(1)); 1013 TmpInst.addOperand(MCOperand::createImm(32 - (B + N))); 1014 TmpInst.addOperand(MCOperand::createImm(B)); 1015 TmpInst.addOperand(MCOperand::createImm((B + N) - 1)); 1016 Inst = TmpInst; 1017 break; 1018 } 1019 case PPC::ROTRWI: 1020 case PPC::ROTRWI_rec: { 1021 MCInst TmpInst; 1022 int64_t N = Inst.getOperand(2).getImm(); 1023 TmpInst.setOpcode(Opcode == PPC::ROTRWI ? PPC::RLWINM : PPC::RLWINM_rec); 1024 TmpInst.addOperand(Inst.getOperand(0)); 1025 TmpInst.addOperand(Inst.getOperand(1)); 1026 TmpInst.addOperand(MCOperand::createImm(32 - N)); 1027 TmpInst.addOperand(MCOperand::createImm(0)); 1028 TmpInst.addOperand(MCOperand::createImm(31)); 1029 Inst = TmpInst; 1030 break; 1031 } 1032 case PPC::SLWI: 1033 case PPC::SLWI_rec: { 1034 MCInst TmpInst; 1035 int64_t N = Inst.getOperand(2).getImm(); 1036 TmpInst.setOpcode(Opcode == PPC::SLWI ? PPC::RLWINM : PPC::RLWINM_rec); 1037 TmpInst.addOperand(Inst.getOperand(0)); 1038 TmpInst.addOperand(Inst.getOperand(1)); 1039 TmpInst.addOperand(MCOperand::createImm(N)); 1040 TmpInst.addOperand(MCOperand::createImm(0)); 1041 TmpInst.addOperand(MCOperand::createImm(31 - N)); 1042 Inst = TmpInst; 1043 break; 1044 } 1045 case PPC::SRWI: 1046 case PPC::SRWI_rec: { 1047 MCInst TmpInst; 1048 int64_t N = Inst.getOperand(2).getImm(); 1049 TmpInst.setOpcode(Opcode == PPC::SRWI ? PPC::RLWINM : PPC::RLWINM_rec); 1050 TmpInst.addOperand(Inst.getOperand(0)); 1051 TmpInst.addOperand(Inst.getOperand(1)); 1052 TmpInst.addOperand(MCOperand::createImm(32 - N)); 1053 TmpInst.addOperand(MCOperand::createImm(N)); 1054 TmpInst.addOperand(MCOperand::createImm(31)); 1055 Inst = TmpInst; 1056 break; 1057 } 1058 case PPC::CLRRWI: 1059 case PPC::CLRRWI_rec: { 1060 MCInst TmpInst; 1061 int64_t N = Inst.getOperand(2).getImm(); 1062 TmpInst.setOpcode(Opcode == PPC::CLRRWI ? PPC::RLWINM : PPC::RLWINM_rec); 1063 TmpInst.addOperand(Inst.getOperand(0)); 1064 TmpInst.addOperand(Inst.getOperand(1)); 1065 TmpInst.addOperand(MCOperand::createImm(0)); 1066 TmpInst.addOperand(MCOperand::createImm(0)); 1067 TmpInst.addOperand(MCOperand::createImm(31 - N)); 1068 Inst = TmpInst; 1069 break; 1070 } 1071 case PPC::CLRLSLWI: 1072 case PPC::CLRLSLWI_rec: { 1073 MCInst TmpInst; 1074 int64_t B = Inst.getOperand(2).getImm(); 1075 int64_t N = Inst.getOperand(3).getImm(); 1076 TmpInst.setOpcode(Opcode == PPC::CLRLSLWI ? PPC::RLWINM : PPC::RLWINM_rec); 1077 TmpInst.addOperand(Inst.getOperand(0)); 1078 TmpInst.addOperand(Inst.getOperand(1)); 1079 TmpInst.addOperand(MCOperand::createImm(N)); 1080 TmpInst.addOperand(MCOperand::createImm(B - N)); 1081 TmpInst.addOperand(MCOperand::createImm(31 - N)); 1082 Inst = TmpInst; 1083 break; 1084 } 1085 case PPC::EXTLDI: 1086 case PPC::EXTLDI_rec: { 1087 MCInst TmpInst; 1088 int64_t N = Inst.getOperand(2).getImm(); 1089 int64_t B = Inst.getOperand(3).getImm(); 1090 TmpInst.setOpcode(Opcode == PPC::EXTLDI ? PPC::RLDICR : PPC::RLDICR_rec); 1091 TmpInst.addOperand(Inst.getOperand(0)); 1092 TmpInst.addOperand(Inst.getOperand(1)); 1093 TmpInst.addOperand(MCOperand::createImm(B)); 1094 TmpInst.addOperand(MCOperand::createImm(N - 1)); 1095 Inst = TmpInst; 1096 break; 1097 } 1098 case PPC::EXTRDI: 1099 case PPC::EXTRDI_rec: { 1100 MCInst TmpInst; 1101 int64_t N = Inst.getOperand(2).getImm(); 1102 int64_t B = Inst.getOperand(3).getImm(); 1103 TmpInst.setOpcode(Opcode == PPC::EXTRDI ? PPC::RLDICL : PPC::RLDICL_rec); 1104 TmpInst.addOperand(Inst.getOperand(0)); 1105 TmpInst.addOperand(Inst.getOperand(1)); 1106 TmpInst.addOperand(MCOperand::createImm(B + N)); 1107 TmpInst.addOperand(MCOperand::createImm(64 - N)); 1108 Inst = TmpInst; 1109 break; 1110 } 1111 case PPC::INSRDI: 1112 case PPC::INSRDI_rec: { 1113 MCInst TmpInst; 1114 int64_t N = Inst.getOperand(2).getImm(); 1115 int64_t B = Inst.getOperand(3).getImm(); 1116 TmpInst.setOpcode(Opcode == PPC::INSRDI ? PPC::RLDIMI : PPC::RLDIMI_rec); 1117 TmpInst.addOperand(Inst.getOperand(0)); 1118 TmpInst.addOperand(Inst.getOperand(0)); 1119 TmpInst.addOperand(Inst.getOperand(1)); 1120 TmpInst.addOperand(MCOperand::createImm(64 - (B + N))); 1121 TmpInst.addOperand(MCOperand::createImm(B)); 1122 Inst = TmpInst; 1123 break; 1124 } 1125 case PPC::ROTRDI: 1126 case PPC::ROTRDI_rec: { 1127 MCInst TmpInst; 1128 int64_t N = Inst.getOperand(2).getImm(); 1129 TmpInst.setOpcode(Opcode == PPC::ROTRDI ? PPC::RLDICL : PPC::RLDICL_rec); 1130 TmpInst.addOperand(Inst.getOperand(0)); 1131 TmpInst.addOperand(Inst.getOperand(1)); 1132 TmpInst.addOperand(MCOperand::createImm(64 - N)); 1133 TmpInst.addOperand(MCOperand::createImm(0)); 1134 Inst = TmpInst; 1135 break; 1136 } 1137 case PPC::SLDI: 1138 case PPC::SLDI_rec: { 1139 MCInst TmpInst; 1140 int64_t N = Inst.getOperand(2).getImm(); 1141 TmpInst.setOpcode(Opcode == PPC::SLDI ? PPC::RLDICR : PPC::RLDICR_rec); 1142 TmpInst.addOperand(Inst.getOperand(0)); 1143 TmpInst.addOperand(Inst.getOperand(1)); 1144 TmpInst.addOperand(MCOperand::createImm(N)); 1145 TmpInst.addOperand(MCOperand::createImm(63 - N)); 1146 Inst = TmpInst; 1147 break; 1148 } 1149 case PPC::SUBPCIS: { 1150 MCInst TmpInst; 1151 int64_t N = Inst.getOperand(1).getImm(); 1152 TmpInst.setOpcode(PPC::ADDPCIS); 1153 TmpInst.addOperand(Inst.getOperand(0)); 1154 TmpInst.addOperand(MCOperand::createImm(-N)); 1155 Inst = TmpInst; 1156 break; 1157 } 1158 case PPC::SRDI: 1159 case PPC::SRDI_rec: { 1160 MCInst TmpInst; 1161 int64_t N = Inst.getOperand(2).getImm(); 1162 TmpInst.setOpcode(Opcode == PPC::SRDI ? PPC::RLDICL : PPC::RLDICL_rec); 1163 TmpInst.addOperand(Inst.getOperand(0)); 1164 TmpInst.addOperand(Inst.getOperand(1)); 1165 TmpInst.addOperand(MCOperand::createImm(64 - N)); 1166 TmpInst.addOperand(MCOperand::createImm(N)); 1167 Inst = TmpInst; 1168 break; 1169 } 1170 case PPC::CLRRDI: 1171 case PPC::CLRRDI_rec: { 1172 MCInst TmpInst; 1173 int64_t N = Inst.getOperand(2).getImm(); 1174 TmpInst.setOpcode(Opcode == PPC::CLRRDI ? PPC::RLDICR : PPC::RLDICR_rec); 1175 TmpInst.addOperand(Inst.getOperand(0)); 1176 TmpInst.addOperand(Inst.getOperand(1)); 1177 TmpInst.addOperand(MCOperand::createImm(0)); 1178 TmpInst.addOperand(MCOperand::createImm(63 - N)); 1179 Inst = TmpInst; 1180 break; 1181 } 1182 case PPC::CLRLSLDI: 1183 case PPC::CLRLSLDI_rec: { 1184 MCInst TmpInst; 1185 int64_t B = Inst.getOperand(2).getImm(); 1186 int64_t N = Inst.getOperand(3).getImm(); 1187 TmpInst.setOpcode(Opcode == PPC::CLRLSLDI ? PPC::RLDIC : PPC::RLDIC_rec); 1188 TmpInst.addOperand(Inst.getOperand(0)); 1189 TmpInst.addOperand(Inst.getOperand(1)); 1190 TmpInst.addOperand(MCOperand::createImm(N)); 1191 TmpInst.addOperand(MCOperand::createImm(B - N)); 1192 Inst = TmpInst; 1193 break; 1194 } 1195 case PPC::RLWINMbm: 1196 case PPC::RLWINMbm_rec: { 1197 unsigned MB, ME; 1198 int64_t BM = Inst.getOperand(3).getImm(); 1199 if (!isRunOfOnes(BM, MB, ME)) 1200 break; 1201 1202 MCInst TmpInst; 1203 TmpInst.setOpcode(Opcode == PPC::RLWINMbm ? PPC::RLWINM : PPC::RLWINM_rec); 1204 TmpInst.addOperand(Inst.getOperand(0)); 1205 TmpInst.addOperand(Inst.getOperand(1)); 1206 TmpInst.addOperand(Inst.getOperand(2)); 1207 TmpInst.addOperand(MCOperand::createImm(MB)); 1208 TmpInst.addOperand(MCOperand::createImm(ME)); 1209 Inst = TmpInst; 1210 break; 1211 } 1212 case PPC::RLWIMIbm: 1213 case PPC::RLWIMIbm_rec: { 1214 unsigned MB, ME; 1215 int64_t BM = Inst.getOperand(3).getImm(); 1216 if (!isRunOfOnes(BM, MB, ME)) 1217 break; 1218 1219 MCInst TmpInst; 1220 TmpInst.setOpcode(Opcode == PPC::RLWIMIbm ? PPC::RLWIMI : PPC::RLWIMI_rec); 1221 TmpInst.addOperand(Inst.getOperand(0)); 1222 TmpInst.addOperand(Inst.getOperand(0)); // The tied operand. 1223 TmpInst.addOperand(Inst.getOperand(1)); 1224 TmpInst.addOperand(Inst.getOperand(2)); 1225 TmpInst.addOperand(MCOperand::createImm(MB)); 1226 TmpInst.addOperand(MCOperand::createImm(ME)); 1227 Inst = TmpInst; 1228 break; 1229 } 1230 case PPC::RLWNMbm: 1231 case PPC::RLWNMbm_rec: { 1232 unsigned MB, ME; 1233 int64_t BM = Inst.getOperand(3).getImm(); 1234 if (!isRunOfOnes(BM, MB, ME)) 1235 break; 1236 1237 MCInst TmpInst; 1238 TmpInst.setOpcode(Opcode == PPC::RLWNMbm ? PPC::RLWNM : PPC::RLWNM_rec); 1239 TmpInst.addOperand(Inst.getOperand(0)); 1240 TmpInst.addOperand(Inst.getOperand(1)); 1241 TmpInst.addOperand(Inst.getOperand(2)); 1242 TmpInst.addOperand(MCOperand::createImm(MB)); 1243 TmpInst.addOperand(MCOperand::createImm(ME)); 1244 Inst = TmpInst; 1245 break; 1246 } 1247 case PPC::MFTB: { 1248 if (getSTI().hasFeature(PPC::FeatureMFTB)) { 1249 assert(Inst.getNumOperands() == 2 && "Expecting two operands"); 1250 Inst.setOpcode(PPC::MFSPR); 1251 } 1252 break; 1253 } 1254 } 1255 } 1256 1257 static std::string PPCMnemonicSpellCheck(StringRef S, const FeatureBitset &FBS, 1258 unsigned VariantID = 0); 1259 1260 // Check that the register+immediate memory operand is in the right position and 1261 // is expected by the instruction. Returns true if the memory operand syntax is 1262 // valid; otherwise, returns false. 1263 static bool validateMemOp(const OperandVector &Operands, bool isMemriOp) { 1264 for (size_t idx = 0; idx < Operands.size(); ++idx) { 1265 const PPCOperand &Op = static_cast<const PPCOperand &>(*Operands[idx]); 1266 if (Op.isMemOpBase() != (idx == 3 && isMemriOp)) 1267 return false; 1268 } 1269 return true; 1270 } 1271 1272 bool PPCAsmParser::matchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 1273 OperandVector &Operands, 1274 MCStreamer &Out, uint64_t &ErrorInfo, 1275 bool MatchingInlineAsm) { 1276 MCInst Inst; 1277 const PPCInstrInfo *TII = static_cast<const PPCInstrInfo *>(&MII); 1278 1279 switch (MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm)) { 1280 case Match_Success: 1281 if (!validateMemOp(Operands, TII->isMemriOp(Inst.getOpcode()))) 1282 return Error(IDLoc, "invalid operand for instruction"); 1283 // Post-process instructions (typically extended mnemonics) 1284 processInstruction(Inst, Operands); 1285 Inst.setLoc(IDLoc); 1286 Out.emitInstruction(Inst, getSTI()); 1287 return false; 1288 case Match_MissingFeature: 1289 return Error(IDLoc, "instruction use requires an option to be enabled"); 1290 case Match_MnemonicFail: { 1291 FeatureBitset FBS = ComputeAvailableFeatures(getSTI().getFeatureBits()); 1292 std::string Suggestion = PPCMnemonicSpellCheck( 1293 ((PPCOperand &)*Operands[0]).getToken(), FBS); 1294 return Error(IDLoc, "invalid instruction" + Suggestion, 1295 ((PPCOperand &)*Operands[0]).getLocRange()); 1296 } 1297 case Match_InvalidOperand: { 1298 SMLoc ErrorLoc = IDLoc; 1299 if (ErrorInfo != ~0ULL) { 1300 if (ErrorInfo >= Operands.size()) 1301 return Error(IDLoc, "too few operands for instruction"); 1302 1303 ErrorLoc = ((PPCOperand &)*Operands[ErrorInfo]).getStartLoc(); 1304 if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc; 1305 } 1306 1307 return Error(ErrorLoc, "invalid operand for instruction"); 1308 } 1309 } 1310 1311 llvm_unreachable("Implement any new match types added!"); 1312 } 1313 1314 #define GET_REGISTER_MATCHER 1315 #include "PPCGenAsmMatcher.inc" 1316 1317 MCRegister PPCAsmParser::matchRegisterName(int64_t &IntVal) { 1318 if (getParser().getTok().is(AsmToken::Percent)) 1319 getParser().Lex(); // Eat the '%'. 1320 1321 if (!getParser().getTok().is(AsmToken::Identifier)) 1322 return MCRegister(); 1323 1324 StringRef Name = getParser().getTok().getString(); 1325 MCRegister RegNo = MatchRegisterName(Name); 1326 if (!RegNo) 1327 return RegNo; 1328 1329 Name.substr(Name.find_first_of("1234567890")).getAsInteger(10, IntVal); 1330 1331 // MatchRegisterName doesn't seem to have special handling for 64bit vs 32bit 1332 // register types. 1333 if (Name.equals_insensitive("lr")) { 1334 RegNo = isPPC64() ? PPC::LR8 : PPC::LR; 1335 IntVal = 8; 1336 } else if (Name.equals_insensitive("ctr")) { 1337 RegNo = isPPC64() ? PPC::CTR8 : PPC::CTR; 1338 IntVal = 9; 1339 } else if (Name.equals_insensitive("vrsave")) 1340 IntVal = 256; 1341 else if (Name.starts_with_insensitive("r")) 1342 RegNo = isPPC64() ? XRegs[IntVal] : RRegs[IntVal]; 1343 1344 getParser().Lex(); 1345 return RegNo; 1346 } 1347 1348 bool PPCAsmParser::parseRegister(MCRegister &Reg, SMLoc &StartLoc, 1349 SMLoc &EndLoc) { 1350 if (!tryParseRegister(Reg, StartLoc, EndLoc).isSuccess()) 1351 return TokError("invalid register name"); 1352 return false; 1353 } 1354 1355 ParseStatus PPCAsmParser::tryParseRegister(MCRegister &Reg, SMLoc &StartLoc, 1356 SMLoc &EndLoc) { 1357 const AsmToken &Tok = getParser().getTok(); 1358 StartLoc = Tok.getLoc(); 1359 EndLoc = Tok.getEndLoc(); 1360 int64_t IntVal; 1361 if (!(Reg = matchRegisterName(IntVal))) 1362 return ParseStatus::NoMatch; 1363 return ParseStatus::Success; 1364 } 1365 1366 /// Extract \code @l/@ha \endcode modifier from expression. Recursively scan 1367 /// the expression and check for VK_PPC_LO/HI/HA 1368 /// symbol variants. If all symbols with modifier use the same 1369 /// variant, return the corresponding PPCMCExpr::VariantKind, 1370 /// and a modified expression using the default symbol variant. 1371 /// Otherwise, return NULL. 1372 const MCExpr * 1373 PPCAsmParser::extractModifierFromExpr(const MCExpr *E, 1374 PPCMCExpr::VariantKind &Variant) { 1375 MCContext &Context = getParser().getContext(); 1376 Variant = PPCMCExpr::VK_PPC_None; 1377 1378 switch (E->getKind()) { 1379 case MCExpr::Target: 1380 case MCExpr::Constant: 1381 return nullptr; 1382 1383 case MCExpr::SymbolRef: { 1384 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 1385 1386 switch (SRE->getKind()) { 1387 case MCSymbolRefExpr::VK_PPC_LO: 1388 Variant = PPCMCExpr::VK_PPC_LO; 1389 break; 1390 case MCSymbolRefExpr::VK_PPC_HI: 1391 Variant = PPCMCExpr::VK_PPC_HI; 1392 break; 1393 case MCSymbolRefExpr::VK_PPC_HA: 1394 Variant = PPCMCExpr::VK_PPC_HA; 1395 break; 1396 case MCSymbolRefExpr::VK_PPC_HIGH: 1397 Variant = PPCMCExpr::VK_PPC_HIGH; 1398 break; 1399 case MCSymbolRefExpr::VK_PPC_HIGHA: 1400 Variant = PPCMCExpr::VK_PPC_HIGHA; 1401 break; 1402 case MCSymbolRefExpr::VK_PPC_HIGHER: 1403 Variant = PPCMCExpr::VK_PPC_HIGHER; 1404 break; 1405 case MCSymbolRefExpr::VK_PPC_HIGHERA: 1406 Variant = PPCMCExpr::VK_PPC_HIGHERA; 1407 break; 1408 case MCSymbolRefExpr::VK_PPC_HIGHEST: 1409 Variant = PPCMCExpr::VK_PPC_HIGHEST; 1410 break; 1411 case MCSymbolRefExpr::VK_PPC_HIGHESTA: 1412 Variant = PPCMCExpr::VK_PPC_HIGHESTA; 1413 break; 1414 default: 1415 return nullptr; 1416 } 1417 1418 return MCSymbolRefExpr::create(&SRE->getSymbol(), Context); 1419 } 1420 1421 case MCExpr::Unary: { 1422 const MCUnaryExpr *UE = cast<MCUnaryExpr>(E); 1423 const MCExpr *Sub = extractModifierFromExpr(UE->getSubExpr(), Variant); 1424 if (!Sub) 1425 return nullptr; 1426 return MCUnaryExpr::create(UE->getOpcode(), Sub, Context); 1427 } 1428 1429 case MCExpr::Binary: { 1430 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 1431 PPCMCExpr::VariantKind LHSVariant, RHSVariant; 1432 const MCExpr *LHS = extractModifierFromExpr(BE->getLHS(), LHSVariant); 1433 const MCExpr *RHS = extractModifierFromExpr(BE->getRHS(), RHSVariant); 1434 1435 if (!LHS && !RHS) 1436 return nullptr; 1437 1438 if (!LHS) LHS = BE->getLHS(); 1439 if (!RHS) RHS = BE->getRHS(); 1440 1441 if (LHSVariant == PPCMCExpr::VK_PPC_None) 1442 Variant = RHSVariant; 1443 else if (RHSVariant == PPCMCExpr::VK_PPC_None) 1444 Variant = LHSVariant; 1445 else if (LHSVariant == RHSVariant) 1446 Variant = LHSVariant; 1447 else 1448 return nullptr; 1449 1450 return MCBinaryExpr::create(BE->getOpcode(), LHS, RHS, Context); 1451 } 1452 } 1453 1454 llvm_unreachable("Invalid expression kind!"); 1455 } 1456 1457 /// Find all VK_TLSGD/VK_TLSLD symbol references in expression and replace 1458 /// them by VK_PPC_TLSGD/VK_PPC_TLSLD. This is necessary to avoid having 1459 /// _GLOBAL_OFFSET_TABLE_ created via ELFObjectWriter::RelocNeedsGOT. 1460 /// FIXME: This is a hack. 1461 const MCExpr *PPCAsmParser::fixupVariantKind(const MCExpr *E) { 1462 MCContext &Context = getParser().getContext(); 1463 1464 switch (E->getKind()) { 1465 case MCExpr::Target: 1466 case MCExpr::Constant: 1467 return E; 1468 1469 case MCExpr::SymbolRef: { 1470 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 1471 MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; 1472 1473 switch (SRE->getKind()) { 1474 case MCSymbolRefExpr::VK_TLSGD: 1475 Variant = MCSymbolRefExpr::VK_PPC_TLSGD; 1476 break; 1477 case MCSymbolRefExpr::VK_TLSLD: 1478 Variant = MCSymbolRefExpr::VK_PPC_TLSLD; 1479 break; 1480 default: 1481 return E; 1482 } 1483 return MCSymbolRefExpr::create(&SRE->getSymbol(), Variant, Context); 1484 } 1485 1486 case MCExpr::Unary: { 1487 const MCUnaryExpr *UE = cast<MCUnaryExpr>(E); 1488 const MCExpr *Sub = fixupVariantKind(UE->getSubExpr()); 1489 if (Sub == UE->getSubExpr()) 1490 return E; 1491 return MCUnaryExpr::create(UE->getOpcode(), Sub, Context); 1492 } 1493 1494 case MCExpr::Binary: { 1495 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 1496 const MCExpr *LHS = fixupVariantKind(BE->getLHS()); 1497 const MCExpr *RHS = fixupVariantKind(BE->getRHS()); 1498 if (LHS == BE->getLHS() && RHS == BE->getRHS()) 1499 return E; 1500 return MCBinaryExpr::create(BE->getOpcode(), LHS, RHS, Context); 1501 } 1502 } 1503 1504 llvm_unreachable("Invalid expression kind!"); 1505 } 1506 1507 /// This differs from the default "parseExpression" in that it handles 1508 /// modifiers. 1509 bool PPCAsmParser::parseExpression(const MCExpr *&EVal) { 1510 // (ELF Platforms) 1511 // Handle \code @l/@ha \endcode 1512 if (getParser().parseExpression(EVal)) 1513 return true; 1514 1515 EVal = fixupVariantKind(EVal); 1516 1517 PPCMCExpr::VariantKind Variant; 1518 const MCExpr *E = extractModifierFromExpr(EVal, Variant); 1519 if (E) 1520 EVal = PPCMCExpr::create(Variant, E, getParser().getContext()); 1521 1522 return false; 1523 } 1524 1525 /// This handles registers in the form 'NN', '%rNN' for ELF platforms and 1526 /// rNN for MachO. 1527 bool PPCAsmParser::parseOperand(OperandVector &Operands) { 1528 MCAsmParser &Parser = getParser(); 1529 SMLoc S = Parser.getTok().getLoc(); 1530 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 1531 const MCExpr *EVal; 1532 1533 // Attempt to parse the next token as an immediate 1534 switch (getLexer().getKind()) { 1535 // Special handling for register names. These are interpreted 1536 // as immediates corresponding to the register number. 1537 case AsmToken::Percent: { 1538 int64_t IntVal; 1539 if (!matchRegisterName(IntVal)) 1540 return Error(S, "invalid register name"); 1541 1542 Operands.push_back(PPCOperand::CreateImm(IntVal, S, E, isPPC64())); 1543 return false; 1544 } 1545 case AsmToken::Identifier: 1546 case AsmToken::LParen: 1547 case AsmToken::Plus: 1548 case AsmToken::Minus: 1549 case AsmToken::Integer: 1550 case AsmToken::Dot: 1551 case AsmToken::Dollar: 1552 case AsmToken::Exclaim: 1553 case AsmToken::Tilde: 1554 if (!parseExpression(EVal)) 1555 break; 1556 // Fall-through 1557 [[fallthrough]]; 1558 default: 1559 return Error(S, "unknown operand"); 1560 } 1561 1562 // Push the parsed operand into the list of operands 1563 Operands.push_back(PPCOperand::CreateFromMCExpr(EVal, S, E, isPPC64())); 1564 1565 // Check whether this is a TLS call expression 1566 const char TlsGetAddr[] = "__tls_get_addr"; 1567 bool TlsCall = false; 1568 const MCExpr *TlsCallAddend = nullptr; 1569 if (auto *Ref = dyn_cast<MCSymbolRefExpr>(EVal)) { 1570 TlsCall = Ref->getSymbol().getName() == TlsGetAddr; 1571 } else if (auto *Bin = dyn_cast<MCBinaryExpr>(EVal); 1572 Bin && Bin->getOpcode() == MCBinaryExpr::Add) { 1573 if (auto *Ref = dyn_cast<MCSymbolRefExpr>(Bin->getLHS())) { 1574 TlsCall = Ref->getSymbol().getName() == TlsGetAddr; 1575 TlsCallAddend = Bin->getRHS(); 1576 } 1577 } 1578 1579 if (TlsCall && parseOptionalToken(AsmToken::LParen)) { 1580 const MCExpr *TLSSym; 1581 const SMLoc S2 = Parser.getTok().getLoc(); 1582 if (parseExpression(TLSSym)) 1583 return Error(S2, "invalid TLS call expression"); 1584 E = Parser.getTok().getLoc(); 1585 if (parseToken(AsmToken::RParen, "expected ')'")) 1586 return true; 1587 // PPC32 allows bl __tls_get_addr[+a](x@tlsgd)@plt+b. Parse "@plt[+b]". 1588 if (!isPPC64() && parseOptionalToken(AsmToken::At)) { 1589 AsmToken Tok = getTok(); 1590 if (!(parseOptionalToken(AsmToken::Identifier) && 1591 Tok.getString().compare_insensitive("plt") == 0)) 1592 return Error(Tok.getLoc(), "expected 'plt'"); 1593 EVal = MCSymbolRefExpr::create(TlsGetAddr, MCSymbolRefExpr::VK_PLT, 1594 getContext()); 1595 if (parseOptionalToken(AsmToken::Plus)) { 1596 const MCExpr *Addend = nullptr; 1597 SMLoc EndLoc; 1598 if (parsePrimaryExpr(Addend, EndLoc)) 1599 return true; 1600 if (TlsCallAddend) // __tls_get_addr+a(x@tlsgd)@plt+b 1601 TlsCallAddend = 1602 MCBinaryExpr::createAdd(TlsCallAddend, Addend, getContext()); 1603 else // __tls_get_addr(x@tlsgd)@plt+b 1604 TlsCallAddend = Addend; 1605 } 1606 if (TlsCallAddend) 1607 EVal = MCBinaryExpr::createAdd(EVal, TlsCallAddend, getContext()); 1608 // Add a __tls_get_addr operand with addend a, b, or a+b. 1609 Operands.back() = PPCOperand::CreateFromMCExpr( 1610 EVal, S, Parser.getTok().getLoc(), false); 1611 } 1612 1613 Operands.push_back(PPCOperand::CreateFromMCExpr(TLSSym, S, E, isPPC64())); 1614 } 1615 1616 // Otherwise, check for D-form memory operands 1617 if (!TlsCall && parseOptionalToken(AsmToken::LParen)) { 1618 S = Parser.getTok().getLoc(); 1619 1620 int64_t IntVal; 1621 switch (getLexer().getKind()) { 1622 case AsmToken::Percent: { 1623 if (!matchRegisterName(IntVal)) 1624 return Error(S, "invalid register name"); 1625 break; 1626 } 1627 case AsmToken::Integer: 1628 if (getParser().parseAbsoluteExpression(IntVal) || IntVal < 0 || 1629 IntVal > 31) 1630 return Error(S, "invalid register number"); 1631 break; 1632 case AsmToken::Identifier: 1633 default: 1634 return Error(S, "invalid memory operand"); 1635 } 1636 1637 E = Parser.getTok().getLoc(); 1638 if (parseToken(AsmToken::RParen, "missing ')'")) 1639 return true; 1640 Operands.push_back( 1641 PPCOperand::CreateImm(IntVal, S, E, isPPC64(), /*IsMemOpBase=*/true)); 1642 } 1643 1644 return false; 1645 } 1646 1647 /// Parse an instruction mnemonic followed by its operands. 1648 bool PPCAsmParser::parseInstruction(ParseInstructionInfo &Info, StringRef Name, 1649 SMLoc NameLoc, OperandVector &Operands) { 1650 // The first operand is the token for the instruction name. 1651 // If the next character is a '+' or '-', we need to add it to the 1652 // instruction name, to match what TableGen is doing. 1653 std::string NewOpcode; 1654 if (parseOptionalToken(AsmToken::Plus)) { 1655 NewOpcode = std::string(Name); 1656 NewOpcode += '+'; 1657 Name = NewOpcode; 1658 } 1659 if (parseOptionalToken(AsmToken::Minus)) { 1660 NewOpcode = std::string(Name); 1661 NewOpcode += '-'; 1662 Name = NewOpcode; 1663 } 1664 // If the instruction ends in a '.', we need to create a separate 1665 // token for it, to match what TableGen is doing. 1666 size_t Dot = Name.find('.'); 1667 StringRef Mnemonic = Name.slice(0, Dot); 1668 if (!NewOpcode.empty()) // Underlying memory for Name is volatile. 1669 Operands.push_back( 1670 PPCOperand::CreateTokenWithStringCopy(Mnemonic, NameLoc, isPPC64())); 1671 else 1672 Operands.push_back(PPCOperand::CreateToken(Mnemonic, NameLoc, isPPC64())); 1673 if (Dot != StringRef::npos) { 1674 SMLoc DotLoc = SMLoc::getFromPointer(NameLoc.getPointer() + Dot); 1675 StringRef DotStr = Name.substr(Dot); 1676 if (!NewOpcode.empty()) // Underlying memory for Name is volatile. 1677 Operands.push_back( 1678 PPCOperand::CreateTokenWithStringCopy(DotStr, DotLoc, isPPC64())); 1679 else 1680 Operands.push_back(PPCOperand::CreateToken(DotStr, DotLoc, isPPC64())); 1681 } 1682 1683 // If there are no more operands then finish 1684 if (parseOptionalToken(AsmToken::EndOfStatement)) 1685 return false; 1686 1687 // Parse the first operand 1688 if (parseOperand(Operands)) 1689 return true; 1690 1691 while (!parseOptionalToken(AsmToken::EndOfStatement)) { 1692 if (parseToken(AsmToken::Comma) || parseOperand(Operands)) 1693 return true; 1694 } 1695 1696 // We'll now deal with an unfortunate special case: the syntax for the dcbt 1697 // and dcbtst instructions differs for server vs. embedded cores. 1698 // The syntax for dcbt is: 1699 // dcbt ra, rb, th [server] 1700 // dcbt th, ra, rb [embedded] 1701 // where th can be omitted when it is 0. dcbtst is the same. We take the 1702 // server form to be the default, so swap the operands if we're parsing for 1703 // an embedded core (they'll be swapped again upon printing). 1704 if (getSTI().hasFeature(PPC::FeatureBookE) && 1705 Operands.size() == 4 && 1706 (Name == "dcbt" || Name == "dcbtst")) { 1707 std::swap(Operands[1], Operands[3]); 1708 std::swap(Operands[2], Operands[1]); 1709 } 1710 1711 // Handle base mnemonic for atomic loads where the EH bit is zero. 1712 if (Name == "lqarx" || Name == "ldarx" || Name == "lwarx" || 1713 Name == "lharx" || Name == "lbarx") { 1714 if (Operands.size() != 5) 1715 return false; 1716 PPCOperand &EHOp = (PPCOperand &)*Operands[4]; 1717 if (EHOp.isU1Imm() && EHOp.getImm() == 0) 1718 Operands.pop_back(); 1719 } 1720 1721 return false; 1722 } 1723 1724 /// Parses the PPC specific directives 1725 bool PPCAsmParser::ParseDirective(AsmToken DirectiveID) { 1726 StringRef IDVal = DirectiveID.getIdentifier(); 1727 if (IDVal == ".word") 1728 parseDirectiveWord(2, DirectiveID); 1729 else if (IDVal == ".llong") 1730 parseDirectiveWord(8, DirectiveID); 1731 else if (IDVal == ".tc") 1732 parseDirectiveTC(isPPC64() ? 8 : 4, DirectiveID); 1733 else if (IDVal == ".machine") 1734 parseDirectiveMachine(DirectiveID.getLoc()); 1735 else if (IDVal == ".abiversion") 1736 parseDirectiveAbiVersion(DirectiveID.getLoc()); 1737 else if (IDVal == ".localentry") 1738 parseDirectiveLocalEntry(DirectiveID.getLoc()); 1739 else if (IDVal.starts_with(".gnu_attribute")) 1740 parseGNUAttribute(DirectiveID.getLoc()); 1741 else 1742 return true; 1743 return false; 1744 } 1745 1746 /// ::= .word [ expression (, expression)* ] 1747 bool PPCAsmParser::parseDirectiveWord(unsigned Size, AsmToken ID) { 1748 auto parseOp = [&]() -> bool { 1749 const MCExpr *Value; 1750 SMLoc ExprLoc = getParser().getTok().getLoc(); 1751 if (getParser().parseExpression(Value)) 1752 return true; 1753 if (const auto *MCE = dyn_cast<MCConstantExpr>(Value)) { 1754 assert(Size <= 8 && "Invalid size"); 1755 uint64_t IntValue = MCE->getValue(); 1756 if (!isUIntN(8 * Size, IntValue) && !isIntN(8 * Size, IntValue)) 1757 return Error(ExprLoc, "literal value out of range for '" + 1758 ID.getIdentifier() + "' directive"); 1759 getStreamer().emitIntValue(IntValue, Size); 1760 } else 1761 getStreamer().emitValue(Value, Size, ExprLoc); 1762 return false; 1763 }; 1764 1765 if (parseMany(parseOp)) 1766 return addErrorSuffix(" in '" + ID.getIdentifier() + "' directive"); 1767 return false; 1768 } 1769 1770 /// ::= .tc [ symbol (, expression)* ] 1771 bool PPCAsmParser::parseDirectiveTC(unsigned Size, AsmToken ID) { 1772 MCAsmParser &Parser = getParser(); 1773 // Skip TC symbol, which is only used with XCOFF. 1774 while (getLexer().isNot(AsmToken::EndOfStatement) 1775 && getLexer().isNot(AsmToken::Comma)) 1776 Parser.Lex(); 1777 if (parseToken(AsmToken::Comma)) 1778 return addErrorSuffix(" in '.tc' directive"); 1779 1780 // Align to word size. 1781 getParser().getStreamer().emitValueToAlignment(Align(Size)); 1782 1783 // Emit expressions. 1784 return parseDirectiveWord(Size, ID); 1785 } 1786 1787 /// ELF platforms. 1788 /// ::= .machine [ cpu | "push" | "pop" ] 1789 bool PPCAsmParser::parseDirectiveMachine(SMLoc L) { 1790 MCAsmParser &Parser = getParser(); 1791 if (Parser.getTok().isNot(AsmToken::Identifier) && 1792 Parser.getTok().isNot(AsmToken::String)) 1793 return Error(L, "unexpected token in '.machine' directive"); 1794 1795 StringRef CPU = Parser.getTok().getIdentifier(); 1796 1797 // FIXME: Right now, the parser always allows any available 1798 // instruction, so the .machine directive is not useful. 1799 // In the wild, any/push/pop/ppc64/altivec/power[4-9] are seen. 1800 1801 Parser.Lex(); 1802 1803 if (parseToken(AsmToken::EndOfStatement)) 1804 return addErrorSuffix(" in '.machine' directive"); 1805 1806 PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>( 1807 getParser().getStreamer().getTargetStreamer()); 1808 if (TStreamer != nullptr) 1809 TStreamer->emitMachine(CPU); 1810 1811 return false; 1812 } 1813 1814 /// ::= .abiversion constant-expression 1815 bool PPCAsmParser::parseDirectiveAbiVersion(SMLoc L) { 1816 int64_t AbiVersion; 1817 if (check(getParser().parseAbsoluteExpression(AbiVersion), L, 1818 "expected constant expression") || 1819 parseToken(AsmToken::EndOfStatement)) 1820 return addErrorSuffix(" in '.abiversion' directive"); 1821 1822 PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>( 1823 getParser().getStreamer().getTargetStreamer()); 1824 if (TStreamer != nullptr) 1825 TStreamer->emitAbiVersion(AbiVersion); 1826 1827 return false; 1828 } 1829 1830 /// ::= .localentry symbol, expression 1831 bool PPCAsmParser::parseDirectiveLocalEntry(SMLoc L) { 1832 StringRef Name; 1833 if (getParser().parseIdentifier(Name)) 1834 return Error(L, "expected identifier in '.localentry' directive"); 1835 1836 MCSymbolELF *Sym = cast<MCSymbolELF>(getContext().getOrCreateSymbol(Name)); 1837 const MCExpr *Expr; 1838 1839 if (parseToken(AsmToken::Comma) || 1840 check(getParser().parseExpression(Expr), L, "expected expression") || 1841 parseToken(AsmToken::EndOfStatement)) 1842 return addErrorSuffix(" in '.localentry' directive"); 1843 1844 PPCTargetStreamer *TStreamer = static_cast<PPCTargetStreamer *>( 1845 getParser().getStreamer().getTargetStreamer()); 1846 if (TStreamer != nullptr) 1847 TStreamer->emitLocalEntry(Sym, Expr); 1848 1849 return false; 1850 } 1851 1852 bool PPCAsmParser::parseGNUAttribute(SMLoc L) { 1853 int64_t Tag; 1854 int64_t IntegerValue; 1855 if (!getParser().parseGNUAttribute(L, Tag, IntegerValue)) 1856 return false; 1857 1858 getParser().getStreamer().emitGNUAttribute(Tag, IntegerValue); 1859 1860 return true; 1861 } 1862 1863 /// Force static initialization. 1864 extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializePowerPCAsmParser() { 1865 RegisterMCAsmParser<PPCAsmParser> A(getThePPC32Target()); 1866 RegisterMCAsmParser<PPCAsmParser> B(getThePPC32LETarget()); 1867 RegisterMCAsmParser<PPCAsmParser> C(getThePPC64Target()); 1868 RegisterMCAsmParser<PPCAsmParser> D(getThePPC64LETarget()); 1869 } 1870 1871 #define GET_MATCHER_IMPLEMENTATION 1872 #define GET_MNEMONIC_SPELL_CHECKER 1873 #include "PPCGenAsmMatcher.inc" 1874 1875 // Define this matcher function after the auto-generated include so we 1876 // have the match class enum definitions. 1877 unsigned PPCAsmParser::validateTargetOperandClass(MCParsedAsmOperand &AsmOp, 1878 unsigned Kind) { 1879 // If the kind is a token for a literal immediate, check if our asm 1880 // operand matches. This is for InstAliases which have a fixed-value 1881 // immediate in the syntax. 1882 int64_t ImmVal; 1883 switch (Kind) { 1884 case MCK_0: ImmVal = 0; break; 1885 case MCK_1: ImmVal = 1; break; 1886 case MCK_2: ImmVal = 2; break; 1887 case MCK_3: ImmVal = 3; break; 1888 case MCK_4: ImmVal = 4; break; 1889 case MCK_5: ImmVal = 5; break; 1890 case MCK_6: ImmVal = 6; break; 1891 case MCK_7: ImmVal = 7; break; 1892 default: return Match_InvalidOperand; 1893 } 1894 1895 PPCOperand &Op = static_cast<PPCOperand &>(AsmOp); 1896 if (Op.isU3Imm() && Op.getImm() == ImmVal) 1897 return Match_Success; 1898 1899 return Match_InvalidOperand; 1900 } 1901 1902 const MCExpr * 1903 PPCAsmParser::applyModifierToExpr(const MCExpr *E, 1904 MCSymbolRefExpr::VariantKind Variant, 1905 MCContext &Ctx) { 1906 switch (Variant) { 1907 case MCSymbolRefExpr::VK_PPC_LO: 1908 return PPCMCExpr::create(PPCMCExpr::VK_PPC_LO, E, Ctx); 1909 case MCSymbolRefExpr::VK_PPC_HI: 1910 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HI, E, Ctx); 1911 case MCSymbolRefExpr::VK_PPC_HA: 1912 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HA, E, Ctx); 1913 case MCSymbolRefExpr::VK_PPC_HIGH: 1914 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGH, E, Ctx); 1915 case MCSymbolRefExpr::VK_PPC_HIGHA: 1916 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHA, E, Ctx); 1917 case MCSymbolRefExpr::VK_PPC_HIGHER: 1918 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHER, E, Ctx); 1919 case MCSymbolRefExpr::VK_PPC_HIGHERA: 1920 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHERA, E, Ctx); 1921 case MCSymbolRefExpr::VK_PPC_HIGHEST: 1922 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHEST, E, Ctx); 1923 case MCSymbolRefExpr::VK_PPC_HIGHESTA: 1924 return PPCMCExpr::create(PPCMCExpr::VK_PPC_HIGHESTA, E, Ctx); 1925 default: 1926 return nullptr; 1927 } 1928 } 1929