1 //===-- MipsAsmParser.cpp - Parse Mips assembly to MCInst instructions ----===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "MCTargetDesc/MipsABIInfo.h" 11 #include "MCTargetDesc/MipsMCExpr.h" 12 #include "MCTargetDesc/MipsMCTargetDesc.h" 13 #include "MipsRegisterInfo.h" 14 #include "MipsTargetObjectFile.h" 15 #include "MipsTargetStreamer.h" 16 #include "llvm/ADT/APInt.h" 17 #include "llvm/ADT/SmallVector.h" 18 #include "llvm/ADT/StringSwitch.h" 19 #include "llvm/MC/MCContext.h" 20 #include "llvm/MC/MCExpr.h" 21 #include "llvm/MC/MCInst.h" 22 #include "llvm/MC/MCInstBuilder.h" 23 #include "llvm/MC/MCParser/MCAsmLexer.h" 24 #include "llvm/MC/MCParser/MCParsedAsmOperand.h" 25 #include "llvm/MC/MCStreamer.h" 26 #include "llvm/MC/MCSubtargetInfo.h" 27 #include "llvm/MC/MCSymbol.h" 28 #include "llvm/MC/MCTargetAsmParser.h" 29 #include "llvm/Support/Debug.h" 30 #include "llvm/Support/MathExtras.h" 31 #include "llvm/Support/SourceMgr.h" 32 #include "llvm/Support/TargetRegistry.h" 33 #include "llvm/Support/raw_ostream.h" 34 #include <memory> 35 36 using namespace llvm; 37 38 #define DEBUG_TYPE "mips-asm-parser" 39 40 namespace llvm { 41 class MCInstrInfo; 42 } 43 44 namespace { 45 class MipsAssemblerOptions { 46 public: 47 MipsAssemblerOptions(const FeatureBitset &Features_) : 48 ATReg(1), Reorder(true), Macro(true), Features(Features_) {} 49 50 MipsAssemblerOptions(const MipsAssemblerOptions *Opts) { 51 ATReg = Opts->getATRegIndex(); 52 Reorder = Opts->isReorder(); 53 Macro = Opts->isMacro(); 54 Features = Opts->getFeatures(); 55 } 56 57 unsigned getATRegIndex() const { return ATReg; } 58 bool setATRegIndex(unsigned Reg) { 59 if (Reg > 31) 60 return false; 61 62 ATReg = Reg; 63 return true; 64 } 65 66 bool isReorder() const { return Reorder; } 67 void setReorder() { Reorder = true; } 68 void setNoReorder() { Reorder = false; } 69 70 bool isMacro() const { return Macro; } 71 void setMacro() { Macro = true; } 72 void setNoMacro() { Macro = false; } 73 74 const FeatureBitset &getFeatures() const { return Features; } 75 void setFeatures(const FeatureBitset &Features_) { Features = Features_; } 76 77 // Set of features that are either architecture features or referenced 78 // by them (e.g.: FeatureNaN2008 implied by FeatureMips32r6). 79 // The full table can be found in MipsGenSubtargetInfo.inc (MipsFeatureKV[]). 80 // The reason we need this mask is explained in the selectArch function. 81 // FIXME: Ideally we would like TableGen to generate this information. 82 static const FeatureBitset AllArchRelatedMask; 83 84 private: 85 unsigned ATReg; 86 bool Reorder; 87 bool Macro; 88 FeatureBitset Features; 89 }; 90 } 91 92 const FeatureBitset MipsAssemblerOptions::AllArchRelatedMask = { 93 Mips::FeatureMips1, Mips::FeatureMips2, Mips::FeatureMips3, 94 Mips::FeatureMips3_32, Mips::FeatureMips3_32r2, Mips::FeatureMips4, 95 Mips::FeatureMips4_32, Mips::FeatureMips4_32r2, Mips::FeatureMips5, 96 Mips::FeatureMips5_32r2, Mips::FeatureMips32, Mips::FeatureMips32r2, 97 Mips::FeatureMips32r3, Mips::FeatureMips32r5, Mips::FeatureMips32r6, 98 Mips::FeatureMips64, Mips::FeatureMips64r2, Mips::FeatureMips64r3, 99 Mips::FeatureMips64r5, Mips::FeatureMips64r6, Mips::FeatureCnMips, 100 Mips::FeatureFP64Bit, Mips::FeatureGP64Bit, Mips::FeatureNaN2008 101 }; 102 103 namespace { 104 class MipsAsmParser : public MCTargetAsmParser { 105 MipsTargetStreamer &getTargetStreamer() { 106 MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer(); 107 return static_cast<MipsTargetStreamer &>(TS); 108 } 109 110 MCSubtargetInfo &STI; 111 MipsABIInfo ABI; 112 SmallVector<std::unique_ptr<MipsAssemblerOptions>, 2> AssemblerOptions; 113 MCSymbol *CurrentFn; // Pointer to the function being parsed. It may be a 114 // nullptr, which indicates that no function is currently 115 // selected. This usually happens after an '.end func' 116 // directive. 117 bool IsLittleEndian; 118 bool IsPicEnabled; 119 bool IsCpRestoreSet; 120 int CpRestoreOffset; 121 unsigned CpSaveLocation; 122 /// If true, then CpSaveLocation is a register, otherwise it's an offset. 123 bool CpSaveLocationIsRegister; 124 125 // Print a warning along with its fix-it message at the given range. 126 void printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg, 127 SMRange Range, bool ShowColors = true); 128 129 #define GET_ASSEMBLER_HEADER 130 #include "MipsGenAsmMatcher.inc" 131 132 unsigned checkTargetMatchPredicate(MCInst &Inst) override; 133 134 bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 135 OperandVector &Operands, MCStreamer &Out, 136 uint64_t &ErrorInfo, 137 bool MatchingInlineAsm) override; 138 139 /// Parse a register as used in CFI directives 140 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override; 141 142 bool parseParenSuffix(StringRef Name, OperandVector &Operands); 143 144 bool parseBracketSuffix(StringRef Name, OperandVector &Operands); 145 146 bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name, 147 SMLoc NameLoc, OperandVector &Operands) override; 148 149 bool ParseDirective(AsmToken DirectiveID) override; 150 151 OperandMatchResultTy parseMemOperand(OperandVector &Operands); 152 OperandMatchResultTy 153 matchAnyRegisterNameWithoutDollar(OperandVector &Operands, 154 StringRef Identifier, SMLoc S); 155 OperandMatchResultTy matchAnyRegisterWithoutDollar(OperandVector &Operands, 156 SMLoc S); 157 OperandMatchResultTy parseAnyRegister(OperandVector &Operands); 158 OperandMatchResultTy parseImm(OperandVector &Operands); 159 OperandMatchResultTy parseJumpTarget(OperandVector &Operands); 160 OperandMatchResultTy parseInvNum(OperandVector &Operands); 161 OperandMatchResultTy parseLSAImm(OperandVector &Operands); 162 OperandMatchResultTy parseRegisterPair(OperandVector &Operands); 163 OperandMatchResultTy parseMovePRegPair(OperandVector &Operands); 164 OperandMatchResultTy parseRegisterList(OperandVector &Operands); 165 166 bool searchSymbolAlias(OperandVector &Operands); 167 168 bool parseOperand(OperandVector &, StringRef Mnemonic); 169 170 bool needsExpansion(MCInst &Inst); 171 172 // Expands assembly pseudo instructions. 173 // Returns false on success, true otherwise. 174 bool expandInstruction(MCInst &Inst, SMLoc IDLoc, 175 SmallVectorImpl<MCInst> &Instructions); 176 177 bool expandJalWithRegs(MCInst &Inst, SMLoc IDLoc, 178 SmallVectorImpl<MCInst> &Instructions); 179 180 bool loadImmediate(int64_t ImmValue, unsigned DstReg, unsigned SrcReg, 181 bool Is32BitImm, bool IsAddress, SMLoc IDLoc, 182 SmallVectorImpl<MCInst> &Instructions); 183 184 bool loadAndAddSymbolAddress(const MCExpr *SymExpr, unsigned DstReg, 185 unsigned SrcReg, bool Is32BitSym, SMLoc IDLoc, 186 SmallVectorImpl<MCInst> &Instructions); 187 188 bool expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc, 189 SmallVectorImpl<MCInst> &Instructions); 190 191 bool expandLoadAddress(unsigned DstReg, unsigned BaseReg, 192 const MCOperand &Offset, bool Is32BitAddress, 193 SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions); 194 195 bool expandUncondBranchMMPseudo(MCInst &Inst, SMLoc IDLoc, 196 SmallVectorImpl<MCInst> &Instructions); 197 198 void expandMemInst(MCInst &Inst, SMLoc IDLoc, 199 SmallVectorImpl<MCInst> &Instructions, bool isLoad, 200 bool isImmOpnd); 201 202 bool expandLoadStoreMultiple(MCInst &Inst, SMLoc IDLoc, 203 SmallVectorImpl<MCInst> &Instructions); 204 205 bool expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, 206 SmallVectorImpl<MCInst> &Instructions); 207 208 bool expandBranchImm(MCInst &Inst, SMLoc IDLoc, 209 SmallVectorImpl<MCInst> &Instructions); 210 211 bool expandCondBranches(MCInst &Inst, SMLoc IDLoc, 212 SmallVectorImpl<MCInst> &Instructions); 213 214 bool expandDiv(MCInst &Inst, SMLoc IDLoc, 215 SmallVectorImpl<MCInst> &Instructions, const bool IsMips64, 216 const bool Signed); 217 218 bool expandUlhu(MCInst &Inst, SMLoc IDLoc, 219 SmallVectorImpl<MCInst> &Instructions); 220 221 bool expandUlw(MCInst &Inst, SMLoc IDLoc, 222 SmallVectorImpl<MCInst> &Instructions); 223 224 void createNop(bool hasShortDelaySlot, SMLoc IDLoc, 225 SmallVectorImpl<MCInst> &Instructions); 226 227 void createAddu(unsigned DstReg, unsigned SrcReg, unsigned TrgReg, 228 bool Is64Bit, SmallVectorImpl<MCInst> &Instructions); 229 230 void createCpRestoreMemOp(bool IsLoad, int StackOffset, SMLoc IDLoc, 231 SmallVectorImpl<MCInst> &Instructions); 232 233 bool reportParseError(Twine ErrorMsg); 234 bool reportParseError(SMLoc Loc, Twine ErrorMsg); 235 236 bool parseMemOffset(const MCExpr *&Res, bool isParenExpr); 237 bool parseRelocOperand(const MCExpr *&Res); 238 239 const MCExpr *evaluateRelocExpr(const MCExpr *Expr, StringRef RelocStr); 240 241 bool isEvaluated(const MCExpr *Expr); 242 bool parseSetMips0Directive(); 243 bool parseSetArchDirective(); 244 bool parseSetFeature(uint64_t Feature); 245 bool isPicAndNotNxxAbi(); // Used by .cpload, .cprestore, and .cpsetup. 246 bool parseDirectiveCpLoad(SMLoc Loc); 247 bool parseDirectiveCpRestore(SMLoc Loc); 248 bool parseDirectiveCPSetup(); 249 bool parseDirectiveCPReturn(); 250 bool parseDirectiveNaN(); 251 bool parseDirectiveSet(); 252 bool parseDirectiveOption(); 253 bool parseInsnDirective(); 254 255 bool parseSetAtDirective(); 256 bool parseSetNoAtDirective(); 257 bool parseSetMacroDirective(); 258 bool parseSetNoMacroDirective(); 259 bool parseSetMsaDirective(); 260 bool parseSetNoMsaDirective(); 261 bool parseSetNoDspDirective(); 262 bool parseSetReorderDirective(); 263 bool parseSetNoReorderDirective(); 264 bool parseSetMips16Directive(); 265 bool parseSetNoMips16Directive(); 266 bool parseSetFpDirective(); 267 bool parseSetOddSPRegDirective(); 268 bool parseSetNoOddSPRegDirective(); 269 bool parseSetPopDirective(); 270 bool parseSetPushDirective(); 271 bool parseSetSoftFloatDirective(); 272 bool parseSetHardFloatDirective(); 273 274 bool parseSetAssignment(); 275 276 bool parseDataDirective(unsigned Size, SMLoc L); 277 bool parseDirectiveGpWord(); 278 bool parseDirectiveGpDWord(); 279 bool parseDirectiveModule(); 280 bool parseDirectiveModuleFP(); 281 bool parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI, 282 StringRef Directive); 283 284 bool parseInternalDirectiveReallowModule(); 285 286 MCSymbolRefExpr::VariantKind getVariantKind(StringRef Symbol); 287 288 bool eatComma(StringRef ErrorStr); 289 290 int matchCPURegisterName(StringRef Symbol); 291 292 int matchHWRegsRegisterName(StringRef Symbol); 293 294 int matchRegisterByNumber(unsigned RegNum, unsigned RegClass); 295 296 int matchFPURegisterName(StringRef Name); 297 298 int matchFCCRegisterName(StringRef Name); 299 300 int matchACRegisterName(StringRef Name); 301 302 int matchMSA128RegisterName(StringRef Name); 303 304 int matchMSA128CtrlRegisterName(StringRef Name); 305 306 unsigned getReg(int RC, int RegNo); 307 308 unsigned getGPR(int RegNo); 309 310 /// Returns the internal register number for the current AT. Also checks if 311 /// the current AT is unavailable (set to $0) and gives an error if it is. 312 /// This should be used in pseudo-instruction expansions which need AT. 313 unsigned getATReg(SMLoc Loc); 314 315 bool processInstruction(MCInst &Inst, SMLoc IDLoc, 316 SmallVectorImpl<MCInst> &Instructions); 317 318 // Helper function that checks if the value of a vector index is within the 319 // boundaries of accepted values for each RegisterKind 320 // Example: INSERT.B $w0[n], $1 => 16 > n >= 0 321 bool validateMSAIndex(int Val, int RegKind); 322 323 // Selects a new architecture by updating the FeatureBits with the necessary 324 // info including implied dependencies. 325 // Internally, it clears all the feature bits related to *any* architecture 326 // and selects the new one using the ToggleFeature functionality of the 327 // MCSubtargetInfo object that handles implied dependencies. The reason we 328 // clear all the arch related bits manually is because ToggleFeature only 329 // clears the features that imply the feature being cleared and not the 330 // features implied by the feature being cleared. This is easier to see 331 // with an example: 332 // -------------------------------------------------- 333 // | Feature | Implies | 334 // | -------------------------------------------------| 335 // | FeatureMips1 | None | 336 // | FeatureMips2 | FeatureMips1 | 337 // | FeatureMips3 | FeatureMips2 | FeatureMipsGP64 | 338 // | FeatureMips4 | FeatureMips3 | 339 // | ... | | 340 // -------------------------------------------------- 341 // 342 // Setting Mips3 is equivalent to set: (FeatureMips3 | FeatureMips2 | 343 // FeatureMipsGP64 | FeatureMips1) 344 // Clearing Mips3 is equivalent to clear (FeatureMips3 | FeatureMips4). 345 void selectArch(StringRef ArchFeature) { 346 FeatureBitset FeatureBits = STI.getFeatureBits(); 347 FeatureBits &= ~MipsAssemblerOptions::AllArchRelatedMask; 348 STI.setFeatureBits(FeatureBits); 349 setAvailableFeatures( 350 ComputeAvailableFeatures(STI.ToggleFeature(ArchFeature))); 351 AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); 352 } 353 354 void setFeatureBits(uint64_t Feature, StringRef FeatureString) { 355 if (!(STI.getFeatureBits()[Feature])) { 356 setAvailableFeatures( 357 ComputeAvailableFeatures(STI.ToggleFeature(FeatureString))); 358 AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); 359 } 360 } 361 362 void clearFeatureBits(uint64_t Feature, StringRef FeatureString) { 363 if (STI.getFeatureBits()[Feature]) { 364 setAvailableFeatures( 365 ComputeAvailableFeatures(STI.ToggleFeature(FeatureString))); 366 AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); 367 } 368 } 369 370 void setModuleFeatureBits(uint64_t Feature, StringRef FeatureString) { 371 setFeatureBits(Feature, FeatureString); 372 AssemblerOptions.front()->setFeatures(STI.getFeatureBits()); 373 } 374 375 void clearModuleFeatureBits(uint64_t Feature, StringRef FeatureString) { 376 clearFeatureBits(Feature, FeatureString); 377 AssemblerOptions.front()->setFeatures(STI.getFeatureBits()); 378 } 379 380 public: 381 enum MipsMatchResultTy { 382 Match_RequiresDifferentSrcAndDst = FIRST_TARGET_MATCH_RESULT_TY 383 #define GET_OPERAND_DIAGNOSTIC_TYPES 384 #include "MipsGenAsmMatcher.inc" 385 #undef GET_OPERAND_DIAGNOSTIC_TYPES 386 387 }; 388 389 MipsAsmParser(MCSubtargetInfo &sti, MCAsmParser &parser, 390 const MCInstrInfo &MII, const MCTargetOptions &Options) 391 : MCTargetAsmParser(Options), STI(sti), 392 ABI(MipsABIInfo::computeTargetABI(Triple(sti.getTargetTriple()), 393 sti.getCPU(), Options)) { 394 MCAsmParserExtension::Initialize(parser); 395 396 parser.addAliasForDirective(".asciiz", ".asciz"); 397 398 // Initialize the set of available features. 399 setAvailableFeatures(ComputeAvailableFeatures(STI.getFeatureBits())); 400 401 // Remember the initial assembler options. The user can not modify these. 402 AssemblerOptions.push_back( 403 llvm::make_unique<MipsAssemblerOptions>(STI.getFeatureBits())); 404 405 // Create an assembler options environment for the user to modify. 406 AssemblerOptions.push_back( 407 llvm::make_unique<MipsAssemblerOptions>(STI.getFeatureBits())); 408 409 getTargetStreamer().updateABIInfo(*this); 410 411 if (!isABI_O32() && !useOddSPReg() != 0) 412 report_fatal_error("-mno-odd-spreg requires the O32 ABI"); 413 414 CurrentFn = nullptr; 415 416 IsPicEnabled = 417 (getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_); 418 419 IsCpRestoreSet = false; 420 CpRestoreOffset = -1; 421 422 Triple TheTriple(sti.getTargetTriple()); 423 if ((TheTriple.getArch() == Triple::mips) || 424 (TheTriple.getArch() == Triple::mips64)) 425 IsLittleEndian = false; 426 else 427 IsLittleEndian = true; 428 } 429 430 /// True if all of $fcc0 - $fcc7 exist for the current ISA. 431 bool hasEightFccRegisters() const { return hasMips4() || hasMips32(); } 432 433 bool isGP64bit() const { return STI.getFeatureBits()[Mips::FeatureGP64Bit]; } 434 bool isFP64bit() const { return STI.getFeatureBits()[Mips::FeatureFP64Bit]; } 435 const MipsABIInfo &getABI() const { return ABI; } 436 bool isABI_N32() const { return ABI.IsN32(); } 437 bool isABI_N64() const { return ABI.IsN64(); } 438 bool isABI_O32() const { return ABI.IsO32(); } 439 bool isABI_FPXX() const { return STI.getFeatureBits()[Mips::FeatureFPXX]; } 440 441 bool useOddSPReg() const { 442 return !(STI.getFeatureBits()[Mips::FeatureNoOddSPReg]); 443 } 444 445 bool inMicroMipsMode() const { 446 return STI.getFeatureBits()[Mips::FeatureMicroMips]; 447 } 448 bool hasMips1() const { return STI.getFeatureBits()[Mips::FeatureMips1]; } 449 bool hasMips2() const { return STI.getFeatureBits()[Mips::FeatureMips2]; } 450 bool hasMips3() const { return STI.getFeatureBits()[Mips::FeatureMips3]; } 451 bool hasMips4() const { return STI.getFeatureBits()[Mips::FeatureMips4]; } 452 bool hasMips5() const { return STI.getFeatureBits()[Mips::FeatureMips5]; } 453 bool hasMips32() const { 454 return STI.getFeatureBits()[Mips::FeatureMips32]; 455 } 456 bool hasMips64() const { 457 return STI.getFeatureBits()[Mips::FeatureMips64]; 458 } 459 bool hasMips32r2() const { 460 return STI.getFeatureBits()[Mips::FeatureMips32r2]; 461 } 462 bool hasMips64r2() const { 463 return STI.getFeatureBits()[Mips::FeatureMips64r2]; 464 } 465 bool hasMips32r3() const { 466 return (STI.getFeatureBits()[Mips::FeatureMips32r3]); 467 } 468 bool hasMips64r3() const { 469 return (STI.getFeatureBits()[Mips::FeatureMips64r3]); 470 } 471 bool hasMips32r5() const { 472 return (STI.getFeatureBits()[Mips::FeatureMips32r5]); 473 } 474 bool hasMips64r5() const { 475 return (STI.getFeatureBits()[Mips::FeatureMips64r5]); 476 } 477 bool hasMips32r6() const { 478 return STI.getFeatureBits()[Mips::FeatureMips32r6]; 479 } 480 bool hasMips64r6() const { 481 return STI.getFeatureBits()[Mips::FeatureMips64r6]; 482 } 483 484 bool hasDSP() const { return STI.getFeatureBits()[Mips::FeatureDSP]; } 485 bool hasDSPR2() const { return STI.getFeatureBits()[Mips::FeatureDSPR2]; } 486 bool hasMSA() const { return STI.getFeatureBits()[Mips::FeatureMSA]; } 487 bool hasCnMips() const { 488 return (STI.getFeatureBits()[Mips::FeatureCnMips]); 489 } 490 491 bool inPicMode() { 492 return IsPicEnabled; 493 } 494 495 bool inMips16Mode() const { 496 return STI.getFeatureBits()[Mips::FeatureMips16]; 497 } 498 499 bool useTraps() const { 500 return STI.getFeatureBits()[Mips::FeatureUseTCCInDIV]; 501 } 502 503 bool useSoftFloat() const { 504 return STI.getFeatureBits()[Mips::FeatureSoftFloat]; 505 } 506 507 /// Warn if RegIndex is the same as the current AT. 508 void warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc); 509 510 void warnIfNoMacro(SMLoc Loc); 511 512 bool isLittle() const { return IsLittleEndian; } 513 }; 514 } 515 516 namespace { 517 518 /// MipsOperand - Instances of this class represent a parsed Mips machine 519 /// instruction. 520 class MipsOperand : public MCParsedAsmOperand { 521 public: 522 /// Broad categories of register classes 523 /// The exact class is finalized by the render method. 524 enum RegKind { 525 RegKind_GPR = 1, /// GPR32 and GPR64 (depending on isGP64bit()) 526 RegKind_FGR = 2, /// FGR32, FGR64, AFGR64 (depending on context and 527 /// isFP64bit()) 528 RegKind_FCC = 4, /// FCC 529 RegKind_MSA128 = 8, /// MSA128[BHWD] (makes no difference which) 530 RegKind_MSACtrl = 16, /// MSA control registers 531 RegKind_COP2 = 32, /// COP2 532 RegKind_ACC = 64, /// HI32DSP, LO32DSP, and ACC64DSP (depending on 533 /// context). 534 RegKind_CCR = 128, /// CCR 535 RegKind_HWRegs = 256, /// HWRegs 536 RegKind_COP3 = 512, /// COP3 537 RegKind_COP0 = 1024, /// COP0 538 /// Potentially any (e.g. $1) 539 RegKind_Numeric = RegKind_GPR | RegKind_FGR | RegKind_FCC | RegKind_MSA128 | 540 RegKind_MSACtrl | RegKind_COP2 | RegKind_ACC | 541 RegKind_CCR | RegKind_HWRegs | RegKind_COP3 | RegKind_COP0 542 }; 543 544 private: 545 enum KindTy { 546 k_Immediate, /// An immediate (possibly involving symbol references) 547 k_Memory, /// Base + Offset Memory Address 548 k_PhysRegister, /// A physical register from the Mips namespace 549 k_RegisterIndex, /// A register index in one or more RegKind. 550 k_Token, /// A simple token 551 k_RegList, /// A physical register list 552 k_RegPair /// A pair of physical register 553 } Kind; 554 555 public: 556 MipsOperand(KindTy K, MipsAsmParser &Parser) 557 : MCParsedAsmOperand(), Kind(K), AsmParser(Parser) {} 558 559 private: 560 /// For diagnostics, and checking the assembler temporary 561 MipsAsmParser &AsmParser; 562 563 struct Token { 564 const char *Data; 565 unsigned Length; 566 }; 567 568 struct PhysRegOp { 569 unsigned Num; /// Register Number 570 }; 571 572 struct RegIdxOp { 573 unsigned Index; /// Index into the register class 574 RegKind Kind; /// Bitfield of the kinds it could possibly be 575 const MCRegisterInfo *RegInfo; 576 }; 577 578 struct ImmOp { 579 const MCExpr *Val; 580 }; 581 582 struct MemOp { 583 MipsOperand *Base; 584 const MCExpr *Off; 585 }; 586 587 struct RegListOp { 588 SmallVector<unsigned, 10> *List; 589 }; 590 591 union { 592 struct Token Tok; 593 struct PhysRegOp PhysReg; 594 struct RegIdxOp RegIdx; 595 struct ImmOp Imm; 596 struct MemOp Mem; 597 struct RegListOp RegList; 598 }; 599 600 SMLoc StartLoc, EndLoc; 601 602 /// Internal constructor for register kinds 603 static std::unique_ptr<MipsOperand> CreateReg(unsigned Index, RegKind RegKind, 604 const MCRegisterInfo *RegInfo, 605 SMLoc S, SMLoc E, 606 MipsAsmParser &Parser) { 607 auto Op = make_unique<MipsOperand>(k_RegisterIndex, Parser); 608 Op->RegIdx.Index = Index; 609 Op->RegIdx.RegInfo = RegInfo; 610 Op->RegIdx.Kind = RegKind; 611 Op->StartLoc = S; 612 Op->EndLoc = E; 613 return Op; 614 } 615 616 public: 617 /// Coerce the register to GPR32 and return the real register for the current 618 /// target. 619 unsigned getGPR32Reg() const { 620 assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); 621 AsmParser.warnIfRegIndexIsAT(RegIdx.Index, StartLoc); 622 unsigned ClassID = Mips::GPR32RegClassID; 623 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 624 } 625 626 /// Coerce the register to GPR32 and return the real register for the current 627 /// target. 628 unsigned getGPRMM16Reg() const { 629 assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); 630 unsigned ClassID = Mips::GPR32RegClassID; 631 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 632 } 633 634 /// Coerce the register to GPR64 and return the real register for the current 635 /// target. 636 unsigned getGPR64Reg() const { 637 assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); 638 unsigned ClassID = Mips::GPR64RegClassID; 639 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 640 } 641 642 private: 643 /// Coerce the register to AFGR64 and return the real register for the current 644 /// target. 645 unsigned getAFGR64Reg() const { 646 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 647 if (RegIdx.Index % 2 != 0) 648 AsmParser.Warning(StartLoc, "Float register should be even."); 649 return RegIdx.RegInfo->getRegClass(Mips::AFGR64RegClassID) 650 .getRegister(RegIdx.Index / 2); 651 } 652 653 /// Coerce the register to FGR64 and return the real register for the current 654 /// target. 655 unsigned getFGR64Reg() const { 656 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 657 return RegIdx.RegInfo->getRegClass(Mips::FGR64RegClassID) 658 .getRegister(RegIdx.Index); 659 } 660 661 /// Coerce the register to FGR32 and return the real register for the current 662 /// target. 663 unsigned getFGR32Reg() const { 664 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 665 return RegIdx.RegInfo->getRegClass(Mips::FGR32RegClassID) 666 .getRegister(RegIdx.Index); 667 } 668 669 /// Coerce the register to FGRH32 and return the real register for the current 670 /// target. 671 unsigned getFGRH32Reg() const { 672 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 673 return RegIdx.RegInfo->getRegClass(Mips::FGRH32RegClassID) 674 .getRegister(RegIdx.Index); 675 } 676 677 /// Coerce the register to FCC and return the real register for the current 678 /// target. 679 unsigned getFCCReg() const { 680 assert(isRegIdx() && (RegIdx.Kind & RegKind_FCC) && "Invalid access!"); 681 return RegIdx.RegInfo->getRegClass(Mips::FCCRegClassID) 682 .getRegister(RegIdx.Index); 683 } 684 685 /// Coerce the register to MSA128 and return the real register for the current 686 /// target. 687 unsigned getMSA128Reg() const { 688 assert(isRegIdx() && (RegIdx.Kind & RegKind_MSA128) && "Invalid access!"); 689 // It doesn't matter which of the MSA128[BHWD] classes we use. They are all 690 // identical 691 unsigned ClassID = Mips::MSA128BRegClassID; 692 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 693 } 694 695 /// Coerce the register to MSACtrl and return the real register for the 696 /// current target. 697 unsigned getMSACtrlReg() const { 698 assert(isRegIdx() && (RegIdx.Kind & RegKind_MSACtrl) && "Invalid access!"); 699 unsigned ClassID = Mips::MSACtrlRegClassID; 700 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 701 } 702 703 /// Coerce the register to COP0 and return the real register for the 704 /// current target. 705 unsigned getCOP0Reg() const { 706 assert(isRegIdx() && (RegIdx.Kind & RegKind_COP0) && "Invalid access!"); 707 unsigned ClassID = Mips::COP0RegClassID; 708 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 709 } 710 711 /// Coerce the register to COP2 and return the real register for the 712 /// current target. 713 unsigned getCOP2Reg() const { 714 assert(isRegIdx() && (RegIdx.Kind & RegKind_COP2) && "Invalid access!"); 715 unsigned ClassID = Mips::COP2RegClassID; 716 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 717 } 718 719 /// Coerce the register to COP3 and return the real register for the 720 /// current target. 721 unsigned getCOP3Reg() const { 722 assert(isRegIdx() && (RegIdx.Kind & RegKind_COP3) && "Invalid access!"); 723 unsigned ClassID = Mips::COP3RegClassID; 724 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 725 } 726 727 /// Coerce the register to ACC64DSP and return the real register for the 728 /// current target. 729 unsigned getACC64DSPReg() const { 730 assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); 731 unsigned ClassID = Mips::ACC64DSPRegClassID; 732 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 733 } 734 735 /// Coerce the register to HI32DSP and return the real register for the 736 /// current target. 737 unsigned getHI32DSPReg() const { 738 assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); 739 unsigned ClassID = Mips::HI32DSPRegClassID; 740 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 741 } 742 743 /// Coerce the register to LO32DSP and return the real register for the 744 /// current target. 745 unsigned getLO32DSPReg() const { 746 assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); 747 unsigned ClassID = Mips::LO32DSPRegClassID; 748 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 749 } 750 751 /// Coerce the register to CCR and return the real register for the 752 /// current target. 753 unsigned getCCRReg() const { 754 assert(isRegIdx() && (RegIdx.Kind & RegKind_CCR) && "Invalid access!"); 755 unsigned ClassID = Mips::CCRRegClassID; 756 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 757 } 758 759 /// Coerce the register to HWRegs and return the real register for the 760 /// current target. 761 unsigned getHWRegsReg() const { 762 assert(isRegIdx() && (RegIdx.Kind & RegKind_HWRegs) && "Invalid access!"); 763 unsigned ClassID = Mips::HWRegsRegClassID; 764 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 765 } 766 767 public: 768 void addExpr(MCInst &Inst, const MCExpr *Expr) const { 769 // Add as immediate when possible. Null MCExpr = 0. 770 if (!Expr) 771 Inst.addOperand(MCOperand::createImm(0)); 772 else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 773 Inst.addOperand(MCOperand::createImm(CE->getValue())); 774 else 775 Inst.addOperand(MCOperand::createExpr(Expr)); 776 } 777 778 void addRegOperands(MCInst &Inst, unsigned N) const { 779 llvm_unreachable("Use a custom parser instead"); 780 } 781 782 /// Render the operand to an MCInst as a GPR32 783 /// Asserts if the wrong number of operands are requested, or the operand 784 /// is not a k_RegisterIndex compatible with RegKind_GPR 785 void addGPR32AsmRegOperands(MCInst &Inst, unsigned N) const { 786 assert(N == 1 && "Invalid number of operands!"); 787 Inst.addOperand(MCOperand::createReg(getGPR32Reg())); 788 } 789 790 void addGPRMM16AsmRegOperands(MCInst &Inst, unsigned N) const { 791 assert(N == 1 && "Invalid number of operands!"); 792 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 793 } 794 795 void addGPRMM16AsmRegZeroOperands(MCInst &Inst, unsigned N) const { 796 assert(N == 1 && "Invalid number of operands!"); 797 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 798 } 799 800 void addGPRMM16AsmRegMovePOperands(MCInst &Inst, unsigned N) const { 801 assert(N == 1 && "Invalid number of operands!"); 802 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 803 } 804 805 /// Render the operand to an MCInst as a GPR64 806 /// Asserts if the wrong number of operands are requested, or the operand 807 /// is not a k_RegisterIndex compatible with RegKind_GPR 808 void addGPR64AsmRegOperands(MCInst &Inst, unsigned N) const { 809 assert(N == 1 && "Invalid number of operands!"); 810 Inst.addOperand(MCOperand::createReg(getGPR64Reg())); 811 } 812 813 void addAFGR64AsmRegOperands(MCInst &Inst, unsigned N) const { 814 assert(N == 1 && "Invalid number of operands!"); 815 Inst.addOperand(MCOperand::createReg(getAFGR64Reg())); 816 } 817 818 void addFGR64AsmRegOperands(MCInst &Inst, unsigned N) const { 819 assert(N == 1 && "Invalid number of operands!"); 820 Inst.addOperand(MCOperand::createReg(getFGR64Reg())); 821 } 822 823 void addFGR32AsmRegOperands(MCInst &Inst, unsigned N) const { 824 assert(N == 1 && "Invalid number of operands!"); 825 Inst.addOperand(MCOperand::createReg(getFGR32Reg())); 826 // FIXME: We ought to do this for -integrated-as without -via-file-asm too. 827 if (!AsmParser.useOddSPReg() && RegIdx.Index & 1) 828 AsmParser.Error(StartLoc, "-mno-odd-spreg prohibits the use of odd FPU " 829 "registers"); 830 } 831 832 void addFGRH32AsmRegOperands(MCInst &Inst, unsigned N) const { 833 assert(N == 1 && "Invalid number of operands!"); 834 Inst.addOperand(MCOperand::createReg(getFGRH32Reg())); 835 } 836 837 void addFCCAsmRegOperands(MCInst &Inst, unsigned N) const { 838 assert(N == 1 && "Invalid number of operands!"); 839 Inst.addOperand(MCOperand::createReg(getFCCReg())); 840 } 841 842 void addMSA128AsmRegOperands(MCInst &Inst, unsigned N) const { 843 assert(N == 1 && "Invalid number of operands!"); 844 Inst.addOperand(MCOperand::createReg(getMSA128Reg())); 845 } 846 847 void addMSACtrlAsmRegOperands(MCInst &Inst, unsigned N) const { 848 assert(N == 1 && "Invalid number of operands!"); 849 Inst.addOperand(MCOperand::createReg(getMSACtrlReg())); 850 } 851 852 void addCOP0AsmRegOperands(MCInst &Inst, unsigned N) const { 853 assert(N == 1 && "Invalid number of operands!"); 854 Inst.addOperand(MCOperand::createReg(getCOP0Reg())); 855 } 856 857 void addCOP2AsmRegOperands(MCInst &Inst, unsigned N) const { 858 assert(N == 1 && "Invalid number of operands!"); 859 Inst.addOperand(MCOperand::createReg(getCOP2Reg())); 860 } 861 862 void addCOP3AsmRegOperands(MCInst &Inst, unsigned N) const { 863 assert(N == 1 && "Invalid number of operands!"); 864 Inst.addOperand(MCOperand::createReg(getCOP3Reg())); 865 } 866 867 void addACC64DSPAsmRegOperands(MCInst &Inst, unsigned N) const { 868 assert(N == 1 && "Invalid number of operands!"); 869 Inst.addOperand(MCOperand::createReg(getACC64DSPReg())); 870 } 871 872 void addHI32DSPAsmRegOperands(MCInst &Inst, unsigned N) const { 873 assert(N == 1 && "Invalid number of operands!"); 874 Inst.addOperand(MCOperand::createReg(getHI32DSPReg())); 875 } 876 877 void addLO32DSPAsmRegOperands(MCInst &Inst, unsigned N) const { 878 assert(N == 1 && "Invalid number of operands!"); 879 Inst.addOperand(MCOperand::createReg(getLO32DSPReg())); 880 } 881 882 void addCCRAsmRegOperands(MCInst &Inst, unsigned N) const { 883 assert(N == 1 && "Invalid number of operands!"); 884 Inst.addOperand(MCOperand::createReg(getCCRReg())); 885 } 886 887 void addHWRegsAsmRegOperands(MCInst &Inst, unsigned N) const { 888 assert(N == 1 && "Invalid number of operands!"); 889 Inst.addOperand(MCOperand::createReg(getHWRegsReg())); 890 } 891 892 void addImmOperands(MCInst &Inst, unsigned N) const { 893 assert(N == 1 && "Invalid number of operands!"); 894 const MCExpr *Expr = getImm(); 895 addExpr(Inst, Expr); 896 } 897 898 void addMemOperands(MCInst &Inst, unsigned N) const { 899 assert(N == 2 && "Invalid number of operands!"); 900 901 Inst.addOperand(MCOperand::createReg(AsmParser.getABI().ArePtrs64bit() 902 ? getMemBase()->getGPR64Reg() 903 : getMemBase()->getGPR32Reg())); 904 905 const MCExpr *Expr = getMemOff(); 906 addExpr(Inst, Expr); 907 } 908 909 void addMicroMipsMemOperands(MCInst &Inst, unsigned N) const { 910 assert(N == 2 && "Invalid number of operands!"); 911 912 Inst.addOperand(MCOperand::createReg(getMemBase()->getGPRMM16Reg())); 913 914 const MCExpr *Expr = getMemOff(); 915 addExpr(Inst, Expr); 916 } 917 918 void addRegListOperands(MCInst &Inst, unsigned N) const { 919 assert(N == 1 && "Invalid number of operands!"); 920 921 for (auto RegNo : getRegList()) 922 Inst.addOperand(MCOperand::createReg(RegNo)); 923 } 924 925 void addRegPairOperands(MCInst &Inst, unsigned N) const { 926 assert(N == 2 && "Invalid number of operands!"); 927 unsigned RegNo = getRegPair(); 928 Inst.addOperand(MCOperand::createReg(RegNo++)); 929 Inst.addOperand(MCOperand::createReg(RegNo)); 930 } 931 932 void addMovePRegPairOperands(MCInst &Inst, unsigned N) const { 933 assert(N == 2 && "Invalid number of operands!"); 934 for (auto RegNo : getRegList()) 935 Inst.addOperand(MCOperand::createReg(RegNo)); 936 } 937 938 bool isReg() const override { 939 // As a special case until we sort out the definition of div/divu, pretend 940 // that $0/$zero are k_PhysRegister so that MCK_ZERO works correctly. 941 if (isGPRAsmReg() && RegIdx.Index == 0) 942 return true; 943 944 return Kind == k_PhysRegister; 945 } 946 bool isRegIdx() const { return Kind == k_RegisterIndex; } 947 bool isImm() const override { return Kind == k_Immediate; } 948 bool isConstantImm() const { 949 return isImm() && dyn_cast<MCConstantExpr>(getImm()); 950 } 951 template <unsigned Bits> bool isUImm() const { 952 return isImm() && isConstantImm() && isUInt<Bits>(getConstantImm()); 953 } 954 bool isToken() const override { 955 // Note: It's not possible to pretend that other operand kinds are tokens. 956 // The matcher emitter checks tokens first. 957 return Kind == k_Token; 958 } 959 bool isMem() const override { return Kind == k_Memory; } 960 bool isConstantMemOff() const { 961 return isMem() && dyn_cast<MCConstantExpr>(getMemOff()); 962 } 963 template <unsigned Bits> bool isMemWithSimmOffset() const { 964 return isMem() && isConstantMemOff() && isInt<Bits>(getConstantMemOff()) 965 && getMemBase()->isGPRAsmReg(); 966 } 967 template <unsigned Bits> bool isMemWithSimmOffsetGPR() const { 968 return isMem() && isConstantMemOff() && isInt<Bits>(getConstantMemOff()) && 969 getMemBase()->isGPRAsmReg(); 970 } 971 bool isMemWithGRPMM16Base() const { 972 return isMem() && getMemBase()->isMM16AsmReg(); 973 } 974 template <unsigned Bits> bool isMemWithUimmOffsetSP() const { 975 return isMem() && isConstantMemOff() && isUInt<Bits>(getConstantMemOff()) 976 && getMemBase()->isRegIdx() && (getMemBase()->getGPR32Reg() == Mips::SP); 977 } 978 template <unsigned Bits> bool isMemWithUimmWordAlignedOffsetSP() const { 979 return isMem() && isConstantMemOff() && isUInt<Bits>(getConstantMemOff()) 980 && (getConstantMemOff() % 4 == 0) && getMemBase()->isRegIdx() 981 && (getMemBase()->getGPR32Reg() == Mips::SP); 982 } 983 bool isRegList16() const { 984 if (!isRegList()) 985 return false; 986 987 int Size = RegList.List->size(); 988 if (Size < 2 || Size > 5 || *RegList.List->begin() != Mips::S0 || 989 RegList.List->back() != Mips::RA) 990 return false; 991 992 int PrevReg = *RegList.List->begin(); 993 for (int i = 1; i < Size - 1; i++) { 994 int Reg = (*(RegList.List))[i]; 995 if ( Reg != PrevReg + 1) 996 return false; 997 PrevReg = Reg; 998 } 999 1000 return true; 1001 } 1002 bool isInvNum() const { return Kind == k_Immediate; } 1003 bool isLSAImm() const { 1004 if (!isConstantImm()) 1005 return false; 1006 int64_t Val = getConstantImm(); 1007 return 1 <= Val && Val <= 4; 1008 } 1009 bool isRegList() const { return Kind == k_RegList; } 1010 bool isMovePRegPair() const { 1011 if (Kind != k_RegList || RegList.List->size() != 2) 1012 return false; 1013 1014 unsigned R0 = RegList.List->front(); 1015 unsigned R1 = RegList.List->back(); 1016 1017 if ((R0 == Mips::A1 && R1 == Mips::A2) || 1018 (R0 == Mips::A1 && R1 == Mips::A3) || 1019 (R0 == Mips::A2 && R1 == Mips::A3) || 1020 (R0 == Mips::A0 && R1 == Mips::S5) || 1021 (R0 == Mips::A0 && R1 == Mips::S6) || 1022 (R0 == Mips::A0 && R1 == Mips::A1) || 1023 (R0 == Mips::A0 && R1 == Mips::A2) || 1024 (R0 == Mips::A0 && R1 == Mips::A3)) 1025 return true; 1026 1027 return false; 1028 } 1029 1030 StringRef getToken() const { 1031 assert(Kind == k_Token && "Invalid access!"); 1032 return StringRef(Tok.Data, Tok.Length); 1033 } 1034 bool isRegPair() const { return Kind == k_RegPair; } 1035 1036 unsigned getReg() const override { 1037 // As a special case until we sort out the definition of div/divu, pretend 1038 // that $0/$zero are k_PhysRegister so that MCK_ZERO works correctly. 1039 if (Kind == k_RegisterIndex && RegIdx.Index == 0 && 1040 RegIdx.Kind & RegKind_GPR) 1041 return getGPR32Reg(); // FIXME: GPR64 too 1042 1043 assert(Kind == k_PhysRegister && "Invalid access!"); 1044 return PhysReg.Num; 1045 } 1046 1047 const MCExpr *getImm() const { 1048 assert((Kind == k_Immediate) && "Invalid access!"); 1049 return Imm.Val; 1050 } 1051 1052 int64_t getConstantImm() const { 1053 const MCExpr *Val = getImm(); 1054 return static_cast<const MCConstantExpr *>(Val)->getValue(); 1055 } 1056 1057 MipsOperand *getMemBase() const { 1058 assert((Kind == k_Memory) && "Invalid access!"); 1059 return Mem.Base; 1060 } 1061 1062 const MCExpr *getMemOff() const { 1063 assert((Kind == k_Memory) && "Invalid access!"); 1064 return Mem.Off; 1065 } 1066 1067 int64_t getConstantMemOff() const { 1068 return static_cast<const MCConstantExpr *>(getMemOff())->getValue(); 1069 } 1070 1071 const SmallVectorImpl<unsigned> &getRegList() const { 1072 assert((Kind == k_RegList) && "Invalid access!"); 1073 return *(RegList.List); 1074 } 1075 1076 unsigned getRegPair() const { 1077 assert((Kind == k_RegPair) && "Invalid access!"); 1078 return RegIdx.Index; 1079 } 1080 1081 static std::unique_ptr<MipsOperand> CreateToken(StringRef Str, SMLoc S, 1082 MipsAsmParser &Parser) { 1083 auto Op = make_unique<MipsOperand>(k_Token, Parser); 1084 Op->Tok.Data = Str.data(); 1085 Op->Tok.Length = Str.size(); 1086 Op->StartLoc = S; 1087 Op->EndLoc = S; 1088 return Op; 1089 } 1090 1091 /// Create a numeric register (e.g. $1). The exact register remains 1092 /// unresolved until an instruction successfully matches 1093 static std::unique_ptr<MipsOperand> 1094 createNumericReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, 1095 SMLoc E, MipsAsmParser &Parser) { 1096 DEBUG(dbgs() << "createNumericReg(" << Index << ", ...)\n"); 1097 return CreateReg(Index, RegKind_Numeric, RegInfo, S, E, Parser); 1098 } 1099 1100 /// Create a register that is definitely a GPR. 1101 /// This is typically only used for named registers such as $gp. 1102 static std::unique_ptr<MipsOperand> 1103 createGPRReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E, 1104 MipsAsmParser &Parser) { 1105 return CreateReg(Index, RegKind_GPR, RegInfo, S, E, Parser); 1106 } 1107 1108 /// Create a register that is definitely a FGR. 1109 /// This is typically only used for named registers such as $f0. 1110 static std::unique_ptr<MipsOperand> 1111 createFGRReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E, 1112 MipsAsmParser &Parser) { 1113 return CreateReg(Index, RegKind_FGR, RegInfo, S, E, Parser); 1114 } 1115 1116 /// Create a register that is definitely a HWReg. 1117 /// This is typically only used for named registers such as $hwr_cpunum. 1118 static std::unique_ptr<MipsOperand> 1119 createHWRegsReg(unsigned Index, const MCRegisterInfo *RegInfo, 1120 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1121 return CreateReg(Index, RegKind_HWRegs, RegInfo, S, E, Parser); 1122 } 1123 1124 /// Create a register that is definitely an FCC. 1125 /// This is typically only used for named registers such as $fcc0. 1126 static std::unique_ptr<MipsOperand> 1127 createFCCReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E, 1128 MipsAsmParser &Parser) { 1129 return CreateReg(Index, RegKind_FCC, RegInfo, S, E, Parser); 1130 } 1131 1132 /// Create a register that is definitely an ACC. 1133 /// This is typically only used for named registers such as $ac0. 1134 static std::unique_ptr<MipsOperand> 1135 createACCReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E, 1136 MipsAsmParser &Parser) { 1137 return CreateReg(Index, RegKind_ACC, RegInfo, S, E, Parser); 1138 } 1139 1140 /// Create a register that is definitely an MSA128. 1141 /// This is typically only used for named registers such as $w0. 1142 static std::unique_ptr<MipsOperand> 1143 createMSA128Reg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, 1144 SMLoc E, MipsAsmParser &Parser) { 1145 return CreateReg(Index, RegKind_MSA128, RegInfo, S, E, Parser); 1146 } 1147 1148 /// Create a register that is definitely an MSACtrl. 1149 /// This is typically only used for named registers such as $msaaccess. 1150 static std::unique_ptr<MipsOperand> 1151 createMSACtrlReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, 1152 SMLoc E, MipsAsmParser &Parser) { 1153 return CreateReg(Index, RegKind_MSACtrl, RegInfo, S, E, Parser); 1154 } 1155 1156 static std::unique_ptr<MipsOperand> 1157 CreateImm(const MCExpr *Val, SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1158 auto Op = make_unique<MipsOperand>(k_Immediate, Parser); 1159 Op->Imm.Val = Val; 1160 Op->StartLoc = S; 1161 Op->EndLoc = E; 1162 return Op; 1163 } 1164 1165 static std::unique_ptr<MipsOperand> 1166 CreateMem(std::unique_ptr<MipsOperand> Base, const MCExpr *Off, SMLoc S, 1167 SMLoc E, MipsAsmParser &Parser) { 1168 auto Op = make_unique<MipsOperand>(k_Memory, Parser); 1169 Op->Mem.Base = Base.release(); 1170 Op->Mem.Off = Off; 1171 Op->StartLoc = S; 1172 Op->EndLoc = E; 1173 return Op; 1174 } 1175 1176 static std::unique_ptr<MipsOperand> 1177 CreateRegList(SmallVectorImpl<unsigned> &Regs, SMLoc StartLoc, SMLoc EndLoc, 1178 MipsAsmParser &Parser) { 1179 assert (Regs.size() > 0 && "Empty list not allowed"); 1180 1181 auto Op = make_unique<MipsOperand>(k_RegList, Parser); 1182 Op->RegList.List = new SmallVector<unsigned, 10>(Regs.begin(), Regs.end()); 1183 Op->StartLoc = StartLoc; 1184 Op->EndLoc = EndLoc; 1185 return Op; 1186 } 1187 1188 static std::unique_ptr<MipsOperand> 1189 CreateRegPair(unsigned RegNo, SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1190 auto Op = make_unique<MipsOperand>(k_RegPair, Parser); 1191 Op->RegIdx.Index = RegNo; 1192 Op->StartLoc = S; 1193 Op->EndLoc = E; 1194 return Op; 1195 } 1196 1197 bool isGPRAsmReg() const { 1198 return isRegIdx() && RegIdx.Kind & RegKind_GPR && RegIdx.Index <= 31; 1199 } 1200 bool isMM16AsmReg() const { 1201 if (!(isRegIdx() && RegIdx.Kind)) 1202 return false; 1203 return ((RegIdx.Index >= 2 && RegIdx.Index <= 7) 1204 || RegIdx.Index == 16 || RegIdx.Index == 17); 1205 } 1206 bool isMM16AsmRegZero() const { 1207 if (!(isRegIdx() && RegIdx.Kind)) 1208 return false; 1209 return (RegIdx.Index == 0 || 1210 (RegIdx.Index >= 2 && RegIdx.Index <= 7) || 1211 RegIdx.Index == 17); 1212 } 1213 bool isMM16AsmRegMoveP() const { 1214 if (!(isRegIdx() && RegIdx.Kind)) 1215 return false; 1216 return (RegIdx.Index == 0 || (RegIdx.Index >= 2 && RegIdx.Index <= 3) || 1217 (RegIdx.Index >= 16 && RegIdx.Index <= 20)); 1218 } 1219 bool isFGRAsmReg() const { 1220 // AFGR64 is $0-$15 but we handle this in getAFGR64() 1221 return isRegIdx() && RegIdx.Kind & RegKind_FGR && RegIdx.Index <= 31; 1222 } 1223 bool isHWRegsAsmReg() const { 1224 return isRegIdx() && RegIdx.Kind & RegKind_HWRegs && RegIdx.Index <= 31; 1225 } 1226 bool isCCRAsmReg() const { 1227 return isRegIdx() && RegIdx.Kind & RegKind_CCR && RegIdx.Index <= 31; 1228 } 1229 bool isFCCAsmReg() const { 1230 if (!(isRegIdx() && RegIdx.Kind & RegKind_FCC)) 1231 return false; 1232 if (!AsmParser.hasEightFccRegisters()) 1233 return RegIdx.Index == 0; 1234 return RegIdx.Index <= 7; 1235 } 1236 bool isACCAsmReg() const { 1237 return isRegIdx() && RegIdx.Kind & RegKind_ACC && RegIdx.Index <= 3; 1238 } 1239 bool isCOP0AsmReg() const { 1240 return isRegIdx() && RegIdx.Kind & RegKind_COP0 && RegIdx.Index <= 31; 1241 } 1242 bool isCOP2AsmReg() const { 1243 return isRegIdx() && RegIdx.Kind & RegKind_COP2 && RegIdx.Index <= 31; 1244 } 1245 bool isCOP3AsmReg() const { 1246 return isRegIdx() && RegIdx.Kind & RegKind_COP3 && RegIdx.Index <= 31; 1247 } 1248 bool isMSA128AsmReg() const { 1249 return isRegIdx() && RegIdx.Kind & RegKind_MSA128 && RegIdx.Index <= 31; 1250 } 1251 bool isMSACtrlAsmReg() const { 1252 return isRegIdx() && RegIdx.Kind & RegKind_MSACtrl && RegIdx.Index <= 7; 1253 } 1254 1255 /// getStartLoc - Get the location of the first token of this operand. 1256 SMLoc getStartLoc() const override { return StartLoc; } 1257 /// getEndLoc - Get the location of the last token of this operand. 1258 SMLoc getEndLoc() const override { return EndLoc; } 1259 1260 virtual ~MipsOperand() { 1261 switch (Kind) { 1262 case k_Immediate: 1263 break; 1264 case k_Memory: 1265 delete Mem.Base; 1266 break; 1267 case k_RegList: 1268 delete RegList.List; 1269 case k_PhysRegister: 1270 case k_RegisterIndex: 1271 case k_Token: 1272 case k_RegPair: 1273 break; 1274 } 1275 } 1276 1277 void print(raw_ostream &OS) const override { 1278 switch (Kind) { 1279 case k_Immediate: 1280 OS << "Imm<"; 1281 OS << *Imm.Val; 1282 OS << ">"; 1283 break; 1284 case k_Memory: 1285 OS << "Mem<"; 1286 Mem.Base->print(OS); 1287 OS << ", "; 1288 OS << *Mem.Off; 1289 OS << ">"; 1290 break; 1291 case k_PhysRegister: 1292 OS << "PhysReg<" << PhysReg.Num << ">"; 1293 break; 1294 case k_RegisterIndex: 1295 OS << "RegIdx<" << RegIdx.Index << ":" << RegIdx.Kind << ">"; 1296 break; 1297 case k_Token: 1298 OS << Tok.Data; 1299 break; 1300 case k_RegList: 1301 OS << "RegList< "; 1302 for (auto Reg : (*RegList.List)) 1303 OS << Reg << " "; 1304 OS << ">"; 1305 break; 1306 case k_RegPair: 1307 OS << "RegPair<" << RegIdx.Index << "," << RegIdx.Index + 1 << ">"; 1308 break; 1309 } 1310 } 1311 }; // class MipsOperand 1312 } // namespace 1313 1314 namespace llvm { 1315 extern const MCInstrDesc MipsInsts[]; 1316 } 1317 static const MCInstrDesc &getInstDesc(unsigned Opcode) { 1318 return MipsInsts[Opcode]; 1319 } 1320 1321 static bool hasShortDelaySlot(unsigned Opcode) { 1322 switch (Opcode) { 1323 case Mips::JALS_MM: 1324 case Mips::JALRS_MM: 1325 case Mips::JALRS16_MM: 1326 case Mips::BGEZALS_MM: 1327 case Mips::BLTZALS_MM: 1328 return true; 1329 default: 1330 return false; 1331 } 1332 } 1333 1334 static const MCSymbol *getSingleMCSymbol(const MCExpr *Expr) { 1335 if (const MCSymbolRefExpr *SRExpr = dyn_cast<MCSymbolRefExpr>(Expr)) { 1336 return &SRExpr->getSymbol(); 1337 } 1338 1339 if (const MCBinaryExpr *BExpr = dyn_cast<MCBinaryExpr>(Expr)) { 1340 const MCSymbol *LHSSym = getSingleMCSymbol(BExpr->getLHS()); 1341 const MCSymbol *RHSSym = getSingleMCSymbol(BExpr->getRHS()); 1342 1343 if (LHSSym) 1344 return LHSSym; 1345 1346 if (RHSSym) 1347 return RHSSym; 1348 1349 return nullptr; 1350 } 1351 1352 if (const MCUnaryExpr *UExpr = dyn_cast<MCUnaryExpr>(Expr)) 1353 return getSingleMCSymbol(UExpr->getSubExpr()); 1354 1355 return nullptr; 1356 } 1357 1358 static unsigned countMCSymbolRefExpr(const MCExpr *Expr) { 1359 if (isa<MCSymbolRefExpr>(Expr)) 1360 return 1; 1361 1362 if (const MCBinaryExpr *BExpr = dyn_cast<MCBinaryExpr>(Expr)) 1363 return countMCSymbolRefExpr(BExpr->getLHS()) + 1364 countMCSymbolRefExpr(BExpr->getRHS()); 1365 1366 if (const MCUnaryExpr *UExpr = dyn_cast<MCUnaryExpr>(Expr)) 1367 return countMCSymbolRefExpr(UExpr->getSubExpr()); 1368 1369 return 0; 1370 } 1371 1372 bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, 1373 SmallVectorImpl<MCInst> &Instructions) { 1374 const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); 1375 bool ExpandedJalSym = false; 1376 1377 Inst.setLoc(IDLoc); 1378 1379 if (MCID.isBranch() || MCID.isCall()) { 1380 const unsigned Opcode = Inst.getOpcode(); 1381 MCOperand Offset; 1382 1383 switch (Opcode) { 1384 default: 1385 break; 1386 case Mips::BBIT0: 1387 case Mips::BBIT032: 1388 case Mips::BBIT1: 1389 case Mips::BBIT132: 1390 assert(hasCnMips() && "instruction only valid for octeon cpus"); 1391 // Fall through 1392 1393 case Mips::BEQ: 1394 case Mips::BNE: 1395 case Mips::BEQ_MM: 1396 case Mips::BNE_MM: 1397 assert(MCID.getNumOperands() == 3 && "unexpected number of operands"); 1398 Offset = Inst.getOperand(2); 1399 if (!Offset.isImm()) 1400 break; // We'll deal with this situation later on when applying fixups. 1401 if (!isIntN(inMicroMipsMode() ? 17 : 18, Offset.getImm())) 1402 return Error(IDLoc, "branch target out of range"); 1403 if (OffsetToAlignment(Offset.getImm(), 1404 1LL << (inMicroMipsMode() ? 1 : 2))) 1405 return Error(IDLoc, "branch to misaligned address"); 1406 break; 1407 case Mips::BGEZ: 1408 case Mips::BGTZ: 1409 case Mips::BLEZ: 1410 case Mips::BLTZ: 1411 case Mips::BGEZAL: 1412 case Mips::BLTZAL: 1413 case Mips::BC1F: 1414 case Mips::BC1T: 1415 case Mips::BGEZ_MM: 1416 case Mips::BGTZ_MM: 1417 case Mips::BLEZ_MM: 1418 case Mips::BLTZ_MM: 1419 case Mips::BGEZAL_MM: 1420 case Mips::BLTZAL_MM: 1421 case Mips::BC1F_MM: 1422 case Mips::BC1T_MM: 1423 assert(MCID.getNumOperands() == 2 && "unexpected number of operands"); 1424 Offset = Inst.getOperand(1); 1425 if (!Offset.isImm()) 1426 break; // We'll deal with this situation later on when applying fixups. 1427 if (!isIntN(inMicroMipsMode() ? 17 : 18, Offset.getImm())) 1428 return Error(IDLoc, "branch target out of range"); 1429 if (OffsetToAlignment(Offset.getImm(), 1430 1LL << (inMicroMipsMode() ? 1 : 2))) 1431 return Error(IDLoc, "branch to misaligned address"); 1432 break; 1433 case Mips::BEQZ16_MM: 1434 case Mips::BEQZC16_MMR6: 1435 case Mips::BNEZ16_MM: 1436 case Mips::BNEZC16_MMR6: 1437 assert(MCID.getNumOperands() == 2 && "unexpected number of operands"); 1438 Offset = Inst.getOperand(1); 1439 if (!Offset.isImm()) 1440 break; // We'll deal with this situation later on when applying fixups. 1441 if (!isIntN(8, Offset.getImm())) 1442 return Error(IDLoc, "branch target out of range"); 1443 if (OffsetToAlignment(Offset.getImm(), 2LL)) 1444 return Error(IDLoc, "branch to misaligned address"); 1445 break; 1446 } 1447 } 1448 1449 // SSNOP is deprecated on MIPS32r6/MIPS64r6 1450 // We still accept it but it is a normal nop. 1451 if (hasMips32r6() && Inst.getOpcode() == Mips::SSNOP) { 1452 std::string ISA = hasMips64r6() ? "MIPS64r6" : "MIPS32r6"; 1453 Warning(IDLoc, "ssnop is deprecated for " + ISA + " and is equivalent to a " 1454 "nop instruction"); 1455 } 1456 1457 if (hasCnMips()) { 1458 const unsigned Opcode = Inst.getOpcode(); 1459 MCOperand Opnd; 1460 int Imm; 1461 1462 switch (Opcode) { 1463 default: 1464 break; 1465 1466 case Mips::BBIT0: 1467 case Mips::BBIT032: 1468 case Mips::BBIT1: 1469 case Mips::BBIT132: 1470 assert(MCID.getNumOperands() == 3 && "unexpected number of operands"); 1471 // The offset is handled above 1472 Opnd = Inst.getOperand(1); 1473 if (!Opnd.isImm()) 1474 return Error(IDLoc, "expected immediate operand kind"); 1475 Imm = Opnd.getImm(); 1476 if (Imm < 0 || Imm > (Opcode == Mips::BBIT0 || 1477 Opcode == Mips::BBIT1 ? 63 : 31)) 1478 return Error(IDLoc, "immediate operand value out of range"); 1479 if (Imm > 31) { 1480 Inst.setOpcode(Opcode == Mips::BBIT0 ? Mips::BBIT032 1481 : Mips::BBIT132); 1482 Inst.getOperand(1).setImm(Imm - 32); 1483 } 1484 break; 1485 1486 case Mips::CINS: 1487 case Mips::CINS32: 1488 case Mips::EXTS: 1489 case Mips::EXTS32: 1490 assert(MCID.getNumOperands() == 4 && "unexpected number of operands"); 1491 // Check length 1492 Opnd = Inst.getOperand(3); 1493 if (!Opnd.isImm()) 1494 return Error(IDLoc, "expected immediate operand kind"); 1495 Imm = Opnd.getImm(); 1496 if (Imm < 0 || Imm > 31) 1497 return Error(IDLoc, "immediate operand value out of range"); 1498 // Check position 1499 Opnd = Inst.getOperand(2); 1500 if (!Opnd.isImm()) 1501 return Error(IDLoc, "expected immediate operand kind"); 1502 Imm = Opnd.getImm(); 1503 if (Imm < 0 || Imm > (Opcode == Mips::CINS || 1504 Opcode == Mips::EXTS ? 63 : 31)) 1505 return Error(IDLoc, "immediate operand value out of range"); 1506 if (Imm > 31) { 1507 Inst.setOpcode(Opcode == Mips::CINS ? Mips::CINS32 : Mips::EXTS32); 1508 Inst.getOperand(2).setImm(Imm - 32); 1509 } 1510 break; 1511 1512 case Mips::SEQi: 1513 case Mips::SNEi: 1514 assert(MCID.getNumOperands() == 3 && "unexpected number of operands"); 1515 Opnd = Inst.getOperand(2); 1516 if (!Opnd.isImm()) 1517 return Error(IDLoc, "expected immediate operand kind"); 1518 Imm = Opnd.getImm(); 1519 if (!isInt<10>(Imm)) 1520 return Error(IDLoc, "immediate operand value out of range"); 1521 break; 1522 } 1523 } 1524 1525 // This expansion is not in a function called by expandInstruction() because 1526 // the pseudo-instruction doesn't have a distinct opcode. 1527 if ((Inst.getOpcode() == Mips::JAL || Inst.getOpcode() == Mips::JAL_MM) && 1528 inPicMode()) { 1529 warnIfNoMacro(IDLoc); 1530 1531 const MCExpr *JalExpr = Inst.getOperand(0).getExpr(); 1532 1533 // We can do this expansion if there's only 1 symbol in the argument 1534 // expression. 1535 if (countMCSymbolRefExpr(JalExpr) > 1) 1536 return Error(IDLoc, "jal doesn't support multiple symbols in PIC mode"); 1537 1538 // FIXME: This is checking the expression can be handled by the later stages 1539 // of the assembler. We ought to leave it to those later stages but 1540 // we can't do that until we stop evaluateRelocExpr() rewriting the 1541 // expressions into non-equivalent forms. 1542 const MCSymbol *JalSym = getSingleMCSymbol(JalExpr); 1543 1544 // FIXME: Add support for label+offset operands (currently causes an error). 1545 // FIXME: Add support for forward-declared local symbols. 1546 // FIXME: Add expansion for when the LargeGOT option is enabled. 1547 if (JalSym->isInSection() || JalSym->isTemporary()) { 1548 if (isABI_O32()) { 1549 // If it's a local symbol and the O32 ABI is being used, we expand to: 1550 // lw $25, 0($gp) 1551 // R_(MICRO)MIPS_GOT16 label 1552 // addiu $25, $25, 0 1553 // R_(MICRO)MIPS_LO16 label 1554 // jalr $25 1555 const MCExpr *Got16RelocExpr = evaluateRelocExpr(JalExpr, "got"); 1556 const MCExpr *Lo16RelocExpr = evaluateRelocExpr(JalExpr, "lo"); 1557 1558 MCInst LwInst; 1559 LwInst.setOpcode(Mips::LW); 1560 LwInst.addOperand(MCOperand::createReg(Mips::T9)); 1561 LwInst.addOperand(MCOperand::createReg(Mips::GP)); 1562 LwInst.addOperand(MCOperand::createExpr(Got16RelocExpr)); 1563 Instructions.push_back(LwInst); 1564 1565 MCInst AddiuInst; 1566 AddiuInst.setOpcode(Mips::ADDiu); 1567 AddiuInst.addOperand(MCOperand::createReg(Mips::T9)); 1568 AddiuInst.addOperand(MCOperand::createReg(Mips::T9)); 1569 AddiuInst.addOperand(MCOperand::createExpr(Lo16RelocExpr)); 1570 Instructions.push_back(AddiuInst); 1571 } else if (isABI_N32() || isABI_N64()) { 1572 // If it's a local symbol and the N32/N64 ABIs are being used, 1573 // we expand to: 1574 // lw/ld $25, 0($gp) 1575 // R_(MICRO)MIPS_GOT_DISP label 1576 // jalr $25 1577 const MCExpr *GotDispRelocExpr = evaluateRelocExpr(JalExpr, "got_disp"); 1578 1579 MCInst LoadInst; 1580 LoadInst.setOpcode(ABI.ArePtrs64bit() ? Mips::LD : Mips::LW); 1581 LoadInst.addOperand(MCOperand::createReg(Mips::T9)); 1582 LoadInst.addOperand(MCOperand::createReg(Mips::GP)); 1583 LoadInst.addOperand(MCOperand::createExpr(GotDispRelocExpr)); 1584 Instructions.push_back(LoadInst); 1585 } 1586 } else { 1587 // If it's an external/weak symbol, we expand to: 1588 // lw/ld $25, 0($gp) 1589 // R_(MICRO)MIPS_CALL16 label 1590 // jalr $25 1591 const MCExpr *Call16RelocExpr = evaluateRelocExpr(JalExpr, "call16"); 1592 1593 MCInst LoadInst; 1594 LoadInst.setOpcode(ABI.ArePtrs64bit() ? Mips::LD : Mips::LW); 1595 LoadInst.addOperand(MCOperand::createReg(Mips::T9)); 1596 LoadInst.addOperand(MCOperand::createReg(Mips::GP)); 1597 LoadInst.addOperand(MCOperand::createExpr(Call16RelocExpr)); 1598 Instructions.push_back(LoadInst); 1599 } 1600 1601 MCInst JalrInst; 1602 if (IsCpRestoreSet && inMicroMipsMode()) 1603 JalrInst.setOpcode(Mips::JALRS_MM); 1604 else 1605 JalrInst.setOpcode(inMicroMipsMode() ? Mips::JALR_MM : Mips::JALR); 1606 JalrInst.addOperand(MCOperand::createReg(Mips::RA)); 1607 JalrInst.addOperand(MCOperand::createReg(Mips::T9)); 1608 1609 // FIXME: Add an R_(MICRO)MIPS_JALR relocation after the JALR. 1610 // This relocation is supposed to be an optimization hint for the linker 1611 // and is not necessary for correctness. 1612 1613 Inst = JalrInst; 1614 ExpandedJalSym = true; 1615 } 1616 1617 if (MCID.mayLoad() || MCID.mayStore()) { 1618 // Check the offset of memory operand, if it is a symbol 1619 // reference or immediate we may have to expand instructions. 1620 for (unsigned i = 0; i < MCID.getNumOperands(); i++) { 1621 const MCOperandInfo &OpInfo = MCID.OpInfo[i]; 1622 if ((OpInfo.OperandType == MCOI::OPERAND_MEMORY) || 1623 (OpInfo.OperandType == MCOI::OPERAND_UNKNOWN)) { 1624 MCOperand &Op = Inst.getOperand(i); 1625 if (Op.isImm()) { 1626 int MemOffset = Op.getImm(); 1627 if (MemOffset < -32768 || MemOffset > 32767) { 1628 // Offset can't exceed 16bit value. 1629 expandMemInst(Inst, IDLoc, Instructions, MCID.mayLoad(), true); 1630 return false; 1631 } 1632 } else if (Op.isExpr()) { 1633 const MCExpr *Expr = Op.getExpr(); 1634 if (Expr->getKind() == MCExpr::SymbolRef) { 1635 const MCSymbolRefExpr *SR = 1636 static_cast<const MCSymbolRefExpr *>(Expr); 1637 if (SR->getKind() == MCSymbolRefExpr::VK_None) { 1638 // Expand symbol. 1639 expandMemInst(Inst, IDLoc, Instructions, MCID.mayLoad(), false); 1640 return false; 1641 } 1642 } else if (!isEvaluated(Expr)) { 1643 expandMemInst(Inst, IDLoc, Instructions, MCID.mayLoad(), false); 1644 return false; 1645 } 1646 } 1647 } 1648 } // for 1649 } // if load/store 1650 1651 if (inMicroMipsMode()) { 1652 if (MCID.mayLoad()) { 1653 // Try to create 16-bit GP relative load instruction. 1654 for (unsigned i = 0; i < MCID.getNumOperands(); i++) { 1655 const MCOperandInfo &OpInfo = MCID.OpInfo[i]; 1656 if ((OpInfo.OperandType == MCOI::OPERAND_MEMORY) || 1657 (OpInfo.OperandType == MCOI::OPERAND_UNKNOWN)) { 1658 MCOperand &Op = Inst.getOperand(i); 1659 if (Op.isImm()) { 1660 int MemOffset = Op.getImm(); 1661 MCOperand &DstReg = Inst.getOperand(0); 1662 MCOperand &BaseReg = Inst.getOperand(1); 1663 if (isIntN(9, MemOffset) && (MemOffset % 4 == 0) && 1664 getContext().getRegisterInfo()->getRegClass( 1665 Mips::GPRMM16RegClassID).contains(DstReg.getReg()) && 1666 (BaseReg.getReg() == Mips::GP || 1667 BaseReg.getReg() == Mips::GP_64)) { 1668 MCInst TmpInst; 1669 TmpInst.setLoc(IDLoc); 1670 TmpInst.setOpcode(Mips::LWGP_MM); 1671 TmpInst.addOperand(MCOperand::createReg(DstReg.getReg())); 1672 TmpInst.addOperand(MCOperand::createReg(Mips::GP)); 1673 TmpInst.addOperand(MCOperand::createImm(MemOffset)); 1674 Instructions.push_back(TmpInst); 1675 return false; 1676 } 1677 } 1678 } 1679 } // for 1680 } // if load 1681 1682 // TODO: Handle this with the AsmOperandClass.PredicateMethod. 1683 1684 MCOperand Opnd; 1685 int Imm; 1686 1687 switch (Inst.getOpcode()) { 1688 default: 1689 break; 1690 case Mips::ADDIUS5_MM: 1691 Opnd = Inst.getOperand(2); 1692 if (!Opnd.isImm()) 1693 return Error(IDLoc, "expected immediate operand kind"); 1694 Imm = Opnd.getImm(); 1695 if (Imm < -8 || Imm > 7) 1696 return Error(IDLoc, "immediate operand value out of range"); 1697 break; 1698 case Mips::ADDIUSP_MM: 1699 Opnd = Inst.getOperand(0); 1700 if (!Opnd.isImm()) 1701 return Error(IDLoc, "expected immediate operand kind"); 1702 Imm = Opnd.getImm(); 1703 if (Imm < -1032 || Imm > 1028 || (Imm < 8 && Imm > -12) || 1704 Imm % 4 != 0) 1705 return Error(IDLoc, "immediate operand value out of range"); 1706 break; 1707 case Mips::SLL16_MM: 1708 case Mips::SRL16_MM: 1709 Opnd = Inst.getOperand(2); 1710 if (!Opnd.isImm()) 1711 return Error(IDLoc, "expected immediate operand kind"); 1712 Imm = Opnd.getImm(); 1713 if (Imm < 1 || Imm > 8) 1714 return Error(IDLoc, "immediate operand value out of range"); 1715 break; 1716 case Mips::LI16_MM: 1717 Opnd = Inst.getOperand(1); 1718 if (!Opnd.isImm()) 1719 return Error(IDLoc, "expected immediate operand kind"); 1720 Imm = Opnd.getImm(); 1721 if (Imm < -1 || Imm > 126) 1722 return Error(IDLoc, "immediate operand value out of range"); 1723 break; 1724 case Mips::ADDIUR2_MM: 1725 Opnd = Inst.getOperand(2); 1726 if (!Opnd.isImm()) 1727 return Error(IDLoc, "expected immediate operand kind"); 1728 Imm = Opnd.getImm(); 1729 if (!(Imm == 1 || Imm == -1 || 1730 ((Imm % 4 == 0) && Imm < 28 && Imm > 0))) 1731 return Error(IDLoc, "immediate operand value out of range"); 1732 break; 1733 case Mips::ADDIUR1SP_MM: 1734 Opnd = Inst.getOperand(1); 1735 if (!Opnd.isImm()) 1736 return Error(IDLoc, "expected immediate operand kind"); 1737 Imm = Opnd.getImm(); 1738 if (OffsetToAlignment(Imm, 4LL)) 1739 return Error(IDLoc, "misaligned immediate operand value"); 1740 if (Imm < 0 || Imm > 255) 1741 return Error(IDLoc, "immediate operand value out of range"); 1742 break; 1743 case Mips::ANDI16_MM: 1744 Opnd = Inst.getOperand(2); 1745 if (!Opnd.isImm()) 1746 return Error(IDLoc, "expected immediate operand kind"); 1747 Imm = Opnd.getImm(); 1748 if (!(Imm == 128 || (Imm >= 1 && Imm <= 4) || Imm == 7 || Imm == 8 || 1749 Imm == 15 || Imm == 16 || Imm == 31 || Imm == 32 || Imm == 63 || 1750 Imm == 64 || Imm == 255 || Imm == 32768 || Imm == 65535)) 1751 return Error(IDLoc, "immediate operand value out of range"); 1752 break; 1753 case Mips::LBU16_MM: 1754 Opnd = Inst.getOperand(2); 1755 if (!Opnd.isImm()) 1756 return Error(IDLoc, "expected immediate operand kind"); 1757 Imm = Opnd.getImm(); 1758 if (Imm < -1 || Imm > 14) 1759 return Error(IDLoc, "immediate operand value out of range"); 1760 break; 1761 case Mips::TEQ_MM: 1762 case Mips::TGE_MM: 1763 case Mips::TGEU_MM: 1764 case Mips::TLT_MM: 1765 case Mips::TLTU_MM: 1766 case Mips::TNE_MM: 1767 case Mips::SB16_MM: 1768 Opnd = Inst.getOperand(2); 1769 if (!Opnd.isImm()) 1770 return Error(IDLoc, "expected immediate operand kind"); 1771 Imm = Opnd.getImm(); 1772 if (Imm < 0 || Imm > 15) 1773 return Error(IDLoc, "immediate operand value out of range"); 1774 break; 1775 case Mips::LHU16_MM: 1776 case Mips::SH16_MM: 1777 Opnd = Inst.getOperand(2); 1778 if (!Opnd.isImm()) 1779 return Error(IDLoc, "expected immediate operand kind"); 1780 Imm = Opnd.getImm(); 1781 if (Imm < 0 || Imm > 30 || (Imm % 2 != 0)) 1782 return Error(IDLoc, "immediate operand value out of range"); 1783 break; 1784 case Mips::LW16_MM: 1785 case Mips::SW16_MM: 1786 Opnd = Inst.getOperand(2); 1787 if (!Opnd.isImm()) 1788 return Error(IDLoc, "expected immediate operand kind"); 1789 Imm = Opnd.getImm(); 1790 if (Imm < 0 || Imm > 60 || (Imm % 4 != 0)) 1791 return Error(IDLoc, "immediate operand value out of range"); 1792 break; 1793 case Mips::PREFX_MM: 1794 case Mips::CACHE: 1795 case Mips::PREF: 1796 Opnd = Inst.getOperand(2); 1797 if (!Opnd.isImm()) 1798 return Error(IDLoc, "expected immediate operand kind"); 1799 Imm = Opnd.getImm(); 1800 if (!isUInt<5>(Imm)) 1801 return Error(IDLoc, "immediate operand value out of range"); 1802 break; 1803 case Mips::ADDIUPC_MM: 1804 MCOperand Opnd = Inst.getOperand(1); 1805 if (!Opnd.isImm()) 1806 return Error(IDLoc, "expected immediate operand kind"); 1807 int Imm = Opnd.getImm(); 1808 if ((Imm % 4 != 0) || !isIntN(25, Imm)) 1809 return Error(IDLoc, "immediate operand value out of range"); 1810 break; 1811 } 1812 } 1813 1814 if (needsExpansion(Inst)) { 1815 if (expandInstruction(Inst, IDLoc, Instructions)) 1816 return true; 1817 } else 1818 Instructions.push_back(Inst); 1819 1820 // If this instruction has a delay slot and .set reorder is active, 1821 // emit a NOP after it. 1822 if (MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder()) 1823 createNop(hasShortDelaySlot(Inst.getOpcode()), IDLoc, Instructions); 1824 1825 if ((Inst.getOpcode() == Mips::JalOneReg || 1826 Inst.getOpcode() == Mips::JalTwoReg || ExpandedJalSym) && 1827 isPicAndNotNxxAbi()) { 1828 if (IsCpRestoreSet) { 1829 // We need a NOP between the JALR and the LW: 1830 // If .set reorder has been used, we've already emitted a NOP. 1831 // If .set noreorder has been used, we need to emit a NOP at this point. 1832 if (!AssemblerOptions.back()->isReorder()) 1833 createNop(hasShortDelaySlot(Inst.getOpcode()), IDLoc, Instructions); 1834 1835 // Load the $gp from the stack. 1836 SmallVector<MCInst, 3> LoadInsts; 1837 createCpRestoreMemOp(true /*IsLoad*/, CpRestoreOffset /*StackOffset*/, 1838 IDLoc, LoadInsts); 1839 1840 for (const MCInst &Inst : LoadInsts) 1841 Instructions.push_back(Inst); 1842 1843 } else 1844 Warning(IDLoc, "no .cprestore used in PIC mode"); 1845 } 1846 1847 return false; 1848 } 1849 1850 bool MipsAsmParser::needsExpansion(MCInst &Inst) { 1851 1852 switch (Inst.getOpcode()) { 1853 case Mips::LoadImm32: 1854 case Mips::LoadImm64: 1855 case Mips::LoadAddrImm32: 1856 case Mips::LoadAddrImm64: 1857 case Mips::LoadAddrReg32: 1858 case Mips::LoadAddrReg64: 1859 case Mips::B_MM_Pseudo: 1860 case Mips::B_MMR6_Pseudo: 1861 case Mips::LWM_MM: 1862 case Mips::SWM_MM: 1863 case Mips::JalOneReg: 1864 case Mips::JalTwoReg: 1865 case Mips::BneImm: 1866 case Mips::BeqImm: 1867 case Mips::BLT: 1868 case Mips::BLE: 1869 case Mips::BGE: 1870 case Mips::BGT: 1871 case Mips::BLTU: 1872 case Mips::BLEU: 1873 case Mips::BGEU: 1874 case Mips::BGTU: 1875 case Mips::BLTL: 1876 case Mips::BLEL: 1877 case Mips::BGEL: 1878 case Mips::BGTL: 1879 case Mips::BLTUL: 1880 case Mips::BLEUL: 1881 case Mips::BGEUL: 1882 case Mips::BGTUL: 1883 case Mips::SDivMacro: 1884 case Mips::UDivMacro: 1885 case Mips::DSDivMacro: 1886 case Mips::DUDivMacro: 1887 case Mips::Ulhu: 1888 case Mips::Ulw: 1889 case Mips::NORImm: 1890 return true; 1891 case Mips::ADDi: 1892 case Mips::ADDiu: 1893 case Mips::SLTi: 1894 case Mips::SLTiu: 1895 if ((Inst.getNumOperands() == 3) && 1896 Inst.getOperand(0).isReg() && 1897 Inst.getOperand(1).isReg() && 1898 Inst.getOperand(2).isImm()) { 1899 int64_t ImmValue = Inst.getOperand(2).getImm(); 1900 return !isInt<16>(ImmValue); 1901 } 1902 return false; 1903 case Mips::ANDi: 1904 case Mips::ORi: 1905 case Mips::XORi: 1906 if ((Inst.getNumOperands() == 3) && 1907 Inst.getOperand(0).isReg() && 1908 Inst.getOperand(1).isReg() && 1909 Inst.getOperand(2).isImm()) { 1910 int64_t ImmValue = Inst.getOperand(2).getImm(); 1911 return !isUInt<16>(ImmValue); 1912 } 1913 return false; 1914 default: 1915 return false; 1916 } 1917 } 1918 1919 bool MipsAsmParser::expandInstruction(MCInst &Inst, SMLoc IDLoc, 1920 SmallVectorImpl<MCInst> &Instructions) { 1921 switch (Inst.getOpcode()) { 1922 default: llvm_unreachable("unimplemented expansion"); 1923 case Mips::LoadImm32: 1924 return expandLoadImm(Inst, true, IDLoc, Instructions); 1925 case Mips::LoadImm64: 1926 return expandLoadImm(Inst, false, IDLoc, Instructions); 1927 case Mips::LoadAddrImm32: 1928 case Mips::LoadAddrImm64: 1929 assert(Inst.getOperand(0).isReg() && "expected register operand kind"); 1930 assert((Inst.getOperand(1).isImm() || Inst.getOperand(1).isExpr()) && 1931 "expected immediate operand kind"); 1932 1933 return expandLoadAddress( 1934 Inst.getOperand(0).getReg(), Mips::NoRegister, Inst.getOperand(1), 1935 Inst.getOpcode() == Mips::LoadAddrImm32, IDLoc, Instructions); 1936 case Mips::LoadAddrReg32: 1937 case Mips::LoadAddrReg64: 1938 assert(Inst.getOperand(0).isReg() && "expected register operand kind"); 1939 assert(Inst.getOperand(1).isReg() && "expected register operand kind"); 1940 assert((Inst.getOperand(2).isImm() || Inst.getOperand(2).isExpr()) && 1941 "expected immediate operand kind"); 1942 1943 return expandLoadAddress( 1944 Inst.getOperand(0).getReg(), Inst.getOperand(1).getReg(), Inst.getOperand(2), 1945 Inst.getOpcode() == Mips::LoadAddrReg32, IDLoc, Instructions); 1946 case Mips::B_MM_Pseudo: 1947 case Mips::B_MMR6_Pseudo: 1948 return expandUncondBranchMMPseudo(Inst, IDLoc, Instructions); 1949 case Mips::SWM_MM: 1950 case Mips::LWM_MM: 1951 return expandLoadStoreMultiple(Inst, IDLoc, Instructions); 1952 case Mips::JalOneReg: 1953 case Mips::JalTwoReg: 1954 return expandJalWithRegs(Inst, IDLoc, Instructions); 1955 case Mips::BneImm: 1956 case Mips::BeqImm: 1957 return expandBranchImm(Inst, IDLoc, Instructions); 1958 case Mips::BLT: 1959 case Mips::BLE: 1960 case Mips::BGE: 1961 case Mips::BGT: 1962 case Mips::BLTU: 1963 case Mips::BLEU: 1964 case Mips::BGEU: 1965 case Mips::BGTU: 1966 case Mips::BLTL: 1967 case Mips::BLEL: 1968 case Mips::BGEL: 1969 case Mips::BGTL: 1970 case Mips::BLTUL: 1971 case Mips::BLEUL: 1972 case Mips::BGEUL: 1973 case Mips::BGTUL: 1974 return expandCondBranches(Inst, IDLoc, Instructions); 1975 case Mips::SDivMacro: 1976 return expandDiv(Inst, IDLoc, Instructions, false, true); 1977 case Mips::DSDivMacro: 1978 return expandDiv(Inst, IDLoc, Instructions, true, true); 1979 case Mips::UDivMacro: 1980 return expandDiv(Inst, IDLoc, Instructions, false, false); 1981 case Mips::DUDivMacro: 1982 return expandDiv(Inst, IDLoc, Instructions, true, false); 1983 case Mips::Ulhu: 1984 return expandUlhu(Inst, IDLoc, Instructions); 1985 case Mips::Ulw: 1986 return expandUlw(Inst, IDLoc, Instructions); 1987 case Mips::ADDi: 1988 case Mips::ADDiu: 1989 case Mips::ANDi: 1990 case Mips::NORImm: 1991 case Mips::ORi: 1992 case Mips::SLTi: 1993 case Mips::SLTiu: 1994 case Mips::XORi: 1995 return expandAliasImmediate(Inst, IDLoc, Instructions); 1996 } 1997 } 1998 1999 namespace { 2000 void emitRX(unsigned Opcode, unsigned Reg0, MCOperand Op1, SMLoc IDLoc, 2001 SmallVectorImpl<MCInst> &Instructions) { 2002 MCInst tmpInst; 2003 tmpInst.setOpcode(Opcode); 2004 tmpInst.addOperand(MCOperand::createReg(Reg0)); 2005 tmpInst.addOperand(Op1); 2006 tmpInst.setLoc(IDLoc); 2007 Instructions.push_back(tmpInst); 2008 } 2009 2010 void emitRI(unsigned Opcode, unsigned Reg0, int32_t Imm, SMLoc IDLoc, 2011 SmallVectorImpl<MCInst> &Instructions) { 2012 emitRX(Opcode, Reg0, MCOperand::createImm(Imm), IDLoc, Instructions); 2013 } 2014 2015 void emitRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, SMLoc IDLoc, 2016 SmallVectorImpl<MCInst> &Instructions) { 2017 emitRX(Opcode, Reg0, MCOperand::createReg(Reg1), IDLoc, Instructions); 2018 } 2019 2020 void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc, 2021 SmallVectorImpl<MCInst> &Instructions) { 2022 MCInst tmpInst; 2023 tmpInst.setOpcode(Opcode); 2024 tmpInst.addOperand(MCOperand::createImm(Imm1)); 2025 tmpInst.addOperand(MCOperand::createImm(Imm2)); 2026 tmpInst.setLoc(IDLoc); 2027 Instructions.push_back(tmpInst); 2028 } 2029 2030 void emitR(unsigned Opcode, unsigned Reg0, SMLoc IDLoc, 2031 SmallVectorImpl<MCInst> &Instructions) { 2032 MCInst tmpInst; 2033 tmpInst.setOpcode(Opcode); 2034 tmpInst.addOperand(MCOperand::createReg(Reg0)); 2035 tmpInst.setLoc(IDLoc); 2036 Instructions.push_back(tmpInst); 2037 } 2038 2039 void emitRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, MCOperand Op2, 2040 SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) { 2041 MCInst tmpInst; 2042 tmpInst.setOpcode(Opcode); 2043 tmpInst.addOperand(MCOperand::createReg(Reg0)); 2044 tmpInst.addOperand(MCOperand::createReg(Reg1)); 2045 tmpInst.addOperand(Op2); 2046 tmpInst.setLoc(IDLoc); 2047 Instructions.push_back(tmpInst); 2048 } 2049 2050 void emitRRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2, 2051 SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) { 2052 emitRRX(Opcode, Reg0, Reg1, MCOperand::createReg(Reg2), IDLoc, 2053 Instructions); 2054 } 2055 2056 void emitRRI(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm, 2057 SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) { 2058 emitRRX(Opcode, Reg0, Reg1, MCOperand::createImm(Imm), IDLoc, 2059 Instructions); 2060 } 2061 2062 void emitAppropriateDSLL(unsigned DstReg, unsigned SrcReg, int16_t ShiftAmount, 2063 SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) { 2064 if (ShiftAmount >= 32) { 2065 emitRRI(Mips::DSLL32, DstReg, SrcReg, ShiftAmount - 32, IDLoc, 2066 Instructions); 2067 return; 2068 } 2069 2070 emitRRI(Mips::DSLL, DstReg, SrcReg, ShiftAmount, IDLoc, Instructions); 2071 } 2072 } // end anonymous namespace. 2073 2074 bool MipsAsmParser::expandJalWithRegs(MCInst &Inst, SMLoc IDLoc, 2075 SmallVectorImpl<MCInst> &Instructions) { 2076 // Create a JALR instruction which is going to replace the pseudo-JAL. 2077 MCInst JalrInst; 2078 JalrInst.setLoc(IDLoc); 2079 const MCOperand FirstRegOp = Inst.getOperand(0); 2080 const unsigned Opcode = Inst.getOpcode(); 2081 2082 if (Opcode == Mips::JalOneReg) { 2083 // jal $rs => jalr $rs 2084 if (IsCpRestoreSet && inMicroMipsMode()) { 2085 JalrInst.setOpcode(Mips::JALRS16_MM); 2086 JalrInst.addOperand(FirstRegOp); 2087 } else if (inMicroMipsMode()) { 2088 JalrInst.setOpcode(Mips::JALR16_MM); 2089 JalrInst.addOperand(FirstRegOp); 2090 } else { 2091 JalrInst.setOpcode(Mips::JALR); 2092 JalrInst.addOperand(MCOperand::createReg(Mips::RA)); 2093 JalrInst.addOperand(FirstRegOp); 2094 } 2095 } else if (Opcode == Mips::JalTwoReg) { 2096 // jal $rd, $rs => jalr $rd, $rs 2097 if (IsCpRestoreSet && inMicroMipsMode()) 2098 JalrInst.setOpcode(Mips::JALRS_MM); 2099 else 2100 JalrInst.setOpcode(inMicroMipsMode() ? Mips::JALR_MM : Mips::JALR); 2101 JalrInst.addOperand(FirstRegOp); 2102 const MCOperand SecondRegOp = Inst.getOperand(1); 2103 JalrInst.addOperand(SecondRegOp); 2104 } 2105 Instructions.push_back(JalrInst); 2106 2107 // If .set reorder is active, emit a NOP after it. 2108 if (AssemblerOptions.back()->isReorder()) 2109 createNop(hasShortDelaySlot(JalrInst.getOpcode()), IDLoc, Instructions); 2110 2111 return false; 2112 } 2113 2114 /// Can the value be represented by a unsigned N-bit value and a shift left? 2115 template<unsigned N> 2116 bool isShiftedUIntAtAnyPosition(uint64_t x) { 2117 unsigned BitNum = findFirstSet(x); 2118 2119 return (x == x >> BitNum << BitNum) && isUInt<N>(x >> BitNum); 2120 } 2121 2122 /// Load (or add) an immediate into a register. 2123 /// 2124 /// @param ImmValue The immediate to load. 2125 /// @param DstReg The register that will hold the immediate. 2126 /// @param SrcReg A register to add to the immediate or Mips::NoRegister 2127 /// for a simple initialization. 2128 /// @param Is32BitImm Is ImmValue 32-bit or 64-bit? 2129 /// @param IsAddress True if the immediate represents an address. False if it 2130 /// is an integer. 2131 /// @param IDLoc Location of the immediate in the source file. 2132 /// @param Instructions The instructions emitted by this expansion. 2133 bool MipsAsmParser::loadImmediate(int64_t ImmValue, unsigned DstReg, 2134 unsigned SrcReg, bool Is32BitImm, 2135 bool IsAddress, SMLoc IDLoc, 2136 SmallVectorImpl<MCInst> &Instructions) { 2137 if (!Is32BitImm && !isGP64bit()) { 2138 Error(IDLoc, "instruction requires a 64-bit architecture"); 2139 return true; 2140 } 2141 2142 if (Is32BitImm) { 2143 if (isInt<32>(ImmValue) || isUInt<32>(ImmValue)) { 2144 // Sign extend up to 64-bit so that the predicates match the hardware 2145 // behaviour. In particular, isInt<16>(0xffff8000) and similar should be 2146 // true. 2147 ImmValue = SignExtend64<32>(ImmValue); 2148 } else { 2149 Error(IDLoc, "instruction requires a 32-bit immediate"); 2150 return true; 2151 } 2152 } 2153 2154 unsigned ZeroReg = IsAddress ? ABI.GetNullPtr() : ABI.GetZeroReg(); 2155 unsigned AdduOp = !Is32BitImm ? Mips::DADDu : Mips::ADDu; 2156 2157 bool UseSrcReg = false; 2158 if (SrcReg != Mips::NoRegister) 2159 UseSrcReg = true; 2160 2161 unsigned TmpReg = DstReg; 2162 if (UseSrcReg && (DstReg == SrcReg)) { 2163 // At this point we need AT to perform the expansions and we exit if it is 2164 // not available. 2165 unsigned ATReg = getATReg(IDLoc); 2166 if (!ATReg) 2167 return true; 2168 TmpReg = ATReg; 2169 } 2170 2171 if (isInt<16>(ImmValue)) { 2172 if (!UseSrcReg) 2173 SrcReg = ZeroReg; 2174 2175 // This doesn't quite follow the usual ABI expectations for N32 but matches 2176 // traditional assembler behaviour. N32 would normally use addiu for both 2177 // integers and addresses. 2178 if (IsAddress && !Is32BitImm) { 2179 emitRRI(Mips::DADDiu, DstReg, SrcReg, ImmValue, IDLoc, Instructions); 2180 return false; 2181 } 2182 2183 emitRRI(Mips::ADDiu, DstReg, SrcReg, ImmValue, IDLoc, Instructions); 2184 return false; 2185 } 2186 2187 if (isUInt<16>(ImmValue)) { 2188 unsigned TmpReg = DstReg; 2189 if (SrcReg == DstReg) { 2190 TmpReg = getATReg(IDLoc); 2191 if (!TmpReg) 2192 return true; 2193 } 2194 2195 emitRRI(Mips::ORi, TmpReg, ZeroReg, ImmValue, IDLoc, Instructions); 2196 if (UseSrcReg) 2197 emitRRR(ABI.GetPtrAdduOp(), DstReg, TmpReg, SrcReg, IDLoc, Instructions); 2198 return false; 2199 } 2200 2201 if (isInt<32>(ImmValue) || isUInt<32>(ImmValue)) { 2202 warnIfNoMacro(IDLoc); 2203 2204 uint16_t Bits31To16 = (ImmValue >> 16) & 0xffff; 2205 uint16_t Bits15To0 = ImmValue & 0xffff; 2206 2207 if (!Is32BitImm && !isInt<32>(ImmValue)) { 2208 // Traditional behaviour seems to special case this particular value. It's 2209 // not clear why other masks are handled differently. 2210 if (ImmValue == 0xffffffff) { 2211 emitRI(Mips::LUi, TmpReg, 0xffff, IDLoc, Instructions); 2212 emitRRI(Mips::DSRL32, TmpReg, TmpReg, 0, IDLoc, Instructions); 2213 if (UseSrcReg) 2214 emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Instructions); 2215 return false; 2216 } 2217 2218 // Expand to an ORi instead of a LUi to avoid sign-extending into the 2219 // upper 32 bits. 2220 emitRRI(Mips::ORi, TmpReg, ZeroReg, Bits31To16, IDLoc, Instructions); 2221 emitRRI(Mips::DSLL, TmpReg, TmpReg, 16, IDLoc, Instructions); 2222 if (Bits15To0) 2223 emitRRI(Mips::ORi, TmpReg, TmpReg, Bits15To0, IDLoc, Instructions); 2224 if (UseSrcReg) 2225 emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Instructions); 2226 return false; 2227 } 2228 2229 emitRI(Mips::LUi, TmpReg, Bits31To16, IDLoc, Instructions); 2230 if (Bits15To0) 2231 emitRRI(Mips::ORi, TmpReg, TmpReg, Bits15To0, IDLoc, Instructions); 2232 if (UseSrcReg) 2233 emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Instructions); 2234 return false; 2235 } 2236 2237 if (isShiftedUIntAtAnyPosition<16>(ImmValue)) { 2238 if (Is32BitImm) { 2239 Error(IDLoc, "instruction requires a 32-bit immediate"); 2240 return true; 2241 } 2242 2243 // Traditionally, these immediates are shifted as little as possible and as 2244 // such we align the most significant bit to bit 15 of our temporary. 2245 unsigned FirstSet = findFirstSet((uint64_t)ImmValue); 2246 unsigned LastSet = findLastSet((uint64_t)ImmValue); 2247 unsigned ShiftAmount = FirstSet - (15 - (LastSet - FirstSet)); 2248 uint16_t Bits = (ImmValue >> ShiftAmount) & 0xffff; 2249 emitRRI(Mips::ORi, TmpReg, ZeroReg, Bits, IDLoc, Instructions); 2250 emitRRI(Mips::DSLL, TmpReg, TmpReg, ShiftAmount, IDLoc, Instructions); 2251 2252 if (UseSrcReg) 2253 emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Instructions); 2254 2255 return false; 2256 } 2257 2258 warnIfNoMacro(IDLoc); 2259 2260 // The remaining case is packed with a sequence of dsll and ori with zeros 2261 // being omitted and any neighbouring dsll's being coalesced. 2262 // The highest 32-bit's are equivalent to a 32-bit immediate load. 2263 2264 // Load bits 32-63 of ImmValue into bits 0-31 of the temporary register. 2265 if (loadImmediate(ImmValue >> 32, TmpReg, Mips::NoRegister, true, false, 2266 IDLoc, Instructions)) 2267 return false; 2268 2269 // Shift and accumulate into the register. If a 16-bit chunk is zero, then 2270 // skip it and defer the shift to the next chunk. 2271 unsigned ShiftCarriedForwards = 16; 2272 for (int BitNum = 16; BitNum >= 0; BitNum -= 16) { 2273 uint16_t ImmChunk = (ImmValue >> BitNum) & 0xffff; 2274 2275 if (ImmChunk != 0) { 2276 emitAppropriateDSLL(TmpReg, TmpReg, ShiftCarriedForwards, IDLoc, 2277 Instructions); 2278 emitRRI(Mips::ORi, TmpReg, TmpReg, ImmChunk, IDLoc, Instructions); 2279 ShiftCarriedForwards = 0; 2280 } 2281 2282 ShiftCarriedForwards += 16; 2283 } 2284 ShiftCarriedForwards -= 16; 2285 2286 // Finish any remaining shifts left by trailing zeros. 2287 if (ShiftCarriedForwards) 2288 emitAppropriateDSLL(TmpReg, TmpReg, ShiftCarriedForwards, IDLoc, 2289 Instructions); 2290 2291 if (UseSrcReg) 2292 emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Instructions); 2293 2294 return false; 2295 } 2296 2297 bool MipsAsmParser::expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc, 2298 SmallVectorImpl<MCInst> &Instructions) { 2299 const MCOperand &ImmOp = Inst.getOperand(1); 2300 assert(ImmOp.isImm() && "expected immediate operand kind"); 2301 const MCOperand &DstRegOp = Inst.getOperand(0); 2302 assert(DstRegOp.isReg() && "expected register operand kind"); 2303 2304 if (loadImmediate(ImmOp.getImm(), DstRegOp.getReg(), Mips::NoRegister, 2305 Is32BitImm, false, IDLoc, Instructions)) 2306 return true; 2307 2308 return false; 2309 } 2310 2311 bool MipsAsmParser::expandLoadAddress(unsigned DstReg, unsigned BaseReg, 2312 const MCOperand &Offset, 2313 bool Is32BitAddress, SMLoc IDLoc, 2314 SmallVectorImpl<MCInst> &Instructions) { 2315 // la can't produce a usable address when addresses are 64-bit. 2316 if (Is32BitAddress && ABI.ArePtrs64bit()) { 2317 // FIXME: Demote this to a warning and continue as if we had 'dla' instead. 2318 // We currently can't do this because we depend on the equality 2319 // operator and N64 can end up with a GPR32/GPR64 mismatch. 2320 Error(IDLoc, "la used to load 64-bit address"); 2321 // Continue as if we had 'dla' instead. 2322 Is32BitAddress = false; 2323 } 2324 2325 // dla requires 64-bit addresses. 2326 if (!Is32BitAddress && !ABI.ArePtrs64bit()) { 2327 Error(IDLoc, "instruction requires a 64-bit architecture"); 2328 return true; 2329 } 2330 2331 if (!Offset.isImm()) 2332 return loadAndAddSymbolAddress(Offset.getExpr(), DstReg, BaseReg, 2333 Is32BitAddress, IDLoc, Instructions); 2334 2335 return loadImmediate(Offset.getImm(), DstReg, BaseReg, Is32BitAddress, true, 2336 IDLoc, Instructions); 2337 } 2338 2339 bool MipsAsmParser::loadAndAddSymbolAddress( 2340 const MCExpr *SymExpr, unsigned DstReg, unsigned SrcReg, bool Is32BitSym, 2341 SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) { 2342 warnIfNoMacro(IDLoc); 2343 2344 // FIXME: The way we're handling symbols right now prevents simple expressions 2345 // like foo+8. We'll be able to fix this once our unary operators (%hi 2346 // and similar) are treated as operators rather than as fixup types. 2347 const MCSymbolRefExpr *Symbol = cast<MCSymbolRefExpr>(SymExpr); 2348 const MCSymbolRefExpr *HiExpr = MCSymbolRefExpr::create( 2349 &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_ABS_HI, getContext()); 2350 const MCSymbolRefExpr *LoExpr = MCSymbolRefExpr::create( 2351 &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_ABS_LO, getContext()); 2352 2353 bool UseSrcReg = SrcReg != Mips::NoRegister; 2354 2355 // This is the 64-bit symbol address expansion. 2356 if (ABI.ArePtrs64bit() && isGP64bit()) { 2357 // We always need AT for the 64-bit expansion. 2358 // If it is not available we exit. 2359 unsigned ATReg = getATReg(IDLoc); 2360 if (!ATReg) 2361 return true; 2362 2363 const MCSymbolRefExpr *HighestExpr = MCSymbolRefExpr::create( 2364 &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_HIGHEST, getContext()); 2365 const MCSymbolRefExpr *HigherExpr = MCSymbolRefExpr::create( 2366 &Symbol->getSymbol(), MCSymbolRefExpr::VK_Mips_HIGHER, getContext()); 2367 2368 if (UseSrcReg && (DstReg == SrcReg)) { 2369 // If $rs is the same as $rd: 2370 // (d)la $rd, sym($rd) => lui $at, %highest(sym) 2371 // daddiu $at, $at, %higher(sym) 2372 // dsll $at, $at, 16 2373 // daddiu $at, $at, %hi(sym) 2374 // dsll $at, $at, 16 2375 // daddiu $at, $at, %lo(sym) 2376 // daddu $rd, $at, $rd 2377 emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HighestExpr), IDLoc, 2378 Instructions); 2379 emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(HigherExpr), 2380 IDLoc, Instructions); 2381 emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, Instructions); 2382 emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(HiExpr), IDLoc, 2383 Instructions); 2384 emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, Instructions); 2385 emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(LoExpr), IDLoc, 2386 Instructions); 2387 emitRRR(Mips::DADDu, DstReg, ATReg, SrcReg, IDLoc, Instructions); 2388 2389 return false; 2390 } 2391 2392 // Otherwise, if the $rs is different from $rd or if $rs isn't specified: 2393 // (d)la $rd, sym/sym($rs) => lui $rd, %highest(sym) 2394 // lui $at, %hi(sym) 2395 // daddiu $rd, $rd, %higher(sym) 2396 // daddiu $at, $at, %lo(sym) 2397 // dsll32 $rd, $rd, 0 2398 // daddu $rd, $rd, $at 2399 // (daddu $rd, $rd, $rs) 2400 emitRX(Mips::LUi, DstReg, MCOperand::createExpr(HighestExpr), IDLoc, 2401 Instructions); 2402 emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HiExpr), IDLoc, 2403 Instructions); 2404 emitRRX(Mips::DADDiu, DstReg, DstReg, MCOperand::createExpr(HigherExpr), 2405 IDLoc, Instructions); 2406 emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(LoExpr), IDLoc, 2407 Instructions); 2408 emitRRI(Mips::DSLL32, DstReg, DstReg, 0, IDLoc, Instructions); 2409 emitRRR(Mips::DADDu, DstReg, DstReg, ATReg, IDLoc, Instructions); 2410 if (UseSrcReg) 2411 emitRRR(Mips::DADDu, DstReg, DstReg, SrcReg, IDLoc, Instructions); 2412 2413 return false; 2414 } 2415 2416 // And now, the 32-bit symbol address expansion: 2417 // If $rs is the same as $rd: 2418 // (d)la $rd, sym($rd) => lui $at, %hi(sym) 2419 // ori $at, $at, %lo(sym) 2420 // addu $rd, $at, $rd 2421 // Otherwise, if the $rs is different from $rd or if $rs isn't specified: 2422 // (d)la $rd, sym/sym($rs) => lui $rd, %hi(sym) 2423 // ori $rd, $rd, %lo(sym) 2424 // (addu $rd, $rd, $rs) 2425 unsigned TmpReg = DstReg; 2426 if (UseSrcReg && (DstReg == SrcReg)) { 2427 // If $rs is the same as $rd, we need to use AT. 2428 // If it is not available we exit. 2429 unsigned ATReg = getATReg(IDLoc); 2430 if (!ATReg) 2431 return true; 2432 TmpReg = ATReg; 2433 } 2434 2435 emitRX(Mips::LUi, TmpReg, MCOperand::createExpr(HiExpr), IDLoc, Instructions); 2436 emitRRX(Mips::ADDiu, TmpReg, TmpReg, MCOperand::createExpr(LoExpr), IDLoc, 2437 Instructions); 2438 2439 if (UseSrcReg) 2440 emitRRR(Mips::ADDu, DstReg, TmpReg, SrcReg, IDLoc, Instructions); 2441 else 2442 assert(DstReg == TmpReg); 2443 2444 return false; 2445 } 2446 2447 bool MipsAsmParser::expandUncondBranchMMPseudo( 2448 MCInst &Inst, SMLoc IDLoc, SmallVectorImpl<MCInst> &Instructions) { 2449 assert(getInstDesc(Inst.getOpcode()).getNumOperands() == 1 && 2450 "unexpected number of operands"); 2451 2452 MCOperand Offset = Inst.getOperand(0); 2453 if (Offset.isExpr()) { 2454 Inst.clear(); 2455 Inst.setOpcode(Mips::BEQ_MM); 2456 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 2457 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 2458 Inst.addOperand(MCOperand::createExpr(Offset.getExpr())); 2459 } else { 2460 assert(Offset.isImm() && "expected immediate operand kind"); 2461 if (isIntN(11, Offset.getImm())) { 2462 // If offset fits into 11 bits then this instruction becomes microMIPS 2463 // 16-bit unconditional branch instruction. 2464 if (inMicroMipsMode()) 2465 Inst.setOpcode(hasMips32r6() ? Mips::BC16_MMR6 : Mips::B16_MM); 2466 } else { 2467 if (!isIntN(17, Offset.getImm())) 2468 Error(IDLoc, "branch target out of range"); 2469 if (OffsetToAlignment(Offset.getImm(), 1LL << 1)) 2470 Error(IDLoc, "branch to misaligned address"); 2471 Inst.clear(); 2472 Inst.setOpcode(Mips::BEQ_MM); 2473 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 2474 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 2475 Inst.addOperand(MCOperand::createImm(Offset.getImm())); 2476 } 2477 } 2478 Instructions.push_back(Inst); 2479 2480 // If .set reorder is active and branch instruction has a delay slot, 2481 // emit a NOP after it. 2482 const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); 2483 if (MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder()) 2484 createNop(true, IDLoc, Instructions); 2485 2486 return false; 2487 } 2488 2489 bool MipsAsmParser::expandBranchImm(MCInst &Inst, SMLoc IDLoc, 2490 SmallVectorImpl<MCInst> &Instructions) { 2491 const MCOperand &DstRegOp = Inst.getOperand(0); 2492 assert(DstRegOp.isReg() && "expected register operand kind"); 2493 2494 const MCOperand &ImmOp = Inst.getOperand(1); 2495 assert(ImmOp.isImm() && "expected immediate operand kind"); 2496 2497 const MCOperand &MemOffsetOp = Inst.getOperand(2); 2498 assert(MemOffsetOp.isImm() && "expected immediate operand kind"); 2499 2500 unsigned OpCode = 0; 2501 switch(Inst.getOpcode()) { 2502 case Mips::BneImm: 2503 OpCode = Mips::BNE; 2504 break; 2505 case Mips::BeqImm: 2506 OpCode = Mips::BEQ; 2507 break; 2508 default: 2509 llvm_unreachable("Unknown immediate branch pseudo-instruction."); 2510 break; 2511 } 2512 2513 int64_t ImmValue = ImmOp.getImm(); 2514 if (ImmValue == 0) { 2515 MCInst BranchInst; 2516 BranchInst.setOpcode(OpCode); 2517 BranchInst.addOperand(DstRegOp); 2518 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2519 BranchInst.addOperand(MemOffsetOp); 2520 Instructions.push_back(BranchInst); 2521 } else { 2522 warnIfNoMacro(IDLoc); 2523 2524 unsigned ATReg = getATReg(IDLoc); 2525 if (!ATReg) 2526 return true; 2527 2528 if (loadImmediate(ImmValue, ATReg, Mips::NoRegister, !isGP64bit(), true, 2529 IDLoc, Instructions)) 2530 return true; 2531 2532 MCInst BranchInst; 2533 BranchInst.setOpcode(OpCode); 2534 BranchInst.addOperand(DstRegOp); 2535 BranchInst.addOperand(MCOperand::createReg(ATReg)); 2536 BranchInst.addOperand(MemOffsetOp); 2537 Instructions.push_back(BranchInst); 2538 } 2539 return false; 2540 } 2541 2542 void MipsAsmParser::expandMemInst(MCInst &Inst, SMLoc IDLoc, 2543 SmallVectorImpl<MCInst> &Instructions, 2544 bool isLoad, bool isImmOpnd) { 2545 MCInst TempInst; 2546 unsigned ImmOffset, HiOffset, LoOffset; 2547 const MCExpr *ExprOffset; 2548 unsigned TmpRegNum; 2549 // 1st operand is either the source or destination register. 2550 assert(Inst.getOperand(0).isReg() && "expected register operand kind"); 2551 unsigned RegOpNum = Inst.getOperand(0).getReg(); 2552 // 2nd operand is the base register. 2553 assert(Inst.getOperand(1).isReg() && "expected register operand kind"); 2554 unsigned BaseRegNum = Inst.getOperand(1).getReg(); 2555 // 3rd operand is either an immediate or expression. 2556 if (isImmOpnd) { 2557 assert(Inst.getOperand(2).isImm() && "expected immediate operand kind"); 2558 ImmOffset = Inst.getOperand(2).getImm(); 2559 LoOffset = ImmOffset & 0x0000ffff; 2560 HiOffset = (ImmOffset & 0xffff0000) >> 16; 2561 // If msb of LoOffset is 1(negative number) we must increment HiOffset. 2562 if (LoOffset & 0x8000) 2563 HiOffset++; 2564 } else 2565 ExprOffset = Inst.getOperand(2).getExpr(); 2566 // All instructions will have the same location. 2567 TempInst.setLoc(IDLoc); 2568 // These are some of the types of expansions we perform here: 2569 // 1) lw $8, sym => lui $8, %hi(sym) 2570 // lw $8, %lo(sym)($8) 2571 // 2) lw $8, offset($9) => lui $8, %hi(offset) 2572 // add $8, $8, $9 2573 // lw $8, %lo(offset)($9) 2574 // 3) lw $8, offset($8) => lui $at, %hi(offset) 2575 // add $at, $at, $8 2576 // lw $8, %lo(offset)($at) 2577 // 4) sw $8, sym => lui $at, %hi(sym) 2578 // sw $8, %lo(sym)($at) 2579 // 5) sw $8, offset($8) => lui $at, %hi(offset) 2580 // add $at, $at, $8 2581 // sw $8, %lo(offset)($at) 2582 // 6) ldc1 $f0, sym => lui $at, %hi(sym) 2583 // ldc1 $f0, %lo(sym)($at) 2584 // 2585 // For load instructions we can use the destination register as a temporary 2586 // if base and dst are different (examples 1 and 2) and if the base register 2587 // is general purpose otherwise we must use $at (example 6) and error if it's 2588 // not available. For stores we must use $at (examples 4 and 5) because we 2589 // must not clobber the source register setting up the offset. 2590 const MCInstrDesc &Desc = getInstDesc(Inst.getOpcode()); 2591 int16_t RegClassOp0 = Desc.OpInfo[0].RegClass; 2592 unsigned RegClassIDOp0 = 2593 getContext().getRegisterInfo()->getRegClass(RegClassOp0).getID(); 2594 bool IsGPR = (RegClassIDOp0 == Mips::GPR32RegClassID) || 2595 (RegClassIDOp0 == Mips::GPR64RegClassID); 2596 if (isLoad && IsGPR && (BaseRegNum != RegOpNum)) 2597 TmpRegNum = RegOpNum; 2598 else { 2599 // At this point we need AT to perform the expansions and we exit if it is 2600 // not available. 2601 TmpRegNum = getATReg(IDLoc); 2602 if (!TmpRegNum) 2603 return; 2604 } 2605 2606 TempInst.setOpcode(Mips::LUi); 2607 TempInst.addOperand(MCOperand::createReg(TmpRegNum)); 2608 if (isImmOpnd) 2609 TempInst.addOperand(MCOperand::createImm(HiOffset)); 2610 else { 2611 const MCExpr *HiExpr = evaluateRelocExpr(ExprOffset, "hi"); 2612 TempInst.addOperand(MCOperand::createExpr(HiExpr)); 2613 } 2614 // Add the instruction to the list. 2615 Instructions.push_back(TempInst); 2616 // Prepare TempInst for next instruction. 2617 TempInst.clear(); 2618 // Add temp register to base. 2619 if (BaseRegNum != Mips::ZERO) { 2620 TempInst.setOpcode(Mips::ADDu); 2621 TempInst.addOperand(MCOperand::createReg(TmpRegNum)); 2622 TempInst.addOperand(MCOperand::createReg(TmpRegNum)); 2623 TempInst.addOperand(MCOperand::createReg(BaseRegNum)); 2624 Instructions.push_back(TempInst); 2625 TempInst.clear(); 2626 } 2627 // And finally, create original instruction with low part 2628 // of offset and new base. 2629 TempInst.setOpcode(Inst.getOpcode()); 2630 TempInst.addOperand(MCOperand::createReg(RegOpNum)); 2631 TempInst.addOperand(MCOperand::createReg(TmpRegNum)); 2632 if (isImmOpnd) 2633 TempInst.addOperand(MCOperand::createImm(LoOffset)); 2634 else { 2635 const MCExpr *LoExpr = evaluateRelocExpr(ExprOffset, "lo"); 2636 TempInst.addOperand(MCOperand::createExpr(LoExpr)); 2637 } 2638 Instructions.push_back(TempInst); 2639 TempInst.clear(); 2640 } 2641 2642 bool 2643 MipsAsmParser::expandLoadStoreMultiple(MCInst &Inst, SMLoc IDLoc, 2644 SmallVectorImpl<MCInst> &Instructions) { 2645 unsigned OpNum = Inst.getNumOperands(); 2646 unsigned Opcode = Inst.getOpcode(); 2647 unsigned NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM32_MM : Mips::LWM32_MM; 2648 2649 assert (Inst.getOperand(OpNum - 1).isImm() && 2650 Inst.getOperand(OpNum - 2).isReg() && 2651 Inst.getOperand(OpNum - 3).isReg() && "Invalid instruction operand."); 2652 2653 if (OpNum < 8 && Inst.getOperand(OpNum - 1).getImm() <= 60 && 2654 Inst.getOperand(OpNum - 1).getImm() >= 0 && 2655 Inst.getOperand(OpNum - 2).getReg() == Mips::SP && 2656 Inst.getOperand(OpNum - 3).getReg() == Mips::RA) 2657 // It can be implemented as SWM16 or LWM16 instruction. 2658 NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM16_MM : Mips::LWM16_MM; 2659 2660 Inst.setOpcode(NewOpcode); 2661 Instructions.push_back(Inst); 2662 return false; 2663 } 2664 2665 bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc, 2666 SmallVectorImpl<MCInst> &Instructions) { 2667 unsigned PseudoOpcode = Inst.getOpcode(); 2668 unsigned SrcReg = Inst.getOperand(0).getReg(); 2669 unsigned TrgReg = Inst.getOperand(1).getReg(); 2670 const MCExpr *OffsetExpr = Inst.getOperand(2).getExpr(); 2671 2672 unsigned ZeroSrcOpcode, ZeroTrgOpcode; 2673 bool ReverseOrderSLT, IsUnsigned, IsLikely, AcceptsEquality; 2674 2675 switch (PseudoOpcode) { 2676 case Mips::BLT: 2677 case Mips::BLTU: 2678 case Mips::BLTL: 2679 case Mips::BLTUL: 2680 AcceptsEquality = false; 2681 ReverseOrderSLT = false; 2682 IsUnsigned = ((PseudoOpcode == Mips::BLTU) || (PseudoOpcode == Mips::BLTUL)); 2683 IsLikely = ((PseudoOpcode == Mips::BLTL) || (PseudoOpcode == Mips::BLTUL)); 2684 ZeroSrcOpcode = Mips::BGTZ; 2685 ZeroTrgOpcode = Mips::BLTZ; 2686 break; 2687 case Mips::BLE: 2688 case Mips::BLEU: 2689 case Mips::BLEL: 2690 case Mips::BLEUL: 2691 AcceptsEquality = true; 2692 ReverseOrderSLT = true; 2693 IsUnsigned = ((PseudoOpcode == Mips::BLEU) || (PseudoOpcode == Mips::BLEUL)); 2694 IsLikely = ((PseudoOpcode == Mips::BLEL) || (PseudoOpcode == Mips::BLEUL)); 2695 ZeroSrcOpcode = Mips::BGEZ; 2696 ZeroTrgOpcode = Mips::BLEZ; 2697 break; 2698 case Mips::BGE: 2699 case Mips::BGEU: 2700 case Mips::BGEL: 2701 case Mips::BGEUL: 2702 AcceptsEquality = true; 2703 ReverseOrderSLT = false; 2704 IsUnsigned = ((PseudoOpcode == Mips::BGEU) || (PseudoOpcode == Mips::BGEUL)); 2705 IsLikely = ((PseudoOpcode == Mips::BGEL) || (PseudoOpcode == Mips::BGEUL)); 2706 ZeroSrcOpcode = Mips::BLEZ; 2707 ZeroTrgOpcode = Mips::BGEZ; 2708 break; 2709 case Mips::BGT: 2710 case Mips::BGTU: 2711 case Mips::BGTL: 2712 case Mips::BGTUL: 2713 AcceptsEquality = false; 2714 ReverseOrderSLT = true; 2715 IsUnsigned = ((PseudoOpcode == Mips::BGTU) || (PseudoOpcode == Mips::BGTUL)); 2716 IsLikely = ((PseudoOpcode == Mips::BGTL) || (PseudoOpcode == Mips::BGTUL)); 2717 ZeroSrcOpcode = Mips::BLTZ; 2718 ZeroTrgOpcode = Mips::BGTZ; 2719 break; 2720 default: 2721 llvm_unreachable("unknown opcode for branch pseudo-instruction"); 2722 } 2723 2724 MCInst BranchInst; 2725 bool IsTrgRegZero = (TrgReg == Mips::ZERO); 2726 bool IsSrcRegZero = (SrcReg == Mips::ZERO); 2727 if (IsSrcRegZero && IsTrgRegZero) { 2728 // FIXME: All of these Opcode-specific if's are needed for compatibility 2729 // with GAS' behaviour. However, they may not generate the most efficient 2730 // code in some circumstances. 2731 if (PseudoOpcode == Mips::BLT) { 2732 BranchInst.setOpcode(Mips::BLTZ); 2733 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2734 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2735 Instructions.push_back(BranchInst); 2736 return false; 2737 } 2738 if (PseudoOpcode == Mips::BLE) { 2739 BranchInst.setOpcode(Mips::BLEZ); 2740 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2741 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2742 Instructions.push_back(BranchInst); 2743 Warning(IDLoc, "branch is always taken"); 2744 return false; 2745 } 2746 if (PseudoOpcode == Mips::BGE) { 2747 BranchInst.setOpcode(Mips::BGEZ); 2748 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2749 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2750 Instructions.push_back(BranchInst); 2751 Warning(IDLoc, "branch is always taken"); 2752 return false; 2753 } 2754 if (PseudoOpcode == Mips::BGT) { 2755 BranchInst.setOpcode(Mips::BGTZ); 2756 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2757 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2758 Instructions.push_back(BranchInst); 2759 return false; 2760 } 2761 if (PseudoOpcode == Mips::BGTU) { 2762 BranchInst.setOpcode(Mips::BNE); 2763 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2764 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2765 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2766 Instructions.push_back(BranchInst); 2767 return false; 2768 } 2769 if (AcceptsEquality) { 2770 // If both registers are $0 and the pseudo-branch accepts equality, it 2771 // will always be taken, so we emit an unconditional branch. 2772 BranchInst.setOpcode(Mips::BEQ); 2773 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2774 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2775 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2776 Instructions.push_back(BranchInst); 2777 Warning(IDLoc, "branch is always taken"); 2778 return false; 2779 } 2780 // If both registers are $0 and the pseudo-branch does not accept 2781 // equality, it will never be taken, so we don't have to emit anything. 2782 return false; 2783 } 2784 if (IsSrcRegZero || IsTrgRegZero) { 2785 if ((IsSrcRegZero && PseudoOpcode == Mips::BGTU) || 2786 (IsTrgRegZero && PseudoOpcode == Mips::BLTU)) { 2787 // If the $rs is $0 and the pseudo-branch is BGTU (0 > x) or 2788 // if the $rt is $0 and the pseudo-branch is BLTU (x < 0), 2789 // the pseudo-branch will never be taken, so we don't emit anything. 2790 // This only applies to unsigned pseudo-branches. 2791 return false; 2792 } 2793 if ((IsSrcRegZero && PseudoOpcode == Mips::BLEU) || 2794 (IsTrgRegZero && PseudoOpcode == Mips::BGEU)) { 2795 // If the $rs is $0 and the pseudo-branch is BLEU (0 <= x) or 2796 // if the $rt is $0 and the pseudo-branch is BGEU (x >= 0), 2797 // the pseudo-branch will always be taken, so we emit an unconditional 2798 // branch. 2799 // This only applies to unsigned pseudo-branches. 2800 BranchInst.setOpcode(Mips::BEQ); 2801 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2802 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2803 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2804 Instructions.push_back(BranchInst); 2805 Warning(IDLoc, "branch is always taken"); 2806 return false; 2807 } 2808 if (IsUnsigned) { 2809 // If the $rs is $0 and the pseudo-branch is BLTU (0 < x) or 2810 // if the $rt is $0 and the pseudo-branch is BGTU (x > 0), 2811 // the pseudo-branch will be taken only when the non-zero register is 2812 // different from 0, so we emit a BNEZ. 2813 // 2814 // If the $rs is $0 and the pseudo-branch is BGEU (0 >= x) or 2815 // if the $rt is $0 and the pseudo-branch is BLEU (x <= 0), 2816 // the pseudo-branch will be taken only when the non-zero register is 2817 // equal to 0, so we emit a BEQZ. 2818 // 2819 // Because only BLEU and BGEU branch on equality, we can use the 2820 // AcceptsEquality variable to decide when to emit the BEQZ. 2821 BranchInst.setOpcode(AcceptsEquality ? Mips::BEQ : Mips::BNE); 2822 BranchInst.addOperand( 2823 MCOperand::createReg(IsSrcRegZero ? TrgReg : SrcReg)); 2824 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2825 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2826 Instructions.push_back(BranchInst); 2827 return false; 2828 } 2829 // If we have a signed pseudo-branch and one of the registers is $0, 2830 // we can use an appropriate compare-to-zero branch. We select which one 2831 // to use in the switch statement above. 2832 BranchInst.setOpcode(IsSrcRegZero ? ZeroSrcOpcode : ZeroTrgOpcode); 2833 BranchInst.addOperand(MCOperand::createReg(IsSrcRegZero ? TrgReg : SrcReg)); 2834 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2835 Instructions.push_back(BranchInst); 2836 return false; 2837 } 2838 2839 // If neither the SrcReg nor the TrgReg are $0, we need AT to perform the 2840 // expansions. If it is not available, we return. 2841 unsigned ATRegNum = getATReg(IDLoc); 2842 if (!ATRegNum) 2843 return true; 2844 2845 warnIfNoMacro(IDLoc); 2846 2847 // SLT fits well with 2 of our 4 pseudo-branches: 2848 // BLT, where $rs < $rt, translates into "slt $at, $rs, $rt" and 2849 // BGT, where $rs > $rt, translates into "slt $at, $rt, $rs". 2850 // If the result of the SLT is 1, we branch, and if it's 0, we don't. 2851 // This is accomplished by using a BNEZ with the result of the SLT. 2852 // 2853 // The other 2 pseudo-branches are opposites of the above 2 (BGE with BLT 2854 // and BLE with BGT), so we change the BNEZ into a a BEQZ. 2855 // Because only BGE and BLE branch on equality, we can use the 2856 // AcceptsEquality variable to decide when to emit the BEQZ. 2857 // Note that the order of the SLT arguments doesn't change between 2858 // opposites. 2859 // 2860 // The same applies to the unsigned variants, except that SLTu is used 2861 // instead of SLT. 2862 MCInst SetInst; 2863 SetInst.setOpcode(IsUnsigned ? Mips::SLTu : Mips::SLT); 2864 SetInst.addOperand(MCOperand::createReg(ATRegNum)); 2865 SetInst.addOperand(MCOperand::createReg(ReverseOrderSLT ? TrgReg : SrcReg)); 2866 SetInst.addOperand(MCOperand::createReg(ReverseOrderSLT ? SrcReg : TrgReg)); 2867 Instructions.push_back(SetInst); 2868 2869 if (!IsLikely) 2870 BranchInst.setOpcode(AcceptsEquality ? Mips::BEQ : Mips::BNE); 2871 else 2872 BranchInst.setOpcode(AcceptsEquality ? Mips::BEQL : Mips::BNEL); 2873 BranchInst.addOperand(MCOperand::createReg(ATRegNum)); 2874 BranchInst.addOperand(MCOperand::createReg(Mips::ZERO)); 2875 BranchInst.addOperand(MCOperand::createExpr(OffsetExpr)); 2876 Instructions.push_back(BranchInst); 2877 return false; 2878 } 2879 2880 bool MipsAsmParser::expandDiv(MCInst &Inst, SMLoc IDLoc, 2881 SmallVectorImpl<MCInst> &Instructions, 2882 const bool IsMips64, const bool Signed) { 2883 if (hasMips32r6()) { 2884 Error(IDLoc, "instruction not supported on mips32r6 or mips64r6"); 2885 return false; 2886 } 2887 2888 warnIfNoMacro(IDLoc); 2889 2890 const MCOperand &RsRegOp = Inst.getOperand(0); 2891 assert(RsRegOp.isReg() && "expected register operand kind"); 2892 unsigned RsReg = RsRegOp.getReg(); 2893 2894 const MCOperand &RtRegOp = Inst.getOperand(1); 2895 assert(RtRegOp.isReg() && "expected register operand kind"); 2896 unsigned RtReg = RtRegOp.getReg(); 2897 unsigned DivOp; 2898 unsigned ZeroReg; 2899 2900 if (IsMips64) { 2901 DivOp = Signed ? Mips::DSDIV : Mips::DUDIV; 2902 ZeroReg = Mips::ZERO_64; 2903 } else { 2904 DivOp = Signed ? Mips::SDIV : Mips::UDIV; 2905 ZeroReg = Mips::ZERO; 2906 } 2907 2908 bool UseTraps = useTraps(); 2909 2910 if (RsReg == Mips::ZERO || RsReg == Mips::ZERO_64) { 2911 if (RtReg == Mips::ZERO || RtReg == Mips::ZERO_64) 2912 Warning(IDLoc, "dividing zero by zero"); 2913 if (IsMips64) { 2914 if (Signed && (RtReg == Mips::ZERO || RtReg == Mips::ZERO_64)) { 2915 if (UseTraps) { 2916 emitRRI(Mips::TEQ, RtReg, ZeroReg, 0x7, IDLoc, Instructions); 2917 return false; 2918 } 2919 2920 emitII(Mips::BREAK, 0x7, 0, IDLoc, Instructions); 2921 return false; 2922 } 2923 } else { 2924 emitRR(DivOp, RsReg, RtReg, IDLoc, Instructions); 2925 return false; 2926 } 2927 } 2928 2929 if (RtReg == Mips::ZERO || RtReg == Mips::ZERO_64) { 2930 Warning(IDLoc, "division by zero"); 2931 if (Signed) { 2932 if (UseTraps) { 2933 emitRRI(Mips::TEQ, RtReg, ZeroReg, 0x7, IDLoc, Instructions); 2934 return false; 2935 } 2936 2937 emitII(Mips::BREAK, 0x7, 0, IDLoc, Instructions); 2938 return false; 2939 } 2940 } 2941 2942 // FIXME: The values for these two BranchTarget variables may be different in 2943 // micromips. These magic numbers need to be removed. 2944 unsigned BranchTargetNoTraps; 2945 unsigned BranchTarget; 2946 2947 if (UseTraps) { 2948 BranchTarget = IsMips64 ? 12 : 8; 2949 emitRRI(Mips::TEQ, RtReg, ZeroReg, 0x7, IDLoc, Instructions); 2950 } else { 2951 BranchTarget = IsMips64 ? 20 : 16; 2952 BranchTargetNoTraps = 8; 2953 // Branch to the li instruction. 2954 emitRRI(Mips::BNE, RtReg, ZeroReg, BranchTargetNoTraps, IDLoc, 2955 Instructions); 2956 } 2957 2958 emitRR(DivOp, RsReg, RtReg, IDLoc, Instructions); 2959 2960 if (!UseTraps) 2961 emitII(Mips::BREAK, 0x7, 0, IDLoc, Instructions); 2962 2963 if (!Signed) { 2964 emitR(Mips::MFLO, RsReg, IDLoc, Instructions); 2965 return false; 2966 } 2967 2968 unsigned ATReg = getATReg(IDLoc); 2969 if (!ATReg) 2970 return true; 2971 2972 emitRRI(Mips::ADDiu, ATReg, ZeroReg, -1, IDLoc, Instructions); 2973 if (IsMips64) { 2974 // Branch to the mflo instruction. 2975 emitRRI(Mips::BNE, RtReg, ATReg, BranchTarget, IDLoc, Instructions); 2976 emitRRI(Mips::ADDiu, ATReg, ZeroReg, 1, IDLoc, Instructions); 2977 emitRRI(Mips::DSLL32, ATReg, ATReg, 0x1f, IDLoc, Instructions); 2978 } else { 2979 // Branch to the mflo instruction. 2980 emitRRI(Mips::BNE, RtReg, ATReg, BranchTarget, IDLoc, Instructions); 2981 emitRI(Mips::LUi, ATReg, (uint16_t)0x8000, IDLoc, Instructions); 2982 } 2983 2984 if (UseTraps) 2985 emitRRI(Mips::TEQ, RsReg, ATReg, 0x6, IDLoc, Instructions); 2986 else { 2987 // Branch to the mflo instruction. 2988 emitRRI(Mips::BNE, RsReg, ATReg, BranchTargetNoTraps, IDLoc, Instructions); 2989 emitRRI(Mips::SLL, ZeroReg, ZeroReg, 0, IDLoc, Instructions); 2990 emitII(Mips::BREAK, 0x6, 0, IDLoc, Instructions); 2991 } 2992 emitR(Mips::MFLO, RsReg, IDLoc, Instructions); 2993 return false; 2994 } 2995 2996 bool MipsAsmParser::expandUlhu(MCInst &Inst, SMLoc IDLoc, 2997 SmallVectorImpl<MCInst> &Instructions) { 2998 if (hasMips32r6() || hasMips64r6()) { 2999 Error(IDLoc, "instruction not supported on mips32r6 or mips64r6"); 3000 return false; 3001 } 3002 3003 warnIfNoMacro(IDLoc); 3004 3005 const MCOperand &DstRegOp = Inst.getOperand(0); 3006 assert(DstRegOp.isReg() && "expected register operand kind"); 3007 3008 const MCOperand &SrcRegOp = Inst.getOperand(1); 3009 assert(SrcRegOp.isReg() && "expected register operand kind"); 3010 3011 const MCOperand &OffsetImmOp = Inst.getOperand(2); 3012 assert(OffsetImmOp.isImm() && "expected immediate operand kind"); 3013 3014 unsigned DstReg = DstRegOp.getReg(); 3015 unsigned SrcReg = SrcRegOp.getReg(); 3016 int64_t OffsetValue = OffsetImmOp.getImm(); 3017 3018 // NOTE: We always need AT for ULHU, as it is always used as the source 3019 // register for one of the LBu's. 3020 unsigned ATReg = getATReg(IDLoc); 3021 if (!ATReg) 3022 return true; 3023 3024 // When the value of offset+1 does not fit in 16 bits, we have to load the 3025 // offset in AT, (D)ADDu the original source register (if there was one), and 3026 // then use AT as the source register for the 2 generated LBu's. 3027 bool LoadedOffsetInAT = false; 3028 if (!isInt<16>(OffsetValue + 1) || !isInt<16>(OffsetValue)) { 3029 LoadedOffsetInAT = true; 3030 3031 if (loadImmediate(OffsetValue, ATReg, Mips::NoRegister, !ABI.ArePtrs64bit(), 3032 true, IDLoc, Instructions)) 3033 return true; 3034 3035 // NOTE: We do this (D)ADDu here instead of doing it in loadImmediate() 3036 // because it will make our output more similar to GAS'. For example, 3037 // generating an "ori $1, $zero, 32768" followed by an "addu $1, $1, $9", 3038 // instead of just an "ori $1, $9, 32768". 3039 // NOTE: If there is no source register specified in the ULHU, the parser 3040 // will interpret it as $0. 3041 if (SrcReg != Mips::ZERO && SrcReg != Mips::ZERO_64) 3042 createAddu(ATReg, ATReg, SrcReg, ABI.ArePtrs64bit(), Instructions); 3043 } 3044 3045 unsigned FirstLbuDstReg = LoadedOffsetInAT ? DstReg : ATReg; 3046 unsigned SecondLbuDstReg = LoadedOffsetInAT ? ATReg : DstReg; 3047 unsigned LbuSrcReg = LoadedOffsetInAT ? ATReg : SrcReg; 3048 3049 int64_t FirstLbuOffset = 0, SecondLbuOffset = 0; 3050 if (isLittle()) { 3051 FirstLbuOffset = LoadedOffsetInAT ? 1 : (OffsetValue + 1); 3052 SecondLbuOffset = LoadedOffsetInAT ? 0 : OffsetValue; 3053 } else { 3054 FirstLbuOffset = LoadedOffsetInAT ? 0 : OffsetValue; 3055 SecondLbuOffset = LoadedOffsetInAT ? 1 : (OffsetValue + 1); 3056 } 3057 3058 unsigned SllReg = LoadedOffsetInAT ? DstReg : ATReg; 3059 3060 MCInst TmpInst; 3061 TmpInst.setOpcode(Mips::LBu); 3062 TmpInst.addOperand(MCOperand::createReg(FirstLbuDstReg)); 3063 TmpInst.addOperand(MCOperand::createReg(LbuSrcReg)); 3064 TmpInst.addOperand(MCOperand::createImm(FirstLbuOffset)); 3065 Instructions.push_back(TmpInst); 3066 3067 TmpInst.clear(); 3068 TmpInst.setOpcode(Mips::LBu); 3069 TmpInst.addOperand(MCOperand::createReg(SecondLbuDstReg)); 3070 TmpInst.addOperand(MCOperand::createReg(LbuSrcReg)); 3071 TmpInst.addOperand(MCOperand::createImm(SecondLbuOffset)); 3072 Instructions.push_back(TmpInst); 3073 3074 TmpInst.clear(); 3075 TmpInst.setOpcode(Mips::SLL); 3076 TmpInst.addOperand(MCOperand::createReg(SllReg)); 3077 TmpInst.addOperand(MCOperand::createReg(SllReg)); 3078 TmpInst.addOperand(MCOperand::createImm(8)); 3079 Instructions.push_back(TmpInst); 3080 3081 TmpInst.clear(); 3082 TmpInst.setOpcode(Mips::OR); 3083 TmpInst.addOperand(MCOperand::createReg(DstReg)); 3084 TmpInst.addOperand(MCOperand::createReg(DstReg)); 3085 TmpInst.addOperand(MCOperand::createReg(ATReg)); 3086 Instructions.push_back(TmpInst); 3087 3088 return false; 3089 } 3090 3091 bool MipsAsmParser::expandUlw(MCInst &Inst, SMLoc IDLoc, 3092 SmallVectorImpl<MCInst> &Instructions) { 3093 if (hasMips32r6() || hasMips64r6()) { 3094 Error(IDLoc, "instruction not supported on mips32r6 or mips64r6"); 3095 return false; 3096 } 3097 3098 const MCOperand &DstRegOp = Inst.getOperand(0); 3099 assert(DstRegOp.isReg() && "expected register operand kind"); 3100 3101 const MCOperand &SrcRegOp = Inst.getOperand(1); 3102 assert(SrcRegOp.isReg() && "expected register operand kind"); 3103 3104 const MCOperand &OffsetImmOp = Inst.getOperand(2); 3105 assert(OffsetImmOp.isImm() && "expected immediate operand kind"); 3106 3107 unsigned SrcReg = SrcRegOp.getReg(); 3108 int64_t OffsetValue = OffsetImmOp.getImm(); 3109 unsigned ATReg = 0; 3110 3111 // When the value of offset+3 does not fit in 16 bits, we have to load the 3112 // offset in AT, (D)ADDu the original source register (if there was one), and 3113 // then use AT as the source register for the generated LWL and LWR. 3114 bool LoadedOffsetInAT = false; 3115 if (!isInt<16>(OffsetValue + 3) || !isInt<16>(OffsetValue)) { 3116 ATReg = getATReg(IDLoc); 3117 if (!ATReg) 3118 return true; 3119 LoadedOffsetInAT = true; 3120 3121 warnIfNoMacro(IDLoc); 3122 3123 if (loadImmediate(OffsetValue, ATReg, Mips::NoRegister, !ABI.ArePtrs64bit(), 3124 true, IDLoc, Instructions)) 3125 return true; 3126 3127 // NOTE: We do this (D)ADDu here instead of doing it in loadImmediate() 3128 // because it will make our output more similar to GAS'. For example, 3129 // generating an "ori $1, $zero, 32768" followed by an "addu $1, $1, $9", 3130 // instead of just an "ori $1, $9, 32768". 3131 // NOTE: If there is no source register specified in the ULW, the parser 3132 // will interpret it as $0. 3133 if (SrcReg != Mips::ZERO && SrcReg != Mips::ZERO_64) 3134 createAddu(ATReg, ATReg, SrcReg, ABI.ArePtrs64bit(), Instructions); 3135 } 3136 3137 unsigned FinalSrcReg = LoadedOffsetInAT ? ATReg : SrcReg; 3138 int64_t LeftLoadOffset = 0, RightLoadOffset = 0; 3139 if (isLittle()) { 3140 LeftLoadOffset = LoadedOffsetInAT ? 3 : (OffsetValue + 3); 3141 RightLoadOffset = LoadedOffsetInAT ? 0 : OffsetValue; 3142 } else { 3143 LeftLoadOffset = LoadedOffsetInAT ? 0 : OffsetValue; 3144 RightLoadOffset = LoadedOffsetInAT ? 3 : (OffsetValue + 3); 3145 } 3146 3147 MCInst LeftLoadInst; 3148 LeftLoadInst.setOpcode(Mips::LWL); 3149 LeftLoadInst.addOperand(DstRegOp); 3150 LeftLoadInst.addOperand(MCOperand::createReg(FinalSrcReg)); 3151 LeftLoadInst.addOperand(MCOperand::createImm(LeftLoadOffset)); 3152 Instructions.push_back(LeftLoadInst); 3153 3154 MCInst RightLoadInst; 3155 RightLoadInst.setOpcode(Mips::LWR); 3156 RightLoadInst.addOperand(DstRegOp); 3157 RightLoadInst.addOperand(MCOperand::createReg(FinalSrcReg)); 3158 RightLoadInst.addOperand(MCOperand::createImm(RightLoadOffset )); 3159 Instructions.push_back(RightLoadInst); 3160 3161 return false; 3162 } 3163 3164 bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, 3165 SmallVectorImpl<MCInst> &Instructions) { 3166 3167 assert (Inst.getNumOperands() == 3 && "Invalid operand count"); 3168 assert (Inst.getOperand(0).isReg() && 3169 Inst.getOperand(1).isReg() && 3170 Inst.getOperand(2).isImm() && "Invalid instruction operand."); 3171 3172 unsigned ATReg = Mips::NoRegister; 3173 unsigned FinalDstReg = Mips::NoRegister; 3174 unsigned DstReg = Inst.getOperand(0).getReg(); 3175 unsigned SrcReg = Inst.getOperand(1).getReg(); 3176 int64_t ImmValue = Inst.getOperand(2).getImm(); 3177 3178 bool Is32Bit = isInt<32>(ImmValue) || isUInt<32>(ImmValue); 3179 3180 unsigned FinalOpcode = Inst.getOpcode(); 3181 3182 if (DstReg == SrcReg) { 3183 ATReg = getATReg(Inst.getLoc()); 3184 if (!ATReg) 3185 return true; 3186 FinalDstReg = DstReg; 3187 DstReg = ATReg; 3188 } 3189 3190 if (!loadImmediate(ImmValue, DstReg, Mips::NoRegister, Is32Bit, false, Inst.getLoc(), Instructions)) { 3191 switch (FinalOpcode) { 3192 default: 3193 llvm_unreachable("unimplemented expansion"); 3194 case (Mips::ADDi): 3195 FinalOpcode = Mips::ADD; 3196 break; 3197 case (Mips::ADDiu): 3198 FinalOpcode = Mips::ADDu; 3199 break; 3200 case (Mips::ANDi): 3201 FinalOpcode = Mips::AND; 3202 break; 3203 case (Mips::NORImm): 3204 FinalOpcode = Mips::NOR; 3205 break; 3206 case (Mips::ORi): 3207 FinalOpcode = Mips::OR; 3208 break; 3209 case (Mips::SLTi): 3210 FinalOpcode = Mips::SLT; 3211 break; 3212 case (Mips::SLTiu): 3213 FinalOpcode = Mips::SLTu; 3214 break; 3215 case (Mips::XORi): 3216 FinalOpcode = Mips::XOR; 3217 break; 3218 } 3219 3220 MCInst tmpInst; 3221 3222 tmpInst.clear(); 3223 tmpInst.setLoc(Inst.getLoc()); 3224 tmpInst.setOpcode(FinalOpcode); 3225 if (FinalDstReg == Mips::NoRegister) { 3226 tmpInst.addOperand(MCOperand::createReg(DstReg)); 3227 tmpInst.addOperand(MCOperand::createReg(DstReg)); 3228 tmpInst.addOperand(MCOperand::createReg(SrcReg)); 3229 } else { 3230 tmpInst.addOperand(MCOperand::createReg(FinalDstReg)); 3231 tmpInst.addOperand(MCOperand::createReg(FinalDstReg)); 3232 tmpInst.addOperand(MCOperand::createReg(DstReg)); 3233 } 3234 Instructions.push_back(tmpInst); 3235 return false; 3236 } 3237 return true; 3238 } 3239 3240 void MipsAsmParser::createNop(bool hasShortDelaySlot, SMLoc IDLoc, 3241 SmallVectorImpl<MCInst> &Instructions) { 3242 MCInst NopInst; 3243 if (hasShortDelaySlot) { 3244 NopInst.setOpcode(Mips::MOVE16_MM); 3245 NopInst.addOperand(MCOperand::createReg(Mips::ZERO)); 3246 NopInst.addOperand(MCOperand::createReg(Mips::ZERO)); 3247 } else { 3248 NopInst.setOpcode(Mips::SLL); 3249 NopInst.addOperand(MCOperand::createReg(Mips::ZERO)); 3250 NopInst.addOperand(MCOperand::createReg(Mips::ZERO)); 3251 NopInst.addOperand(MCOperand::createImm(0)); 3252 } 3253 Instructions.push_back(NopInst); 3254 } 3255 3256 void MipsAsmParser::createAddu(unsigned DstReg, unsigned SrcReg, 3257 unsigned TrgReg, bool Is64Bit, 3258 SmallVectorImpl<MCInst> &Instructions) { 3259 emitRRR(Is64Bit ? Mips::DADDu : Mips::ADDu, DstReg, SrcReg, TrgReg, SMLoc(), 3260 Instructions); 3261 } 3262 3263 void MipsAsmParser::createCpRestoreMemOp( 3264 bool IsLoad, int StackOffset, SMLoc IDLoc, 3265 SmallVectorImpl<MCInst> &Instructions) { 3266 MCInst MemInst; 3267 MemInst.setOpcode(IsLoad ? Mips::LW : Mips::SW); 3268 MemInst.addOperand(MCOperand::createReg(Mips::GP)); 3269 MemInst.addOperand(MCOperand::createReg(Mips::SP)); 3270 MemInst.addOperand(MCOperand::createImm(StackOffset)); 3271 3272 // If the offset can not fit into 16 bits, we need to expand. 3273 if (!isInt<16>(StackOffset)) 3274 expandMemInst(MemInst, IDLoc, Instructions, IsLoad, true /*HasImmOpnd*/); 3275 else 3276 Instructions.push_back(MemInst); 3277 } 3278 3279 unsigned MipsAsmParser::checkTargetMatchPredicate(MCInst &Inst) { 3280 // As described by the Mips32r2 spec, the registers Rd and Rs for 3281 // jalr.hb must be different. 3282 unsigned Opcode = Inst.getOpcode(); 3283 3284 if (Opcode == Mips::JALR_HB && 3285 (Inst.getOperand(0).getReg() == Inst.getOperand(1).getReg())) 3286 return Match_RequiresDifferentSrcAndDst; 3287 3288 return Match_Success; 3289 } 3290 3291 bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 3292 OperandVector &Operands, 3293 MCStreamer &Out, 3294 uint64_t &ErrorInfo, 3295 bool MatchingInlineAsm) { 3296 3297 MCInst Inst; 3298 SmallVector<MCInst, 8> Instructions; 3299 unsigned MatchResult = 3300 MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm); 3301 3302 switch (MatchResult) { 3303 case Match_Success: { 3304 if (processInstruction(Inst, IDLoc, Instructions)) 3305 return true; 3306 for (unsigned i = 0; i < Instructions.size(); i++) 3307 Out.EmitInstruction(Instructions[i], STI); 3308 return false; 3309 } 3310 case Match_MissingFeature: 3311 Error(IDLoc, "instruction requires a CPU feature not currently enabled"); 3312 return true; 3313 case Match_InvalidOperand: { 3314 SMLoc ErrorLoc = IDLoc; 3315 if (ErrorInfo != ~0ULL) { 3316 if (ErrorInfo >= Operands.size()) 3317 return Error(IDLoc, "too few operands for instruction"); 3318 3319 ErrorLoc = ((MipsOperand &)*Operands[ErrorInfo]).getStartLoc(); 3320 if (ErrorLoc == SMLoc()) 3321 ErrorLoc = IDLoc; 3322 } 3323 3324 return Error(ErrorLoc, "invalid operand for instruction"); 3325 } 3326 case Match_MnemonicFail: 3327 return Error(IDLoc, "invalid instruction"); 3328 case Match_RequiresDifferentSrcAndDst: 3329 return Error(IDLoc, "source and destination must be different"); 3330 } 3331 3332 llvm_unreachable("Implement any new match types added!"); 3333 } 3334 3335 void MipsAsmParser::warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc) { 3336 if (RegIndex != 0 && AssemblerOptions.back()->getATRegIndex() == RegIndex) 3337 Warning(Loc, "used $at (currently $" + Twine(RegIndex) + 3338 ") without \".set noat\""); 3339 } 3340 3341 void MipsAsmParser::warnIfNoMacro(SMLoc Loc) { 3342 if (!AssemblerOptions.back()->isMacro()) 3343 Warning(Loc, "macro instruction expanded into multiple instructions"); 3344 } 3345 3346 void 3347 MipsAsmParser::printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg, 3348 SMRange Range, bool ShowColors) { 3349 getSourceManager().PrintMessage(Range.Start, SourceMgr::DK_Warning, Msg, 3350 Range, SMFixIt(Range, FixMsg), 3351 ShowColors); 3352 } 3353 3354 int MipsAsmParser::matchCPURegisterName(StringRef Name) { 3355 int CC; 3356 3357 CC = StringSwitch<unsigned>(Name) 3358 .Case("zero", 0) 3359 .Case("at", 1) 3360 .Case("a0", 4) 3361 .Case("a1", 5) 3362 .Case("a2", 6) 3363 .Case("a3", 7) 3364 .Case("v0", 2) 3365 .Case("v1", 3) 3366 .Case("s0", 16) 3367 .Case("s1", 17) 3368 .Case("s2", 18) 3369 .Case("s3", 19) 3370 .Case("s4", 20) 3371 .Case("s5", 21) 3372 .Case("s6", 22) 3373 .Case("s7", 23) 3374 .Case("k0", 26) 3375 .Case("k1", 27) 3376 .Case("gp", 28) 3377 .Case("sp", 29) 3378 .Case("fp", 30) 3379 .Case("s8", 30) 3380 .Case("ra", 31) 3381 .Case("t0", 8) 3382 .Case("t1", 9) 3383 .Case("t2", 10) 3384 .Case("t3", 11) 3385 .Case("t4", 12) 3386 .Case("t5", 13) 3387 .Case("t6", 14) 3388 .Case("t7", 15) 3389 .Case("t8", 24) 3390 .Case("t9", 25) 3391 .Default(-1); 3392 3393 if (!(isABI_N32() || isABI_N64())) 3394 return CC; 3395 3396 if (12 <= CC && CC <= 15) { 3397 // Name is one of t4-t7 3398 AsmToken RegTok = getLexer().peekTok(); 3399 SMRange RegRange = RegTok.getLocRange(); 3400 3401 StringRef FixedName = StringSwitch<StringRef>(Name) 3402 .Case("t4", "t0") 3403 .Case("t5", "t1") 3404 .Case("t6", "t2") 3405 .Case("t7", "t3") 3406 .Default(""); 3407 assert(FixedName != "" && "Register name is not one of t4-t7."); 3408 3409 printWarningWithFixIt("register names $t4-$t7 are only available in O32.", 3410 "Did you mean $" + FixedName + "?", RegRange); 3411 } 3412 3413 // Although SGI documentation just cuts out t0-t3 for n32/n64, 3414 // GNU pushes the values of t0-t3 to override the o32/o64 values for t4-t7 3415 // We are supporting both cases, so for t0-t3 we'll just push them to t4-t7. 3416 if (8 <= CC && CC <= 11) 3417 CC += 4; 3418 3419 if (CC == -1) 3420 CC = StringSwitch<unsigned>(Name) 3421 .Case("a4", 8) 3422 .Case("a5", 9) 3423 .Case("a6", 10) 3424 .Case("a7", 11) 3425 .Case("kt0", 26) 3426 .Case("kt1", 27) 3427 .Default(-1); 3428 3429 return CC; 3430 } 3431 3432 int MipsAsmParser::matchHWRegsRegisterName(StringRef Name) { 3433 int CC; 3434 3435 CC = StringSwitch<unsigned>(Name) 3436 .Case("hwr_cpunum", 0) 3437 .Case("hwr_synci_step", 1) 3438 .Case("hwr_cc", 2) 3439 .Case("hwr_ccres", 3) 3440 .Case("hwr_ulr", 29) 3441 .Default(-1); 3442 3443 return CC; 3444 } 3445 3446 int MipsAsmParser::matchFPURegisterName(StringRef Name) { 3447 3448 if (Name[0] == 'f') { 3449 StringRef NumString = Name.substr(1); 3450 unsigned IntVal; 3451 if (NumString.getAsInteger(10, IntVal)) 3452 return -1; // This is not an integer. 3453 if (IntVal > 31) // Maximum index for fpu register. 3454 return -1; 3455 return IntVal; 3456 } 3457 return -1; 3458 } 3459 3460 int MipsAsmParser::matchFCCRegisterName(StringRef Name) { 3461 3462 if (Name.startswith("fcc")) { 3463 StringRef NumString = Name.substr(3); 3464 unsigned IntVal; 3465 if (NumString.getAsInteger(10, IntVal)) 3466 return -1; // This is not an integer. 3467 if (IntVal > 7) // There are only 8 fcc registers. 3468 return -1; 3469 return IntVal; 3470 } 3471 return -1; 3472 } 3473 3474 int MipsAsmParser::matchACRegisterName(StringRef Name) { 3475 3476 if (Name.startswith("ac")) { 3477 StringRef NumString = Name.substr(2); 3478 unsigned IntVal; 3479 if (NumString.getAsInteger(10, IntVal)) 3480 return -1; // This is not an integer. 3481 if (IntVal > 3) // There are only 3 acc registers. 3482 return -1; 3483 return IntVal; 3484 } 3485 return -1; 3486 } 3487 3488 int MipsAsmParser::matchMSA128RegisterName(StringRef Name) { 3489 unsigned IntVal; 3490 3491 if (Name.front() != 'w' || Name.drop_front(1).getAsInteger(10, IntVal)) 3492 return -1; 3493 3494 if (IntVal > 31) 3495 return -1; 3496 3497 return IntVal; 3498 } 3499 3500 int MipsAsmParser::matchMSA128CtrlRegisterName(StringRef Name) { 3501 int CC; 3502 3503 CC = StringSwitch<unsigned>(Name) 3504 .Case("msair", 0) 3505 .Case("msacsr", 1) 3506 .Case("msaaccess", 2) 3507 .Case("msasave", 3) 3508 .Case("msamodify", 4) 3509 .Case("msarequest", 5) 3510 .Case("msamap", 6) 3511 .Case("msaunmap", 7) 3512 .Default(-1); 3513 3514 return CC; 3515 } 3516 3517 unsigned MipsAsmParser::getATReg(SMLoc Loc) { 3518 unsigned ATIndex = AssemblerOptions.back()->getATRegIndex(); 3519 if (ATIndex == 0) { 3520 reportParseError(Loc, 3521 "pseudo-instruction requires $at, which is not available"); 3522 return 0; 3523 } 3524 unsigned AT = getReg( 3525 (isGP64bit()) ? Mips::GPR64RegClassID : Mips::GPR32RegClassID, ATIndex); 3526 return AT; 3527 } 3528 3529 unsigned MipsAsmParser::getReg(int RC, int RegNo) { 3530 return *(getContext().getRegisterInfo()->getRegClass(RC).begin() + RegNo); 3531 } 3532 3533 unsigned MipsAsmParser::getGPR(int RegNo) { 3534 return getReg(isGP64bit() ? Mips::GPR64RegClassID : Mips::GPR32RegClassID, 3535 RegNo); 3536 } 3537 3538 int MipsAsmParser::matchRegisterByNumber(unsigned RegNum, unsigned RegClass) { 3539 if (RegNum > 3540 getContext().getRegisterInfo()->getRegClass(RegClass).getNumRegs() - 1) 3541 return -1; 3542 3543 return getReg(RegClass, RegNum); 3544 } 3545 3546 bool MipsAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) { 3547 MCAsmParser &Parser = getParser(); 3548 DEBUG(dbgs() << "parseOperand\n"); 3549 3550 // Check if the current operand has a custom associated parser, if so, try to 3551 // custom parse the operand, or fallback to the general approach. 3552 OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic); 3553 if (ResTy == MatchOperand_Success) 3554 return false; 3555 // If there wasn't a custom match, try the generic matcher below. Otherwise, 3556 // there was a match, but an error occurred, in which case, just return that 3557 // the operand parsing failed. 3558 if (ResTy == MatchOperand_ParseFail) 3559 return true; 3560 3561 DEBUG(dbgs() << ".. Generic Parser\n"); 3562 3563 switch (getLexer().getKind()) { 3564 default: 3565 Error(Parser.getTok().getLoc(), "unexpected token in operand"); 3566 return true; 3567 case AsmToken::Dollar: { 3568 // Parse the register. 3569 SMLoc S = Parser.getTok().getLoc(); 3570 3571 // Almost all registers have been parsed by custom parsers. There is only 3572 // one exception to this. $zero (and it's alias $0) will reach this point 3573 // for div, divu, and similar instructions because it is not an operand 3574 // to the instruction definition but an explicit register. Special case 3575 // this situation for now. 3576 if (parseAnyRegister(Operands) != MatchOperand_NoMatch) 3577 return false; 3578 3579 // Maybe it is a symbol reference. 3580 StringRef Identifier; 3581 if (Parser.parseIdentifier(Identifier)) 3582 return true; 3583 3584 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 3585 MCSymbol *Sym = getContext().getOrCreateSymbol("$" + Identifier); 3586 // Otherwise create a symbol reference. 3587 const MCExpr *Res = 3588 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3589 3590 Operands.push_back(MipsOperand::CreateImm(Res, S, E, *this)); 3591 return false; 3592 } 3593 // Else drop to expression parsing. 3594 case AsmToken::LParen: 3595 case AsmToken::Minus: 3596 case AsmToken::Plus: 3597 case AsmToken::Integer: 3598 case AsmToken::Tilde: 3599 case AsmToken::String: { 3600 DEBUG(dbgs() << ".. generic integer\n"); 3601 OperandMatchResultTy ResTy = parseImm(Operands); 3602 return ResTy != MatchOperand_Success; 3603 } 3604 case AsmToken::Percent: { 3605 // It is a symbol reference or constant expression. 3606 const MCExpr *IdVal; 3607 SMLoc S = Parser.getTok().getLoc(); // Start location of the operand. 3608 if (parseRelocOperand(IdVal)) 3609 return true; 3610 3611 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 3612 3613 Operands.push_back(MipsOperand::CreateImm(IdVal, S, E, *this)); 3614 return false; 3615 } // case AsmToken::Percent 3616 } // switch(getLexer().getKind()) 3617 return true; 3618 } 3619 3620 const MCExpr *MipsAsmParser::evaluateRelocExpr(const MCExpr *Expr, 3621 StringRef RelocStr) { 3622 const MCExpr *Res; 3623 // Check the type of the expression. 3624 if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Expr)) { 3625 // It's a constant, evaluate reloc value. 3626 int16_t Val; 3627 switch (getVariantKind(RelocStr)) { 3628 case MCSymbolRefExpr::VK_Mips_ABS_LO: 3629 // Get the 1st 16-bits. 3630 Val = MCE->getValue() & 0xffff; 3631 break; 3632 case MCSymbolRefExpr::VK_Mips_ABS_HI: 3633 // Get the 2nd 16-bits. Also add 1 if bit 15 is 1, to compensate for low 3634 // 16 bits being negative. 3635 Val = ((MCE->getValue() + 0x8000) >> 16) & 0xffff; 3636 break; 3637 case MCSymbolRefExpr::VK_Mips_HIGHER: 3638 // Get the 3rd 16-bits. 3639 Val = ((MCE->getValue() + 0x80008000LL) >> 32) & 0xffff; 3640 break; 3641 case MCSymbolRefExpr::VK_Mips_HIGHEST: 3642 // Get the 4th 16-bits. 3643 Val = ((MCE->getValue() + 0x800080008000LL) >> 48) & 0xffff; 3644 break; 3645 default: 3646 report_fatal_error("unsupported reloc value"); 3647 } 3648 return MCConstantExpr::create(Val, getContext()); 3649 } 3650 3651 if (const MCSymbolRefExpr *MSRE = dyn_cast<MCSymbolRefExpr>(Expr)) { 3652 // It's a symbol, create a symbolic expression from the symbol. 3653 const MCSymbol *Symbol = &MSRE->getSymbol(); 3654 MCSymbolRefExpr::VariantKind VK = getVariantKind(RelocStr); 3655 Res = MCSymbolRefExpr::create(Symbol, VK, getContext()); 3656 return Res; 3657 } 3658 3659 if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) { 3660 MCSymbolRefExpr::VariantKind VK = getVariantKind(RelocStr); 3661 3662 // Try to create target expression. 3663 if (MipsMCExpr::isSupportedBinaryExpr(VK, BE)) 3664 return MipsMCExpr::create(VK, Expr, getContext()); 3665 3666 const MCExpr *LExp = evaluateRelocExpr(BE->getLHS(), RelocStr); 3667 const MCExpr *RExp = evaluateRelocExpr(BE->getRHS(), RelocStr); 3668 Res = MCBinaryExpr::create(BE->getOpcode(), LExp, RExp, getContext()); 3669 return Res; 3670 } 3671 3672 if (const MCUnaryExpr *UN = dyn_cast<MCUnaryExpr>(Expr)) { 3673 const MCExpr *UnExp = evaluateRelocExpr(UN->getSubExpr(), RelocStr); 3674 Res = MCUnaryExpr::create(UN->getOpcode(), UnExp, getContext()); 3675 return Res; 3676 } 3677 // Just return the original expression. 3678 return Expr; 3679 } 3680 3681 bool MipsAsmParser::isEvaluated(const MCExpr *Expr) { 3682 3683 switch (Expr->getKind()) { 3684 case MCExpr::Constant: 3685 return true; 3686 case MCExpr::SymbolRef: 3687 return (cast<MCSymbolRefExpr>(Expr)->getKind() != MCSymbolRefExpr::VK_None); 3688 case MCExpr::Binary: 3689 if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) { 3690 if (!isEvaluated(BE->getLHS())) 3691 return false; 3692 return isEvaluated(BE->getRHS()); 3693 } 3694 case MCExpr::Unary: 3695 return isEvaluated(cast<MCUnaryExpr>(Expr)->getSubExpr()); 3696 case MCExpr::Target: 3697 return true; 3698 } 3699 return false; 3700 } 3701 3702 bool MipsAsmParser::parseRelocOperand(const MCExpr *&Res) { 3703 MCAsmParser &Parser = getParser(); 3704 Parser.Lex(); // Eat the % token. 3705 const AsmToken &Tok = Parser.getTok(); // Get next token, operation. 3706 if (Tok.isNot(AsmToken::Identifier)) 3707 return true; 3708 3709 std::string Str = Tok.getIdentifier(); 3710 3711 Parser.Lex(); // Eat the identifier. 3712 // Now make an expression from the rest of the operand. 3713 const MCExpr *IdVal; 3714 SMLoc EndLoc; 3715 3716 if (getLexer().getKind() == AsmToken::LParen) { 3717 while (1) { 3718 Parser.Lex(); // Eat the '(' token. 3719 if (getLexer().getKind() == AsmToken::Percent) { 3720 Parser.Lex(); // Eat the % token. 3721 const AsmToken &nextTok = Parser.getTok(); 3722 if (nextTok.isNot(AsmToken::Identifier)) 3723 return true; 3724 Str += "(%"; 3725 Str += nextTok.getIdentifier(); 3726 Parser.Lex(); // Eat the identifier. 3727 if (getLexer().getKind() != AsmToken::LParen) 3728 return true; 3729 } else 3730 break; 3731 } 3732 if (getParser().parseParenExpression(IdVal, EndLoc)) 3733 return true; 3734 3735 while (getLexer().getKind() == AsmToken::RParen) 3736 Parser.Lex(); // Eat the ')' token. 3737 3738 } else 3739 return true; // Parenthesis must follow the relocation operand. 3740 3741 Res = evaluateRelocExpr(IdVal, Str); 3742 return false; 3743 } 3744 3745 bool MipsAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, 3746 SMLoc &EndLoc) { 3747 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> Operands; 3748 OperandMatchResultTy ResTy = parseAnyRegister(Operands); 3749 if (ResTy == MatchOperand_Success) { 3750 assert(Operands.size() == 1); 3751 MipsOperand &Operand = static_cast<MipsOperand &>(*Operands.front()); 3752 StartLoc = Operand.getStartLoc(); 3753 EndLoc = Operand.getEndLoc(); 3754 3755 // AFAIK, we only support numeric registers and named GPR's in CFI 3756 // directives. 3757 // Don't worry about eating tokens before failing. Using an unrecognised 3758 // register is a parse error. 3759 if (Operand.isGPRAsmReg()) { 3760 // Resolve to GPR32 or GPR64 appropriately. 3761 RegNo = isGP64bit() ? Operand.getGPR64Reg() : Operand.getGPR32Reg(); 3762 } 3763 3764 return (RegNo == (unsigned)-1); 3765 } 3766 3767 assert(Operands.size() == 0); 3768 return (RegNo == (unsigned)-1); 3769 } 3770 3771 bool MipsAsmParser::parseMemOffset(const MCExpr *&Res, bool isParenExpr) { 3772 MCAsmParser &Parser = getParser(); 3773 SMLoc S; 3774 bool Result = true; 3775 unsigned NumOfLParen = 0; 3776 3777 while (getLexer().getKind() == AsmToken::LParen) { 3778 Parser.Lex(); 3779 ++NumOfLParen; 3780 } 3781 3782 switch (getLexer().getKind()) { 3783 default: 3784 return true; 3785 case AsmToken::Identifier: 3786 case AsmToken::LParen: 3787 case AsmToken::Integer: 3788 case AsmToken::Minus: 3789 case AsmToken::Plus: 3790 if (isParenExpr) 3791 Result = getParser().parseParenExprOfDepth(NumOfLParen, Res, S); 3792 else 3793 Result = (getParser().parseExpression(Res)); 3794 while (getLexer().getKind() == AsmToken::RParen) 3795 Parser.Lex(); 3796 break; 3797 case AsmToken::Percent: 3798 Result = parseRelocOperand(Res); 3799 } 3800 return Result; 3801 } 3802 3803 MipsAsmParser::OperandMatchResultTy 3804 MipsAsmParser::parseMemOperand(OperandVector &Operands) { 3805 MCAsmParser &Parser = getParser(); 3806 DEBUG(dbgs() << "parseMemOperand\n"); 3807 const MCExpr *IdVal = nullptr; 3808 SMLoc S; 3809 bool isParenExpr = false; 3810 MipsAsmParser::OperandMatchResultTy Res = MatchOperand_NoMatch; 3811 // First operand is the offset. 3812 S = Parser.getTok().getLoc(); 3813 3814 if (getLexer().getKind() == AsmToken::LParen) { 3815 Parser.Lex(); 3816 isParenExpr = true; 3817 } 3818 3819 if (getLexer().getKind() != AsmToken::Dollar) { 3820 if (parseMemOffset(IdVal, isParenExpr)) 3821 return MatchOperand_ParseFail; 3822 3823 const AsmToken &Tok = Parser.getTok(); // Get the next token. 3824 if (Tok.isNot(AsmToken::LParen)) { 3825 MipsOperand &Mnemonic = static_cast<MipsOperand &>(*Operands[0]); 3826 if (Mnemonic.getToken() == "la" || Mnemonic.getToken() == "dla") { 3827 SMLoc E = 3828 SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 3829 Operands.push_back(MipsOperand::CreateImm(IdVal, S, E, *this)); 3830 return MatchOperand_Success; 3831 } 3832 if (Tok.is(AsmToken::EndOfStatement)) { 3833 SMLoc E = 3834 SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 3835 3836 // Zero register assumed, add a memory operand with ZERO as its base. 3837 // "Base" will be managed by k_Memory. 3838 auto Base = MipsOperand::createGPRReg(0, getContext().getRegisterInfo(), 3839 S, E, *this); 3840 Operands.push_back( 3841 MipsOperand::CreateMem(std::move(Base), IdVal, S, E, *this)); 3842 return MatchOperand_Success; 3843 } 3844 Error(Parser.getTok().getLoc(), "'(' expected"); 3845 return MatchOperand_ParseFail; 3846 } 3847 3848 Parser.Lex(); // Eat the '(' token. 3849 } 3850 3851 Res = parseAnyRegister(Operands); 3852 if (Res != MatchOperand_Success) 3853 return Res; 3854 3855 if (Parser.getTok().isNot(AsmToken::RParen)) { 3856 Error(Parser.getTok().getLoc(), "')' expected"); 3857 return MatchOperand_ParseFail; 3858 } 3859 3860 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 3861 3862 Parser.Lex(); // Eat the ')' token. 3863 3864 if (!IdVal) 3865 IdVal = MCConstantExpr::create(0, getContext()); 3866 3867 // Replace the register operand with the memory operand. 3868 std::unique_ptr<MipsOperand> op( 3869 static_cast<MipsOperand *>(Operands.back().release())); 3870 // Remove the register from the operands. 3871 // "op" will be managed by k_Memory. 3872 Operands.pop_back(); 3873 // Add the memory operand. 3874 if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(IdVal)) { 3875 int64_t Imm; 3876 if (IdVal->evaluateAsAbsolute(Imm)) 3877 IdVal = MCConstantExpr::create(Imm, getContext()); 3878 else if (BE->getLHS()->getKind() != MCExpr::SymbolRef) 3879 IdVal = MCBinaryExpr::create(BE->getOpcode(), BE->getRHS(), BE->getLHS(), 3880 getContext()); 3881 } 3882 3883 Operands.push_back(MipsOperand::CreateMem(std::move(op), IdVal, S, E, *this)); 3884 return MatchOperand_Success; 3885 } 3886 3887 bool MipsAsmParser::searchSymbolAlias(OperandVector &Operands) { 3888 MCAsmParser &Parser = getParser(); 3889 MCSymbol *Sym = getContext().lookupSymbol(Parser.getTok().getIdentifier()); 3890 if (Sym) { 3891 SMLoc S = Parser.getTok().getLoc(); 3892 const MCExpr *Expr; 3893 if (Sym->isVariable()) 3894 Expr = Sym->getVariableValue(); 3895 else 3896 return false; 3897 if (Expr->getKind() == MCExpr::SymbolRef) { 3898 const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr); 3899 StringRef DefSymbol = Ref->getSymbol().getName(); 3900 if (DefSymbol.startswith("$")) { 3901 OperandMatchResultTy ResTy = 3902 matchAnyRegisterNameWithoutDollar(Operands, DefSymbol.substr(1), S); 3903 if (ResTy == MatchOperand_Success) { 3904 Parser.Lex(); 3905 return true; 3906 } else if (ResTy == MatchOperand_ParseFail) 3907 llvm_unreachable("Should never ParseFail"); 3908 return false; 3909 } 3910 } else if (Expr->getKind() == MCExpr::Constant) { 3911 Parser.Lex(); 3912 const MCConstantExpr *Const = static_cast<const MCConstantExpr *>(Expr); 3913 Operands.push_back( 3914 MipsOperand::CreateImm(Const, S, Parser.getTok().getLoc(), *this)); 3915 return true; 3916 } 3917 } 3918 return false; 3919 } 3920 3921 MipsAsmParser::OperandMatchResultTy 3922 MipsAsmParser::matchAnyRegisterNameWithoutDollar(OperandVector &Operands, 3923 StringRef Identifier, 3924 SMLoc S) { 3925 int Index = matchCPURegisterName(Identifier); 3926 if (Index != -1) { 3927 Operands.push_back(MipsOperand::createGPRReg( 3928 Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this)); 3929 return MatchOperand_Success; 3930 } 3931 3932 Index = matchHWRegsRegisterName(Identifier); 3933 if (Index != -1) { 3934 Operands.push_back(MipsOperand::createHWRegsReg( 3935 Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this)); 3936 return MatchOperand_Success; 3937 } 3938 3939 Index = matchFPURegisterName(Identifier); 3940 if (Index != -1) { 3941 Operands.push_back(MipsOperand::createFGRReg( 3942 Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this)); 3943 return MatchOperand_Success; 3944 } 3945 3946 Index = matchFCCRegisterName(Identifier); 3947 if (Index != -1) { 3948 Operands.push_back(MipsOperand::createFCCReg( 3949 Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this)); 3950 return MatchOperand_Success; 3951 } 3952 3953 Index = matchACRegisterName(Identifier); 3954 if (Index != -1) { 3955 Operands.push_back(MipsOperand::createACCReg( 3956 Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this)); 3957 return MatchOperand_Success; 3958 } 3959 3960 Index = matchMSA128RegisterName(Identifier); 3961 if (Index != -1) { 3962 Operands.push_back(MipsOperand::createMSA128Reg( 3963 Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this)); 3964 return MatchOperand_Success; 3965 } 3966 3967 Index = matchMSA128CtrlRegisterName(Identifier); 3968 if (Index != -1) { 3969 Operands.push_back(MipsOperand::createMSACtrlReg( 3970 Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this)); 3971 return MatchOperand_Success; 3972 } 3973 3974 return MatchOperand_NoMatch; 3975 } 3976 3977 MipsAsmParser::OperandMatchResultTy 3978 MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) { 3979 MCAsmParser &Parser = getParser(); 3980 auto Token = Parser.getLexer().peekTok(false); 3981 3982 if (Token.is(AsmToken::Identifier)) { 3983 DEBUG(dbgs() << ".. identifier\n"); 3984 StringRef Identifier = Token.getIdentifier(); 3985 OperandMatchResultTy ResTy = 3986 matchAnyRegisterNameWithoutDollar(Operands, Identifier, S); 3987 return ResTy; 3988 } else if (Token.is(AsmToken::Integer)) { 3989 DEBUG(dbgs() << ".. integer\n"); 3990 Operands.push_back(MipsOperand::createNumericReg( 3991 Token.getIntVal(), getContext().getRegisterInfo(), S, Token.getLoc(), 3992 *this)); 3993 return MatchOperand_Success; 3994 } 3995 3996 DEBUG(dbgs() << Parser.getTok().getKind() << "\n"); 3997 3998 return MatchOperand_NoMatch; 3999 } 4000 4001 MipsAsmParser::OperandMatchResultTy 4002 MipsAsmParser::parseAnyRegister(OperandVector &Operands) { 4003 MCAsmParser &Parser = getParser(); 4004 DEBUG(dbgs() << "parseAnyRegister\n"); 4005 4006 auto Token = Parser.getTok(); 4007 4008 SMLoc S = Token.getLoc(); 4009 4010 if (Token.isNot(AsmToken::Dollar)) { 4011 DEBUG(dbgs() << ".. !$ -> try sym aliasing\n"); 4012 if (Token.is(AsmToken::Identifier)) { 4013 if (searchSymbolAlias(Operands)) 4014 return MatchOperand_Success; 4015 } 4016 DEBUG(dbgs() << ".. !symalias -> NoMatch\n"); 4017 return MatchOperand_NoMatch; 4018 } 4019 DEBUG(dbgs() << ".. $\n"); 4020 4021 OperandMatchResultTy ResTy = matchAnyRegisterWithoutDollar(Operands, S); 4022 if (ResTy == MatchOperand_Success) { 4023 Parser.Lex(); // $ 4024 Parser.Lex(); // identifier 4025 } 4026 return ResTy; 4027 } 4028 4029 MipsAsmParser::OperandMatchResultTy 4030 MipsAsmParser::parseImm(OperandVector &Operands) { 4031 MCAsmParser &Parser = getParser(); 4032 switch (getLexer().getKind()) { 4033 default: 4034 return MatchOperand_NoMatch; 4035 case AsmToken::LParen: 4036 case AsmToken::Minus: 4037 case AsmToken::Plus: 4038 case AsmToken::Integer: 4039 case AsmToken::Tilde: 4040 case AsmToken::String: 4041 break; 4042 } 4043 4044 const MCExpr *IdVal; 4045 SMLoc S = Parser.getTok().getLoc(); 4046 if (getParser().parseExpression(IdVal)) 4047 return MatchOperand_ParseFail; 4048 4049 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 4050 Operands.push_back(MipsOperand::CreateImm(IdVal, S, E, *this)); 4051 return MatchOperand_Success; 4052 } 4053 4054 MipsAsmParser::OperandMatchResultTy 4055 MipsAsmParser::parseJumpTarget(OperandVector &Operands) { 4056 MCAsmParser &Parser = getParser(); 4057 DEBUG(dbgs() << "parseJumpTarget\n"); 4058 4059 SMLoc S = getLexer().getLoc(); 4060 4061 // Integers and expressions are acceptable 4062 OperandMatchResultTy ResTy = parseImm(Operands); 4063 if (ResTy != MatchOperand_NoMatch) 4064 return ResTy; 4065 4066 // Registers are a valid target and have priority over symbols. 4067 ResTy = parseAnyRegister(Operands); 4068 if (ResTy != MatchOperand_NoMatch) 4069 return ResTy; 4070 4071 const MCExpr *Expr = nullptr; 4072 if (Parser.parseExpression(Expr)) { 4073 // We have no way of knowing if a symbol was consumed so we must ParseFail 4074 return MatchOperand_ParseFail; 4075 } 4076 Operands.push_back( 4077 MipsOperand::CreateImm(Expr, S, getLexer().getLoc(), *this)); 4078 return MatchOperand_Success; 4079 } 4080 4081 MipsAsmParser::OperandMatchResultTy 4082 MipsAsmParser::parseInvNum(OperandVector &Operands) { 4083 MCAsmParser &Parser = getParser(); 4084 const MCExpr *IdVal; 4085 // If the first token is '$' we may have register operand. 4086 if (Parser.getTok().is(AsmToken::Dollar)) 4087 return MatchOperand_NoMatch; 4088 SMLoc S = Parser.getTok().getLoc(); 4089 if (getParser().parseExpression(IdVal)) 4090 return MatchOperand_ParseFail; 4091 const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(IdVal); 4092 assert(MCE && "Unexpected MCExpr type."); 4093 int64_t Val = MCE->getValue(); 4094 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 4095 Operands.push_back(MipsOperand::CreateImm( 4096 MCConstantExpr::create(0 - Val, getContext()), S, E, *this)); 4097 return MatchOperand_Success; 4098 } 4099 4100 MipsAsmParser::OperandMatchResultTy 4101 MipsAsmParser::parseLSAImm(OperandVector &Operands) { 4102 MCAsmParser &Parser = getParser(); 4103 switch (getLexer().getKind()) { 4104 default: 4105 return MatchOperand_NoMatch; 4106 case AsmToken::LParen: 4107 case AsmToken::Plus: 4108 case AsmToken::Minus: 4109 case AsmToken::Integer: 4110 break; 4111 } 4112 4113 const MCExpr *Expr; 4114 SMLoc S = Parser.getTok().getLoc(); 4115 4116 if (getParser().parseExpression(Expr)) 4117 return MatchOperand_ParseFail; 4118 4119 int64_t Val; 4120 if (!Expr->evaluateAsAbsolute(Val)) { 4121 Error(S, "expected immediate value"); 4122 return MatchOperand_ParseFail; 4123 } 4124 4125 // The LSA instruction allows a 2-bit unsigned immediate. For this reason 4126 // and because the CPU always adds one to the immediate field, the allowed 4127 // range becomes 1..4. We'll only check the range here and will deal 4128 // with the addition/subtraction when actually decoding/encoding 4129 // the instruction. 4130 if (Val < 1 || Val > 4) { 4131 Error(S, "immediate not in range (1..4)"); 4132 return MatchOperand_ParseFail; 4133 } 4134 4135 Operands.push_back( 4136 MipsOperand::CreateImm(Expr, S, Parser.getTok().getLoc(), *this)); 4137 return MatchOperand_Success; 4138 } 4139 4140 MipsAsmParser::OperandMatchResultTy 4141 MipsAsmParser::parseRegisterList(OperandVector &Operands) { 4142 MCAsmParser &Parser = getParser(); 4143 SmallVector<unsigned, 10> Regs; 4144 unsigned RegNo; 4145 unsigned PrevReg = Mips::NoRegister; 4146 bool RegRange = false; 4147 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 8> TmpOperands; 4148 4149 if (Parser.getTok().isNot(AsmToken::Dollar)) 4150 return MatchOperand_ParseFail; 4151 4152 SMLoc S = Parser.getTok().getLoc(); 4153 while (parseAnyRegister(TmpOperands) == MatchOperand_Success) { 4154 SMLoc E = getLexer().getLoc(); 4155 MipsOperand &Reg = static_cast<MipsOperand &>(*TmpOperands.back()); 4156 RegNo = isGP64bit() ? Reg.getGPR64Reg() : Reg.getGPR32Reg(); 4157 if (RegRange) { 4158 // Remove last register operand because registers from register range 4159 // should be inserted first. 4160 if (RegNo == Mips::RA) { 4161 Regs.push_back(RegNo); 4162 } else { 4163 unsigned TmpReg = PrevReg + 1; 4164 while (TmpReg <= RegNo) { 4165 if ((TmpReg < Mips::S0) || (TmpReg > Mips::S7)) { 4166 Error(E, "invalid register operand"); 4167 return MatchOperand_ParseFail; 4168 } 4169 4170 PrevReg = TmpReg; 4171 Regs.push_back(TmpReg++); 4172 } 4173 } 4174 4175 RegRange = false; 4176 } else { 4177 if ((PrevReg == Mips::NoRegister) && (RegNo != Mips::S0) && 4178 (RegNo != Mips::RA)) { 4179 Error(E, "$16 or $31 expected"); 4180 return MatchOperand_ParseFail; 4181 } else if (((RegNo < Mips::S0) || (RegNo > Mips::S7)) && 4182 (RegNo != Mips::FP) && (RegNo != Mips::RA)) { 4183 Error(E, "invalid register operand"); 4184 return MatchOperand_ParseFail; 4185 } else if ((PrevReg != Mips::NoRegister) && (RegNo != PrevReg + 1) && 4186 (RegNo != Mips::FP) && (RegNo != Mips::RA)) { 4187 Error(E, "consecutive register numbers expected"); 4188 return MatchOperand_ParseFail; 4189 } 4190 4191 Regs.push_back(RegNo); 4192 } 4193 4194 if (Parser.getTok().is(AsmToken::Minus)) 4195 RegRange = true; 4196 4197 if (!Parser.getTok().isNot(AsmToken::Minus) && 4198 !Parser.getTok().isNot(AsmToken::Comma)) { 4199 Error(E, "',' or '-' expected"); 4200 return MatchOperand_ParseFail; 4201 } 4202 4203 Lex(); // Consume comma or minus 4204 if (Parser.getTok().isNot(AsmToken::Dollar)) 4205 break; 4206 4207 PrevReg = RegNo; 4208 } 4209 4210 SMLoc E = Parser.getTok().getLoc(); 4211 Operands.push_back(MipsOperand::CreateRegList(Regs, S, E, *this)); 4212 parseMemOperand(Operands); 4213 return MatchOperand_Success; 4214 } 4215 4216 MipsAsmParser::OperandMatchResultTy 4217 MipsAsmParser::parseRegisterPair(OperandVector &Operands) { 4218 MCAsmParser &Parser = getParser(); 4219 4220 SMLoc S = Parser.getTok().getLoc(); 4221 if (parseAnyRegister(Operands) != MatchOperand_Success) 4222 return MatchOperand_ParseFail; 4223 4224 SMLoc E = Parser.getTok().getLoc(); 4225 MipsOperand &Op = static_cast<MipsOperand &>(*Operands.back()); 4226 unsigned Reg = Op.getGPR32Reg(); 4227 Operands.pop_back(); 4228 Operands.push_back(MipsOperand::CreateRegPair(Reg, S, E, *this)); 4229 return MatchOperand_Success; 4230 } 4231 4232 MipsAsmParser::OperandMatchResultTy 4233 MipsAsmParser::parseMovePRegPair(OperandVector &Operands) { 4234 MCAsmParser &Parser = getParser(); 4235 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 8> TmpOperands; 4236 SmallVector<unsigned, 10> Regs; 4237 4238 if (Parser.getTok().isNot(AsmToken::Dollar)) 4239 return MatchOperand_ParseFail; 4240 4241 SMLoc S = Parser.getTok().getLoc(); 4242 4243 if (parseAnyRegister(TmpOperands) != MatchOperand_Success) 4244 return MatchOperand_ParseFail; 4245 4246 MipsOperand *Reg = &static_cast<MipsOperand &>(*TmpOperands.back()); 4247 unsigned RegNo = isGP64bit() ? Reg->getGPR64Reg() : Reg->getGPR32Reg(); 4248 Regs.push_back(RegNo); 4249 4250 SMLoc E = Parser.getTok().getLoc(); 4251 if (Parser.getTok().isNot(AsmToken::Comma)) { 4252 Error(E, "',' expected"); 4253 return MatchOperand_ParseFail; 4254 } 4255 4256 // Remove comma. 4257 Parser.Lex(); 4258 4259 if (parseAnyRegister(TmpOperands) != MatchOperand_Success) 4260 return MatchOperand_ParseFail; 4261 4262 Reg = &static_cast<MipsOperand &>(*TmpOperands.back()); 4263 RegNo = isGP64bit() ? Reg->getGPR64Reg() : Reg->getGPR32Reg(); 4264 Regs.push_back(RegNo); 4265 4266 Operands.push_back(MipsOperand::CreateRegList(Regs, S, E, *this)); 4267 4268 return MatchOperand_Success; 4269 } 4270 4271 MCSymbolRefExpr::VariantKind MipsAsmParser::getVariantKind(StringRef Symbol) { 4272 4273 MCSymbolRefExpr::VariantKind VK = 4274 StringSwitch<MCSymbolRefExpr::VariantKind>(Symbol) 4275 .Case("hi", MCSymbolRefExpr::VK_Mips_ABS_HI) 4276 .Case("lo", MCSymbolRefExpr::VK_Mips_ABS_LO) 4277 .Case("gp_rel", MCSymbolRefExpr::VK_Mips_GPREL) 4278 .Case("call16", MCSymbolRefExpr::VK_Mips_GOT_CALL) 4279 .Case("got", MCSymbolRefExpr::VK_Mips_GOT) 4280 .Case("tlsgd", MCSymbolRefExpr::VK_Mips_TLSGD) 4281 .Case("tlsldm", MCSymbolRefExpr::VK_Mips_TLSLDM) 4282 .Case("dtprel_hi", MCSymbolRefExpr::VK_Mips_DTPREL_HI) 4283 .Case("dtprel_lo", MCSymbolRefExpr::VK_Mips_DTPREL_LO) 4284 .Case("gottprel", MCSymbolRefExpr::VK_Mips_GOTTPREL) 4285 .Case("tprel_hi", MCSymbolRefExpr::VK_Mips_TPREL_HI) 4286 .Case("tprel_lo", MCSymbolRefExpr::VK_Mips_TPREL_LO) 4287 .Case("got_disp", MCSymbolRefExpr::VK_Mips_GOT_DISP) 4288 .Case("got_page", MCSymbolRefExpr::VK_Mips_GOT_PAGE) 4289 .Case("got_ofst", MCSymbolRefExpr::VK_Mips_GOT_OFST) 4290 .Case("hi(%neg(%gp_rel", MCSymbolRefExpr::VK_Mips_GPOFF_HI) 4291 .Case("lo(%neg(%gp_rel", MCSymbolRefExpr::VK_Mips_GPOFF_LO) 4292 .Case("got_hi", MCSymbolRefExpr::VK_Mips_GOT_HI16) 4293 .Case("got_lo", MCSymbolRefExpr::VK_Mips_GOT_LO16) 4294 .Case("call_hi", MCSymbolRefExpr::VK_Mips_CALL_HI16) 4295 .Case("call_lo", MCSymbolRefExpr::VK_Mips_CALL_LO16) 4296 .Case("higher", MCSymbolRefExpr::VK_Mips_HIGHER) 4297 .Case("highest", MCSymbolRefExpr::VK_Mips_HIGHEST) 4298 .Case("pcrel_hi", MCSymbolRefExpr::VK_Mips_PCREL_HI16) 4299 .Case("pcrel_lo", MCSymbolRefExpr::VK_Mips_PCREL_LO16) 4300 .Default(MCSymbolRefExpr::VK_None); 4301 4302 assert(VK != MCSymbolRefExpr::VK_None); 4303 4304 return VK; 4305 } 4306 4307 /// Sometimes (i.e. load/stores) the operand may be followed immediately by 4308 /// either this. 4309 /// ::= '(', register, ')' 4310 /// handle it before we iterate so we don't get tripped up by the lack of 4311 /// a comma. 4312 bool MipsAsmParser::parseParenSuffix(StringRef Name, OperandVector &Operands) { 4313 MCAsmParser &Parser = getParser(); 4314 if (getLexer().is(AsmToken::LParen)) { 4315 Operands.push_back( 4316 MipsOperand::CreateToken("(", getLexer().getLoc(), *this)); 4317 Parser.Lex(); 4318 if (parseOperand(Operands, Name)) { 4319 SMLoc Loc = getLexer().getLoc(); 4320 Parser.eatToEndOfStatement(); 4321 return Error(Loc, "unexpected token in argument list"); 4322 } 4323 if (Parser.getTok().isNot(AsmToken::RParen)) { 4324 SMLoc Loc = getLexer().getLoc(); 4325 Parser.eatToEndOfStatement(); 4326 return Error(Loc, "unexpected token, expected ')'"); 4327 } 4328 Operands.push_back( 4329 MipsOperand::CreateToken(")", getLexer().getLoc(), *this)); 4330 Parser.Lex(); 4331 } 4332 return false; 4333 } 4334 4335 /// Sometimes (i.e. in MSA) the operand may be followed immediately by 4336 /// either one of these. 4337 /// ::= '[', register, ']' 4338 /// ::= '[', integer, ']' 4339 /// handle it before we iterate so we don't get tripped up by the lack of 4340 /// a comma. 4341 bool MipsAsmParser::parseBracketSuffix(StringRef Name, 4342 OperandVector &Operands) { 4343 MCAsmParser &Parser = getParser(); 4344 if (getLexer().is(AsmToken::LBrac)) { 4345 Operands.push_back( 4346 MipsOperand::CreateToken("[", getLexer().getLoc(), *this)); 4347 Parser.Lex(); 4348 if (parseOperand(Operands, Name)) { 4349 SMLoc Loc = getLexer().getLoc(); 4350 Parser.eatToEndOfStatement(); 4351 return Error(Loc, "unexpected token in argument list"); 4352 } 4353 if (Parser.getTok().isNot(AsmToken::RBrac)) { 4354 SMLoc Loc = getLexer().getLoc(); 4355 Parser.eatToEndOfStatement(); 4356 return Error(Loc, "unexpected token, expected ']'"); 4357 } 4358 Operands.push_back( 4359 MipsOperand::CreateToken("]", getLexer().getLoc(), *this)); 4360 Parser.Lex(); 4361 } 4362 return false; 4363 } 4364 4365 bool MipsAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name, 4366 SMLoc NameLoc, OperandVector &Operands) { 4367 MCAsmParser &Parser = getParser(); 4368 DEBUG(dbgs() << "ParseInstruction\n"); 4369 4370 // We have reached first instruction, module directive are now forbidden. 4371 getTargetStreamer().forbidModuleDirective(); 4372 4373 // Check if we have valid mnemonic 4374 if (!mnemonicIsValid(Name, 0)) { 4375 Parser.eatToEndOfStatement(); 4376 return Error(NameLoc, "unknown instruction"); 4377 } 4378 // First operand in MCInst is instruction mnemonic. 4379 Operands.push_back(MipsOperand::CreateToken(Name, NameLoc, *this)); 4380 4381 // Read the remaining operands. 4382 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4383 // Read the first operand. 4384 if (parseOperand(Operands, Name)) { 4385 SMLoc Loc = getLexer().getLoc(); 4386 Parser.eatToEndOfStatement(); 4387 return Error(Loc, "unexpected token in argument list"); 4388 } 4389 if (getLexer().is(AsmToken::LBrac) && parseBracketSuffix(Name, Operands)) 4390 return true; 4391 // AFAIK, parenthesis suffixes are never on the first operand 4392 4393 while (getLexer().is(AsmToken::Comma)) { 4394 Parser.Lex(); // Eat the comma. 4395 // Parse and remember the operand. 4396 if (parseOperand(Operands, Name)) { 4397 SMLoc Loc = getLexer().getLoc(); 4398 Parser.eatToEndOfStatement(); 4399 return Error(Loc, "unexpected token in argument list"); 4400 } 4401 // Parse bracket and parenthesis suffixes before we iterate 4402 if (getLexer().is(AsmToken::LBrac)) { 4403 if (parseBracketSuffix(Name, Operands)) 4404 return true; 4405 } else if (getLexer().is(AsmToken::LParen) && 4406 parseParenSuffix(Name, Operands)) 4407 return true; 4408 } 4409 } 4410 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4411 SMLoc Loc = getLexer().getLoc(); 4412 Parser.eatToEndOfStatement(); 4413 return Error(Loc, "unexpected token in argument list"); 4414 } 4415 Parser.Lex(); // Consume the EndOfStatement. 4416 return false; 4417 } 4418 4419 bool MipsAsmParser::reportParseError(Twine ErrorMsg) { 4420 MCAsmParser &Parser = getParser(); 4421 SMLoc Loc = getLexer().getLoc(); 4422 Parser.eatToEndOfStatement(); 4423 return Error(Loc, ErrorMsg); 4424 } 4425 4426 bool MipsAsmParser::reportParseError(SMLoc Loc, Twine ErrorMsg) { 4427 return Error(Loc, ErrorMsg); 4428 } 4429 4430 bool MipsAsmParser::parseSetNoAtDirective() { 4431 MCAsmParser &Parser = getParser(); 4432 // Line should look like: ".set noat". 4433 4434 // Set the $at register to $0. 4435 AssemblerOptions.back()->setATRegIndex(0); 4436 4437 Parser.Lex(); // Eat "noat". 4438 4439 // If this is not the end of the statement, report an error. 4440 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4441 reportParseError("unexpected token, expected end of statement"); 4442 return false; 4443 } 4444 4445 getTargetStreamer().emitDirectiveSetNoAt(); 4446 Parser.Lex(); // Consume the EndOfStatement. 4447 return false; 4448 } 4449 4450 bool MipsAsmParser::parseSetAtDirective() { 4451 // Line can be: ".set at", which sets $at to $1 4452 // or ".set at=$reg", which sets $at to $reg. 4453 MCAsmParser &Parser = getParser(); 4454 Parser.Lex(); // Eat "at". 4455 4456 if (getLexer().is(AsmToken::EndOfStatement)) { 4457 // No register was specified, so we set $at to $1. 4458 AssemblerOptions.back()->setATRegIndex(1); 4459 4460 getTargetStreamer().emitDirectiveSetAt(); 4461 Parser.Lex(); // Consume the EndOfStatement. 4462 return false; 4463 } 4464 4465 if (getLexer().isNot(AsmToken::Equal)) { 4466 reportParseError("unexpected token, expected equals sign"); 4467 return false; 4468 } 4469 Parser.Lex(); // Eat "=". 4470 4471 if (getLexer().isNot(AsmToken::Dollar)) { 4472 if (getLexer().is(AsmToken::EndOfStatement)) { 4473 reportParseError("no register specified"); 4474 return false; 4475 } else { 4476 reportParseError("unexpected token, expected dollar sign '$'"); 4477 return false; 4478 } 4479 } 4480 Parser.Lex(); // Eat "$". 4481 4482 // Find out what "reg" is. 4483 unsigned AtRegNo; 4484 const AsmToken &Reg = Parser.getTok(); 4485 if (Reg.is(AsmToken::Identifier)) { 4486 AtRegNo = matchCPURegisterName(Reg.getIdentifier()); 4487 } else if (Reg.is(AsmToken::Integer)) { 4488 AtRegNo = Reg.getIntVal(); 4489 } else { 4490 reportParseError("unexpected token, expected identifier or integer"); 4491 return false; 4492 } 4493 4494 // Check if $reg is a valid register. If it is, set $at to $reg. 4495 if (!AssemblerOptions.back()->setATRegIndex(AtRegNo)) { 4496 reportParseError("invalid register"); 4497 return false; 4498 } 4499 Parser.Lex(); // Eat "reg". 4500 4501 // If this is not the end of the statement, report an error. 4502 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4503 reportParseError("unexpected token, expected end of statement"); 4504 return false; 4505 } 4506 4507 getTargetStreamer().emitDirectiveSetAtWithArg(AtRegNo); 4508 4509 Parser.Lex(); // Consume the EndOfStatement. 4510 return false; 4511 } 4512 4513 bool MipsAsmParser::parseSetReorderDirective() { 4514 MCAsmParser &Parser = getParser(); 4515 Parser.Lex(); 4516 // If this is not the end of the statement, report an error. 4517 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4518 reportParseError("unexpected token, expected end of statement"); 4519 return false; 4520 } 4521 AssemblerOptions.back()->setReorder(); 4522 getTargetStreamer().emitDirectiveSetReorder(); 4523 Parser.Lex(); // Consume the EndOfStatement. 4524 return false; 4525 } 4526 4527 bool MipsAsmParser::parseSetNoReorderDirective() { 4528 MCAsmParser &Parser = getParser(); 4529 Parser.Lex(); 4530 // If this is not the end of the statement, report an error. 4531 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4532 reportParseError("unexpected token, expected end of statement"); 4533 return false; 4534 } 4535 AssemblerOptions.back()->setNoReorder(); 4536 getTargetStreamer().emitDirectiveSetNoReorder(); 4537 Parser.Lex(); // Consume the EndOfStatement. 4538 return false; 4539 } 4540 4541 bool MipsAsmParser::parseSetMacroDirective() { 4542 MCAsmParser &Parser = getParser(); 4543 Parser.Lex(); 4544 // If this is not the end of the statement, report an error. 4545 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4546 reportParseError("unexpected token, expected end of statement"); 4547 return false; 4548 } 4549 AssemblerOptions.back()->setMacro(); 4550 getTargetStreamer().emitDirectiveSetMacro(); 4551 Parser.Lex(); // Consume the EndOfStatement. 4552 return false; 4553 } 4554 4555 bool MipsAsmParser::parseSetNoMacroDirective() { 4556 MCAsmParser &Parser = getParser(); 4557 Parser.Lex(); 4558 // If this is not the end of the statement, report an error. 4559 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4560 reportParseError("unexpected token, expected end of statement"); 4561 return false; 4562 } 4563 if (AssemblerOptions.back()->isReorder()) { 4564 reportParseError("`noreorder' must be set before `nomacro'"); 4565 return false; 4566 } 4567 AssemblerOptions.back()->setNoMacro(); 4568 getTargetStreamer().emitDirectiveSetNoMacro(); 4569 Parser.Lex(); // Consume the EndOfStatement. 4570 return false; 4571 } 4572 4573 bool MipsAsmParser::parseSetMsaDirective() { 4574 MCAsmParser &Parser = getParser(); 4575 Parser.Lex(); 4576 4577 // If this is not the end of the statement, report an error. 4578 if (getLexer().isNot(AsmToken::EndOfStatement)) 4579 return reportParseError("unexpected token, expected end of statement"); 4580 4581 setFeatureBits(Mips::FeatureMSA, "msa"); 4582 getTargetStreamer().emitDirectiveSetMsa(); 4583 return false; 4584 } 4585 4586 bool MipsAsmParser::parseSetNoMsaDirective() { 4587 MCAsmParser &Parser = getParser(); 4588 Parser.Lex(); 4589 4590 // If this is not the end of the statement, report an error. 4591 if (getLexer().isNot(AsmToken::EndOfStatement)) 4592 return reportParseError("unexpected token, expected end of statement"); 4593 4594 clearFeatureBits(Mips::FeatureMSA, "msa"); 4595 getTargetStreamer().emitDirectiveSetNoMsa(); 4596 return false; 4597 } 4598 4599 bool MipsAsmParser::parseSetNoDspDirective() { 4600 MCAsmParser &Parser = getParser(); 4601 Parser.Lex(); // Eat "nodsp". 4602 4603 // If this is not the end of the statement, report an error. 4604 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4605 reportParseError("unexpected token, expected end of statement"); 4606 return false; 4607 } 4608 4609 clearFeatureBits(Mips::FeatureDSP, "dsp"); 4610 getTargetStreamer().emitDirectiveSetNoDsp(); 4611 return false; 4612 } 4613 4614 bool MipsAsmParser::parseSetMips16Directive() { 4615 MCAsmParser &Parser = getParser(); 4616 Parser.Lex(); // Eat "mips16". 4617 4618 // If this is not the end of the statement, report an error. 4619 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4620 reportParseError("unexpected token, expected end of statement"); 4621 return false; 4622 } 4623 4624 setFeatureBits(Mips::FeatureMips16, "mips16"); 4625 getTargetStreamer().emitDirectiveSetMips16(); 4626 Parser.Lex(); // Consume the EndOfStatement. 4627 return false; 4628 } 4629 4630 bool MipsAsmParser::parseSetNoMips16Directive() { 4631 MCAsmParser &Parser = getParser(); 4632 Parser.Lex(); // Eat "nomips16". 4633 4634 // If this is not the end of the statement, report an error. 4635 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4636 reportParseError("unexpected token, expected end of statement"); 4637 return false; 4638 } 4639 4640 clearFeatureBits(Mips::FeatureMips16, "mips16"); 4641 getTargetStreamer().emitDirectiveSetNoMips16(); 4642 Parser.Lex(); // Consume the EndOfStatement. 4643 return false; 4644 } 4645 4646 bool MipsAsmParser::parseSetFpDirective() { 4647 MCAsmParser &Parser = getParser(); 4648 MipsABIFlagsSection::FpABIKind FpAbiVal; 4649 // Line can be: .set fp=32 4650 // .set fp=xx 4651 // .set fp=64 4652 Parser.Lex(); // Eat fp token 4653 AsmToken Tok = Parser.getTok(); 4654 if (Tok.isNot(AsmToken::Equal)) { 4655 reportParseError("unexpected token, expected equals sign '='"); 4656 return false; 4657 } 4658 Parser.Lex(); // Eat '=' token. 4659 Tok = Parser.getTok(); 4660 4661 if (!parseFpABIValue(FpAbiVal, ".set")) 4662 return false; 4663 4664 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4665 reportParseError("unexpected token, expected end of statement"); 4666 return false; 4667 } 4668 getTargetStreamer().emitDirectiveSetFp(FpAbiVal); 4669 Parser.Lex(); // Consume the EndOfStatement. 4670 return false; 4671 } 4672 4673 bool MipsAsmParser::parseSetOddSPRegDirective() { 4674 MCAsmParser &Parser = getParser(); 4675 4676 Parser.Lex(); // Eat "oddspreg". 4677 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4678 reportParseError("unexpected token, expected end of statement"); 4679 return false; 4680 } 4681 4682 clearFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 4683 getTargetStreamer().emitDirectiveSetOddSPReg(); 4684 return false; 4685 } 4686 4687 bool MipsAsmParser::parseSetNoOddSPRegDirective() { 4688 MCAsmParser &Parser = getParser(); 4689 4690 Parser.Lex(); // Eat "nooddspreg". 4691 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4692 reportParseError("unexpected token, expected end of statement"); 4693 return false; 4694 } 4695 4696 setFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 4697 getTargetStreamer().emitDirectiveSetNoOddSPReg(); 4698 return false; 4699 } 4700 4701 bool MipsAsmParser::parseSetPopDirective() { 4702 MCAsmParser &Parser = getParser(); 4703 SMLoc Loc = getLexer().getLoc(); 4704 4705 Parser.Lex(); 4706 if (getLexer().isNot(AsmToken::EndOfStatement)) 4707 return reportParseError("unexpected token, expected end of statement"); 4708 4709 // Always keep an element on the options "stack" to prevent the user 4710 // from changing the initial options. This is how we remember them. 4711 if (AssemblerOptions.size() == 2) 4712 return reportParseError(Loc, ".set pop with no .set push"); 4713 4714 AssemblerOptions.pop_back(); 4715 setAvailableFeatures( 4716 ComputeAvailableFeatures(AssemblerOptions.back()->getFeatures())); 4717 STI.setFeatureBits(AssemblerOptions.back()->getFeatures()); 4718 4719 getTargetStreamer().emitDirectiveSetPop(); 4720 return false; 4721 } 4722 4723 bool MipsAsmParser::parseSetPushDirective() { 4724 MCAsmParser &Parser = getParser(); 4725 Parser.Lex(); 4726 if (getLexer().isNot(AsmToken::EndOfStatement)) 4727 return reportParseError("unexpected token, expected end of statement"); 4728 4729 // Create a copy of the current assembler options environment and push it. 4730 AssemblerOptions.push_back( 4731 make_unique<MipsAssemblerOptions>(AssemblerOptions.back().get())); 4732 4733 getTargetStreamer().emitDirectiveSetPush(); 4734 return false; 4735 } 4736 4737 bool MipsAsmParser::parseSetSoftFloatDirective() { 4738 MCAsmParser &Parser = getParser(); 4739 Parser.Lex(); 4740 if (getLexer().isNot(AsmToken::EndOfStatement)) 4741 return reportParseError("unexpected token, expected end of statement"); 4742 4743 setFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 4744 getTargetStreamer().emitDirectiveSetSoftFloat(); 4745 return false; 4746 } 4747 4748 bool MipsAsmParser::parseSetHardFloatDirective() { 4749 MCAsmParser &Parser = getParser(); 4750 Parser.Lex(); 4751 if (getLexer().isNot(AsmToken::EndOfStatement)) 4752 return reportParseError("unexpected token, expected end of statement"); 4753 4754 clearFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 4755 getTargetStreamer().emitDirectiveSetHardFloat(); 4756 return false; 4757 } 4758 4759 bool MipsAsmParser::parseSetAssignment() { 4760 StringRef Name; 4761 const MCExpr *Value; 4762 MCAsmParser &Parser = getParser(); 4763 4764 if (Parser.parseIdentifier(Name)) 4765 reportParseError("expected identifier after .set"); 4766 4767 if (getLexer().isNot(AsmToken::Comma)) 4768 return reportParseError("unexpected token, expected comma"); 4769 Lex(); // Eat comma 4770 4771 if (Parser.parseExpression(Value)) 4772 return reportParseError("expected valid expression after comma"); 4773 4774 MCSymbol *Sym = getContext().getOrCreateSymbol(Name); 4775 Sym->setVariableValue(Value); 4776 4777 return false; 4778 } 4779 4780 bool MipsAsmParser::parseSetMips0Directive() { 4781 MCAsmParser &Parser = getParser(); 4782 Parser.Lex(); 4783 if (getLexer().isNot(AsmToken::EndOfStatement)) 4784 return reportParseError("unexpected token, expected end of statement"); 4785 4786 // Reset assembler options to their initial values. 4787 setAvailableFeatures( 4788 ComputeAvailableFeatures(AssemblerOptions.front()->getFeatures())); 4789 STI.setFeatureBits(AssemblerOptions.front()->getFeatures()); 4790 AssemblerOptions.back()->setFeatures(AssemblerOptions.front()->getFeatures()); 4791 4792 getTargetStreamer().emitDirectiveSetMips0(); 4793 return false; 4794 } 4795 4796 bool MipsAsmParser::parseSetArchDirective() { 4797 MCAsmParser &Parser = getParser(); 4798 Parser.Lex(); 4799 if (getLexer().isNot(AsmToken::Equal)) 4800 return reportParseError("unexpected token, expected equals sign"); 4801 4802 Parser.Lex(); 4803 StringRef Arch; 4804 if (Parser.parseIdentifier(Arch)) 4805 return reportParseError("expected arch identifier"); 4806 4807 StringRef ArchFeatureName = 4808 StringSwitch<StringRef>(Arch) 4809 .Case("mips1", "mips1") 4810 .Case("mips2", "mips2") 4811 .Case("mips3", "mips3") 4812 .Case("mips4", "mips4") 4813 .Case("mips5", "mips5") 4814 .Case("mips32", "mips32") 4815 .Case("mips32r2", "mips32r2") 4816 .Case("mips32r3", "mips32r3") 4817 .Case("mips32r5", "mips32r5") 4818 .Case("mips32r6", "mips32r6") 4819 .Case("mips64", "mips64") 4820 .Case("mips64r2", "mips64r2") 4821 .Case("mips64r3", "mips64r3") 4822 .Case("mips64r5", "mips64r5") 4823 .Case("mips64r6", "mips64r6") 4824 .Case("cnmips", "cnmips") 4825 .Case("r4000", "mips3") // This is an implementation of Mips3. 4826 .Default(""); 4827 4828 if (ArchFeatureName.empty()) 4829 return reportParseError("unsupported architecture"); 4830 4831 selectArch(ArchFeatureName); 4832 getTargetStreamer().emitDirectiveSetArch(Arch); 4833 return false; 4834 } 4835 4836 bool MipsAsmParser::parseSetFeature(uint64_t Feature) { 4837 MCAsmParser &Parser = getParser(); 4838 Parser.Lex(); 4839 if (getLexer().isNot(AsmToken::EndOfStatement)) 4840 return reportParseError("unexpected token, expected end of statement"); 4841 4842 switch (Feature) { 4843 default: 4844 llvm_unreachable("Unimplemented feature"); 4845 case Mips::FeatureDSP: 4846 setFeatureBits(Mips::FeatureDSP, "dsp"); 4847 getTargetStreamer().emitDirectiveSetDsp(); 4848 break; 4849 case Mips::FeatureMicroMips: 4850 getTargetStreamer().emitDirectiveSetMicroMips(); 4851 break; 4852 case Mips::FeatureMips1: 4853 selectArch("mips1"); 4854 getTargetStreamer().emitDirectiveSetMips1(); 4855 break; 4856 case Mips::FeatureMips2: 4857 selectArch("mips2"); 4858 getTargetStreamer().emitDirectiveSetMips2(); 4859 break; 4860 case Mips::FeatureMips3: 4861 selectArch("mips3"); 4862 getTargetStreamer().emitDirectiveSetMips3(); 4863 break; 4864 case Mips::FeatureMips4: 4865 selectArch("mips4"); 4866 getTargetStreamer().emitDirectiveSetMips4(); 4867 break; 4868 case Mips::FeatureMips5: 4869 selectArch("mips5"); 4870 getTargetStreamer().emitDirectiveSetMips5(); 4871 break; 4872 case Mips::FeatureMips32: 4873 selectArch("mips32"); 4874 getTargetStreamer().emitDirectiveSetMips32(); 4875 break; 4876 case Mips::FeatureMips32r2: 4877 selectArch("mips32r2"); 4878 getTargetStreamer().emitDirectiveSetMips32R2(); 4879 break; 4880 case Mips::FeatureMips32r3: 4881 selectArch("mips32r3"); 4882 getTargetStreamer().emitDirectiveSetMips32R3(); 4883 break; 4884 case Mips::FeatureMips32r5: 4885 selectArch("mips32r5"); 4886 getTargetStreamer().emitDirectiveSetMips32R5(); 4887 break; 4888 case Mips::FeatureMips32r6: 4889 selectArch("mips32r6"); 4890 getTargetStreamer().emitDirectiveSetMips32R6(); 4891 break; 4892 case Mips::FeatureMips64: 4893 selectArch("mips64"); 4894 getTargetStreamer().emitDirectiveSetMips64(); 4895 break; 4896 case Mips::FeatureMips64r2: 4897 selectArch("mips64r2"); 4898 getTargetStreamer().emitDirectiveSetMips64R2(); 4899 break; 4900 case Mips::FeatureMips64r3: 4901 selectArch("mips64r3"); 4902 getTargetStreamer().emitDirectiveSetMips64R3(); 4903 break; 4904 case Mips::FeatureMips64r5: 4905 selectArch("mips64r5"); 4906 getTargetStreamer().emitDirectiveSetMips64R5(); 4907 break; 4908 case Mips::FeatureMips64r6: 4909 selectArch("mips64r6"); 4910 getTargetStreamer().emitDirectiveSetMips64R6(); 4911 break; 4912 } 4913 return false; 4914 } 4915 4916 bool MipsAsmParser::eatComma(StringRef ErrorStr) { 4917 MCAsmParser &Parser = getParser(); 4918 if (getLexer().isNot(AsmToken::Comma)) { 4919 SMLoc Loc = getLexer().getLoc(); 4920 Parser.eatToEndOfStatement(); 4921 return Error(Loc, ErrorStr); 4922 } 4923 4924 Parser.Lex(); // Eat the comma. 4925 return true; 4926 } 4927 4928 // Used to determine if .cpload, .cprestore, and .cpsetup have any effect. 4929 // In this class, it is only used for .cprestore. 4930 // FIXME: Only keep track of IsPicEnabled in one place, instead of in both 4931 // MipsTargetELFStreamer and MipsAsmParser. 4932 bool MipsAsmParser::isPicAndNotNxxAbi() { 4933 return inPicMode() && !(isABI_N32() || isABI_N64()); 4934 } 4935 4936 bool MipsAsmParser::parseDirectiveCpLoad(SMLoc Loc) { 4937 if (AssemblerOptions.back()->isReorder()) 4938 Warning(Loc, ".cpload should be inside a noreorder section"); 4939 4940 if (inMips16Mode()) { 4941 reportParseError(".cpload is not supported in Mips16 mode"); 4942 return false; 4943 } 4944 4945 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> Reg; 4946 OperandMatchResultTy ResTy = parseAnyRegister(Reg); 4947 if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) { 4948 reportParseError("expected register containing function address"); 4949 return false; 4950 } 4951 4952 MipsOperand &RegOpnd = static_cast<MipsOperand &>(*Reg[0]); 4953 if (!RegOpnd.isGPRAsmReg()) { 4954 reportParseError(RegOpnd.getStartLoc(), "invalid register"); 4955 return false; 4956 } 4957 4958 // If this is not the end of the statement, report an error. 4959 if (getLexer().isNot(AsmToken::EndOfStatement)) { 4960 reportParseError("unexpected token, expected end of statement"); 4961 return false; 4962 } 4963 4964 getTargetStreamer().emitDirectiveCpLoad(RegOpnd.getGPR32Reg()); 4965 return false; 4966 } 4967 4968 bool MipsAsmParser::parseDirectiveCpRestore(SMLoc Loc) { 4969 MCAsmParser &Parser = getParser(); 4970 4971 // Note that .cprestore is ignored if used with the N32 and N64 ABIs or if it 4972 // is used in non-PIC mode. 4973 4974 if (inMips16Mode()) { 4975 reportParseError(".cprestore is not supported in Mips16 mode"); 4976 return false; 4977 } 4978 4979 // Get the stack offset value. 4980 const MCExpr *StackOffset; 4981 int64_t StackOffsetVal; 4982 if (Parser.parseExpression(StackOffset)) { 4983 reportParseError("expected stack offset value"); 4984 return false; 4985 } 4986 4987 if (!StackOffset->evaluateAsAbsolute(StackOffsetVal)) { 4988 reportParseError("stack offset is not an absolute expression"); 4989 return false; 4990 } 4991 4992 if (StackOffsetVal < 0) { 4993 Warning(Loc, ".cprestore with negative stack offset has no effect"); 4994 IsCpRestoreSet = false; 4995 } else { 4996 IsCpRestoreSet = true; 4997 CpRestoreOffset = StackOffsetVal; 4998 } 4999 5000 // If this is not the end of the statement, report an error. 5001 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5002 reportParseError("unexpected token, expected end of statement"); 5003 return false; 5004 } 5005 5006 // Store the $gp on the stack. 5007 SmallVector<MCInst, 3> StoreInsts; 5008 createCpRestoreMemOp(false /*IsLoad*/, CpRestoreOffset /*StackOffset*/, Loc, 5009 StoreInsts); 5010 5011 getTargetStreamer().emitDirectiveCpRestore(StoreInsts, CpRestoreOffset); 5012 Parser.Lex(); // Consume the EndOfStatement. 5013 return false; 5014 } 5015 5016 bool MipsAsmParser::parseDirectiveCPSetup() { 5017 MCAsmParser &Parser = getParser(); 5018 unsigned FuncReg; 5019 unsigned Save; 5020 bool SaveIsReg = true; 5021 5022 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg; 5023 OperandMatchResultTy ResTy = parseAnyRegister(TmpReg); 5024 if (ResTy == MatchOperand_NoMatch) { 5025 reportParseError("expected register containing function address"); 5026 Parser.eatToEndOfStatement(); 5027 return false; 5028 } 5029 5030 MipsOperand &FuncRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 5031 if (!FuncRegOpnd.isGPRAsmReg()) { 5032 reportParseError(FuncRegOpnd.getStartLoc(), "invalid register"); 5033 Parser.eatToEndOfStatement(); 5034 return false; 5035 } 5036 5037 FuncReg = FuncRegOpnd.getGPR32Reg(); 5038 TmpReg.clear(); 5039 5040 if (!eatComma("unexpected token, expected comma")) 5041 return true; 5042 5043 ResTy = parseAnyRegister(TmpReg); 5044 if (ResTy == MatchOperand_NoMatch) { 5045 const MCExpr *OffsetExpr; 5046 int64_t OffsetVal; 5047 SMLoc ExprLoc = getLexer().getLoc(); 5048 5049 if (Parser.parseExpression(OffsetExpr) || 5050 !OffsetExpr->evaluateAsAbsolute(OffsetVal)) { 5051 reportParseError(ExprLoc, "expected save register or stack offset"); 5052 Parser.eatToEndOfStatement(); 5053 return false; 5054 } 5055 5056 Save = OffsetVal; 5057 SaveIsReg = false; 5058 } else { 5059 MipsOperand &SaveOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 5060 if (!SaveOpnd.isGPRAsmReg()) { 5061 reportParseError(SaveOpnd.getStartLoc(), "invalid register"); 5062 Parser.eatToEndOfStatement(); 5063 return false; 5064 } 5065 Save = SaveOpnd.getGPR32Reg(); 5066 } 5067 5068 if (!eatComma("unexpected token, expected comma")) 5069 return true; 5070 5071 const MCExpr *Expr; 5072 if (Parser.parseExpression(Expr)) { 5073 reportParseError("expected expression"); 5074 return false; 5075 } 5076 5077 if (Expr->getKind() != MCExpr::SymbolRef) { 5078 reportParseError("expected symbol"); 5079 return false; 5080 } 5081 const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr); 5082 5083 CpSaveLocation = Save; 5084 CpSaveLocationIsRegister = SaveIsReg; 5085 5086 getTargetStreamer().emitDirectiveCpsetup(FuncReg, Save, Ref->getSymbol(), 5087 SaveIsReg); 5088 return false; 5089 } 5090 5091 bool MipsAsmParser::parseDirectiveCPReturn() { 5092 getTargetStreamer().emitDirectiveCpreturn(CpSaveLocation, 5093 CpSaveLocationIsRegister); 5094 return false; 5095 } 5096 5097 bool MipsAsmParser::parseDirectiveNaN() { 5098 MCAsmParser &Parser = getParser(); 5099 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5100 const AsmToken &Tok = Parser.getTok(); 5101 5102 if (Tok.getString() == "2008") { 5103 Parser.Lex(); 5104 getTargetStreamer().emitDirectiveNaN2008(); 5105 return false; 5106 } else if (Tok.getString() == "legacy") { 5107 Parser.Lex(); 5108 getTargetStreamer().emitDirectiveNaNLegacy(); 5109 return false; 5110 } 5111 } 5112 // If we don't recognize the option passed to the .nan 5113 // directive (e.g. no option or unknown option), emit an error. 5114 reportParseError("invalid option in .nan directive"); 5115 return false; 5116 } 5117 5118 bool MipsAsmParser::parseDirectiveSet() { 5119 MCAsmParser &Parser = getParser(); 5120 // Get the next token. 5121 const AsmToken &Tok = Parser.getTok(); 5122 5123 if (Tok.getString() == "noat") { 5124 return parseSetNoAtDirective(); 5125 } else if (Tok.getString() == "at") { 5126 return parseSetAtDirective(); 5127 } else if (Tok.getString() == "arch") { 5128 return parseSetArchDirective(); 5129 } else if (Tok.getString() == "fp") { 5130 return parseSetFpDirective(); 5131 } else if (Tok.getString() == "oddspreg") { 5132 return parseSetOddSPRegDirective(); 5133 } else if (Tok.getString() == "nooddspreg") { 5134 return parseSetNoOddSPRegDirective(); 5135 } else if (Tok.getString() == "pop") { 5136 return parseSetPopDirective(); 5137 } else if (Tok.getString() == "push") { 5138 return parseSetPushDirective(); 5139 } else if (Tok.getString() == "reorder") { 5140 return parseSetReorderDirective(); 5141 } else if (Tok.getString() == "noreorder") { 5142 return parseSetNoReorderDirective(); 5143 } else if (Tok.getString() == "macro") { 5144 return parseSetMacroDirective(); 5145 } else if (Tok.getString() == "nomacro") { 5146 return parseSetNoMacroDirective(); 5147 } else if (Tok.getString() == "mips16") { 5148 return parseSetMips16Directive(); 5149 } else if (Tok.getString() == "nomips16") { 5150 return parseSetNoMips16Directive(); 5151 } else if (Tok.getString() == "nomicromips") { 5152 getTargetStreamer().emitDirectiveSetNoMicroMips(); 5153 Parser.eatToEndOfStatement(); 5154 return false; 5155 } else if (Tok.getString() == "micromips") { 5156 return parseSetFeature(Mips::FeatureMicroMips); 5157 } else if (Tok.getString() == "mips0") { 5158 return parseSetMips0Directive(); 5159 } else if (Tok.getString() == "mips1") { 5160 return parseSetFeature(Mips::FeatureMips1); 5161 } else if (Tok.getString() == "mips2") { 5162 return parseSetFeature(Mips::FeatureMips2); 5163 } else if (Tok.getString() == "mips3") { 5164 return parseSetFeature(Mips::FeatureMips3); 5165 } else if (Tok.getString() == "mips4") { 5166 return parseSetFeature(Mips::FeatureMips4); 5167 } else if (Tok.getString() == "mips5") { 5168 return parseSetFeature(Mips::FeatureMips5); 5169 } else if (Tok.getString() == "mips32") { 5170 return parseSetFeature(Mips::FeatureMips32); 5171 } else if (Tok.getString() == "mips32r2") { 5172 return parseSetFeature(Mips::FeatureMips32r2); 5173 } else if (Tok.getString() == "mips32r3") { 5174 return parseSetFeature(Mips::FeatureMips32r3); 5175 } else if (Tok.getString() == "mips32r5") { 5176 return parseSetFeature(Mips::FeatureMips32r5); 5177 } else if (Tok.getString() == "mips32r6") { 5178 return parseSetFeature(Mips::FeatureMips32r6); 5179 } else if (Tok.getString() == "mips64") { 5180 return parseSetFeature(Mips::FeatureMips64); 5181 } else if (Tok.getString() == "mips64r2") { 5182 return parseSetFeature(Mips::FeatureMips64r2); 5183 } else if (Tok.getString() == "mips64r3") { 5184 return parseSetFeature(Mips::FeatureMips64r3); 5185 } else if (Tok.getString() == "mips64r5") { 5186 return parseSetFeature(Mips::FeatureMips64r5); 5187 } else if (Tok.getString() == "mips64r6") { 5188 return parseSetFeature(Mips::FeatureMips64r6); 5189 } else if (Tok.getString() == "dsp") { 5190 return parseSetFeature(Mips::FeatureDSP); 5191 } else if (Tok.getString() == "nodsp") { 5192 return parseSetNoDspDirective(); 5193 } else if (Tok.getString() == "msa") { 5194 return parseSetMsaDirective(); 5195 } else if (Tok.getString() == "nomsa") { 5196 return parseSetNoMsaDirective(); 5197 } else if (Tok.getString() == "softfloat") { 5198 return parseSetSoftFloatDirective(); 5199 } else if (Tok.getString() == "hardfloat") { 5200 return parseSetHardFloatDirective(); 5201 } else { 5202 // It is just an identifier, look for an assignment. 5203 parseSetAssignment(); 5204 return false; 5205 } 5206 5207 return true; 5208 } 5209 5210 /// parseDataDirective 5211 /// ::= .word [ expression (, expression)* ] 5212 bool MipsAsmParser::parseDataDirective(unsigned Size, SMLoc L) { 5213 MCAsmParser &Parser = getParser(); 5214 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5215 for (;;) { 5216 const MCExpr *Value; 5217 if (getParser().parseExpression(Value)) 5218 return true; 5219 5220 getParser().getStreamer().EmitValue(Value, Size); 5221 5222 if (getLexer().is(AsmToken::EndOfStatement)) 5223 break; 5224 5225 if (getLexer().isNot(AsmToken::Comma)) 5226 return Error(L, "unexpected token, expected comma"); 5227 Parser.Lex(); 5228 } 5229 } 5230 5231 Parser.Lex(); 5232 return false; 5233 } 5234 5235 /// parseDirectiveGpWord 5236 /// ::= .gpword local_sym 5237 bool MipsAsmParser::parseDirectiveGpWord() { 5238 MCAsmParser &Parser = getParser(); 5239 const MCExpr *Value; 5240 // EmitGPRel32Value requires an expression, so we are using base class 5241 // method to evaluate the expression. 5242 if (getParser().parseExpression(Value)) 5243 return true; 5244 getParser().getStreamer().EmitGPRel32Value(Value); 5245 5246 if (getLexer().isNot(AsmToken::EndOfStatement)) 5247 return Error(getLexer().getLoc(), 5248 "unexpected token, expected end of statement"); 5249 Parser.Lex(); // Eat EndOfStatement token. 5250 return false; 5251 } 5252 5253 /// parseDirectiveGpDWord 5254 /// ::= .gpdword local_sym 5255 bool MipsAsmParser::parseDirectiveGpDWord() { 5256 MCAsmParser &Parser = getParser(); 5257 const MCExpr *Value; 5258 // EmitGPRel64Value requires an expression, so we are using base class 5259 // method to evaluate the expression. 5260 if (getParser().parseExpression(Value)) 5261 return true; 5262 getParser().getStreamer().EmitGPRel64Value(Value); 5263 5264 if (getLexer().isNot(AsmToken::EndOfStatement)) 5265 return Error(getLexer().getLoc(), 5266 "unexpected token, expected end of statement"); 5267 Parser.Lex(); // Eat EndOfStatement token. 5268 return false; 5269 } 5270 5271 bool MipsAsmParser::parseDirectiveOption() { 5272 MCAsmParser &Parser = getParser(); 5273 // Get the option token. 5274 AsmToken Tok = Parser.getTok(); 5275 // At the moment only identifiers are supported. 5276 if (Tok.isNot(AsmToken::Identifier)) { 5277 Error(Parser.getTok().getLoc(), "unexpected token, expected identifier"); 5278 Parser.eatToEndOfStatement(); 5279 return false; 5280 } 5281 5282 StringRef Option = Tok.getIdentifier(); 5283 5284 if (Option == "pic0") { 5285 // MipsAsmParser needs to know if the current PIC mode changes. 5286 IsPicEnabled = false; 5287 5288 getTargetStreamer().emitDirectiveOptionPic0(); 5289 Parser.Lex(); 5290 if (Parser.getTok().isNot(AsmToken::EndOfStatement)) { 5291 Error(Parser.getTok().getLoc(), 5292 "unexpected token, expected end of statement"); 5293 Parser.eatToEndOfStatement(); 5294 } 5295 return false; 5296 } 5297 5298 if (Option == "pic2") { 5299 // MipsAsmParser needs to know if the current PIC mode changes. 5300 IsPicEnabled = true; 5301 5302 getTargetStreamer().emitDirectiveOptionPic2(); 5303 Parser.Lex(); 5304 if (Parser.getTok().isNot(AsmToken::EndOfStatement)) { 5305 Error(Parser.getTok().getLoc(), 5306 "unexpected token, expected end of statement"); 5307 Parser.eatToEndOfStatement(); 5308 } 5309 return false; 5310 } 5311 5312 // Unknown option. 5313 Warning(Parser.getTok().getLoc(), 5314 "unknown option, expected 'pic0' or 'pic2'"); 5315 Parser.eatToEndOfStatement(); 5316 return false; 5317 } 5318 5319 /// parseInsnDirective 5320 /// ::= .insn 5321 bool MipsAsmParser::parseInsnDirective() { 5322 // If this is not the end of the statement, report an error. 5323 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5324 reportParseError("unexpected token, expected end of statement"); 5325 return false; 5326 } 5327 5328 // The actual label marking happens in 5329 // MipsELFStreamer::createPendingLabelRelocs(). 5330 getTargetStreamer().emitDirectiveInsn(); 5331 5332 getParser().Lex(); // Eat EndOfStatement token. 5333 return false; 5334 } 5335 5336 /// parseDirectiveModule 5337 /// ::= .module oddspreg 5338 /// ::= .module nooddspreg 5339 /// ::= .module fp=value 5340 /// ::= .module softfloat 5341 /// ::= .module hardfloat 5342 bool MipsAsmParser::parseDirectiveModule() { 5343 MCAsmParser &Parser = getParser(); 5344 MCAsmLexer &Lexer = getLexer(); 5345 SMLoc L = Lexer.getLoc(); 5346 5347 if (!getTargetStreamer().isModuleDirectiveAllowed()) { 5348 // TODO : get a better message. 5349 reportParseError(".module directive must appear before any code"); 5350 return false; 5351 } 5352 5353 StringRef Option; 5354 if (Parser.parseIdentifier(Option)) { 5355 reportParseError("expected .module option identifier"); 5356 return false; 5357 } 5358 5359 if (Option == "oddspreg") { 5360 clearModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 5361 5362 // Synchronize the abiflags information with the FeatureBits information we 5363 // changed above. 5364 getTargetStreamer().updateABIInfo(*this); 5365 5366 // If printing assembly, use the recently updated abiflags information. 5367 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 5368 // emitted at the end). 5369 getTargetStreamer().emitDirectiveModuleOddSPReg(); 5370 5371 // If this is not the end of the statement, report an error. 5372 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5373 reportParseError("unexpected token, expected end of statement"); 5374 return false; 5375 } 5376 5377 return false; // parseDirectiveModule has finished successfully. 5378 } else if (Option == "nooddspreg") { 5379 if (!isABI_O32()) { 5380 Error(L, "'.module nooddspreg' requires the O32 ABI"); 5381 return false; 5382 } 5383 5384 setModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 5385 5386 // Synchronize the abiflags information with the FeatureBits information we 5387 // changed above. 5388 getTargetStreamer().updateABIInfo(*this); 5389 5390 // If printing assembly, use the recently updated abiflags information. 5391 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 5392 // emitted at the end). 5393 getTargetStreamer().emitDirectiveModuleOddSPReg(); 5394 5395 // If this is not the end of the statement, report an error. 5396 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5397 reportParseError("unexpected token, expected end of statement"); 5398 return false; 5399 } 5400 5401 return false; // parseDirectiveModule has finished successfully. 5402 } else if (Option == "fp") { 5403 return parseDirectiveModuleFP(); 5404 } else if (Option == "softfloat") { 5405 setModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 5406 5407 // Synchronize the ABI Flags information with the FeatureBits information we 5408 // updated above. 5409 getTargetStreamer().updateABIInfo(*this); 5410 5411 // If printing assembly, use the recently updated ABI Flags information. 5412 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 5413 // emitted later). 5414 getTargetStreamer().emitDirectiveModuleSoftFloat(); 5415 5416 // If this is not the end of the statement, report an error. 5417 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5418 reportParseError("unexpected token, expected end of statement"); 5419 return false; 5420 } 5421 5422 return false; // parseDirectiveModule has finished successfully. 5423 } else if (Option == "hardfloat") { 5424 clearModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 5425 5426 // Synchronize the ABI Flags information with the FeatureBits information we 5427 // updated above. 5428 getTargetStreamer().updateABIInfo(*this); 5429 5430 // If printing assembly, use the recently updated ABI Flags information. 5431 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 5432 // emitted later). 5433 getTargetStreamer().emitDirectiveModuleHardFloat(); 5434 5435 // If this is not the end of the statement, report an error. 5436 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5437 reportParseError("unexpected token, expected end of statement"); 5438 return false; 5439 } 5440 5441 return false; // parseDirectiveModule has finished successfully. 5442 } else { 5443 return Error(L, "'" + Twine(Option) + "' is not a valid .module option."); 5444 } 5445 } 5446 5447 /// parseDirectiveModuleFP 5448 /// ::= =32 5449 /// ::= =xx 5450 /// ::= =64 5451 bool MipsAsmParser::parseDirectiveModuleFP() { 5452 MCAsmParser &Parser = getParser(); 5453 MCAsmLexer &Lexer = getLexer(); 5454 5455 if (Lexer.isNot(AsmToken::Equal)) { 5456 reportParseError("unexpected token, expected equals sign '='"); 5457 return false; 5458 } 5459 Parser.Lex(); // Eat '=' token. 5460 5461 MipsABIFlagsSection::FpABIKind FpABI; 5462 if (!parseFpABIValue(FpABI, ".module")) 5463 return false; 5464 5465 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5466 reportParseError("unexpected token, expected end of statement"); 5467 return false; 5468 } 5469 5470 // Synchronize the abiflags information with the FeatureBits information we 5471 // changed above. 5472 getTargetStreamer().updateABIInfo(*this); 5473 5474 // If printing assembly, use the recently updated abiflags information. 5475 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 5476 // emitted at the end). 5477 getTargetStreamer().emitDirectiveModuleFP(); 5478 5479 Parser.Lex(); // Consume the EndOfStatement. 5480 return false; 5481 } 5482 5483 bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI, 5484 StringRef Directive) { 5485 MCAsmParser &Parser = getParser(); 5486 MCAsmLexer &Lexer = getLexer(); 5487 bool ModuleLevelOptions = Directive == ".module"; 5488 5489 if (Lexer.is(AsmToken::Identifier)) { 5490 StringRef Value = Parser.getTok().getString(); 5491 Parser.Lex(); 5492 5493 if (Value != "xx") { 5494 reportParseError("unsupported value, expected 'xx', '32' or '64'"); 5495 return false; 5496 } 5497 5498 if (!isABI_O32()) { 5499 reportParseError("'" + Directive + " fp=xx' requires the O32 ABI"); 5500 return false; 5501 } 5502 5503 FpABI = MipsABIFlagsSection::FpABIKind::XX; 5504 if (ModuleLevelOptions) { 5505 setModuleFeatureBits(Mips::FeatureFPXX, "fpxx"); 5506 clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64"); 5507 } else { 5508 setFeatureBits(Mips::FeatureFPXX, "fpxx"); 5509 clearFeatureBits(Mips::FeatureFP64Bit, "fp64"); 5510 } 5511 return true; 5512 } 5513 5514 if (Lexer.is(AsmToken::Integer)) { 5515 unsigned Value = Parser.getTok().getIntVal(); 5516 Parser.Lex(); 5517 5518 if (Value != 32 && Value != 64) { 5519 reportParseError("unsupported value, expected 'xx', '32' or '64'"); 5520 return false; 5521 } 5522 5523 if (Value == 32) { 5524 if (!isABI_O32()) { 5525 reportParseError("'" + Directive + " fp=32' requires the O32 ABI"); 5526 return false; 5527 } 5528 5529 FpABI = MipsABIFlagsSection::FpABIKind::S32; 5530 if (ModuleLevelOptions) { 5531 clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx"); 5532 clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64"); 5533 } else { 5534 clearFeatureBits(Mips::FeatureFPXX, "fpxx"); 5535 clearFeatureBits(Mips::FeatureFP64Bit, "fp64"); 5536 } 5537 } else { 5538 FpABI = MipsABIFlagsSection::FpABIKind::S64; 5539 if (ModuleLevelOptions) { 5540 clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx"); 5541 setModuleFeatureBits(Mips::FeatureFP64Bit, "fp64"); 5542 } else { 5543 clearFeatureBits(Mips::FeatureFPXX, "fpxx"); 5544 setFeatureBits(Mips::FeatureFP64Bit, "fp64"); 5545 } 5546 } 5547 5548 return true; 5549 } 5550 5551 return false; 5552 } 5553 5554 bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) { 5555 MCAsmParser &Parser = getParser(); 5556 StringRef IDVal = DirectiveID.getString(); 5557 5558 if (IDVal == ".cpload") 5559 return parseDirectiveCpLoad(DirectiveID.getLoc()); 5560 if (IDVal == ".cprestore") 5561 return parseDirectiveCpRestore(DirectiveID.getLoc()); 5562 if (IDVal == ".dword") { 5563 parseDataDirective(8, DirectiveID.getLoc()); 5564 return false; 5565 } 5566 if (IDVal == ".ent") { 5567 StringRef SymbolName; 5568 5569 if (Parser.parseIdentifier(SymbolName)) { 5570 reportParseError("expected identifier after .ent"); 5571 return false; 5572 } 5573 5574 // There's an undocumented extension that allows an integer to 5575 // follow the name of the procedure which AFAICS is ignored by GAS. 5576 // Example: .ent foo,2 5577 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5578 if (getLexer().isNot(AsmToken::Comma)) { 5579 // Even though we accept this undocumented extension for compatibility 5580 // reasons, the additional integer argument does not actually change 5581 // the behaviour of the '.ent' directive, so we would like to discourage 5582 // its use. We do this by not referring to the extended version in 5583 // error messages which are not directly related to its use. 5584 reportParseError("unexpected token, expected end of statement"); 5585 return false; 5586 } 5587 Parser.Lex(); // Eat the comma. 5588 const MCExpr *DummyNumber; 5589 int64_t DummyNumberVal; 5590 // If the user was explicitly trying to use the extended version, 5591 // we still give helpful extension-related error messages. 5592 if (Parser.parseExpression(DummyNumber)) { 5593 reportParseError("expected number after comma"); 5594 return false; 5595 } 5596 if (!DummyNumber->evaluateAsAbsolute(DummyNumberVal)) { 5597 reportParseError("expected an absolute expression after comma"); 5598 return false; 5599 } 5600 } 5601 5602 // If this is not the end of the statement, report an error. 5603 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5604 reportParseError("unexpected token, expected end of statement"); 5605 return false; 5606 } 5607 5608 MCSymbol *Sym = getContext().getOrCreateSymbol(SymbolName); 5609 5610 getTargetStreamer().emitDirectiveEnt(*Sym); 5611 CurrentFn = Sym; 5612 IsCpRestoreSet = false; 5613 return false; 5614 } 5615 5616 if (IDVal == ".end") { 5617 StringRef SymbolName; 5618 5619 if (Parser.parseIdentifier(SymbolName)) { 5620 reportParseError("expected identifier after .end"); 5621 return false; 5622 } 5623 5624 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5625 reportParseError("unexpected token, expected end of statement"); 5626 return false; 5627 } 5628 5629 if (CurrentFn == nullptr) { 5630 reportParseError(".end used without .ent"); 5631 return false; 5632 } 5633 5634 if ((SymbolName != CurrentFn->getName())) { 5635 reportParseError(".end symbol does not match .ent symbol"); 5636 return false; 5637 } 5638 5639 getTargetStreamer().emitDirectiveEnd(SymbolName); 5640 CurrentFn = nullptr; 5641 IsCpRestoreSet = false; 5642 return false; 5643 } 5644 5645 if (IDVal == ".frame") { 5646 // .frame $stack_reg, frame_size_in_bytes, $return_reg 5647 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg; 5648 OperandMatchResultTy ResTy = parseAnyRegister(TmpReg); 5649 if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) { 5650 reportParseError("expected stack register"); 5651 return false; 5652 } 5653 5654 MipsOperand &StackRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 5655 if (!StackRegOpnd.isGPRAsmReg()) { 5656 reportParseError(StackRegOpnd.getStartLoc(), 5657 "expected general purpose register"); 5658 return false; 5659 } 5660 unsigned StackReg = StackRegOpnd.getGPR32Reg(); 5661 5662 if (Parser.getTok().is(AsmToken::Comma)) 5663 Parser.Lex(); 5664 else { 5665 reportParseError("unexpected token, expected comma"); 5666 return false; 5667 } 5668 5669 // Parse the frame size. 5670 const MCExpr *FrameSize; 5671 int64_t FrameSizeVal; 5672 5673 if (Parser.parseExpression(FrameSize)) { 5674 reportParseError("expected frame size value"); 5675 return false; 5676 } 5677 5678 if (!FrameSize->evaluateAsAbsolute(FrameSizeVal)) { 5679 reportParseError("frame size not an absolute expression"); 5680 return false; 5681 } 5682 5683 if (Parser.getTok().is(AsmToken::Comma)) 5684 Parser.Lex(); 5685 else { 5686 reportParseError("unexpected token, expected comma"); 5687 return false; 5688 } 5689 5690 // Parse the return register. 5691 TmpReg.clear(); 5692 ResTy = parseAnyRegister(TmpReg); 5693 if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) { 5694 reportParseError("expected return register"); 5695 return false; 5696 } 5697 5698 MipsOperand &ReturnRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 5699 if (!ReturnRegOpnd.isGPRAsmReg()) { 5700 reportParseError(ReturnRegOpnd.getStartLoc(), 5701 "expected general purpose register"); 5702 return false; 5703 } 5704 5705 // If this is not the end of the statement, report an error. 5706 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5707 reportParseError("unexpected token, expected end of statement"); 5708 return false; 5709 } 5710 5711 getTargetStreamer().emitFrame(StackReg, FrameSizeVal, 5712 ReturnRegOpnd.getGPR32Reg()); 5713 IsCpRestoreSet = false; 5714 return false; 5715 } 5716 5717 if (IDVal == ".set") { 5718 return parseDirectiveSet(); 5719 } 5720 5721 if (IDVal == ".mask" || IDVal == ".fmask") { 5722 // .mask bitmask, frame_offset 5723 // bitmask: One bit for each register used. 5724 // frame_offset: Offset from Canonical Frame Address ($sp on entry) where 5725 // first register is expected to be saved. 5726 // Examples: 5727 // .mask 0x80000000, -4 5728 // .fmask 0x80000000, -4 5729 // 5730 5731 // Parse the bitmask 5732 const MCExpr *BitMask; 5733 int64_t BitMaskVal; 5734 5735 if (Parser.parseExpression(BitMask)) { 5736 reportParseError("expected bitmask value"); 5737 return false; 5738 } 5739 5740 if (!BitMask->evaluateAsAbsolute(BitMaskVal)) { 5741 reportParseError("bitmask not an absolute expression"); 5742 return false; 5743 } 5744 5745 if (Parser.getTok().is(AsmToken::Comma)) 5746 Parser.Lex(); 5747 else { 5748 reportParseError("unexpected token, expected comma"); 5749 return false; 5750 } 5751 5752 // Parse the frame_offset 5753 const MCExpr *FrameOffset; 5754 int64_t FrameOffsetVal; 5755 5756 if (Parser.parseExpression(FrameOffset)) { 5757 reportParseError("expected frame offset value"); 5758 return false; 5759 } 5760 5761 if (!FrameOffset->evaluateAsAbsolute(FrameOffsetVal)) { 5762 reportParseError("frame offset not an absolute expression"); 5763 return false; 5764 } 5765 5766 // If this is not the end of the statement, report an error. 5767 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5768 reportParseError("unexpected token, expected end of statement"); 5769 return false; 5770 } 5771 5772 if (IDVal == ".mask") 5773 getTargetStreamer().emitMask(BitMaskVal, FrameOffsetVal); 5774 else 5775 getTargetStreamer().emitFMask(BitMaskVal, FrameOffsetVal); 5776 return false; 5777 } 5778 5779 if (IDVal == ".nan") 5780 return parseDirectiveNaN(); 5781 5782 if (IDVal == ".gpword") { 5783 parseDirectiveGpWord(); 5784 return false; 5785 } 5786 5787 if (IDVal == ".gpdword") { 5788 parseDirectiveGpDWord(); 5789 return false; 5790 } 5791 5792 if (IDVal == ".word") { 5793 parseDataDirective(4, DirectiveID.getLoc()); 5794 return false; 5795 } 5796 5797 if (IDVal == ".option") 5798 return parseDirectiveOption(); 5799 5800 if (IDVal == ".abicalls") { 5801 getTargetStreamer().emitDirectiveAbiCalls(); 5802 if (Parser.getTok().isNot(AsmToken::EndOfStatement)) { 5803 Error(Parser.getTok().getLoc(), 5804 "unexpected token, expected end of statement"); 5805 // Clear line 5806 Parser.eatToEndOfStatement(); 5807 } 5808 return false; 5809 } 5810 5811 if (IDVal == ".cpsetup") 5812 return parseDirectiveCPSetup(); 5813 5814 if (IDVal == ".cpreturn") 5815 return parseDirectiveCPReturn(); 5816 5817 if (IDVal == ".module") 5818 return parseDirectiveModule(); 5819 5820 if (IDVal == ".llvm_internal_mips_reallow_module_directive") 5821 return parseInternalDirectiveReallowModule(); 5822 5823 if (IDVal == ".insn") 5824 return parseInsnDirective(); 5825 5826 return true; 5827 } 5828 5829 bool MipsAsmParser::parseInternalDirectiveReallowModule() { 5830 // If this is not the end of the statement, report an error. 5831 if (getLexer().isNot(AsmToken::EndOfStatement)) { 5832 reportParseError("unexpected token, expected end of statement"); 5833 return false; 5834 } 5835 5836 getTargetStreamer().reallowModuleDirective(); 5837 5838 getParser().Lex(); // Eat EndOfStatement token. 5839 return false; 5840 } 5841 5842 extern "C" void LLVMInitializeMipsAsmParser() { 5843 RegisterMCAsmParser<MipsAsmParser> X(TheMipsTarget); 5844 RegisterMCAsmParser<MipsAsmParser> Y(TheMipselTarget); 5845 RegisterMCAsmParser<MipsAsmParser> A(TheMips64Target); 5846 RegisterMCAsmParser<MipsAsmParser> B(TheMips64elTarget); 5847 } 5848 5849 #define GET_REGISTER_MATCHER 5850 #define GET_MATCHER_IMPLEMENTATION 5851 #include "MipsGenAsmMatcher.inc" 5852