1 //===-- PPCAsmParser.cpp - Parse PowerPC asm 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/PPCMCTargetDesc.h" 11 #include "MCTargetDesc/PPCMCExpr.h" 12 #include "llvm/MC/MCTargetAsmParser.h" 13 #include "llvm/MC/MCStreamer.h" 14 #include "llvm/MC/MCExpr.h" 15 #include "llvm/MC/MCInst.h" 16 #include "llvm/MC/MCRegisterInfo.h" 17 #include "llvm/MC/MCSubtargetInfo.h" 18 #include "llvm/MC/MCParser/MCAsmLexer.h" 19 #include "llvm/MC/MCParser/MCAsmParser.h" 20 #include "llvm/MC/MCParser/MCParsedAsmOperand.h" 21 #include "llvm/ADT/STLExtras.h" 22 #include "llvm/ADT/SmallString.h" 23 #include "llvm/ADT/SmallVector.h" 24 #include "llvm/ADT/StringSwitch.h" 25 #include "llvm/ADT/Twine.h" 26 #include "llvm/Support/SourceMgr.h" 27 #include "llvm/Support/TargetRegistry.h" 28 #include "llvm/Support/raw_ostream.h" 29 30 using namespace llvm; 31 32 namespace { 33 34 static unsigned RRegs[32] = { 35 PPC::R0, PPC::R1, PPC::R2, PPC::R3, 36 PPC::R4, PPC::R5, PPC::R6, PPC::R7, 37 PPC::R8, PPC::R9, PPC::R10, PPC::R11, 38 PPC::R12, PPC::R13, PPC::R14, PPC::R15, 39 PPC::R16, PPC::R17, PPC::R18, PPC::R19, 40 PPC::R20, PPC::R21, PPC::R22, PPC::R23, 41 PPC::R24, PPC::R25, PPC::R26, PPC::R27, 42 PPC::R28, PPC::R29, PPC::R30, PPC::R31 43 }; 44 static unsigned RRegsNoR0[32] = { 45 PPC::ZERO, 46 PPC::R1, PPC::R2, PPC::R3, 47 PPC::R4, PPC::R5, PPC::R6, PPC::R7, 48 PPC::R8, PPC::R9, PPC::R10, PPC::R11, 49 PPC::R12, PPC::R13, PPC::R14, PPC::R15, 50 PPC::R16, PPC::R17, PPC::R18, PPC::R19, 51 PPC::R20, PPC::R21, PPC::R22, PPC::R23, 52 PPC::R24, PPC::R25, PPC::R26, PPC::R27, 53 PPC::R28, PPC::R29, PPC::R30, PPC::R31 54 }; 55 static unsigned XRegs[32] = { 56 PPC::X0, PPC::X1, PPC::X2, PPC::X3, 57 PPC::X4, PPC::X5, PPC::X6, PPC::X7, 58 PPC::X8, PPC::X9, PPC::X10, PPC::X11, 59 PPC::X12, PPC::X13, PPC::X14, PPC::X15, 60 PPC::X16, PPC::X17, PPC::X18, PPC::X19, 61 PPC::X20, PPC::X21, PPC::X22, PPC::X23, 62 PPC::X24, PPC::X25, PPC::X26, PPC::X27, 63 PPC::X28, PPC::X29, PPC::X30, PPC::X31 64 }; 65 static unsigned XRegsNoX0[32] = { 66 PPC::ZERO8, 67 PPC::X1, PPC::X2, PPC::X3, 68 PPC::X4, PPC::X5, PPC::X6, PPC::X7, 69 PPC::X8, PPC::X9, PPC::X10, PPC::X11, 70 PPC::X12, PPC::X13, PPC::X14, PPC::X15, 71 PPC::X16, PPC::X17, PPC::X18, PPC::X19, 72 PPC::X20, PPC::X21, PPC::X22, PPC::X23, 73 PPC::X24, PPC::X25, PPC::X26, PPC::X27, 74 PPC::X28, PPC::X29, PPC::X30, PPC::X31 75 }; 76 static unsigned FRegs[32] = { 77 PPC::F0, PPC::F1, PPC::F2, PPC::F3, 78 PPC::F4, PPC::F5, PPC::F6, PPC::F7, 79 PPC::F8, PPC::F9, PPC::F10, PPC::F11, 80 PPC::F12, PPC::F13, PPC::F14, PPC::F15, 81 PPC::F16, PPC::F17, PPC::F18, PPC::F19, 82 PPC::F20, PPC::F21, PPC::F22, PPC::F23, 83 PPC::F24, PPC::F25, PPC::F26, PPC::F27, 84 PPC::F28, PPC::F29, PPC::F30, PPC::F31 85 }; 86 static unsigned VRegs[32] = { 87 PPC::V0, PPC::V1, PPC::V2, PPC::V3, 88 PPC::V4, PPC::V5, PPC::V6, PPC::V7, 89 PPC::V8, PPC::V9, PPC::V10, PPC::V11, 90 PPC::V12, PPC::V13, PPC::V14, PPC::V15, 91 PPC::V16, PPC::V17, PPC::V18, PPC::V19, 92 PPC::V20, PPC::V21, PPC::V22, PPC::V23, 93 PPC::V24, PPC::V25, PPC::V26, PPC::V27, 94 PPC::V28, PPC::V29, PPC::V30, PPC::V31 95 }; 96 static unsigned CRBITRegs[32] = { 97 PPC::CR0LT, PPC::CR0GT, PPC::CR0EQ, PPC::CR0UN, 98 PPC::CR1LT, PPC::CR1GT, PPC::CR1EQ, PPC::CR1UN, 99 PPC::CR2LT, PPC::CR2GT, PPC::CR2EQ, PPC::CR2UN, 100 PPC::CR3LT, PPC::CR3GT, PPC::CR3EQ, PPC::CR3UN, 101 PPC::CR4LT, PPC::CR4GT, PPC::CR4EQ, PPC::CR4UN, 102 PPC::CR5LT, PPC::CR5GT, PPC::CR5EQ, PPC::CR5UN, 103 PPC::CR6LT, PPC::CR6GT, PPC::CR6EQ, PPC::CR6UN, 104 PPC::CR7LT, PPC::CR7GT, PPC::CR7EQ, PPC::CR7UN 105 }; 106 static unsigned CRRegs[8] = { 107 PPC::CR0, PPC::CR1, PPC::CR2, PPC::CR3, 108 PPC::CR4, PPC::CR5, PPC::CR6, PPC::CR7 109 }; 110 111 // Evaluate an expression containing condition register 112 // or condition register field symbols. Returns positive 113 // value on success, or -1 on error. 114 static int64_t 115 EvaluateCRExpr(const MCExpr *E) { 116 switch (E->getKind()) { 117 case MCExpr::Target: 118 return -1; 119 120 case MCExpr::Constant: { 121 int64_t Res = cast<MCConstantExpr>(E)->getValue(); 122 return Res < 0 ? -1 : Res; 123 } 124 125 case MCExpr::SymbolRef: { 126 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 127 StringRef Name = SRE->getSymbol().getName(); 128 129 if (Name == "lt") return 0; 130 if (Name == "gt") return 1; 131 if (Name == "eq") return 2; 132 if (Name == "so") return 3; 133 if (Name == "un") return 3; 134 135 if (Name == "cr0") return 0; 136 if (Name == "cr1") return 1; 137 if (Name == "cr2") return 2; 138 if (Name == "cr3") return 3; 139 if (Name == "cr4") return 4; 140 if (Name == "cr5") return 5; 141 if (Name == "cr6") return 6; 142 if (Name == "cr7") return 7; 143 144 return -1; 145 } 146 147 case MCExpr::Unary: 148 return -1; 149 150 case MCExpr::Binary: { 151 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 152 int64_t LHSVal = EvaluateCRExpr(BE->getLHS()); 153 int64_t RHSVal = EvaluateCRExpr(BE->getRHS()); 154 int64_t Res; 155 156 if (LHSVal < 0 || RHSVal < 0) 157 return -1; 158 159 switch (BE->getOpcode()) { 160 default: return -1; 161 case MCBinaryExpr::Add: Res = LHSVal + RHSVal; break; 162 case MCBinaryExpr::Mul: Res = LHSVal * RHSVal; break; 163 } 164 165 return Res < 0 ? -1 : Res; 166 } 167 } 168 169 llvm_unreachable("Invalid expression kind!"); 170 } 171 172 struct PPCOperand; 173 174 class PPCAsmParser : public MCTargetAsmParser { 175 MCSubtargetInfo &STI; 176 MCAsmParser &Parser; 177 bool IsPPC64; 178 179 MCAsmParser &getParser() const { return Parser; } 180 MCAsmLexer &getLexer() const { return Parser.getLexer(); } 181 182 void Warning(SMLoc L, const Twine &Msg) { Parser.Warning(L, Msg); } 183 bool Error(SMLoc L, const Twine &Msg) { return Parser.Error(L, Msg); } 184 185 bool isPPC64() const { return IsPPC64; } 186 187 bool MatchRegisterName(const AsmToken &Tok, 188 unsigned &RegNo, int64_t &IntVal); 189 190 virtual bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc); 191 192 const MCExpr *ExtractModifierFromExpr(const MCExpr *E, 193 PPCMCExpr::VariantKind &Variant); 194 const MCExpr *FixupVariantKind(const MCExpr *E); 195 bool ParseExpression(const MCExpr *&EVal); 196 197 bool ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands); 198 199 bool ParseDirectiveWord(unsigned Size, SMLoc L); 200 bool ParseDirectiveTC(unsigned Size, SMLoc L); 201 bool ParseDirectiveMachine(SMLoc L); 202 203 bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 204 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 205 MCStreamer &Out, unsigned &ErrorInfo, 206 bool MatchingInlineAsm); 207 208 void ProcessInstruction(MCInst &Inst, 209 const SmallVectorImpl<MCParsedAsmOperand*> &Ops); 210 211 /// @name Auto-generated Match Functions 212 /// { 213 214 #define GET_ASSEMBLER_HEADER 215 #include "PPCGenAsmMatcher.inc" 216 217 /// } 218 219 220 public: 221 PPCAsmParser(MCSubtargetInfo &_STI, MCAsmParser &_Parser) 222 : MCTargetAsmParser(), STI(_STI), Parser(_Parser) { 223 // Check for 64-bit vs. 32-bit pointer mode. 224 Triple TheTriple(STI.getTargetTriple()); 225 IsPPC64 = (TheTriple.getArch() == Triple::ppc64 || 226 TheTriple.getArch() == Triple::ppc64le); 227 // Initialize the set of available features. 228 setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); 229 } 230 231 virtual bool ParseInstruction(ParseInstructionInfo &Info, 232 StringRef Name, SMLoc NameLoc, 233 SmallVectorImpl<MCParsedAsmOperand*> &Operands); 234 235 virtual bool ParseDirective(AsmToken DirectiveID); 236 237 unsigned validateTargetOperandClass(MCParsedAsmOperand *Op, unsigned Kind); 238 239 virtual const MCExpr *applyModifierToExpr(const MCExpr *E, 240 MCSymbolRefExpr::VariantKind, 241 MCContext &Ctx); 242 }; 243 244 /// PPCOperand - Instances of this class represent a parsed PowerPC machine 245 /// instruction. 246 struct PPCOperand : public MCParsedAsmOperand { 247 enum KindTy { 248 Token, 249 Immediate, 250 Expression, 251 TLSRegister 252 } Kind; 253 254 SMLoc StartLoc, EndLoc; 255 bool IsPPC64; 256 257 struct TokOp { 258 const char *Data; 259 unsigned Length; 260 }; 261 262 struct ImmOp { 263 int64_t Val; 264 }; 265 266 struct ExprOp { 267 const MCExpr *Val; 268 int64_t CRVal; // Cached result of EvaluateCRExpr(Val) 269 }; 270 271 struct TLSRegOp { 272 const MCSymbolRefExpr *Sym; 273 }; 274 275 union { 276 struct TokOp Tok; 277 struct ImmOp Imm; 278 struct ExprOp Expr; 279 struct TLSRegOp TLSReg; 280 }; 281 282 PPCOperand(KindTy K) : MCParsedAsmOperand(), Kind(K) {} 283 public: 284 PPCOperand(const PPCOperand &o) : MCParsedAsmOperand() { 285 Kind = o.Kind; 286 StartLoc = o.StartLoc; 287 EndLoc = o.EndLoc; 288 IsPPC64 = o.IsPPC64; 289 switch (Kind) { 290 case Token: 291 Tok = o.Tok; 292 break; 293 case Immediate: 294 Imm = o.Imm; 295 break; 296 case Expression: 297 Expr = o.Expr; 298 break; 299 case TLSRegister: 300 TLSReg = o.TLSReg; 301 break; 302 } 303 } 304 305 /// getStartLoc - Get the location of the first token of this operand. 306 SMLoc getStartLoc() const { return StartLoc; } 307 308 /// getEndLoc - Get the location of the last token of this operand. 309 SMLoc getEndLoc() const { return EndLoc; } 310 311 /// isPPC64 - True if this operand is for an instruction in 64-bit mode. 312 bool isPPC64() const { return IsPPC64; } 313 314 int64_t getImm() const { 315 assert(Kind == Immediate && "Invalid access!"); 316 return Imm.Val; 317 } 318 319 const MCExpr *getExpr() const { 320 assert(Kind == Expression && "Invalid access!"); 321 return Expr.Val; 322 } 323 324 int64_t getExprCRVal() const { 325 assert(Kind == Expression && "Invalid access!"); 326 return Expr.CRVal; 327 } 328 329 const MCExpr *getTLSReg() const { 330 assert(Kind == TLSRegister && "Invalid access!"); 331 return TLSReg.Sym; 332 } 333 334 unsigned getReg() const { 335 assert(isRegNumber() && "Invalid access!"); 336 return (unsigned) Imm.Val; 337 } 338 339 unsigned getCCReg() const { 340 assert(isCCRegNumber() && "Invalid access!"); 341 return (unsigned) (Kind == Immediate ? Imm.Val : Expr.CRVal); 342 } 343 344 unsigned getCRBit() const { 345 assert(isCRBitNumber() && "Invalid access!"); 346 return (unsigned) (Kind == Immediate ? Imm.Val : Expr.CRVal); 347 } 348 349 unsigned getCRBitMask() const { 350 assert(isCRBitMask() && "Invalid access!"); 351 return 7 - countTrailingZeros<uint64_t>(Imm.Val); 352 } 353 354 bool isToken() const { return Kind == Token; } 355 bool isImm() const { return Kind == Immediate || Kind == Expression; } 356 bool isU5Imm() const { return Kind == Immediate && isUInt<5>(getImm()); } 357 bool isS5Imm() const { return Kind == Immediate && isInt<5>(getImm()); } 358 bool isU6Imm() const { return Kind == Immediate && isUInt<6>(getImm()); } 359 bool isU16Imm() const { return Kind == Expression || 360 (Kind == Immediate && isUInt<16>(getImm())); } 361 bool isS16Imm() const { return Kind == Expression || 362 (Kind == Immediate && isInt<16>(getImm())); } 363 bool isS16ImmX4() const { return Kind == Expression || 364 (Kind == Immediate && isInt<16>(getImm()) && 365 (getImm() & 3) == 0); } 366 bool isS17Imm() const { return Kind == Expression || 367 (Kind == Immediate && isInt<17>(getImm())); } 368 bool isTLSReg() const { return Kind == TLSRegister; } 369 bool isDirectBr() const { return Kind == Expression || 370 (Kind == Immediate && isInt<26>(getImm()) && 371 (getImm() & 3) == 0); } 372 bool isCondBr() const { return Kind == Expression || 373 (Kind == Immediate && isInt<16>(getImm()) && 374 (getImm() & 3) == 0); } 375 bool isRegNumber() const { return Kind == Immediate && isUInt<5>(getImm()); } 376 bool isCCRegNumber() const { return (Kind == Expression 377 && isUInt<3>(getExprCRVal())) || 378 (Kind == Immediate 379 && isUInt<3>(getImm())); } 380 bool isCRBitNumber() const { return (Kind == Expression 381 && isUInt<5>(getExprCRVal())) || 382 (Kind == Immediate 383 && isUInt<5>(getImm())); } 384 bool isCRBitMask() const { return Kind == Immediate && isUInt<8>(getImm()) && 385 isPowerOf2_32(getImm()); } 386 bool isMem() const { return false; } 387 bool isReg() const { return false; } 388 389 void addRegOperands(MCInst &Inst, unsigned N) const { 390 llvm_unreachable("addRegOperands"); 391 } 392 393 void addRegGPRCOperands(MCInst &Inst, unsigned N) const { 394 assert(N == 1 && "Invalid number of operands!"); 395 Inst.addOperand(MCOperand::CreateReg(RRegs[getReg()])); 396 } 397 398 void addRegGPRCNoR0Operands(MCInst &Inst, unsigned N) const { 399 assert(N == 1 && "Invalid number of operands!"); 400 Inst.addOperand(MCOperand::CreateReg(RRegsNoR0[getReg()])); 401 } 402 403 void addRegG8RCOperands(MCInst &Inst, unsigned N) const { 404 assert(N == 1 && "Invalid number of operands!"); 405 Inst.addOperand(MCOperand::CreateReg(XRegs[getReg()])); 406 } 407 408 void addRegG8RCNoX0Operands(MCInst &Inst, unsigned N) const { 409 assert(N == 1 && "Invalid number of operands!"); 410 Inst.addOperand(MCOperand::CreateReg(XRegsNoX0[getReg()])); 411 } 412 413 void addRegGxRCOperands(MCInst &Inst, unsigned N) const { 414 if (isPPC64()) 415 addRegG8RCOperands(Inst, N); 416 else 417 addRegGPRCOperands(Inst, N); 418 } 419 420 void addRegGxRCNoR0Operands(MCInst &Inst, unsigned N) const { 421 if (isPPC64()) 422 addRegG8RCNoX0Operands(Inst, N); 423 else 424 addRegGPRCNoR0Operands(Inst, N); 425 } 426 427 void addRegF4RCOperands(MCInst &Inst, unsigned N) const { 428 assert(N == 1 && "Invalid number of operands!"); 429 Inst.addOperand(MCOperand::CreateReg(FRegs[getReg()])); 430 } 431 432 void addRegF8RCOperands(MCInst &Inst, unsigned N) const { 433 assert(N == 1 && "Invalid number of operands!"); 434 Inst.addOperand(MCOperand::CreateReg(FRegs[getReg()])); 435 } 436 437 void addRegVRRCOperands(MCInst &Inst, unsigned N) const { 438 assert(N == 1 && "Invalid number of operands!"); 439 Inst.addOperand(MCOperand::CreateReg(VRegs[getReg()])); 440 } 441 442 void addRegCRBITRCOperands(MCInst &Inst, unsigned N) const { 443 assert(N == 1 && "Invalid number of operands!"); 444 Inst.addOperand(MCOperand::CreateReg(CRBITRegs[getCRBit()])); 445 } 446 447 void addRegCRRCOperands(MCInst &Inst, unsigned N) const { 448 assert(N == 1 && "Invalid number of operands!"); 449 Inst.addOperand(MCOperand::CreateReg(CRRegs[getCCReg()])); 450 } 451 452 void addCRBitMaskOperands(MCInst &Inst, unsigned N) const { 453 assert(N == 1 && "Invalid number of operands!"); 454 Inst.addOperand(MCOperand::CreateReg(CRRegs[getCRBitMask()])); 455 } 456 457 void addImmOperands(MCInst &Inst, unsigned N) const { 458 assert(N == 1 && "Invalid number of operands!"); 459 if (Kind == Immediate) 460 Inst.addOperand(MCOperand::CreateImm(getImm())); 461 else 462 Inst.addOperand(MCOperand::CreateExpr(getExpr())); 463 } 464 465 void addBranchTargetOperands(MCInst &Inst, unsigned N) const { 466 assert(N == 1 && "Invalid number of operands!"); 467 if (Kind == Immediate) 468 Inst.addOperand(MCOperand::CreateImm(getImm() / 4)); 469 else 470 Inst.addOperand(MCOperand::CreateExpr(getExpr())); 471 } 472 473 void addTLSRegOperands(MCInst &Inst, unsigned N) const { 474 assert(N == 1 && "Invalid number of operands!"); 475 Inst.addOperand(MCOperand::CreateExpr(getTLSReg())); 476 } 477 478 StringRef getToken() const { 479 assert(Kind == Token && "Invalid access!"); 480 return StringRef(Tok.Data, Tok.Length); 481 } 482 483 virtual void print(raw_ostream &OS) const; 484 485 static PPCOperand *CreateToken(StringRef Str, SMLoc S, bool IsPPC64) { 486 PPCOperand *Op = new PPCOperand(Token); 487 Op->Tok.Data = Str.data(); 488 Op->Tok.Length = Str.size(); 489 Op->StartLoc = S; 490 Op->EndLoc = S; 491 Op->IsPPC64 = IsPPC64; 492 return Op; 493 } 494 495 static PPCOperand *CreateTokenWithStringCopy(StringRef Str, SMLoc S, 496 bool IsPPC64) { 497 // Allocate extra memory for the string and copy it. 498 void *Mem = ::operator new(sizeof(PPCOperand) + Str.size()); 499 PPCOperand *Op = new (Mem) PPCOperand(Token); 500 Op->Tok.Data = (const char *)(Op + 1); 501 Op->Tok.Length = Str.size(); 502 std::memcpy((char *)(Op + 1), Str.data(), Str.size()); 503 Op->StartLoc = S; 504 Op->EndLoc = S; 505 Op->IsPPC64 = IsPPC64; 506 return Op; 507 } 508 509 static PPCOperand *CreateImm(int64_t Val, SMLoc S, SMLoc E, bool IsPPC64) { 510 PPCOperand *Op = new PPCOperand(Immediate); 511 Op->Imm.Val = Val; 512 Op->StartLoc = S; 513 Op->EndLoc = E; 514 Op->IsPPC64 = IsPPC64; 515 return Op; 516 } 517 518 static PPCOperand *CreateExpr(const MCExpr *Val, 519 SMLoc S, SMLoc E, bool IsPPC64) { 520 PPCOperand *Op = new PPCOperand(Expression); 521 Op->Expr.Val = Val; 522 Op->Expr.CRVal = EvaluateCRExpr(Val); 523 Op->StartLoc = S; 524 Op->EndLoc = E; 525 Op->IsPPC64 = IsPPC64; 526 return Op; 527 } 528 529 static PPCOperand *CreateTLSReg(const MCSymbolRefExpr *Sym, 530 SMLoc S, SMLoc E, bool IsPPC64) { 531 PPCOperand *Op = new PPCOperand(TLSRegister); 532 Op->TLSReg.Sym = Sym; 533 Op->StartLoc = S; 534 Op->EndLoc = E; 535 Op->IsPPC64 = IsPPC64; 536 return Op; 537 } 538 539 static PPCOperand *CreateFromMCExpr(const MCExpr *Val, 540 SMLoc S, SMLoc E, bool IsPPC64) { 541 if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Val)) 542 return CreateImm(CE->getValue(), S, E, IsPPC64); 543 544 if (const MCSymbolRefExpr *SRE = dyn_cast<MCSymbolRefExpr>(Val)) 545 if (SRE->getKind() == MCSymbolRefExpr::VK_PPC_TLS) 546 return CreateTLSReg(SRE, S, E, IsPPC64); 547 548 return CreateExpr(Val, S, E, IsPPC64); 549 } 550 }; 551 552 } // end anonymous namespace. 553 554 void PPCOperand::print(raw_ostream &OS) const { 555 switch (Kind) { 556 case Token: 557 OS << "'" << getToken() << "'"; 558 break; 559 case Immediate: 560 OS << getImm(); 561 break; 562 case Expression: 563 getExpr()->print(OS); 564 break; 565 case TLSRegister: 566 getTLSReg()->print(OS); 567 break; 568 } 569 } 570 571 572 void PPCAsmParser:: 573 ProcessInstruction(MCInst &Inst, 574 const SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 575 int Opcode = Inst.getOpcode(); 576 switch (Opcode) { 577 case PPC::LAx: { 578 MCInst TmpInst; 579 TmpInst.setOpcode(PPC::LA); 580 TmpInst.addOperand(Inst.getOperand(0)); 581 TmpInst.addOperand(Inst.getOperand(2)); 582 TmpInst.addOperand(Inst.getOperand(1)); 583 Inst = TmpInst; 584 break; 585 } 586 case PPC::SUBI: { 587 MCInst TmpInst; 588 int64_t N = Inst.getOperand(2).getImm(); 589 TmpInst.setOpcode(PPC::ADDI); 590 TmpInst.addOperand(Inst.getOperand(0)); 591 TmpInst.addOperand(Inst.getOperand(1)); 592 TmpInst.addOperand(MCOperand::CreateImm(-N)); 593 Inst = TmpInst; 594 break; 595 } 596 case PPC::SUBIS: { 597 MCInst TmpInst; 598 int64_t N = Inst.getOperand(2).getImm(); 599 TmpInst.setOpcode(PPC::ADDIS); 600 TmpInst.addOperand(Inst.getOperand(0)); 601 TmpInst.addOperand(Inst.getOperand(1)); 602 TmpInst.addOperand(MCOperand::CreateImm(-N)); 603 Inst = TmpInst; 604 break; 605 } 606 case PPC::SUBIC: { 607 MCInst TmpInst; 608 int64_t N = Inst.getOperand(2).getImm(); 609 TmpInst.setOpcode(PPC::ADDIC); 610 TmpInst.addOperand(Inst.getOperand(0)); 611 TmpInst.addOperand(Inst.getOperand(1)); 612 TmpInst.addOperand(MCOperand::CreateImm(-N)); 613 Inst = TmpInst; 614 break; 615 } 616 case PPC::SUBICo: { 617 MCInst TmpInst; 618 int64_t N = Inst.getOperand(2).getImm(); 619 TmpInst.setOpcode(PPC::ADDICo); 620 TmpInst.addOperand(Inst.getOperand(0)); 621 TmpInst.addOperand(Inst.getOperand(1)); 622 TmpInst.addOperand(MCOperand::CreateImm(-N)); 623 Inst = TmpInst; 624 break; 625 } 626 case PPC::EXTLWI: 627 case PPC::EXTLWIo: { 628 MCInst TmpInst; 629 int64_t N = Inst.getOperand(2).getImm(); 630 int64_t B = Inst.getOperand(3).getImm(); 631 TmpInst.setOpcode(Opcode == PPC::EXTLWI? PPC::RLWINM : PPC::RLWINMo); 632 TmpInst.addOperand(Inst.getOperand(0)); 633 TmpInst.addOperand(Inst.getOperand(1)); 634 TmpInst.addOperand(MCOperand::CreateImm(B)); 635 TmpInst.addOperand(MCOperand::CreateImm(0)); 636 TmpInst.addOperand(MCOperand::CreateImm(N - 1)); 637 Inst = TmpInst; 638 break; 639 } 640 case PPC::EXTRWI: 641 case PPC::EXTRWIo: { 642 MCInst TmpInst; 643 int64_t N = Inst.getOperand(2).getImm(); 644 int64_t B = Inst.getOperand(3).getImm(); 645 TmpInst.setOpcode(Opcode == PPC::EXTRWI? PPC::RLWINM : PPC::RLWINMo); 646 TmpInst.addOperand(Inst.getOperand(0)); 647 TmpInst.addOperand(Inst.getOperand(1)); 648 TmpInst.addOperand(MCOperand::CreateImm(B + N)); 649 TmpInst.addOperand(MCOperand::CreateImm(32 - N)); 650 TmpInst.addOperand(MCOperand::CreateImm(31)); 651 Inst = TmpInst; 652 break; 653 } 654 case PPC::INSLWI: 655 case PPC::INSLWIo: { 656 MCInst TmpInst; 657 int64_t N = Inst.getOperand(2).getImm(); 658 int64_t B = Inst.getOperand(3).getImm(); 659 TmpInst.setOpcode(Opcode == PPC::INSLWI? PPC::RLWIMI : PPC::RLWIMIo); 660 TmpInst.addOperand(Inst.getOperand(0)); 661 TmpInst.addOperand(Inst.getOperand(0)); 662 TmpInst.addOperand(Inst.getOperand(1)); 663 TmpInst.addOperand(MCOperand::CreateImm(32 - B)); 664 TmpInst.addOperand(MCOperand::CreateImm(B)); 665 TmpInst.addOperand(MCOperand::CreateImm((B + N) - 1)); 666 Inst = TmpInst; 667 break; 668 } 669 case PPC::INSRWI: 670 case PPC::INSRWIo: { 671 MCInst TmpInst; 672 int64_t N = Inst.getOperand(2).getImm(); 673 int64_t B = Inst.getOperand(3).getImm(); 674 TmpInst.setOpcode(Opcode == PPC::INSRWI? PPC::RLWIMI : PPC::RLWIMIo); 675 TmpInst.addOperand(Inst.getOperand(0)); 676 TmpInst.addOperand(Inst.getOperand(0)); 677 TmpInst.addOperand(Inst.getOperand(1)); 678 TmpInst.addOperand(MCOperand::CreateImm(32 - (B + N))); 679 TmpInst.addOperand(MCOperand::CreateImm(B)); 680 TmpInst.addOperand(MCOperand::CreateImm((B + N) - 1)); 681 Inst = TmpInst; 682 break; 683 } 684 case PPC::ROTRWI: 685 case PPC::ROTRWIo: { 686 MCInst TmpInst; 687 int64_t N = Inst.getOperand(2).getImm(); 688 TmpInst.setOpcode(Opcode == PPC::ROTRWI? PPC::RLWINM : PPC::RLWINMo); 689 TmpInst.addOperand(Inst.getOperand(0)); 690 TmpInst.addOperand(Inst.getOperand(1)); 691 TmpInst.addOperand(MCOperand::CreateImm(32 - N)); 692 TmpInst.addOperand(MCOperand::CreateImm(0)); 693 TmpInst.addOperand(MCOperand::CreateImm(31)); 694 Inst = TmpInst; 695 break; 696 } 697 case PPC::SLWI: 698 case PPC::SLWIo: { 699 MCInst TmpInst; 700 int64_t N = Inst.getOperand(2).getImm(); 701 TmpInst.setOpcode(Opcode == PPC::SLWI? PPC::RLWINM : PPC::RLWINMo); 702 TmpInst.addOperand(Inst.getOperand(0)); 703 TmpInst.addOperand(Inst.getOperand(1)); 704 TmpInst.addOperand(MCOperand::CreateImm(N)); 705 TmpInst.addOperand(MCOperand::CreateImm(0)); 706 TmpInst.addOperand(MCOperand::CreateImm(31 - N)); 707 Inst = TmpInst; 708 break; 709 } 710 case PPC::SRWI: 711 case PPC::SRWIo: { 712 MCInst TmpInst; 713 int64_t N = Inst.getOperand(2).getImm(); 714 TmpInst.setOpcode(Opcode == PPC::SRWI? PPC::RLWINM : PPC::RLWINMo); 715 TmpInst.addOperand(Inst.getOperand(0)); 716 TmpInst.addOperand(Inst.getOperand(1)); 717 TmpInst.addOperand(MCOperand::CreateImm(32 - N)); 718 TmpInst.addOperand(MCOperand::CreateImm(N)); 719 TmpInst.addOperand(MCOperand::CreateImm(31)); 720 Inst = TmpInst; 721 break; 722 } 723 case PPC::CLRRWI: 724 case PPC::CLRRWIo: { 725 MCInst TmpInst; 726 int64_t N = Inst.getOperand(2).getImm(); 727 TmpInst.setOpcode(Opcode == PPC::CLRRWI? PPC::RLWINM : PPC::RLWINMo); 728 TmpInst.addOperand(Inst.getOperand(0)); 729 TmpInst.addOperand(Inst.getOperand(1)); 730 TmpInst.addOperand(MCOperand::CreateImm(0)); 731 TmpInst.addOperand(MCOperand::CreateImm(0)); 732 TmpInst.addOperand(MCOperand::CreateImm(31 - N)); 733 Inst = TmpInst; 734 break; 735 } 736 case PPC::CLRLSLWI: 737 case PPC::CLRLSLWIo: { 738 MCInst TmpInst; 739 int64_t B = Inst.getOperand(2).getImm(); 740 int64_t N = Inst.getOperand(3).getImm(); 741 TmpInst.setOpcode(Opcode == PPC::CLRLSLWI? PPC::RLWINM : PPC::RLWINMo); 742 TmpInst.addOperand(Inst.getOperand(0)); 743 TmpInst.addOperand(Inst.getOperand(1)); 744 TmpInst.addOperand(MCOperand::CreateImm(N)); 745 TmpInst.addOperand(MCOperand::CreateImm(B - N)); 746 TmpInst.addOperand(MCOperand::CreateImm(31 - N)); 747 Inst = TmpInst; 748 break; 749 } 750 case PPC::EXTLDI: 751 case PPC::EXTLDIo: { 752 MCInst TmpInst; 753 int64_t N = Inst.getOperand(2).getImm(); 754 int64_t B = Inst.getOperand(3).getImm(); 755 TmpInst.setOpcode(Opcode == PPC::EXTLDI? PPC::RLDICR : PPC::RLDICRo); 756 TmpInst.addOperand(Inst.getOperand(0)); 757 TmpInst.addOperand(Inst.getOperand(1)); 758 TmpInst.addOperand(MCOperand::CreateImm(B)); 759 TmpInst.addOperand(MCOperand::CreateImm(N - 1)); 760 Inst = TmpInst; 761 break; 762 } 763 case PPC::EXTRDI: 764 case PPC::EXTRDIo: { 765 MCInst TmpInst; 766 int64_t N = Inst.getOperand(2).getImm(); 767 int64_t B = Inst.getOperand(3).getImm(); 768 TmpInst.setOpcode(Opcode == PPC::EXTRDI? PPC::RLDICL : PPC::RLDICLo); 769 TmpInst.addOperand(Inst.getOperand(0)); 770 TmpInst.addOperand(Inst.getOperand(1)); 771 TmpInst.addOperand(MCOperand::CreateImm(B + N)); 772 TmpInst.addOperand(MCOperand::CreateImm(64 - N)); 773 Inst = TmpInst; 774 break; 775 } 776 case PPC::INSRDI: 777 case PPC::INSRDIo: { 778 MCInst TmpInst; 779 int64_t N = Inst.getOperand(2).getImm(); 780 int64_t B = Inst.getOperand(3).getImm(); 781 TmpInst.setOpcode(Opcode == PPC::INSRDI? PPC::RLDIMI : PPC::RLDIMIo); 782 TmpInst.addOperand(Inst.getOperand(0)); 783 TmpInst.addOperand(Inst.getOperand(0)); 784 TmpInst.addOperand(Inst.getOperand(1)); 785 TmpInst.addOperand(MCOperand::CreateImm(64 - (B + N))); 786 TmpInst.addOperand(MCOperand::CreateImm(B)); 787 Inst = TmpInst; 788 break; 789 } 790 case PPC::ROTRDI: 791 case PPC::ROTRDIo: { 792 MCInst TmpInst; 793 int64_t N = Inst.getOperand(2).getImm(); 794 TmpInst.setOpcode(Opcode == PPC::ROTRDI? PPC::RLDICL : PPC::RLDICLo); 795 TmpInst.addOperand(Inst.getOperand(0)); 796 TmpInst.addOperand(Inst.getOperand(1)); 797 TmpInst.addOperand(MCOperand::CreateImm(64 - N)); 798 TmpInst.addOperand(MCOperand::CreateImm(0)); 799 Inst = TmpInst; 800 break; 801 } 802 case PPC::SLDI: 803 case PPC::SLDIo: { 804 MCInst TmpInst; 805 int64_t N = Inst.getOperand(2).getImm(); 806 TmpInst.setOpcode(Opcode == PPC::SLDI? PPC::RLDICR : PPC::RLDICRo); 807 TmpInst.addOperand(Inst.getOperand(0)); 808 TmpInst.addOperand(Inst.getOperand(1)); 809 TmpInst.addOperand(MCOperand::CreateImm(N)); 810 TmpInst.addOperand(MCOperand::CreateImm(63 - N)); 811 Inst = TmpInst; 812 break; 813 } 814 case PPC::SRDI: 815 case PPC::SRDIo: { 816 MCInst TmpInst; 817 int64_t N = Inst.getOperand(2).getImm(); 818 TmpInst.setOpcode(Opcode == PPC::SRDI? PPC::RLDICL : PPC::RLDICLo); 819 TmpInst.addOperand(Inst.getOperand(0)); 820 TmpInst.addOperand(Inst.getOperand(1)); 821 TmpInst.addOperand(MCOperand::CreateImm(64 - N)); 822 TmpInst.addOperand(MCOperand::CreateImm(N)); 823 Inst = TmpInst; 824 break; 825 } 826 case PPC::CLRRDI: 827 case PPC::CLRRDIo: { 828 MCInst TmpInst; 829 int64_t N = Inst.getOperand(2).getImm(); 830 TmpInst.setOpcode(Opcode == PPC::CLRRDI? PPC::RLDICR : PPC::RLDICRo); 831 TmpInst.addOperand(Inst.getOperand(0)); 832 TmpInst.addOperand(Inst.getOperand(1)); 833 TmpInst.addOperand(MCOperand::CreateImm(0)); 834 TmpInst.addOperand(MCOperand::CreateImm(63 - N)); 835 Inst = TmpInst; 836 break; 837 } 838 case PPC::CLRLSLDI: 839 case PPC::CLRLSLDIo: { 840 MCInst TmpInst; 841 int64_t B = Inst.getOperand(2).getImm(); 842 int64_t N = Inst.getOperand(3).getImm(); 843 TmpInst.setOpcode(Opcode == PPC::CLRLSLDI? PPC::RLDIC : PPC::RLDICo); 844 TmpInst.addOperand(Inst.getOperand(0)); 845 TmpInst.addOperand(Inst.getOperand(1)); 846 TmpInst.addOperand(MCOperand::CreateImm(N)); 847 TmpInst.addOperand(MCOperand::CreateImm(B - N)); 848 Inst = TmpInst; 849 break; 850 } 851 } 852 } 853 854 bool PPCAsmParser:: 855 MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 856 SmallVectorImpl<MCParsedAsmOperand*> &Operands, 857 MCStreamer &Out, unsigned &ErrorInfo, 858 bool MatchingInlineAsm) { 859 MCInst Inst; 860 861 switch (MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm)) { 862 default: break; 863 case Match_Success: 864 // Post-process instructions (typically extended mnemonics) 865 ProcessInstruction(Inst, Operands); 866 Inst.setLoc(IDLoc); 867 Out.EmitInstruction(Inst); 868 return false; 869 case Match_MissingFeature: 870 return Error(IDLoc, "instruction use requires an option to be enabled"); 871 case Match_MnemonicFail: 872 return Error(IDLoc, "unrecognized instruction mnemonic"); 873 case Match_InvalidOperand: { 874 SMLoc ErrorLoc = IDLoc; 875 if (ErrorInfo != ~0U) { 876 if (ErrorInfo >= Operands.size()) 877 return Error(IDLoc, "too few operands for instruction"); 878 879 ErrorLoc = ((PPCOperand*)Operands[ErrorInfo])->getStartLoc(); 880 if (ErrorLoc == SMLoc()) ErrorLoc = IDLoc; 881 } 882 883 return Error(ErrorLoc, "invalid operand for instruction"); 884 } 885 } 886 887 llvm_unreachable("Implement any new match types added!"); 888 } 889 890 bool PPCAsmParser:: 891 MatchRegisterName(const AsmToken &Tok, unsigned &RegNo, int64_t &IntVal) { 892 if (Tok.is(AsmToken::Identifier)) { 893 StringRef Name = Tok.getString(); 894 895 if (Name.equals_lower("lr")) { 896 RegNo = isPPC64()? PPC::LR8 : PPC::LR; 897 IntVal = 8; 898 return false; 899 } else if (Name.equals_lower("ctr")) { 900 RegNo = isPPC64()? PPC::CTR8 : PPC::CTR; 901 IntVal = 9; 902 return false; 903 } else if (Name.equals_lower("vrsave")) { 904 RegNo = PPC::VRSAVE; 905 IntVal = 256; 906 return false; 907 } else if (Name.substr(0, 1).equals_lower("r") && 908 !Name.substr(1).getAsInteger(10, IntVal) && IntVal < 32) { 909 RegNo = isPPC64()? XRegs[IntVal] : RRegs[IntVal]; 910 return false; 911 } else if (Name.substr(0, 1).equals_lower("f") && 912 !Name.substr(1).getAsInteger(10, IntVal) && IntVal < 32) { 913 RegNo = FRegs[IntVal]; 914 return false; 915 } else if (Name.substr(0, 1).equals_lower("v") && 916 !Name.substr(1).getAsInteger(10, IntVal) && IntVal < 32) { 917 RegNo = VRegs[IntVal]; 918 return false; 919 } else if (Name.substr(0, 2).equals_lower("cr") && 920 !Name.substr(2).getAsInteger(10, IntVal) && IntVal < 8) { 921 RegNo = CRRegs[IntVal]; 922 return false; 923 } 924 } 925 926 return true; 927 } 928 929 bool PPCAsmParser:: 930 ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) { 931 const AsmToken &Tok = Parser.getTok(); 932 StartLoc = Tok.getLoc(); 933 EndLoc = Tok.getEndLoc(); 934 RegNo = 0; 935 int64_t IntVal; 936 937 if (!MatchRegisterName(Tok, RegNo, IntVal)) { 938 Parser.Lex(); // Eat identifier token. 939 return false; 940 } 941 942 return Error(StartLoc, "invalid register name"); 943 } 944 945 /// Extract \code @l/@ha \endcode modifier from expression. Recursively scan 946 /// the expression and check for VK_PPC_LO/HI/HA 947 /// symbol variants. If all symbols with modifier use the same 948 /// variant, return the corresponding PPCMCExpr::VariantKind, 949 /// and a modified expression using the default symbol variant. 950 /// Otherwise, return NULL. 951 const MCExpr *PPCAsmParser:: 952 ExtractModifierFromExpr(const MCExpr *E, 953 PPCMCExpr::VariantKind &Variant) { 954 MCContext &Context = getParser().getContext(); 955 Variant = PPCMCExpr::VK_PPC_None; 956 957 switch (E->getKind()) { 958 case MCExpr::Target: 959 case MCExpr::Constant: 960 return 0; 961 962 case MCExpr::SymbolRef: { 963 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 964 965 switch (SRE->getKind()) { 966 case MCSymbolRefExpr::VK_PPC_LO: 967 Variant = PPCMCExpr::VK_PPC_LO; 968 break; 969 case MCSymbolRefExpr::VK_PPC_HI: 970 Variant = PPCMCExpr::VK_PPC_HI; 971 break; 972 case MCSymbolRefExpr::VK_PPC_HA: 973 Variant = PPCMCExpr::VK_PPC_HA; 974 break; 975 case MCSymbolRefExpr::VK_PPC_HIGHER: 976 Variant = PPCMCExpr::VK_PPC_HIGHER; 977 break; 978 case MCSymbolRefExpr::VK_PPC_HIGHERA: 979 Variant = PPCMCExpr::VK_PPC_HIGHERA; 980 break; 981 case MCSymbolRefExpr::VK_PPC_HIGHEST: 982 Variant = PPCMCExpr::VK_PPC_HIGHEST; 983 break; 984 case MCSymbolRefExpr::VK_PPC_HIGHESTA: 985 Variant = PPCMCExpr::VK_PPC_HIGHESTA; 986 break; 987 default: 988 return 0; 989 } 990 991 return MCSymbolRefExpr::Create(&SRE->getSymbol(), Context); 992 } 993 994 case MCExpr::Unary: { 995 const MCUnaryExpr *UE = cast<MCUnaryExpr>(E); 996 const MCExpr *Sub = ExtractModifierFromExpr(UE->getSubExpr(), Variant); 997 if (!Sub) 998 return 0; 999 return MCUnaryExpr::Create(UE->getOpcode(), Sub, Context); 1000 } 1001 1002 case MCExpr::Binary: { 1003 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 1004 PPCMCExpr::VariantKind LHSVariant, RHSVariant; 1005 const MCExpr *LHS = ExtractModifierFromExpr(BE->getLHS(), LHSVariant); 1006 const MCExpr *RHS = ExtractModifierFromExpr(BE->getRHS(), RHSVariant); 1007 1008 if (!LHS && !RHS) 1009 return 0; 1010 1011 if (!LHS) LHS = BE->getLHS(); 1012 if (!RHS) RHS = BE->getRHS(); 1013 1014 if (LHSVariant == PPCMCExpr::VK_PPC_None) 1015 Variant = RHSVariant; 1016 else if (RHSVariant == PPCMCExpr::VK_PPC_None) 1017 Variant = LHSVariant; 1018 else if (LHSVariant == RHSVariant) 1019 Variant = LHSVariant; 1020 else 1021 return 0; 1022 1023 return MCBinaryExpr::Create(BE->getOpcode(), LHS, RHS, Context); 1024 } 1025 } 1026 1027 llvm_unreachable("Invalid expression kind!"); 1028 } 1029 1030 /// Find all VK_TLSGD/VK_TLSLD symbol references in expression and replace 1031 /// them by VK_PPC_TLSGD/VK_PPC_TLSLD. This is necessary to avoid having 1032 /// _GLOBAL_OFFSET_TABLE_ created via ELFObjectWriter::RelocNeedsGOT. 1033 /// FIXME: This is a hack. 1034 const MCExpr *PPCAsmParser:: 1035 FixupVariantKind(const MCExpr *E) { 1036 MCContext &Context = getParser().getContext(); 1037 1038 switch (E->getKind()) { 1039 case MCExpr::Target: 1040 case MCExpr::Constant: 1041 return E; 1042 1043 case MCExpr::SymbolRef: { 1044 const MCSymbolRefExpr *SRE = cast<MCSymbolRefExpr>(E); 1045 MCSymbolRefExpr::VariantKind Variant = MCSymbolRefExpr::VK_None; 1046 1047 switch (SRE->getKind()) { 1048 case MCSymbolRefExpr::VK_TLSGD: 1049 Variant = MCSymbolRefExpr::VK_PPC_TLSGD; 1050 break; 1051 case MCSymbolRefExpr::VK_TLSLD: 1052 Variant = MCSymbolRefExpr::VK_PPC_TLSLD; 1053 break; 1054 default: 1055 return E; 1056 } 1057 return MCSymbolRefExpr::Create(&SRE->getSymbol(), Variant, Context); 1058 } 1059 1060 case MCExpr::Unary: { 1061 const MCUnaryExpr *UE = cast<MCUnaryExpr>(E); 1062 const MCExpr *Sub = FixupVariantKind(UE->getSubExpr()); 1063 if (Sub == UE->getSubExpr()) 1064 return E; 1065 return MCUnaryExpr::Create(UE->getOpcode(), Sub, Context); 1066 } 1067 1068 case MCExpr::Binary: { 1069 const MCBinaryExpr *BE = cast<MCBinaryExpr>(E); 1070 const MCExpr *LHS = FixupVariantKind(BE->getLHS()); 1071 const MCExpr *RHS = FixupVariantKind(BE->getRHS()); 1072 if (LHS == BE->getLHS() && RHS == BE->getRHS()) 1073 return E; 1074 return MCBinaryExpr::Create(BE->getOpcode(), LHS, RHS, Context); 1075 } 1076 } 1077 1078 llvm_unreachable("Invalid expression kind!"); 1079 } 1080 1081 /// Parse an expression. This differs from the default "parseExpression" 1082 /// in that it handles complex \code @l/@ha \endcode modifiers. 1083 bool PPCAsmParser:: 1084 ParseExpression(const MCExpr *&EVal) { 1085 if (getParser().parseExpression(EVal)) 1086 return true; 1087 1088 EVal = FixupVariantKind(EVal); 1089 1090 PPCMCExpr::VariantKind Variant; 1091 const MCExpr *E = ExtractModifierFromExpr(EVal, Variant); 1092 if (E) 1093 EVal = PPCMCExpr::Create(Variant, E, false, getParser().getContext()); 1094 1095 return false; 1096 } 1097 1098 bool PPCAsmParser:: 1099 ParseOperand(SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1100 SMLoc S = Parser.getTok().getLoc(); 1101 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 1102 const MCExpr *EVal; 1103 PPCOperand *Op; 1104 1105 // Attempt to parse the next token as an immediate 1106 switch (getLexer().getKind()) { 1107 // Special handling for register names. These are interpreted 1108 // as immediates corresponding to the register number. 1109 case AsmToken::Percent: 1110 Parser.Lex(); // Eat the '%'. 1111 unsigned RegNo; 1112 int64_t IntVal; 1113 if (!MatchRegisterName(Parser.getTok(), RegNo, IntVal)) { 1114 Parser.Lex(); // Eat the identifier token. 1115 Op = PPCOperand::CreateImm(IntVal, S, E, isPPC64()); 1116 Operands.push_back(Op); 1117 return false; 1118 } 1119 return Error(S, "invalid register name"); 1120 1121 // All other expressions 1122 case AsmToken::LParen: 1123 case AsmToken::Plus: 1124 case AsmToken::Minus: 1125 case AsmToken::Integer: 1126 case AsmToken::Identifier: 1127 case AsmToken::Dot: 1128 case AsmToken::Dollar: 1129 if (!ParseExpression(EVal)) 1130 break; 1131 /* fall through */ 1132 default: 1133 return Error(S, "unknown operand"); 1134 } 1135 1136 // Push the parsed operand into the list of operands 1137 Op = PPCOperand::CreateFromMCExpr(EVal, S, E, isPPC64()); 1138 Operands.push_back(Op); 1139 1140 // Check whether this is a TLS call expression 1141 bool TLSCall = false; 1142 if (const MCSymbolRefExpr *Ref = dyn_cast<MCSymbolRefExpr>(EVal)) 1143 TLSCall = Ref->getSymbol().getName() == "__tls_get_addr"; 1144 1145 if (TLSCall && getLexer().is(AsmToken::LParen)) { 1146 const MCExpr *TLSSym; 1147 1148 Parser.Lex(); // Eat the '('. 1149 S = Parser.getTok().getLoc(); 1150 if (ParseExpression(TLSSym)) 1151 return Error(S, "invalid TLS call expression"); 1152 if (getLexer().isNot(AsmToken::RParen)) 1153 return Error(Parser.getTok().getLoc(), "missing ')'"); 1154 E = Parser.getTok().getLoc(); 1155 Parser.Lex(); // Eat the ')'. 1156 1157 Op = PPCOperand::CreateFromMCExpr(TLSSym, S, E, isPPC64()); 1158 Operands.push_back(Op); 1159 } 1160 1161 // Otherwise, check for D-form memory operands 1162 if (!TLSCall && getLexer().is(AsmToken::LParen)) { 1163 Parser.Lex(); // Eat the '('. 1164 S = Parser.getTok().getLoc(); 1165 1166 int64_t IntVal; 1167 switch (getLexer().getKind()) { 1168 case AsmToken::Percent: 1169 Parser.Lex(); // Eat the '%'. 1170 unsigned RegNo; 1171 if (MatchRegisterName(Parser.getTok(), RegNo, IntVal)) 1172 return Error(S, "invalid register name"); 1173 Parser.Lex(); // Eat the identifier token. 1174 break; 1175 1176 case AsmToken::Integer: 1177 if (getParser().parseAbsoluteExpression(IntVal) || 1178 IntVal < 0 || IntVal > 31) 1179 return Error(S, "invalid register number"); 1180 break; 1181 1182 default: 1183 return Error(S, "invalid memory operand"); 1184 } 1185 1186 if (getLexer().isNot(AsmToken::RParen)) 1187 return Error(Parser.getTok().getLoc(), "missing ')'"); 1188 E = Parser.getTok().getLoc(); 1189 Parser.Lex(); // Eat the ')'. 1190 1191 Op = PPCOperand::CreateImm(IntVal, S, E, isPPC64()); 1192 Operands.push_back(Op); 1193 } 1194 1195 return false; 1196 } 1197 1198 /// Parse an instruction mnemonic followed by its operands. 1199 bool PPCAsmParser:: 1200 ParseInstruction(ParseInstructionInfo &Info, StringRef Name, SMLoc NameLoc, 1201 SmallVectorImpl<MCParsedAsmOperand*> &Operands) { 1202 // The first operand is the token for the instruction name. 1203 // If the next character is a '+' or '-', we need to add it to the 1204 // instruction name, to match what TableGen is doing. 1205 std::string NewOpcode; 1206 if (getLexer().is(AsmToken::Plus)) { 1207 getLexer().Lex(); 1208 NewOpcode = Name; 1209 NewOpcode += '+'; 1210 Name = NewOpcode; 1211 } 1212 if (getLexer().is(AsmToken::Minus)) { 1213 getLexer().Lex(); 1214 NewOpcode = Name; 1215 NewOpcode += '-'; 1216 Name = NewOpcode; 1217 } 1218 // If the instruction ends in a '.', we need to create a separate 1219 // token for it, to match what TableGen is doing. 1220 size_t Dot = Name.find('.'); 1221 StringRef Mnemonic = Name.slice(0, Dot); 1222 if (!NewOpcode.empty()) // Underlying memory for Name is volatile. 1223 Operands.push_back( 1224 PPCOperand::CreateTokenWithStringCopy(Mnemonic, NameLoc, isPPC64())); 1225 else 1226 Operands.push_back(PPCOperand::CreateToken(Mnemonic, NameLoc, isPPC64())); 1227 if (Dot != StringRef::npos) { 1228 SMLoc DotLoc = SMLoc::getFromPointer(NameLoc.getPointer() + Dot); 1229 StringRef DotStr = Name.slice(Dot, StringRef::npos); 1230 if (!NewOpcode.empty()) // Underlying memory for Name is volatile. 1231 Operands.push_back( 1232 PPCOperand::CreateTokenWithStringCopy(DotStr, DotLoc, isPPC64())); 1233 else 1234 Operands.push_back(PPCOperand::CreateToken(DotStr, DotLoc, isPPC64())); 1235 } 1236 1237 // If there are no more operands then finish 1238 if (getLexer().is(AsmToken::EndOfStatement)) 1239 return false; 1240 1241 // Parse the first operand 1242 if (ParseOperand(Operands)) 1243 return true; 1244 1245 while (getLexer().isNot(AsmToken::EndOfStatement) && 1246 getLexer().is(AsmToken::Comma)) { 1247 // Consume the comma token 1248 getLexer().Lex(); 1249 1250 // Parse the next operand 1251 if (ParseOperand(Operands)) 1252 return true; 1253 } 1254 1255 return false; 1256 } 1257 1258 /// ParseDirective parses the PPC specific directives 1259 bool PPCAsmParser::ParseDirective(AsmToken DirectiveID) { 1260 StringRef IDVal = DirectiveID.getIdentifier(); 1261 if (IDVal == ".word") 1262 return ParseDirectiveWord(2, DirectiveID.getLoc()); 1263 if (IDVal == ".llong") 1264 return ParseDirectiveWord(8, DirectiveID.getLoc()); 1265 if (IDVal == ".tc") 1266 return ParseDirectiveTC(isPPC64()? 8 : 4, DirectiveID.getLoc()); 1267 if (IDVal == ".machine") 1268 return ParseDirectiveMachine(DirectiveID.getLoc()); 1269 return true; 1270 } 1271 1272 /// ParseDirectiveWord 1273 /// ::= .word [ expression (, expression)* ] 1274 bool PPCAsmParser::ParseDirectiveWord(unsigned Size, SMLoc L) { 1275 if (getLexer().isNot(AsmToken::EndOfStatement)) { 1276 for (;;) { 1277 const MCExpr *Value; 1278 if (getParser().parseExpression(Value)) 1279 return true; 1280 1281 getParser().getStreamer().EmitValue(Value, Size); 1282 1283 if (getLexer().is(AsmToken::EndOfStatement)) 1284 break; 1285 1286 if (getLexer().isNot(AsmToken::Comma)) 1287 return Error(L, "unexpected token in directive"); 1288 Parser.Lex(); 1289 } 1290 } 1291 1292 Parser.Lex(); 1293 return false; 1294 } 1295 1296 /// ParseDirectiveTC 1297 /// ::= .tc [ symbol (, expression)* ] 1298 bool PPCAsmParser::ParseDirectiveTC(unsigned Size, SMLoc L) { 1299 // Skip TC symbol, which is only used with XCOFF. 1300 while (getLexer().isNot(AsmToken::EndOfStatement) 1301 && getLexer().isNot(AsmToken::Comma)) 1302 Parser.Lex(); 1303 if (getLexer().isNot(AsmToken::Comma)) 1304 return Error(L, "unexpected token in directive"); 1305 Parser.Lex(); 1306 1307 // Align to word size. 1308 getParser().getStreamer().EmitValueToAlignment(Size); 1309 1310 // Emit expressions. 1311 return ParseDirectiveWord(Size, L); 1312 } 1313 1314 /// ParseDirectiveMachine 1315 /// ::= .machine [ cpu | "push" | "pop" ] 1316 bool PPCAsmParser::ParseDirectiveMachine(SMLoc L) { 1317 if (getLexer().isNot(AsmToken::Identifier) && 1318 getLexer().isNot(AsmToken::String)) 1319 return Error(L, "unexpected token in directive"); 1320 1321 StringRef CPU = Parser.getTok().getIdentifier(); 1322 Parser.Lex(); 1323 1324 // FIXME: Right now, the parser always allows any available 1325 // instruction, so the .machine directive is not useful. 1326 // Implement ".machine any" (by doing nothing) for the benefit 1327 // of existing assembler code. Likewise, we can then implement 1328 // ".machine push" and ".machine pop" as no-op. 1329 if (CPU != "any" && CPU != "push" && CPU != "pop") 1330 return Error(L, "unrecognized machine type"); 1331 1332 if (getLexer().isNot(AsmToken::EndOfStatement)) 1333 return Error(L, "unexpected token in directive"); 1334 1335 return false; 1336 } 1337 1338 /// Force static initialization. 1339 extern "C" void LLVMInitializePowerPCAsmParser() { 1340 RegisterMCAsmParser<PPCAsmParser> A(ThePPC32Target); 1341 RegisterMCAsmParser<PPCAsmParser> B(ThePPC64Target); 1342 RegisterMCAsmParser<PPCAsmParser> C(ThePPC64LETarget); 1343 } 1344 1345 #define GET_REGISTER_MATCHER 1346 #define GET_MATCHER_IMPLEMENTATION 1347 #include "PPCGenAsmMatcher.inc" 1348 1349 // Define this matcher function after the auto-generated include so we 1350 // have the match class enum definitions. 1351 unsigned PPCAsmParser::validateTargetOperandClass(MCParsedAsmOperand *AsmOp, 1352 unsigned Kind) { 1353 // If the kind is a token for a literal immediate, check if our asm 1354 // operand matches. This is for InstAliases which have a fixed-value 1355 // immediate in the syntax. 1356 int64_t ImmVal; 1357 switch (Kind) { 1358 case MCK_0: ImmVal = 0; break; 1359 case MCK_1: ImmVal = 1; break; 1360 default: return Match_InvalidOperand; 1361 } 1362 1363 PPCOperand *Op = static_cast<PPCOperand*>(AsmOp); 1364 if (Op->isImm() && Op->getImm() == ImmVal) 1365 return Match_Success; 1366 1367 return Match_InvalidOperand; 1368 } 1369 1370 const MCExpr * 1371 PPCAsmParser::applyModifierToExpr(const MCExpr *E, 1372 MCSymbolRefExpr::VariantKind Variant, 1373 MCContext &Ctx) { 1374 switch (Variant) { 1375 case MCSymbolRefExpr::VK_PPC_LO: 1376 return PPCMCExpr::Create(PPCMCExpr::VK_PPC_LO, E, false, Ctx); 1377 case MCSymbolRefExpr::VK_PPC_HI: 1378 return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HI, E, false, Ctx); 1379 case MCSymbolRefExpr::VK_PPC_HA: 1380 return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HA, E, false, Ctx); 1381 case MCSymbolRefExpr::VK_PPC_HIGHER: 1382 return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHER, E, false, Ctx); 1383 case MCSymbolRefExpr::VK_PPC_HIGHERA: 1384 return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHERA, E, false, Ctx); 1385 case MCSymbolRefExpr::VK_PPC_HIGHEST: 1386 return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHEST, E, false, Ctx); 1387 case MCSymbolRefExpr::VK_PPC_HIGHESTA: 1388 return PPCMCExpr::Create(PPCMCExpr::VK_PPC_HIGHESTA, E, false, Ctx); 1389 default: 1390 return 0; 1391 } 1392 } 1393