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