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/MipsABIFlagsSection.h" 11 #include "MCTargetDesc/MipsABIInfo.h" 12 #include "MCTargetDesc/MipsBaseInfo.h" 13 #include "MCTargetDesc/MipsMCExpr.h" 14 #include "MCTargetDesc/MipsMCTargetDesc.h" 15 #include "MipsTargetStreamer.h" 16 #include "llvm/ADT/APFloat.h" 17 #include "llvm/ADT/STLExtras.h" 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/ADT/StringRef.h" 20 #include "llvm/ADT/StringSwitch.h" 21 #include "llvm/ADT/Triple.h" 22 #include "llvm/ADT/Twine.h" 23 #include "llvm/BinaryFormat/ELF.h" 24 #include "llvm/MC/MCContext.h" 25 #include "llvm/MC/MCExpr.h" 26 #include "llvm/MC/MCInst.h" 27 #include "llvm/MC/MCInstrDesc.h" 28 #include "llvm/MC/MCObjectFileInfo.h" 29 #include "llvm/MC/MCParser/MCAsmLexer.h" 30 #include "llvm/MC/MCParser/MCAsmParser.h" 31 #include "llvm/MC/MCParser/MCAsmParserExtension.h" 32 #include "llvm/MC/MCParser/MCParsedAsmOperand.h" 33 #include "llvm/MC/MCParser/MCTargetAsmParser.h" 34 #include "llvm/MC/MCSectionELF.h" 35 #include "llvm/MC/MCStreamer.h" 36 #include "llvm/MC/MCSubtargetInfo.h" 37 #include "llvm/MC/MCSymbol.h" 38 #include "llvm/MC/MCSymbolELF.h" 39 #include "llvm/MC/MCValue.h" 40 #include "llvm/MC/SubtargetFeature.h" 41 #include "llvm/Support/Casting.h" 42 #include "llvm/Support/Compiler.h" 43 #include "llvm/Support/Debug.h" 44 #include "llvm/Support/ErrorHandling.h" 45 #include "llvm/Support/MathExtras.h" 46 #include "llvm/Support/SMLoc.h" 47 #include "llvm/Support/SourceMgr.h" 48 #include "llvm/Support/TargetRegistry.h" 49 #include "llvm/Support/raw_ostream.h" 50 #include <algorithm> 51 #include <cassert> 52 #include <cstdint> 53 #include <memory> 54 #include <string> 55 #include <utility> 56 57 using namespace llvm; 58 59 #define DEBUG_TYPE "mips-asm-parser" 60 61 namespace llvm { 62 63 class MCInstrInfo; 64 65 } // end namespace llvm 66 67 namespace { 68 69 class MipsAssemblerOptions { 70 public: 71 MipsAssemblerOptions(const FeatureBitset &Features_) : Features(Features_) {} 72 73 MipsAssemblerOptions(const MipsAssemblerOptions *Opts) { 74 ATReg = Opts->getATRegIndex(); 75 Reorder = Opts->isReorder(); 76 Macro = Opts->isMacro(); 77 Features = Opts->getFeatures(); 78 } 79 80 unsigned getATRegIndex() const { return ATReg; } 81 bool setATRegIndex(unsigned Reg) { 82 if (Reg > 31) 83 return false; 84 85 ATReg = Reg; 86 return true; 87 } 88 89 bool isReorder() const { return Reorder; } 90 void setReorder() { Reorder = true; } 91 void setNoReorder() { Reorder = false; } 92 93 bool isMacro() const { return Macro; } 94 void setMacro() { Macro = true; } 95 void setNoMacro() { Macro = false; } 96 97 const FeatureBitset &getFeatures() const { return Features; } 98 void setFeatures(const FeatureBitset &Features_) { Features = Features_; } 99 100 // Set of features that are either architecture features or referenced 101 // by them (e.g.: FeatureNaN2008 implied by FeatureMips32r6). 102 // The full table can be found in MipsGenSubtargetInfo.inc (MipsFeatureKV[]). 103 // The reason we need this mask is explained in the selectArch function. 104 // FIXME: Ideally we would like TableGen to generate this information. 105 static const FeatureBitset AllArchRelatedMask; 106 107 private: 108 unsigned ATReg = 1; 109 bool Reorder = true; 110 bool Macro = true; 111 FeatureBitset Features; 112 }; 113 114 } // end anonymous namespace 115 116 const FeatureBitset MipsAssemblerOptions::AllArchRelatedMask = { 117 Mips::FeatureMips1, Mips::FeatureMips2, Mips::FeatureMips3, 118 Mips::FeatureMips3_32, Mips::FeatureMips3_32r2, Mips::FeatureMips4, 119 Mips::FeatureMips4_32, Mips::FeatureMips4_32r2, Mips::FeatureMips5, 120 Mips::FeatureMips5_32r2, Mips::FeatureMips32, Mips::FeatureMips32r2, 121 Mips::FeatureMips32r3, Mips::FeatureMips32r5, Mips::FeatureMips32r6, 122 Mips::FeatureMips64, Mips::FeatureMips64r2, Mips::FeatureMips64r3, 123 Mips::FeatureMips64r5, Mips::FeatureMips64r6, Mips::FeatureCnMips, 124 Mips::FeatureFP64Bit, Mips::FeatureGP64Bit, Mips::FeatureNaN2008 125 }; 126 127 namespace { 128 129 class MipsAsmParser : public MCTargetAsmParser { 130 MipsTargetStreamer &getTargetStreamer() { 131 MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer(); 132 return static_cast<MipsTargetStreamer &>(TS); 133 } 134 135 MipsABIInfo ABI; 136 SmallVector<std::unique_ptr<MipsAssemblerOptions>, 2> AssemblerOptions; 137 MCSymbol *CurrentFn; // Pointer to the function being parsed. It may be a 138 // nullptr, which indicates that no function is currently 139 // selected. This usually happens after an '.end func' 140 // directive. 141 bool IsLittleEndian; 142 bool IsPicEnabled; 143 bool IsCpRestoreSet; 144 int CpRestoreOffset; 145 unsigned CpSaveLocation; 146 /// If true, then CpSaveLocation is a register, otherwise it's an offset. 147 bool CpSaveLocationIsRegister; 148 149 // Map of register aliases created via the .set directive. 150 StringMap<AsmToken> RegisterSets; 151 152 // Print a warning along with its fix-it message at the given range. 153 void printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg, 154 SMRange Range, bool ShowColors = true); 155 156 void ConvertXWPOperands(MCInst &Inst, const OperandVector &Operands); 157 158 #define GET_ASSEMBLER_HEADER 159 #include "MipsGenAsmMatcher.inc" 160 161 unsigned 162 checkEarlyTargetMatchPredicate(MCInst &Inst, 163 const OperandVector &Operands) override; 164 unsigned checkTargetMatchPredicate(MCInst &Inst) override; 165 166 bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 167 OperandVector &Operands, MCStreamer &Out, 168 uint64_t &ErrorInfo, 169 bool MatchingInlineAsm) override; 170 171 /// Parse a register as used in CFI directives 172 bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override; 173 174 bool parseParenSuffix(StringRef Name, OperandVector &Operands); 175 176 bool parseBracketSuffix(StringRef Name, OperandVector &Operands); 177 178 bool mnemonicIsValid(StringRef Mnemonic, unsigned VariantID); 179 180 bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name, 181 SMLoc NameLoc, OperandVector &Operands) override; 182 183 bool ParseDirective(AsmToken DirectiveID) override; 184 185 OperandMatchResultTy parseMemOperand(OperandVector &Operands); 186 OperandMatchResultTy 187 matchAnyRegisterNameWithoutDollar(OperandVector &Operands, 188 StringRef Identifier, SMLoc S); 189 OperandMatchResultTy matchAnyRegisterWithoutDollar(OperandVector &Operands, 190 const AsmToken &Token, 191 SMLoc S); 192 OperandMatchResultTy matchAnyRegisterWithoutDollar(OperandVector &Operands, 193 SMLoc S); 194 OperandMatchResultTy parseAnyRegister(OperandVector &Operands); 195 OperandMatchResultTy parseImm(OperandVector &Operands); 196 OperandMatchResultTy parseJumpTarget(OperandVector &Operands); 197 OperandMatchResultTy parseInvNum(OperandVector &Operands); 198 OperandMatchResultTy parseRegisterList(OperandVector &Operands); 199 200 bool searchSymbolAlias(OperandVector &Operands); 201 202 bool parseOperand(OperandVector &, StringRef Mnemonic); 203 204 enum MacroExpanderResultTy { 205 MER_NotAMacro, 206 MER_Success, 207 MER_Fail, 208 }; 209 210 // Expands assembly pseudo instructions. 211 MacroExpanderResultTy tryExpandInstruction(MCInst &Inst, SMLoc IDLoc, 212 MCStreamer &Out, 213 const MCSubtargetInfo *STI); 214 215 bool expandJalWithRegs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 216 const MCSubtargetInfo *STI); 217 218 bool loadImmediate(int64_t ImmValue, unsigned DstReg, unsigned SrcReg, 219 bool Is32BitImm, bool IsAddress, SMLoc IDLoc, 220 MCStreamer &Out, const MCSubtargetInfo *STI); 221 222 bool loadAndAddSymbolAddress(const MCExpr *SymExpr, unsigned DstReg, 223 unsigned SrcReg, bool Is32BitSym, SMLoc IDLoc, 224 MCStreamer &Out, const MCSubtargetInfo *STI); 225 226 bool emitPartialAddress(MipsTargetStreamer &TOut, SMLoc IDLoc, MCSymbol *Sym); 227 228 bool expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc, 229 MCStreamer &Out, const MCSubtargetInfo *STI); 230 231 bool expandLoadImmReal(MCInst &Inst, bool IsSingle, bool IsGPR, bool Is64FPU, 232 SMLoc IDLoc, MCStreamer &Out, 233 const MCSubtargetInfo *STI); 234 235 bool expandLoadAddress(unsigned DstReg, unsigned BaseReg, 236 const MCOperand &Offset, bool Is32BitAddress, 237 SMLoc IDLoc, MCStreamer &Out, 238 const MCSubtargetInfo *STI); 239 240 bool expandUncondBranchMMPseudo(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 241 const MCSubtargetInfo *STI); 242 243 void expandMemInst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 244 const MCSubtargetInfo *STI, bool IsLoad); 245 246 bool expandLoadStoreMultiple(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 247 const MCSubtargetInfo *STI); 248 249 bool expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 250 const MCSubtargetInfo *STI); 251 252 bool expandBranchImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 253 const MCSubtargetInfo *STI); 254 255 bool expandCondBranches(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 256 const MCSubtargetInfo *STI); 257 258 bool expandDivRem(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 259 const MCSubtargetInfo *STI, const bool IsMips64, 260 const bool Signed); 261 262 bool expandTrunc(MCInst &Inst, bool IsDouble, bool Is64FPU, SMLoc IDLoc, 263 MCStreamer &Out, const MCSubtargetInfo *STI); 264 265 bool expandUlh(MCInst &Inst, bool Signed, SMLoc IDLoc, MCStreamer &Out, 266 const MCSubtargetInfo *STI); 267 268 bool expandUsh(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 269 const MCSubtargetInfo *STI); 270 271 bool expandUxw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 272 const MCSubtargetInfo *STI); 273 274 bool expandRotation(MCInst &Inst, SMLoc IDLoc, 275 MCStreamer &Out, const MCSubtargetInfo *STI); 276 bool expandRotationImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 277 const MCSubtargetInfo *STI); 278 bool expandDRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 279 const MCSubtargetInfo *STI); 280 bool expandDRotationImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 281 const MCSubtargetInfo *STI); 282 283 bool expandAbs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 284 const MCSubtargetInfo *STI); 285 286 bool expandMulImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 287 const MCSubtargetInfo *STI); 288 289 bool expandMulO(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 290 const MCSubtargetInfo *STI); 291 292 bool expandMulOU(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 293 const MCSubtargetInfo *STI); 294 295 bool expandDMULMacro(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 296 const MCSubtargetInfo *STI); 297 298 bool expandLoadStoreDMacro(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 299 const MCSubtargetInfo *STI, bool IsLoad); 300 301 bool expandSeq(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 302 const MCSubtargetInfo *STI); 303 304 bool expandSeqI(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 305 const MCSubtargetInfo *STI); 306 307 bool expandMXTRAlias(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 308 const MCSubtargetInfo *STI); 309 310 bool reportParseError(Twine ErrorMsg); 311 bool reportParseError(SMLoc Loc, Twine ErrorMsg); 312 313 bool parseMemOffset(const MCExpr *&Res, bool isParenExpr); 314 315 bool isEvaluated(const MCExpr *Expr); 316 bool parseSetMips0Directive(); 317 bool parseSetArchDirective(); 318 bool parseSetFeature(uint64_t Feature); 319 bool isPicAndNotNxxAbi(); // Used by .cpload, .cprestore, and .cpsetup. 320 bool parseDirectiveCpLoad(SMLoc Loc); 321 bool parseDirectiveCpRestore(SMLoc Loc); 322 bool parseDirectiveCPSetup(); 323 bool parseDirectiveCPReturn(); 324 bool parseDirectiveNaN(); 325 bool parseDirectiveSet(); 326 bool parseDirectiveOption(); 327 bool parseInsnDirective(); 328 bool parseRSectionDirective(StringRef Section); 329 bool parseSSectionDirective(StringRef Section, unsigned Type); 330 331 bool parseSetAtDirective(); 332 bool parseSetNoAtDirective(); 333 bool parseSetMacroDirective(); 334 bool parseSetNoMacroDirective(); 335 bool parseSetMsaDirective(); 336 bool parseSetNoMsaDirective(); 337 bool parseSetNoDspDirective(); 338 bool parseSetReorderDirective(); 339 bool parseSetNoReorderDirective(); 340 bool parseSetMips16Directive(); 341 bool parseSetNoMips16Directive(); 342 bool parseSetFpDirective(); 343 bool parseSetOddSPRegDirective(); 344 bool parseSetNoOddSPRegDirective(); 345 bool parseSetPopDirective(); 346 bool parseSetPushDirective(); 347 bool parseSetSoftFloatDirective(); 348 bool parseSetHardFloatDirective(); 349 bool parseSetMtDirective(); 350 bool parseSetNoMtDirective(); 351 bool parseSetNoCRCDirective(); 352 bool parseSetNoVirtDirective(); 353 bool parseSetNoGINVDirective(); 354 355 bool parseSetAssignment(); 356 357 bool parseDirectiveGpWord(); 358 bool parseDirectiveGpDWord(); 359 bool parseDirectiveDtpRelWord(); 360 bool parseDirectiveDtpRelDWord(); 361 bool parseDirectiveTpRelWord(); 362 bool parseDirectiveTpRelDWord(); 363 bool parseDirectiveModule(); 364 bool parseDirectiveModuleFP(); 365 bool parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI, 366 StringRef Directive); 367 368 bool parseInternalDirectiveReallowModule(); 369 370 bool eatComma(StringRef ErrorStr); 371 372 int matchCPURegisterName(StringRef Symbol); 373 374 int matchHWRegsRegisterName(StringRef Symbol); 375 376 int matchFPURegisterName(StringRef Name); 377 378 int matchFCCRegisterName(StringRef Name); 379 380 int matchACRegisterName(StringRef Name); 381 382 int matchMSA128RegisterName(StringRef Name); 383 384 int matchMSA128CtrlRegisterName(StringRef Name); 385 386 unsigned getReg(int RC, int RegNo); 387 388 /// Returns the internal register number for the current AT. Also checks if 389 /// the current AT is unavailable (set to $0) and gives an error if it is. 390 /// This should be used in pseudo-instruction expansions which need AT. 391 unsigned getATReg(SMLoc Loc); 392 393 bool canUseATReg(); 394 395 bool processInstruction(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 396 const MCSubtargetInfo *STI); 397 398 // Helper function that checks if the value of a vector index is within the 399 // boundaries of accepted values for each RegisterKind 400 // Example: INSERT.B $w0[n], $1 => 16 > n >= 0 401 bool validateMSAIndex(int Val, int RegKind); 402 403 // Selects a new architecture by updating the FeatureBits with the necessary 404 // info including implied dependencies. 405 // Internally, it clears all the feature bits related to *any* architecture 406 // and selects the new one using the ToggleFeature functionality of the 407 // MCSubtargetInfo object that handles implied dependencies. The reason we 408 // clear all the arch related bits manually is because ToggleFeature only 409 // clears the features that imply the feature being cleared and not the 410 // features implied by the feature being cleared. This is easier to see 411 // with an example: 412 // -------------------------------------------------- 413 // | Feature | Implies | 414 // | -------------------------------------------------| 415 // | FeatureMips1 | None | 416 // | FeatureMips2 | FeatureMips1 | 417 // | FeatureMips3 | FeatureMips2 | FeatureMipsGP64 | 418 // | FeatureMips4 | FeatureMips3 | 419 // | ... | | 420 // -------------------------------------------------- 421 // 422 // Setting Mips3 is equivalent to set: (FeatureMips3 | FeatureMips2 | 423 // FeatureMipsGP64 | FeatureMips1) 424 // Clearing Mips3 is equivalent to clear (FeatureMips3 | FeatureMips4). 425 void selectArch(StringRef ArchFeature) { 426 MCSubtargetInfo &STI = copySTI(); 427 FeatureBitset FeatureBits = STI.getFeatureBits(); 428 FeatureBits &= ~MipsAssemblerOptions::AllArchRelatedMask; 429 STI.setFeatureBits(FeatureBits); 430 setAvailableFeatures( 431 ComputeAvailableFeatures(STI.ToggleFeature(ArchFeature))); 432 AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); 433 } 434 435 void setFeatureBits(uint64_t Feature, StringRef FeatureString) { 436 if (!(getSTI().getFeatureBits()[Feature])) { 437 MCSubtargetInfo &STI = copySTI(); 438 setAvailableFeatures( 439 ComputeAvailableFeatures(STI.ToggleFeature(FeatureString))); 440 AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); 441 } 442 } 443 444 void clearFeatureBits(uint64_t Feature, StringRef FeatureString) { 445 if (getSTI().getFeatureBits()[Feature]) { 446 MCSubtargetInfo &STI = copySTI(); 447 setAvailableFeatures( 448 ComputeAvailableFeatures(STI.ToggleFeature(FeatureString))); 449 AssemblerOptions.back()->setFeatures(STI.getFeatureBits()); 450 } 451 } 452 453 void setModuleFeatureBits(uint64_t Feature, StringRef FeatureString) { 454 setFeatureBits(Feature, FeatureString); 455 AssemblerOptions.front()->setFeatures(getSTI().getFeatureBits()); 456 } 457 458 void clearModuleFeatureBits(uint64_t Feature, StringRef FeatureString) { 459 clearFeatureBits(Feature, FeatureString); 460 AssemblerOptions.front()->setFeatures(getSTI().getFeatureBits()); 461 } 462 463 public: 464 enum MipsMatchResultTy { 465 Match_RequiresDifferentSrcAndDst = FIRST_TARGET_MATCH_RESULT_TY, 466 Match_RequiresDifferentOperands, 467 Match_RequiresNoZeroRegister, 468 Match_RequiresSameSrcAndDst, 469 Match_NoFCCRegisterForCurrentISA, 470 Match_NonZeroOperandForSync, 471 Match_NonZeroOperandForMTCX, 472 Match_RequiresPosSizeRange0_32, 473 Match_RequiresPosSizeRange33_64, 474 Match_RequiresPosSizeUImm6, 475 #define GET_OPERAND_DIAGNOSTIC_TYPES 476 #include "MipsGenAsmMatcher.inc" 477 #undef GET_OPERAND_DIAGNOSTIC_TYPES 478 }; 479 480 MipsAsmParser(const MCSubtargetInfo &sti, MCAsmParser &parser, 481 const MCInstrInfo &MII, const MCTargetOptions &Options) 482 : MCTargetAsmParser(Options, sti, MII), 483 ABI(MipsABIInfo::computeTargetABI(Triple(sti.getTargetTriple()), 484 sti.getCPU(), Options)) { 485 MCAsmParserExtension::Initialize(parser); 486 487 parser.addAliasForDirective(".asciiz", ".asciz"); 488 parser.addAliasForDirective(".hword", ".2byte"); 489 parser.addAliasForDirective(".word", ".4byte"); 490 parser.addAliasForDirective(".dword", ".8byte"); 491 492 // Initialize the set of available features. 493 setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits())); 494 495 // Remember the initial assembler options. The user can not modify these. 496 AssemblerOptions.push_back( 497 llvm::make_unique<MipsAssemblerOptions>(getSTI().getFeatureBits())); 498 499 // Create an assembler options environment for the user to modify. 500 AssemblerOptions.push_back( 501 llvm::make_unique<MipsAssemblerOptions>(getSTI().getFeatureBits())); 502 503 getTargetStreamer().updateABIInfo(*this); 504 505 if (!isABI_O32() && !useOddSPReg() != 0) 506 report_fatal_error("-mno-odd-spreg requires the O32 ABI"); 507 508 CurrentFn = nullptr; 509 510 IsPicEnabled = getContext().getObjectFileInfo()->isPositionIndependent(); 511 512 IsCpRestoreSet = false; 513 CpRestoreOffset = -1; 514 515 const Triple &TheTriple = sti.getTargetTriple(); 516 IsLittleEndian = TheTriple.isLittleEndian(); 517 518 if (getSTI().getCPU() == "mips64r6" && inMicroMipsMode()) 519 report_fatal_error("microMIPS64R6 is not supported", false); 520 521 if (!isABI_O32() && inMicroMipsMode()) 522 report_fatal_error("microMIPS64 is not supported", false); 523 } 524 525 /// True if all of $fcc0 - $fcc7 exist for the current ISA. 526 bool hasEightFccRegisters() const { return hasMips4() || hasMips32(); } 527 528 bool isGP64bit() const { 529 return getSTI().getFeatureBits()[Mips::FeatureGP64Bit]; 530 } 531 532 bool isFP64bit() const { 533 return getSTI().getFeatureBits()[Mips::FeatureFP64Bit]; 534 } 535 536 const MipsABIInfo &getABI() const { return ABI; } 537 bool isABI_N32() const { return ABI.IsN32(); } 538 bool isABI_N64() const { return ABI.IsN64(); } 539 bool isABI_O32() const { return ABI.IsO32(); } 540 bool isABI_FPXX() const { 541 return getSTI().getFeatureBits()[Mips::FeatureFPXX]; 542 } 543 544 bool useOddSPReg() const { 545 return !(getSTI().getFeatureBits()[Mips::FeatureNoOddSPReg]); 546 } 547 548 bool inMicroMipsMode() const { 549 return getSTI().getFeatureBits()[Mips::FeatureMicroMips]; 550 } 551 552 bool hasMips1() const { 553 return getSTI().getFeatureBits()[Mips::FeatureMips1]; 554 } 555 556 bool hasMips2() const { 557 return getSTI().getFeatureBits()[Mips::FeatureMips2]; 558 } 559 560 bool hasMips3() const { 561 return getSTI().getFeatureBits()[Mips::FeatureMips3]; 562 } 563 564 bool hasMips4() const { 565 return getSTI().getFeatureBits()[Mips::FeatureMips4]; 566 } 567 568 bool hasMips5() const { 569 return getSTI().getFeatureBits()[Mips::FeatureMips5]; 570 } 571 572 bool hasMips32() const { 573 return getSTI().getFeatureBits()[Mips::FeatureMips32]; 574 } 575 576 bool hasMips64() const { 577 return getSTI().getFeatureBits()[Mips::FeatureMips64]; 578 } 579 580 bool hasMips32r2() const { 581 return getSTI().getFeatureBits()[Mips::FeatureMips32r2]; 582 } 583 584 bool hasMips64r2() const { 585 return getSTI().getFeatureBits()[Mips::FeatureMips64r2]; 586 } 587 588 bool hasMips32r3() const { 589 return (getSTI().getFeatureBits()[Mips::FeatureMips32r3]); 590 } 591 592 bool hasMips64r3() const { 593 return (getSTI().getFeatureBits()[Mips::FeatureMips64r3]); 594 } 595 596 bool hasMips32r5() const { 597 return (getSTI().getFeatureBits()[Mips::FeatureMips32r5]); 598 } 599 600 bool hasMips64r5() const { 601 return (getSTI().getFeatureBits()[Mips::FeatureMips64r5]); 602 } 603 604 bool hasMips32r6() const { 605 return getSTI().getFeatureBits()[Mips::FeatureMips32r6]; 606 } 607 608 bool hasMips64r6() const { 609 return getSTI().getFeatureBits()[Mips::FeatureMips64r6]; 610 } 611 612 bool hasDSP() const { 613 return getSTI().getFeatureBits()[Mips::FeatureDSP]; 614 } 615 616 bool hasDSPR2() const { 617 return getSTI().getFeatureBits()[Mips::FeatureDSPR2]; 618 } 619 620 bool hasDSPR3() const { 621 return getSTI().getFeatureBits()[Mips::FeatureDSPR3]; 622 } 623 624 bool hasMSA() const { 625 return getSTI().getFeatureBits()[Mips::FeatureMSA]; 626 } 627 628 bool hasCnMips() const { 629 return (getSTI().getFeatureBits()[Mips::FeatureCnMips]); 630 } 631 632 bool inPicMode() { 633 return IsPicEnabled; 634 } 635 636 bool inMips16Mode() const { 637 return getSTI().getFeatureBits()[Mips::FeatureMips16]; 638 } 639 640 bool useTraps() const { 641 return getSTI().getFeatureBits()[Mips::FeatureUseTCCInDIV]; 642 } 643 644 bool useSoftFloat() const { 645 return getSTI().getFeatureBits()[Mips::FeatureSoftFloat]; 646 } 647 bool hasMT() const { 648 return getSTI().getFeatureBits()[Mips::FeatureMT]; 649 } 650 651 bool hasCRC() const { 652 return getSTI().getFeatureBits()[Mips::FeatureCRC]; 653 } 654 655 bool hasVirt() const { 656 return getSTI().getFeatureBits()[Mips::FeatureVirt]; 657 } 658 659 bool hasGINV() const { 660 return getSTI().getFeatureBits()[Mips::FeatureGINV]; 661 } 662 663 /// Warn if RegIndex is the same as the current AT. 664 void warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc); 665 666 void warnIfNoMacro(SMLoc Loc); 667 668 bool isLittle() const { return IsLittleEndian; } 669 670 const MCExpr *createTargetUnaryExpr(const MCExpr *E, 671 AsmToken::TokenKind OperatorToken, 672 MCContext &Ctx) override { 673 switch(OperatorToken) { 674 default: 675 llvm_unreachable("Unknown token"); 676 return nullptr; 677 case AsmToken::PercentCall16: 678 return MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, E, Ctx); 679 case AsmToken::PercentCall_Hi: 680 return MipsMCExpr::create(MipsMCExpr::MEK_CALL_HI16, E, Ctx); 681 case AsmToken::PercentCall_Lo: 682 return MipsMCExpr::create(MipsMCExpr::MEK_CALL_LO16, E, Ctx); 683 case AsmToken::PercentDtprel_Hi: 684 return MipsMCExpr::create(MipsMCExpr::MEK_DTPREL_HI, E, Ctx); 685 case AsmToken::PercentDtprel_Lo: 686 return MipsMCExpr::create(MipsMCExpr::MEK_DTPREL_LO, E, Ctx); 687 case AsmToken::PercentGot: 688 return MipsMCExpr::create(MipsMCExpr::MEK_GOT, E, Ctx); 689 case AsmToken::PercentGot_Disp: 690 return MipsMCExpr::create(MipsMCExpr::MEK_GOT_DISP, E, Ctx); 691 case AsmToken::PercentGot_Hi: 692 return MipsMCExpr::create(MipsMCExpr::MEK_GOT_HI16, E, Ctx); 693 case AsmToken::PercentGot_Lo: 694 return MipsMCExpr::create(MipsMCExpr::MEK_GOT_LO16, E, Ctx); 695 case AsmToken::PercentGot_Ofst: 696 return MipsMCExpr::create(MipsMCExpr::MEK_GOT_OFST, E, Ctx); 697 case AsmToken::PercentGot_Page: 698 return MipsMCExpr::create(MipsMCExpr::MEK_GOT_PAGE, E, Ctx); 699 case AsmToken::PercentGottprel: 700 return MipsMCExpr::create(MipsMCExpr::MEK_GOTTPREL, E, Ctx); 701 case AsmToken::PercentGp_Rel: 702 return MipsMCExpr::create(MipsMCExpr::MEK_GPREL, E, Ctx); 703 case AsmToken::PercentHi: 704 return MipsMCExpr::create(MipsMCExpr::MEK_HI, E, Ctx); 705 case AsmToken::PercentHigher: 706 return MipsMCExpr::create(MipsMCExpr::MEK_HIGHER, E, Ctx); 707 case AsmToken::PercentHighest: 708 return MipsMCExpr::create(MipsMCExpr::MEK_HIGHEST, E, Ctx); 709 case AsmToken::PercentLo: 710 return MipsMCExpr::create(MipsMCExpr::MEK_LO, E, Ctx); 711 case AsmToken::PercentNeg: 712 return MipsMCExpr::create(MipsMCExpr::MEK_NEG, E, Ctx); 713 case AsmToken::PercentPcrel_Hi: 714 return MipsMCExpr::create(MipsMCExpr::MEK_PCREL_HI16, E, Ctx); 715 case AsmToken::PercentPcrel_Lo: 716 return MipsMCExpr::create(MipsMCExpr::MEK_PCREL_LO16, E, Ctx); 717 case AsmToken::PercentTlsgd: 718 return MipsMCExpr::create(MipsMCExpr::MEK_TLSGD, E, Ctx); 719 case AsmToken::PercentTlsldm: 720 return MipsMCExpr::create(MipsMCExpr::MEK_TLSLDM, E, Ctx); 721 case AsmToken::PercentTprel_Hi: 722 return MipsMCExpr::create(MipsMCExpr::MEK_TPREL_HI, E, Ctx); 723 case AsmToken::PercentTprel_Lo: 724 return MipsMCExpr::create(MipsMCExpr::MEK_TPREL_LO, E, Ctx); 725 } 726 } 727 }; 728 729 /// MipsOperand - Instances of this class represent a parsed Mips machine 730 /// instruction. 731 class MipsOperand : public MCParsedAsmOperand { 732 public: 733 /// Broad categories of register classes 734 /// The exact class is finalized by the render method. 735 enum RegKind { 736 RegKind_GPR = 1, /// GPR32 and GPR64 (depending on isGP64bit()) 737 RegKind_FGR = 2, /// FGR32, FGR64, AFGR64 (depending on context and 738 /// isFP64bit()) 739 RegKind_FCC = 4, /// FCC 740 RegKind_MSA128 = 8, /// MSA128[BHWD] (makes no difference which) 741 RegKind_MSACtrl = 16, /// MSA control registers 742 RegKind_COP2 = 32, /// COP2 743 RegKind_ACC = 64, /// HI32DSP, LO32DSP, and ACC64DSP (depending on 744 /// context). 745 RegKind_CCR = 128, /// CCR 746 RegKind_HWRegs = 256, /// HWRegs 747 RegKind_COP3 = 512, /// COP3 748 RegKind_COP0 = 1024, /// COP0 749 /// Potentially any (e.g. $1) 750 RegKind_Numeric = RegKind_GPR | RegKind_FGR | RegKind_FCC | RegKind_MSA128 | 751 RegKind_MSACtrl | RegKind_COP2 | RegKind_ACC | 752 RegKind_CCR | RegKind_HWRegs | RegKind_COP3 | RegKind_COP0 753 }; 754 755 private: 756 enum KindTy { 757 k_Immediate, /// An immediate (possibly involving symbol references) 758 k_Memory, /// Base + Offset Memory Address 759 k_RegisterIndex, /// A register index in one or more RegKind. 760 k_Token, /// A simple token 761 k_RegList, /// A physical register list 762 } Kind; 763 764 public: 765 MipsOperand(KindTy K, MipsAsmParser &Parser) 766 : MCParsedAsmOperand(), Kind(K), AsmParser(Parser) {} 767 768 ~MipsOperand() override { 769 switch (Kind) { 770 case k_Memory: 771 delete Mem.Base; 772 break; 773 case k_RegList: 774 delete RegList.List; 775 break; 776 case k_Immediate: 777 case k_RegisterIndex: 778 case k_Token: 779 break; 780 } 781 } 782 783 private: 784 /// For diagnostics, and checking the assembler temporary 785 MipsAsmParser &AsmParser; 786 787 struct Token { 788 const char *Data; 789 unsigned Length; 790 }; 791 792 struct RegIdxOp { 793 unsigned Index; /// Index into the register class 794 RegKind Kind; /// Bitfield of the kinds it could possibly be 795 struct Token Tok; /// The input token this operand originated from. 796 const MCRegisterInfo *RegInfo; 797 }; 798 799 struct ImmOp { 800 const MCExpr *Val; 801 }; 802 803 struct MemOp { 804 MipsOperand *Base; 805 const MCExpr *Off; 806 }; 807 808 struct RegListOp { 809 SmallVector<unsigned, 10> *List; 810 }; 811 812 union { 813 struct Token Tok; 814 struct RegIdxOp RegIdx; 815 struct ImmOp Imm; 816 struct MemOp Mem; 817 struct RegListOp RegList; 818 }; 819 820 SMLoc StartLoc, EndLoc; 821 822 /// Internal constructor for register kinds 823 static std::unique_ptr<MipsOperand> CreateReg(unsigned Index, StringRef Str, 824 RegKind RegKind, 825 const MCRegisterInfo *RegInfo, 826 SMLoc S, SMLoc E, 827 MipsAsmParser &Parser) { 828 auto Op = llvm::make_unique<MipsOperand>(k_RegisterIndex, Parser); 829 Op->RegIdx.Index = Index; 830 Op->RegIdx.RegInfo = RegInfo; 831 Op->RegIdx.Kind = RegKind; 832 Op->RegIdx.Tok.Data = Str.data(); 833 Op->RegIdx.Tok.Length = Str.size(); 834 Op->StartLoc = S; 835 Op->EndLoc = E; 836 return Op; 837 } 838 839 public: 840 /// Coerce the register to GPR32 and return the real register for the current 841 /// target. 842 unsigned getGPR32Reg() const { 843 assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); 844 AsmParser.warnIfRegIndexIsAT(RegIdx.Index, StartLoc); 845 unsigned ClassID = Mips::GPR32RegClassID; 846 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 847 } 848 849 /// Coerce the register to GPR32 and return the real register for the current 850 /// target. 851 unsigned getGPRMM16Reg() const { 852 assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); 853 unsigned ClassID = Mips::GPR32RegClassID; 854 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 855 } 856 857 /// Coerce the register to GPR64 and return the real register for the current 858 /// target. 859 unsigned getGPR64Reg() const { 860 assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!"); 861 unsigned ClassID = Mips::GPR64RegClassID; 862 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 863 } 864 865 private: 866 /// Coerce the register to AFGR64 and return the real register for the current 867 /// target. 868 unsigned getAFGR64Reg() const { 869 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 870 if (RegIdx.Index % 2 != 0) 871 AsmParser.Warning(StartLoc, "Float register should be even."); 872 return RegIdx.RegInfo->getRegClass(Mips::AFGR64RegClassID) 873 .getRegister(RegIdx.Index / 2); 874 } 875 876 /// Coerce the register to FGR64 and return the real register for the current 877 /// target. 878 unsigned getFGR64Reg() const { 879 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 880 return RegIdx.RegInfo->getRegClass(Mips::FGR64RegClassID) 881 .getRegister(RegIdx.Index); 882 } 883 884 /// Coerce the register to FGR32 and return the real register for the current 885 /// target. 886 unsigned getFGR32Reg() const { 887 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 888 return RegIdx.RegInfo->getRegClass(Mips::FGR32RegClassID) 889 .getRegister(RegIdx.Index); 890 } 891 892 /// Coerce the register to FGRH32 and return the real register for the current 893 /// target. 894 unsigned getFGRH32Reg() const { 895 assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!"); 896 return RegIdx.RegInfo->getRegClass(Mips::FGRH32RegClassID) 897 .getRegister(RegIdx.Index); 898 } 899 900 /// Coerce the register to FCC and return the real register for the current 901 /// target. 902 unsigned getFCCReg() const { 903 assert(isRegIdx() && (RegIdx.Kind & RegKind_FCC) && "Invalid access!"); 904 return RegIdx.RegInfo->getRegClass(Mips::FCCRegClassID) 905 .getRegister(RegIdx.Index); 906 } 907 908 /// Coerce the register to MSA128 and return the real register for the current 909 /// target. 910 unsigned getMSA128Reg() const { 911 assert(isRegIdx() && (RegIdx.Kind & RegKind_MSA128) && "Invalid access!"); 912 // It doesn't matter which of the MSA128[BHWD] classes we use. They are all 913 // identical 914 unsigned ClassID = Mips::MSA128BRegClassID; 915 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 916 } 917 918 /// Coerce the register to MSACtrl and return the real register for the 919 /// current target. 920 unsigned getMSACtrlReg() const { 921 assert(isRegIdx() && (RegIdx.Kind & RegKind_MSACtrl) && "Invalid access!"); 922 unsigned ClassID = Mips::MSACtrlRegClassID; 923 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 924 } 925 926 /// Coerce the register to COP0 and return the real register for the 927 /// current target. 928 unsigned getCOP0Reg() const { 929 assert(isRegIdx() && (RegIdx.Kind & RegKind_COP0) && "Invalid access!"); 930 unsigned ClassID = Mips::COP0RegClassID; 931 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 932 } 933 934 /// Coerce the register to COP2 and return the real register for the 935 /// current target. 936 unsigned getCOP2Reg() const { 937 assert(isRegIdx() && (RegIdx.Kind & RegKind_COP2) && "Invalid access!"); 938 unsigned ClassID = Mips::COP2RegClassID; 939 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 940 } 941 942 /// Coerce the register to COP3 and return the real register for the 943 /// current target. 944 unsigned getCOP3Reg() const { 945 assert(isRegIdx() && (RegIdx.Kind & RegKind_COP3) && "Invalid access!"); 946 unsigned ClassID = Mips::COP3RegClassID; 947 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 948 } 949 950 /// Coerce the register to ACC64DSP and return the real register for the 951 /// current target. 952 unsigned getACC64DSPReg() const { 953 assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); 954 unsigned ClassID = Mips::ACC64DSPRegClassID; 955 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 956 } 957 958 /// Coerce the register to HI32DSP and return the real register for the 959 /// current target. 960 unsigned getHI32DSPReg() const { 961 assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); 962 unsigned ClassID = Mips::HI32DSPRegClassID; 963 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 964 } 965 966 /// Coerce the register to LO32DSP and return the real register for the 967 /// current target. 968 unsigned getLO32DSPReg() const { 969 assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!"); 970 unsigned ClassID = Mips::LO32DSPRegClassID; 971 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 972 } 973 974 /// Coerce the register to CCR and return the real register for the 975 /// current target. 976 unsigned getCCRReg() const { 977 assert(isRegIdx() && (RegIdx.Kind & RegKind_CCR) && "Invalid access!"); 978 unsigned ClassID = Mips::CCRRegClassID; 979 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 980 } 981 982 /// Coerce the register to HWRegs and return the real register for the 983 /// current target. 984 unsigned getHWRegsReg() const { 985 assert(isRegIdx() && (RegIdx.Kind & RegKind_HWRegs) && "Invalid access!"); 986 unsigned ClassID = Mips::HWRegsRegClassID; 987 return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index); 988 } 989 990 public: 991 void addExpr(MCInst &Inst, const MCExpr *Expr) const { 992 // Add as immediate when possible. Null MCExpr = 0. 993 if (!Expr) 994 Inst.addOperand(MCOperand::createImm(0)); 995 else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr)) 996 Inst.addOperand(MCOperand::createImm(CE->getValue())); 997 else 998 Inst.addOperand(MCOperand::createExpr(Expr)); 999 } 1000 1001 void addRegOperands(MCInst &Inst, unsigned N) const { 1002 llvm_unreachable("Use a custom parser instead"); 1003 } 1004 1005 /// Render the operand to an MCInst as a GPR32 1006 /// Asserts if the wrong number of operands are requested, or the operand 1007 /// is not a k_RegisterIndex compatible with RegKind_GPR 1008 void addGPR32ZeroAsmRegOperands(MCInst &Inst, unsigned N) const { 1009 assert(N == 1 && "Invalid number of operands!"); 1010 Inst.addOperand(MCOperand::createReg(getGPR32Reg())); 1011 } 1012 1013 void addGPR32NonZeroAsmRegOperands(MCInst &Inst, unsigned N) const { 1014 assert(N == 1 && "Invalid number of operands!"); 1015 Inst.addOperand(MCOperand::createReg(getGPR32Reg())); 1016 } 1017 1018 void addGPR32AsmRegOperands(MCInst &Inst, unsigned N) const { 1019 assert(N == 1 && "Invalid number of operands!"); 1020 Inst.addOperand(MCOperand::createReg(getGPR32Reg())); 1021 } 1022 1023 void addGPRMM16AsmRegOperands(MCInst &Inst, unsigned N) const { 1024 assert(N == 1 && "Invalid number of operands!"); 1025 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 1026 } 1027 1028 void addGPRMM16AsmRegZeroOperands(MCInst &Inst, unsigned N) const { 1029 assert(N == 1 && "Invalid number of operands!"); 1030 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 1031 } 1032 1033 void addGPRMM16AsmRegMovePOperands(MCInst &Inst, unsigned N) const { 1034 assert(N == 1 && "Invalid number of operands!"); 1035 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 1036 } 1037 1038 void addGPRMM16AsmRegMovePPairFirstOperands(MCInst &Inst, unsigned N) const { 1039 assert(N == 1 && "Invalid number of operands!"); 1040 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 1041 } 1042 1043 void addGPRMM16AsmRegMovePPairSecondOperands(MCInst &Inst, 1044 unsigned N) const { 1045 assert(N == 1 && "Invalid number of operands!"); 1046 Inst.addOperand(MCOperand::createReg(getGPRMM16Reg())); 1047 } 1048 1049 /// Render the operand to an MCInst as a GPR64 1050 /// Asserts if the wrong number of operands are requested, or the operand 1051 /// is not a k_RegisterIndex compatible with RegKind_GPR 1052 void addGPR64AsmRegOperands(MCInst &Inst, unsigned N) const { 1053 assert(N == 1 && "Invalid number of operands!"); 1054 Inst.addOperand(MCOperand::createReg(getGPR64Reg())); 1055 } 1056 1057 void addAFGR64AsmRegOperands(MCInst &Inst, unsigned N) const { 1058 assert(N == 1 && "Invalid number of operands!"); 1059 Inst.addOperand(MCOperand::createReg(getAFGR64Reg())); 1060 } 1061 1062 void addStrictlyAFGR64AsmRegOperands(MCInst &Inst, unsigned N) const { 1063 assert(N == 1 && "Invalid number of operands!"); 1064 Inst.addOperand(MCOperand::createReg(getAFGR64Reg())); 1065 } 1066 1067 void addStrictlyFGR64AsmRegOperands(MCInst &Inst, unsigned N) const { 1068 assert(N == 1 && "Invalid number of operands!"); 1069 Inst.addOperand(MCOperand::createReg(getFGR64Reg())); 1070 } 1071 1072 void addFGR64AsmRegOperands(MCInst &Inst, unsigned N) const { 1073 assert(N == 1 && "Invalid number of operands!"); 1074 Inst.addOperand(MCOperand::createReg(getFGR64Reg())); 1075 } 1076 1077 void addFGR32AsmRegOperands(MCInst &Inst, unsigned N) const { 1078 assert(N == 1 && "Invalid number of operands!"); 1079 Inst.addOperand(MCOperand::createReg(getFGR32Reg())); 1080 // FIXME: We ought to do this for -integrated-as without -via-file-asm too. 1081 // FIXME: This should propagate failure up to parseStatement. 1082 if (!AsmParser.useOddSPReg() && RegIdx.Index & 1) 1083 AsmParser.getParser().printError( 1084 StartLoc, "-mno-odd-spreg prohibits the use of odd FPU " 1085 "registers"); 1086 } 1087 1088 void addStrictlyFGR32AsmRegOperands(MCInst &Inst, unsigned N) const { 1089 assert(N == 1 && "Invalid number of operands!"); 1090 Inst.addOperand(MCOperand::createReg(getFGR32Reg())); 1091 // FIXME: We ought to do this for -integrated-as without -via-file-asm too. 1092 if (!AsmParser.useOddSPReg() && RegIdx.Index & 1) 1093 AsmParser.Error(StartLoc, "-mno-odd-spreg prohibits the use of odd FPU " 1094 "registers"); 1095 } 1096 1097 void addFGRH32AsmRegOperands(MCInst &Inst, unsigned N) const { 1098 assert(N == 1 && "Invalid number of operands!"); 1099 Inst.addOperand(MCOperand::createReg(getFGRH32Reg())); 1100 } 1101 1102 void addFCCAsmRegOperands(MCInst &Inst, unsigned N) const { 1103 assert(N == 1 && "Invalid number of operands!"); 1104 Inst.addOperand(MCOperand::createReg(getFCCReg())); 1105 } 1106 1107 void addMSA128AsmRegOperands(MCInst &Inst, unsigned N) const { 1108 assert(N == 1 && "Invalid number of operands!"); 1109 Inst.addOperand(MCOperand::createReg(getMSA128Reg())); 1110 } 1111 1112 void addMSACtrlAsmRegOperands(MCInst &Inst, unsigned N) const { 1113 assert(N == 1 && "Invalid number of operands!"); 1114 Inst.addOperand(MCOperand::createReg(getMSACtrlReg())); 1115 } 1116 1117 void addCOP0AsmRegOperands(MCInst &Inst, unsigned N) const { 1118 assert(N == 1 && "Invalid number of operands!"); 1119 Inst.addOperand(MCOperand::createReg(getCOP0Reg())); 1120 } 1121 1122 void addCOP2AsmRegOperands(MCInst &Inst, unsigned N) const { 1123 assert(N == 1 && "Invalid number of operands!"); 1124 Inst.addOperand(MCOperand::createReg(getCOP2Reg())); 1125 } 1126 1127 void addCOP3AsmRegOperands(MCInst &Inst, unsigned N) const { 1128 assert(N == 1 && "Invalid number of operands!"); 1129 Inst.addOperand(MCOperand::createReg(getCOP3Reg())); 1130 } 1131 1132 void addACC64DSPAsmRegOperands(MCInst &Inst, unsigned N) const { 1133 assert(N == 1 && "Invalid number of operands!"); 1134 Inst.addOperand(MCOperand::createReg(getACC64DSPReg())); 1135 } 1136 1137 void addHI32DSPAsmRegOperands(MCInst &Inst, unsigned N) const { 1138 assert(N == 1 && "Invalid number of operands!"); 1139 Inst.addOperand(MCOperand::createReg(getHI32DSPReg())); 1140 } 1141 1142 void addLO32DSPAsmRegOperands(MCInst &Inst, unsigned N) const { 1143 assert(N == 1 && "Invalid number of operands!"); 1144 Inst.addOperand(MCOperand::createReg(getLO32DSPReg())); 1145 } 1146 1147 void addCCRAsmRegOperands(MCInst &Inst, unsigned N) const { 1148 assert(N == 1 && "Invalid number of operands!"); 1149 Inst.addOperand(MCOperand::createReg(getCCRReg())); 1150 } 1151 1152 void addHWRegsAsmRegOperands(MCInst &Inst, unsigned N) const { 1153 assert(N == 1 && "Invalid number of operands!"); 1154 Inst.addOperand(MCOperand::createReg(getHWRegsReg())); 1155 } 1156 1157 template <unsigned Bits, int Offset = 0, int AdjustOffset = 0> 1158 void addConstantUImmOperands(MCInst &Inst, unsigned N) const { 1159 assert(N == 1 && "Invalid number of operands!"); 1160 uint64_t Imm = getConstantImm() - Offset; 1161 Imm &= (1ULL << Bits) - 1; 1162 Imm += Offset; 1163 Imm += AdjustOffset; 1164 Inst.addOperand(MCOperand::createImm(Imm)); 1165 } 1166 1167 template <unsigned Bits> 1168 void addSImmOperands(MCInst &Inst, unsigned N) const { 1169 if (isImm() && !isConstantImm()) { 1170 addExpr(Inst, getImm()); 1171 return; 1172 } 1173 addConstantSImmOperands<Bits, 0, 0>(Inst, N); 1174 } 1175 1176 template <unsigned Bits> 1177 void addUImmOperands(MCInst &Inst, unsigned N) const { 1178 if (isImm() && !isConstantImm()) { 1179 addExpr(Inst, getImm()); 1180 return; 1181 } 1182 addConstantUImmOperands<Bits, 0, 0>(Inst, N); 1183 } 1184 1185 template <unsigned Bits, int Offset = 0, int AdjustOffset = 0> 1186 void addConstantSImmOperands(MCInst &Inst, unsigned N) const { 1187 assert(N == 1 && "Invalid number of operands!"); 1188 int64_t Imm = getConstantImm() - Offset; 1189 Imm = SignExtend64<Bits>(Imm); 1190 Imm += Offset; 1191 Imm += AdjustOffset; 1192 Inst.addOperand(MCOperand::createImm(Imm)); 1193 } 1194 1195 void addImmOperands(MCInst &Inst, unsigned N) const { 1196 assert(N == 1 && "Invalid number of operands!"); 1197 const MCExpr *Expr = getImm(); 1198 addExpr(Inst, Expr); 1199 } 1200 1201 void addMemOperands(MCInst &Inst, unsigned N) const { 1202 assert(N == 2 && "Invalid number of operands!"); 1203 1204 Inst.addOperand(MCOperand::createReg(AsmParser.getABI().ArePtrs64bit() 1205 ? getMemBase()->getGPR64Reg() 1206 : getMemBase()->getGPR32Reg())); 1207 1208 const MCExpr *Expr = getMemOff(); 1209 addExpr(Inst, Expr); 1210 } 1211 1212 void addMicroMipsMemOperands(MCInst &Inst, unsigned N) const { 1213 assert(N == 2 && "Invalid number of operands!"); 1214 1215 Inst.addOperand(MCOperand::createReg(getMemBase()->getGPRMM16Reg())); 1216 1217 const MCExpr *Expr = getMemOff(); 1218 addExpr(Inst, Expr); 1219 } 1220 1221 void addRegListOperands(MCInst &Inst, unsigned N) const { 1222 assert(N == 1 && "Invalid number of operands!"); 1223 1224 for (auto RegNo : getRegList()) 1225 Inst.addOperand(MCOperand::createReg(RegNo)); 1226 } 1227 1228 bool isReg() const override { 1229 // As a special case until we sort out the definition of div/divu, accept 1230 // $0/$zero here so that MCK_ZERO works correctly. 1231 return isGPRAsmReg() && RegIdx.Index == 0; 1232 } 1233 1234 bool isRegIdx() const { return Kind == k_RegisterIndex; } 1235 bool isImm() const override { return Kind == k_Immediate; } 1236 1237 bool isConstantImm() const { 1238 int64_t Res; 1239 return isImm() && getImm()->evaluateAsAbsolute(Res); 1240 } 1241 1242 bool isConstantImmz() const { 1243 return isConstantImm() && getConstantImm() == 0; 1244 } 1245 1246 template <unsigned Bits, int Offset = 0> bool isConstantUImm() const { 1247 return isConstantImm() && isUInt<Bits>(getConstantImm() - Offset); 1248 } 1249 1250 template <unsigned Bits> bool isSImm() const { 1251 return isConstantImm() ? isInt<Bits>(getConstantImm()) : isImm(); 1252 } 1253 1254 template <unsigned Bits> bool isUImm() const { 1255 return isConstantImm() ? isUInt<Bits>(getConstantImm()) : isImm(); 1256 } 1257 1258 template <unsigned Bits> bool isAnyImm() const { 1259 return isConstantImm() ? (isInt<Bits>(getConstantImm()) || 1260 isUInt<Bits>(getConstantImm())) 1261 : isImm(); 1262 } 1263 1264 template <unsigned Bits, int Offset = 0> bool isConstantSImm() const { 1265 return isConstantImm() && isInt<Bits>(getConstantImm() - Offset); 1266 } 1267 1268 template <unsigned Bottom, unsigned Top> bool isConstantUImmRange() const { 1269 return isConstantImm() && getConstantImm() >= Bottom && 1270 getConstantImm() <= Top; 1271 } 1272 1273 bool isToken() const override { 1274 // Note: It's not possible to pretend that other operand kinds are tokens. 1275 // The matcher emitter checks tokens first. 1276 return Kind == k_Token; 1277 } 1278 1279 bool isMem() const override { return Kind == k_Memory; } 1280 1281 bool isConstantMemOff() const { 1282 return isMem() && isa<MCConstantExpr>(getMemOff()); 1283 } 1284 1285 // Allow relocation operators. 1286 // FIXME: This predicate and others need to look through binary expressions 1287 // and determine whether a Value is a constant or not. 1288 template <unsigned Bits, unsigned ShiftAmount = 0> 1289 bool isMemWithSimmOffset() const { 1290 if (!isMem()) 1291 return false; 1292 if (!getMemBase()->isGPRAsmReg()) 1293 return false; 1294 if (isa<MCTargetExpr>(getMemOff()) || 1295 (isConstantMemOff() && 1296 isShiftedInt<Bits, ShiftAmount>(getConstantMemOff()))) 1297 return true; 1298 MCValue Res; 1299 bool IsReloc = getMemOff()->evaluateAsRelocatable(Res, nullptr, nullptr); 1300 return IsReloc && isShiftedInt<Bits, ShiftAmount>(Res.getConstant()); 1301 } 1302 1303 bool isMemWithPtrSizeOffset() const { 1304 if (!isMem()) 1305 return false; 1306 if (!getMemBase()->isGPRAsmReg()) 1307 return false; 1308 const unsigned PtrBits = AsmParser.getABI().ArePtrs64bit() ? 64 : 32; 1309 if (isa<MCTargetExpr>(getMemOff()) || 1310 (isConstantMemOff() && isIntN(PtrBits, getConstantMemOff()))) 1311 return true; 1312 MCValue Res; 1313 bool IsReloc = getMemOff()->evaluateAsRelocatable(Res, nullptr, nullptr); 1314 return IsReloc && isIntN(PtrBits, Res.getConstant()); 1315 } 1316 1317 bool isMemWithGRPMM16Base() const { 1318 return isMem() && getMemBase()->isMM16AsmReg(); 1319 } 1320 1321 template <unsigned Bits> bool isMemWithUimmOffsetSP() const { 1322 return isMem() && isConstantMemOff() && isUInt<Bits>(getConstantMemOff()) 1323 && getMemBase()->isRegIdx() && (getMemBase()->getGPR32Reg() == Mips::SP); 1324 } 1325 1326 template <unsigned Bits> bool isMemWithUimmWordAlignedOffsetSP() const { 1327 return isMem() && isConstantMemOff() && isUInt<Bits>(getConstantMemOff()) 1328 && (getConstantMemOff() % 4 == 0) && getMemBase()->isRegIdx() 1329 && (getMemBase()->getGPR32Reg() == Mips::SP); 1330 } 1331 1332 template <unsigned Bits> bool isMemWithSimmWordAlignedOffsetGP() const { 1333 return isMem() && isConstantMemOff() && isInt<Bits>(getConstantMemOff()) 1334 && (getConstantMemOff() % 4 == 0) && getMemBase()->isRegIdx() 1335 && (getMemBase()->getGPR32Reg() == Mips::GP); 1336 } 1337 1338 template <unsigned Bits, unsigned ShiftLeftAmount> 1339 bool isScaledUImm() const { 1340 return isConstantImm() && 1341 isShiftedUInt<Bits, ShiftLeftAmount>(getConstantImm()); 1342 } 1343 1344 template <unsigned Bits, unsigned ShiftLeftAmount> 1345 bool isScaledSImm() const { 1346 if (isConstantImm() && 1347 isShiftedInt<Bits, ShiftLeftAmount>(getConstantImm())) 1348 return true; 1349 // Operand can also be a symbol or symbol plus 1350 // offset in case of relocations. 1351 if (Kind != k_Immediate) 1352 return false; 1353 MCValue Res; 1354 bool Success = getImm()->evaluateAsRelocatable(Res, nullptr, nullptr); 1355 return Success && isShiftedInt<Bits, ShiftLeftAmount>(Res.getConstant()); 1356 } 1357 1358 bool isRegList16() const { 1359 if (!isRegList()) 1360 return false; 1361 1362 int Size = RegList.List->size(); 1363 if (Size < 2 || Size > 5) 1364 return false; 1365 1366 unsigned R0 = RegList.List->front(); 1367 unsigned R1 = RegList.List->back(); 1368 if (!((R0 == Mips::S0 && R1 == Mips::RA) || 1369 (R0 == Mips::S0_64 && R1 == Mips::RA_64))) 1370 return false; 1371 1372 int PrevReg = *RegList.List->begin(); 1373 for (int i = 1; i < Size - 1; i++) { 1374 int Reg = (*(RegList.List))[i]; 1375 if ( Reg != PrevReg + 1) 1376 return false; 1377 PrevReg = Reg; 1378 } 1379 1380 return true; 1381 } 1382 1383 bool isInvNum() const { return Kind == k_Immediate; } 1384 1385 bool isLSAImm() const { 1386 if (!isConstantImm()) 1387 return false; 1388 int64_t Val = getConstantImm(); 1389 return 1 <= Val && Val <= 4; 1390 } 1391 1392 bool isRegList() const { return Kind == k_RegList; } 1393 1394 StringRef getToken() const { 1395 assert(Kind == k_Token && "Invalid access!"); 1396 return StringRef(Tok.Data, Tok.Length); 1397 } 1398 1399 unsigned getReg() const override { 1400 // As a special case until we sort out the definition of div/divu, accept 1401 // $0/$zero here so that MCK_ZERO works correctly. 1402 if (Kind == k_RegisterIndex && RegIdx.Index == 0 && 1403 RegIdx.Kind & RegKind_GPR) 1404 return getGPR32Reg(); // FIXME: GPR64 too 1405 1406 llvm_unreachable("Invalid access!"); 1407 return 0; 1408 } 1409 1410 const MCExpr *getImm() const { 1411 assert((Kind == k_Immediate) && "Invalid access!"); 1412 return Imm.Val; 1413 } 1414 1415 int64_t getConstantImm() const { 1416 const MCExpr *Val = getImm(); 1417 int64_t Value = 0; 1418 (void)Val->evaluateAsAbsolute(Value); 1419 return Value; 1420 } 1421 1422 MipsOperand *getMemBase() const { 1423 assert((Kind == k_Memory) && "Invalid access!"); 1424 return Mem.Base; 1425 } 1426 1427 const MCExpr *getMemOff() const { 1428 assert((Kind == k_Memory) && "Invalid access!"); 1429 return Mem.Off; 1430 } 1431 1432 int64_t getConstantMemOff() const { 1433 return static_cast<const MCConstantExpr *>(getMemOff())->getValue(); 1434 } 1435 1436 const SmallVectorImpl<unsigned> &getRegList() const { 1437 assert((Kind == k_RegList) && "Invalid access!"); 1438 return *(RegList.List); 1439 } 1440 1441 static std::unique_ptr<MipsOperand> CreateToken(StringRef Str, SMLoc S, 1442 MipsAsmParser &Parser) { 1443 auto Op = llvm::make_unique<MipsOperand>(k_Token, Parser); 1444 Op->Tok.Data = Str.data(); 1445 Op->Tok.Length = Str.size(); 1446 Op->StartLoc = S; 1447 Op->EndLoc = S; 1448 return Op; 1449 } 1450 1451 /// Create a numeric register (e.g. $1). The exact register remains 1452 /// unresolved until an instruction successfully matches 1453 static std::unique_ptr<MipsOperand> 1454 createNumericReg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1455 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1456 LLVM_DEBUG(dbgs() << "createNumericReg(" << Index << ", ...)\n"); 1457 return CreateReg(Index, Str, RegKind_Numeric, RegInfo, S, E, Parser); 1458 } 1459 1460 /// Create a register that is definitely a GPR. 1461 /// This is typically only used for named registers such as $gp. 1462 static std::unique_ptr<MipsOperand> 1463 createGPRReg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1464 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1465 return CreateReg(Index, Str, RegKind_GPR, RegInfo, S, E, Parser); 1466 } 1467 1468 /// Create a register that is definitely a FGR. 1469 /// This is typically only used for named registers such as $f0. 1470 static std::unique_ptr<MipsOperand> 1471 createFGRReg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1472 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1473 return CreateReg(Index, Str, RegKind_FGR, RegInfo, S, E, Parser); 1474 } 1475 1476 /// Create a register that is definitely a HWReg. 1477 /// This is typically only used for named registers such as $hwr_cpunum. 1478 static std::unique_ptr<MipsOperand> 1479 createHWRegsReg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1480 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1481 return CreateReg(Index, Str, RegKind_HWRegs, RegInfo, S, E, Parser); 1482 } 1483 1484 /// Create a register that is definitely an FCC. 1485 /// This is typically only used for named registers such as $fcc0. 1486 static std::unique_ptr<MipsOperand> 1487 createFCCReg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1488 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1489 return CreateReg(Index, Str, RegKind_FCC, RegInfo, S, E, Parser); 1490 } 1491 1492 /// Create a register that is definitely an ACC. 1493 /// This is typically only used for named registers such as $ac0. 1494 static std::unique_ptr<MipsOperand> 1495 createACCReg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1496 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1497 return CreateReg(Index, Str, RegKind_ACC, RegInfo, S, E, Parser); 1498 } 1499 1500 /// Create a register that is definitely an MSA128. 1501 /// This is typically only used for named registers such as $w0. 1502 static std::unique_ptr<MipsOperand> 1503 createMSA128Reg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1504 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1505 return CreateReg(Index, Str, RegKind_MSA128, RegInfo, S, E, Parser); 1506 } 1507 1508 /// Create a register that is definitely an MSACtrl. 1509 /// This is typically only used for named registers such as $msaaccess. 1510 static std::unique_ptr<MipsOperand> 1511 createMSACtrlReg(unsigned Index, StringRef Str, const MCRegisterInfo *RegInfo, 1512 SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1513 return CreateReg(Index, Str, RegKind_MSACtrl, RegInfo, S, E, Parser); 1514 } 1515 1516 static std::unique_ptr<MipsOperand> 1517 CreateImm(const MCExpr *Val, SMLoc S, SMLoc E, MipsAsmParser &Parser) { 1518 auto Op = llvm::make_unique<MipsOperand>(k_Immediate, Parser); 1519 Op->Imm.Val = Val; 1520 Op->StartLoc = S; 1521 Op->EndLoc = E; 1522 return Op; 1523 } 1524 1525 static std::unique_ptr<MipsOperand> 1526 CreateMem(std::unique_ptr<MipsOperand> Base, const MCExpr *Off, SMLoc S, 1527 SMLoc E, MipsAsmParser &Parser) { 1528 auto Op = llvm::make_unique<MipsOperand>(k_Memory, Parser); 1529 Op->Mem.Base = Base.release(); 1530 Op->Mem.Off = Off; 1531 Op->StartLoc = S; 1532 Op->EndLoc = E; 1533 return Op; 1534 } 1535 1536 static std::unique_ptr<MipsOperand> 1537 CreateRegList(SmallVectorImpl<unsigned> &Regs, SMLoc StartLoc, SMLoc EndLoc, 1538 MipsAsmParser &Parser) { 1539 assert(Regs.size() > 0 && "Empty list not allowed"); 1540 1541 auto Op = llvm::make_unique<MipsOperand>(k_RegList, Parser); 1542 Op->RegList.List = new SmallVector<unsigned, 10>(Regs.begin(), Regs.end()); 1543 Op->StartLoc = StartLoc; 1544 Op->EndLoc = EndLoc; 1545 return Op; 1546 } 1547 1548 bool isGPRZeroAsmReg() const { 1549 return isRegIdx() && RegIdx.Kind & RegKind_GPR && RegIdx.Index == 0; 1550 } 1551 1552 bool isGPRNonZeroAsmReg() const { 1553 return isRegIdx() && RegIdx.Kind & RegKind_GPR && RegIdx.Index > 0 && 1554 RegIdx.Index <= 31; 1555 } 1556 1557 bool isGPRAsmReg() const { 1558 return isRegIdx() && RegIdx.Kind & RegKind_GPR && RegIdx.Index <= 31; 1559 } 1560 1561 bool isMM16AsmReg() const { 1562 if (!(isRegIdx() && RegIdx.Kind)) 1563 return false; 1564 return ((RegIdx.Index >= 2 && RegIdx.Index <= 7) 1565 || RegIdx.Index == 16 || RegIdx.Index == 17); 1566 1567 } 1568 bool isMM16AsmRegZero() const { 1569 if (!(isRegIdx() && RegIdx.Kind)) 1570 return false; 1571 return (RegIdx.Index == 0 || 1572 (RegIdx.Index >= 2 && RegIdx.Index <= 7) || 1573 RegIdx.Index == 17); 1574 } 1575 1576 bool isMM16AsmRegMoveP() const { 1577 if (!(isRegIdx() && RegIdx.Kind)) 1578 return false; 1579 return (RegIdx.Index == 0 || (RegIdx.Index >= 2 && RegIdx.Index <= 3) || 1580 (RegIdx.Index >= 16 && RegIdx.Index <= 20)); 1581 } 1582 1583 bool isMM16AsmRegMovePPairFirst() const { 1584 if (!(isRegIdx() && RegIdx.Kind)) 1585 return false; 1586 return RegIdx.Index >= 4 && RegIdx.Index <= 6; 1587 } 1588 1589 bool isMM16AsmRegMovePPairSecond() const { 1590 if (!(isRegIdx() && RegIdx.Kind)) 1591 return false; 1592 return (RegIdx.Index == 21 || RegIdx.Index == 22 || 1593 (RegIdx.Index >= 5 && RegIdx.Index <= 7)); 1594 } 1595 1596 bool isFGRAsmReg() const { 1597 // AFGR64 is $0-$15 but we handle this in getAFGR64() 1598 return isRegIdx() && RegIdx.Kind & RegKind_FGR && RegIdx.Index <= 31; 1599 } 1600 1601 bool isStrictlyFGRAsmReg() const { 1602 // AFGR64 is $0-$15 but we handle this in getAFGR64() 1603 return isRegIdx() && RegIdx.Kind == RegKind_FGR && RegIdx.Index <= 31; 1604 } 1605 1606 bool isHWRegsAsmReg() const { 1607 return isRegIdx() && RegIdx.Kind & RegKind_HWRegs && RegIdx.Index <= 31; 1608 } 1609 1610 bool isCCRAsmReg() const { 1611 return isRegIdx() && RegIdx.Kind & RegKind_CCR && RegIdx.Index <= 31; 1612 } 1613 1614 bool isFCCAsmReg() const { 1615 if (!(isRegIdx() && RegIdx.Kind & RegKind_FCC)) 1616 return false; 1617 return RegIdx.Index <= 7; 1618 } 1619 1620 bool isACCAsmReg() const { 1621 return isRegIdx() && RegIdx.Kind & RegKind_ACC && RegIdx.Index <= 3; 1622 } 1623 1624 bool isCOP0AsmReg() const { 1625 return isRegIdx() && RegIdx.Kind & RegKind_COP0 && RegIdx.Index <= 31; 1626 } 1627 1628 bool isCOP2AsmReg() const { 1629 return isRegIdx() && RegIdx.Kind & RegKind_COP2 && RegIdx.Index <= 31; 1630 } 1631 1632 bool isCOP3AsmReg() const { 1633 return isRegIdx() && RegIdx.Kind & RegKind_COP3 && RegIdx.Index <= 31; 1634 } 1635 1636 bool isMSA128AsmReg() const { 1637 return isRegIdx() && RegIdx.Kind & RegKind_MSA128 && RegIdx.Index <= 31; 1638 } 1639 1640 bool isMSACtrlAsmReg() const { 1641 return isRegIdx() && RegIdx.Kind & RegKind_MSACtrl && RegIdx.Index <= 7; 1642 } 1643 1644 /// getStartLoc - Get the location of the first token of this operand. 1645 SMLoc getStartLoc() const override { return StartLoc; } 1646 /// getEndLoc - Get the location of the last token of this operand. 1647 SMLoc getEndLoc() const override { return EndLoc; } 1648 1649 void print(raw_ostream &OS) const override { 1650 switch (Kind) { 1651 case k_Immediate: 1652 OS << "Imm<"; 1653 OS << *Imm.Val; 1654 OS << ">"; 1655 break; 1656 case k_Memory: 1657 OS << "Mem<"; 1658 Mem.Base->print(OS); 1659 OS << ", "; 1660 OS << *Mem.Off; 1661 OS << ">"; 1662 break; 1663 case k_RegisterIndex: 1664 OS << "RegIdx<" << RegIdx.Index << ":" << RegIdx.Kind << ", " 1665 << StringRef(RegIdx.Tok.Data, RegIdx.Tok.Length) << ">"; 1666 break; 1667 case k_Token: 1668 OS << getToken(); 1669 break; 1670 case k_RegList: 1671 OS << "RegList< "; 1672 for (auto Reg : (*RegList.List)) 1673 OS << Reg << " "; 1674 OS << ">"; 1675 break; 1676 } 1677 } 1678 1679 bool isValidForTie(const MipsOperand &Other) const { 1680 if (Kind != Other.Kind) 1681 return false; 1682 1683 switch (Kind) { 1684 default: 1685 llvm_unreachable("Unexpected kind"); 1686 return false; 1687 case k_RegisterIndex: { 1688 StringRef Token(RegIdx.Tok.Data, RegIdx.Tok.Length); 1689 StringRef OtherToken(Other.RegIdx.Tok.Data, Other.RegIdx.Tok.Length); 1690 return Token == OtherToken; 1691 } 1692 } 1693 } 1694 }; // class MipsOperand 1695 1696 } // end anonymous namespace 1697 1698 namespace llvm { 1699 1700 extern const MCInstrDesc MipsInsts[]; 1701 1702 } // end namespace llvm 1703 1704 static const MCInstrDesc &getInstDesc(unsigned Opcode) { 1705 return MipsInsts[Opcode]; 1706 } 1707 1708 static bool hasShortDelaySlot(unsigned Opcode) { 1709 switch (Opcode) { 1710 case Mips::JALS_MM: 1711 case Mips::JALRS_MM: 1712 case Mips::JALRS16_MM: 1713 case Mips::BGEZALS_MM: 1714 case Mips::BLTZALS_MM: 1715 return true; 1716 default: 1717 return false; 1718 } 1719 } 1720 1721 static const MCSymbol *getSingleMCSymbol(const MCExpr *Expr) { 1722 if (const MCSymbolRefExpr *SRExpr = dyn_cast<MCSymbolRefExpr>(Expr)) { 1723 return &SRExpr->getSymbol(); 1724 } 1725 1726 if (const MCBinaryExpr *BExpr = dyn_cast<MCBinaryExpr>(Expr)) { 1727 const MCSymbol *LHSSym = getSingleMCSymbol(BExpr->getLHS()); 1728 const MCSymbol *RHSSym = getSingleMCSymbol(BExpr->getRHS()); 1729 1730 if (LHSSym) 1731 return LHSSym; 1732 1733 if (RHSSym) 1734 return RHSSym; 1735 1736 return nullptr; 1737 } 1738 1739 if (const MCUnaryExpr *UExpr = dyn_cast<MCUnaryExpr>(Expr)) 1740 return getSingleMCSymbol(UExpr->getSubExpr()); 1741 1742 return nullptr; 1743 } 1744 1745 static unsigned countMCSymbolRefExpr(const MCExpr *Expr) { 1746 if (isa<MCSymbolRefExpr>(Expr)) 1747 return 1; 1748 1749 if (const MCBinaryExpr *BExpr = dyn_cast<MCBinaryExpr>(Expr)) 1750 return countMCSymbolRefExpr(BExpr->getLHS()) + 1751 countMCSymbolRefExpr(BExpr->getRHS()); 1752 1753 if (const MCUnaryExpr *UExpr = dyn_cast<MCUnaryExpr>(Expr)) 1754 return countMCSymbolRefExpr(UExpr->getSubExpr()); 1755 1756 return 0; 1757 } 1758 1759 bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc, 1760 MCStreamer &Out, 1761 const MCSubtargetInfo *STI) { 1762 MipsTargetStreamer &TOut = getTargetStreamer(); 1763 const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); 1764 bool ExpandedJalSym = false; 1765 1766 Inst.setLoc(IDLoc); 1767 1768 if (MCID.isBranch() || MCID.isCall()) { 1769 const unsigned Opcode = Inst.getOpcode(); 1770 MCOperand Offset; 1771 1772 switch (Opcode) { 1773 default: 1774 break; 1775 case Mips::BBIT0: 1776 case Mips::BBIT032: 1777 case Mips::BBIT1: 1778 case Mips::BBIT132: 1779 assert(hasCnMips() && "instruction only valid for octeon cpus"); 1780 LLVM_FALLTHROUGH; 1781 1782 case Mips::BEQ: 1783 case Mips::BNE: 1784 case Mips::BEQ_MM: 1785 case Mips::BNE_MM: 1786 assert(MCID.getNumOperands() == 3 && "unexpected number of operands"); 1787 Offset = Inst.getOperand(2); 1788 if (!Offset.isImm()) 1789 break; // We'll deal with this situation later on when applying fixups. 1790 if (!isIntN(inMicroMipsMode() ? 17 : 18, Offset.getImm())) 1791 return Error(IDLoc, "branch target out of range"); 1792 if (OffsetToAlignment(Offset.getImm(), 1793 1LL << (inMicroMipsMode() ? 1 : 2))) 1794 return Error(IDLoc, "branch to misaligned address"); 1795 break; 1796 case Mips::BGEZ: 1797 case Mips::BGTZ: 1798 case Mips::BLEZ: 1799 case Mips::BLTZ: 1800 case Mips::BGEZAL: 1801 case Mips::BLTZAL: 1802 case Mips::BC1F: 1803 case Mips::BC1T: 1804 case Mips::BGEZ_MM: 1805 case Mips::BGTZ_MM: 1806 case Mips::BLEZ_MM: 1807 case Mips::BLTZ_MM: 1808 case Mips::BGEZAL_MM: 1809 case Mips::BLTZAL_MM: 1810 case Mips::BC1F_MM: 1811 case Mips::BC1T_MM: 1812 case Mips::BC1EQZC_MMR6: 1813 case Mips::BC1NEZC_MMR6: 1814 case Mips::BC2EQZC_MMR6: 1815 case Mips::BC2NEZC_MMR6: 1816 assert(MCID.getNumOperands() == 2 && "unexpected number of operands"); 1817 Offset = Inst.getOperand(1); 1818 if (!Offset.isImm()) 1819 break; // We'll deal with this situation later on when applying fixups. 1820 if (!isIntN(inMicroMipsMode() ? 17 : 18, Offset.getImm())) 1821 return Error(IDLoc, "branch target out of range"); 1822 if (OffsetToAlignment(Offset.getImm(), 1823 1LL << (inMicroMipsMode() ? 1 : 2))) 1824 return Error(IDLoc, "branch to misaligned address"); 1825 break; 1826 case Mips::BGEC: case Mips::BGEC_MMR6: 1827 case Mips::BLTC: case Mips::BLTC_MMR6: 1828 case Mips::BGEUC: case Mips::BGEUC_MMR6: 1829 case Mips::BLTUC: case Mips::BLTUC_MMR6: 1830 case Mips::BEQC: case Mips::BEQC_MMR6: 1831 case Mips::BNEC: case Mips::BNEC_MMR6: 1832 assert(MCID.getNumOperands() == 3 && "unexpected number of operands"); 1833 Offset = Inst.getOperand(2); 1834 if (!Offset.isImm()) 1835 break; // We'll deal with this situation later on when applying fixups. 1836 if (!isIntN(18, Offset.getImm())) 1837 return Error(IDLoc, "branch target out of range"); 1838 if (OffsetToAlignment(Offset.getImm(), 1LL << 2)) 1839 return Error(IDLoc, "branch to misaligned address"); 1840 break; 1841 case Mips::BLEZC: case Mips::BLEZC_MMR6: 1842 case Mips::BGEZC: case Mips::BGEZC_MMR6: 1843 case Mips::BGTZC: case Mips::BGTZC_MMR6: 1844 case Mips::BLTZC: case Mips::BLTZC_MMR6: 1845 assert(MCID.getNumOperands() == 2 && "unexpected number of operands"); 1846 Offset = Inst.getOperand(1); 1847 if (!Offset.isImm()) 1848 break; // We'll deal with this situation later on when applying fixups. 1849 if (!isIntN(18, Offset.getImm())) 1850 return Error(IDLoc, "branch target out of range"); 1851 if (OffsetToAlignment(Offset.getImm(), 1LL << 2)) 1852 return Error(IDLoc, "branch to misaligned address"); 1853 break; 1854 case Mips::BEQZC: case Mips::BEQZC_MMR6: 1855 case Mips::BNEZC: case Mips::BNEZC_MMR6: 1856 assert(MCID.getNumOperands() == 2 && "unexpected number of operands"); 1857 Offset = Inst.getOperand(1); 1858 if (!Offset.isImm()) 1859 break; // We'll deal with this situation later on when applying fixups. 1860 if (!isIntN(23, Offset.getImm())) 1861 return Error(IDLoc, "branch target out of range"); 1862 if (OffsetToAlignment(Offset.getImm(), 1LL << 2)) 1863 return Error(IDLoc, "branch to misaligned address"); 1864 break; 1865 case Mips::BEQZ16_MM: 1866 case Mips::BEQZC16_MMR6: 1867 case Mips::BNEZ16_MM: 1868 case Mips::BNEZC16_MMR6: 1869 assert(MCID.getNumOperands() == 2 && "unexpected number of operands"); 1870 Offset = Inst.getOperand(1); 1871 if (!Offset.isImm()) 1872 break; // We'll deal with this situation later on when applying fixups. 1873 if (!isInt<8>(Offset.getImm())) 1874 return Error(IDLoc, "branch target out of range"); 1875 if (OffsetToAlignment(Offset.getImm(), 2LL)) 1876 return Error(IDLoc, "branch to misaligned address"); 1877 break; 1878 } 1879 } 1880 1881 // SSNOP is deprecated on MIPS32r6/MIPS64r6 1882 // We still accept it but it is a normal nop. 1883 if (hasMips32r6() && Inst.getOpcode() == Mips::SSNOP) { 1884 std::string ISA = hasMips64r6() ? "MIPS64r6" : "MIPS32r6"; 1885 Warning(IDLoc, "ssnop is deprecated for " + ISA + " and is equivalent to a " 1886 "nop instruction"); 1887 } 1888 1889 if (hasCnMips()) { 1890 const unsigned Opcode = Inst.getOpcode(); 1891 MCOperand Opnd; 1892 int Imm; 1893 1894 switch (Opcode) { 1895 default: 1896 break; 1897 1898 case Mips::BBIT0: 1899 case Mips::BBIT032: 1900 case Mips::BBIT1: 1901 case Mips::BBIT132: 1902 assert(MCID.getNumOperands() == 3 && "unexpected number of operands"); 1903 // The offset is handled above 1904 Opnd = Inst.getOperand(1); 1905 if (!Opnd.isImm()) 1906 return Error(IDLoc, "expected immediate operand kind"); 1907 Imm = Opnd.getImm(); 1908 if (Imm < 0 || Imm > (Opcode == Mips::BBIT0 || 1909 Opcode == Mips::BBIT1 ? 63 : 31)) 1910 return Error(IDLoc, "immediate operand value out of range"); 1911 if (Imm > 31) { 1912 Inst.setOpcode(Opcode == Mips::BBIT0 ? Mips::BBIT032 1913 : Mips::BBIT132); 1914 Inst.getOperand(1).setImm(Imm - 32); 1915 } 1916 break; 1917 1918 case Mips::SEQi: 1919 case Mips::SNEi: 1920 assert(MCID.getNumOperands() == 3 && "unexpected number of operands"); 1921 Opnd = Inst.getOperand(2); 1922 if (!Opnd.isImm()) 1923 return Error(IDLoc, "expected immediate operand kind"); 1924 Imm = Opnd.getImm(); 1925 if (!isInt<10>(Imm)) 1926 return Error(IDLoc, "immediate operand value out of range"); 1927 break; 1928 } 1929 } 1930 1931 // Warn on division by zero. We're checking here as all instructions get 1932 // processed here, not just the macros that need expansion. 1933 // 1934 // The MIPS backend models most of the divison instructions and macros as 1935 // three operand instructions. The pre-R6 divide instructions however have 1936 // two operands and explicitly define HI/LO as part of the instruction, 1937 // not in the operands. 1938 unsigned FirstOp = 1; 1939 unsigned SecondOp = 2; 1940 switch (Inst.getOpcode()) { 1941 default: 1942 break; 1943 case Mips::SDivIMacro: 1944 case Mips::UDivIMacro: 1945 case Mips::DSDivIMacro: 1946 case Mips::DUDivIMacro: 1947 if (Inst.getOperand(2).getImm() == 0) { 1948 if (Inst.getOperand(1).getReg() == Mips::ZERO || 1949 Inst.getOperand(1).getReg() == Mips::ZERO_64) 1950 Warning(IDLoc, "dividing zero by zero"); 1951 else 1952 Warning(IDLoc, "division by zero"); 1953 } 1954 break; 1955 case Mips::DSDIV: 1956 case Mips::SDIV: 1957 case Mips::UDIV: 1958 case Mips::DUDIV: 1959 case Mips::UDIV_MM: 1960 case Mips::SDIV_MM: 1961 FirstOp = 0; 1962 SecondOp = 1; 1963 LLVM_FALLTHROUGH; 1964 case Mips::SDivMacro: 1965 case Mips::DSDivMacro: 1966 case Mips::UDivMacro: 1967 case Mips::DUDivMacro: 1968 case Mips::DIV: 1969 case Mips::DIVU: 1970 case Mips::DDIV: 1971 case Mips::DDIVU: 1972 case Mips::DIVU_MMR6: 1973 case Mips::DIV_MMR6: 1974 if (Inst.getOperand(SecondOp).getReg() == Mips::ZERO || 1975 Inst.getOperand(SecondOp).getReg() == Mips::ZERO_64) { 1976 if (Inst.getOperand(FirstOp).getReg() == Mips::ZERO || 1977 Inst.getOperand(FirstOp).getReg() == Mips::ZERO_64) 1978 Warning(IDLoc, "dividing zero by zero"); 1979 else 1980 Warning(IDLoc, "division by zero"); 1981 } 1982 break; 1983 } 1984 1985 // For PIC code convert unconditional jump to unconditional branch. 1986 if ((Inst.getOpcode() == Mips::J || Inst.getOpcode() == Mips::J_MM) && 1987 inPicMode()) { 1988 MCInst BInst; 1989 BInst.setOpcode(inMicroMipsMode() ? Mips::BEQ_MM : Mips::BEQ); 1990 BInst.addOperand(MCOperand::createReg(Mips::ZERO)); 1991 BInst.addOperand(MCOperand::createReg(Mips::ZERO)); 1992 BInst.addOperand(Inst.getOperand(0)); 1993 Inst = BInst; 1994 } 1995 1996 // This expansion is not in a function called by tryExpandInstruction() 1997 // because the pseudo-instruction doesn't have a distinct opcode. 1998 if ((Inst.getOpcode() == Mips::JAL || Inst.getOpcode() == Mips::JAL_MM) && 1999 inPicMode()) { 2000 warnIfNoMacro(IDLoc); 2001 2002 const MCExpr *JalExpr = Inst.getOperand(0).getExpr(); 2003 2004 // We can do this expansion if there's only 1 symbol in the argument 2005 // expression. 2006 if (countMCSymbolRefExpr(JalExpr) > 1) 2007 return Error(IDLoc, "jal doesn't support multiple symbols in PIC mode"); 2008 2009 // FIXME: This is checking the expression can be handled by the later stages 2010 // of the assembler. We ought to leave it to those later stages. 2011 const MCSymbol *JalSym = getSingleMCSymbol(JalExpr); 2012 2013 // FIXME: Add support for label+offset operands (currently causes an error). 2014 // FIXME: Add support for forward-declared local symbols. 2015 // FIXME: Add expansion for when the LargeGOT option is enabled. 2016 if (JalSym->isInSection() || JalSym->isTemporary() || 2017 (JalSym->isELF() && 2018 cast<MCSymbolELF>(JalSym)->getBinding() == ELF::STB_LOCAL)) { 2019 if (isABI_O32()) { 2020 // If it's a local symbol and the O32 ABI is being used, we expand to: 2021 // lw $25, 0($gp) 2022 // R_(MICRO)MIPS_GOT16 label 2023 // addiu $25, $25, 0 2024 // R_(MICRO)MIPS_LO16 label 2025 // jalr $25 2026 const MCExpr *Got16RelocExpr = 2027 MipsMCExpr::create(MipsMCExpr::MEK_GOT, JalExpr, getContext()); 2028 const MCExpr *Lo16RelocExpr = 2029 MipsMCExpr::create(MipsMCExpr::MEK_LO, JalExpr, getContext()); 2030 2031 TOut.emitRRX(Mips::LW, Mips::T9, Mips::GP, 2032 MCOperand::createExpr(Got16RelocExpr), IDLoc, STI); 2033 TOut.emitRRX(Mips::ADDiu, Mips::T9, Mips::T9, 2034 MCOperand::createExpr(Lo16RelocExpr), IDLoc, STI); 2035 } else if (isABI_N32() || isABI_N64()) { 2036 // If it's a local symbol and the N32/N64 ABIs are being used, 2037 // we expand to: 2038 // lw/ld $25, 0($gp) 2039 // R_(MICRO)MIPS_GOT_DISP label 2040 // jalr $25 2041 const MCExpr *GotDispRelocExpr = 2042 MipsMCExpr::create(MipsMCExpr::MEK_GOT_DISP, JalExpr, getContext()); 2043 2044 TOut.emitRRX(ABI.ArePtrs64bit() ? Mips::LD : Mips::LW, Mips::T9, 2045 Mips::GP, MCOperand::createExpr(GotDispRelocExpr), IDLoc, 2046 STI); 2047 } 2048 } else { 2049 // If it's an external/weak symbol, we expand to: 2050 // lw/ld $25, 0($gp) 2051 // R_(MICRO)MIPS_CALL16 label 2052 // jalr $25 2053 const MCExpr *Call16RelocExpr = 2054 MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, JalExpr, getContext()); 2055 2056 TOut.emitRRX(ABI.ArePtrs64bit() ? Mips::LD : Mips::LW, Mips::T9, Mips::GP, 2057 MCOperand::createExpr(Call16RelocExpr), IDLoc, STI); 2058 } 2059 2060 MCInst JalrInst; 2061 if (IsCpRestoreSet && inMicroMipsMode()) 2062 JalrInst.setOpcode(Mips::JALRS_MM); 2063 else 2064 JalrInst.setOpcode(inMicroMipsMode() ? Mips::JALR_MM : Mips::JALR); 2065 JalrInst.addOperand(MCOperand::createReg(Mips::RA)); 2066 JalrInst.addOperand(MCOperand::createReg(Mips::T9)); 2067 2068 // FIXME: Add an R_(MICRO)MIPS_JALR relocation after the JALR. 2069 // This relocation is supposed to be an optimization hint for the linker 2070 // and is not necessary for correctness. 2071 2072 Inst = JalrInst; 2073 ExpandedJalSym = true; 2074 } 2075 2076 bool IsPCRelativeLoad = (MCID.TSFlags & MipsII::IsPCRelativeLoad) != 0; 2077 if ((MCID.mayLoad() || MCID.mayStore()) && !IsPCRelativeLoad) { 2078 // Check the offset of memory operand, if it is a symbol 2079 // reference or immediate we may have to expand instructions. 2080 for (unsigned i = 0; i < MCID.getNumOperands(); i++) { 2081 const MCOperandInfo &OpInfo = MCID.OpInfo[i]; 2082 if ((OpInfo.OperandType == MCOI::OPERAND_MEMORY) || 2083 (OpInfo.OperandType == MCOI::OPERAND_UNKNOWN)) { 2084 MCOperand &Op = Inst.getOperand(i); 2085 if (Op.isImm()) { 2086 int64_t MemOffset = Op.getImm(); 2087 if (MemOffset < -32768 || MemOffset > 32767) { 2088 // Offset can't exceed 16bit value. 2089 expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad()); 2090 return getParser().hasPendingError(); 2091 } 2092 } else if (Op.isExpr()) { 2093 const MCExpr *Expr = Op.getExpr(); 2094 if (Expr->getKind() == MCExpr::SymbolRef) { 2095 const MCSymbolRefExpr *SR = 2096 static_cast<const MCSymbolRefExpr *>(Expr); 2097 if (SR->getKind() == MCSymbolRefExpr::VK_None) { 2098 // Expand symbol. 2099 expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad()); 2100 return getParser().hasPendingError(); 2101 } 2102 } else if (!isEvaluated(Expr)) { 2103 expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad()); 2104 return getParser().hasPendingError(); 2105 } 2106 } 2107 } 2108 } // for 2109 } // if load/store 2110 2111 if (inMicroMipsMode()) { 2112 if (MCID.mayLoad() && Inst.getOpcode() != Mips::LWP_MM) { 2113 // Try to create 16-bit GP relative load instruction. 2114 for (unsigned i = 0; i < MCID.getNumOperands(); i++) { 2115 const MCOperandInfo &OpInfo = MCID.OpInfo[i]; 2116 if ((OpInfo.OperandType == MCOI::OPERAND_MEMORY) || 2117 (OpInfo.OperandType == MCOI::OPERAND_UNKNOWN)) { 2118 MCOperand &Op = Inst.getOperand(i); 2119 if (Op.isImm()) { 2120 int MemOffset = Op.getImm(); 2121 MCOperand &DstReg = Inst.getOperand(0); 2122 MCOperand &BaseReg = Inst.getOperand(1); 2123 if (isInt<9>(MemOffset) && (MemOffset % 4 == 0) && 2124 getContext().getRegisterInfo()->getRegClass( 2125 Mips::GPRMM16RegClassID).contains(DstReg.getReg()) && 2126 (BaseReg.getReg() == Mips::GP || 2127 BaseReg.getReg() == Mips::GP_64)) { 2128 2129 TOut.emitRRI(Mips::LWGP_MM, DstReg.getReg(), Mips::GP, MemOffset, 2130 IDLoc, STI); 2131 return false; 2132 } 2133 } 2134 } 2135 } // for 2136 } // if load 2137 2138 // TODO: Handle this with the AsmOperandClass.PredicateMethod. 2139 2140 MCOperand Opnd; 2141 int Imm; 2142 2143 switch (Inst.getOpcode()) { 2144 default: 2145 break; 2146 case Mips::ADDIUSP_MM: 2147 Opnd = Inst.getOperand(0); 2148 if (!Opnd.isImm()) 2149 return Error(IDLoc, "expected immediate operand kind"); 2150 Imm = Opnd.getImm(); 2151 if (Imm < -1032 || Imm > 1028 || (Imm < 8 && Imm > -12) || 2152 Imm % 4 != 0) 2153 return Error(IDLoc, "immediate operand value out of range"); 2154 break; 2155 case Mips::SLL16_MM: 2156 case Mips::SRL16_MM: 2157 Opnd = Inst.getOperand(2); 2158 if (!Opnd.isImm()) 2159 return Error(IDLoc, "expected immediate operand kind"); 2160 Imm = Opnd.getImm(); 2161 if (Imm < 1 || Imm > 8) 2162 return Error(IDLoc, "immediate operand value out of range"); 2163 break; 2164 case Mips::LI16_MM: 2165 Opnd = Inst.getOperand(1); 2166 if (!Opnd.isImm()) 2167 return Error(IDLoc, "expected immediate operand kind"); 2168 Imm = Opnd.getImm(); 2169 if (Imm < -1 || Imm > 126) 2170 return Error(IDLoc, "immediate operand value out of range"); 2171 break; 2172 case Mips::ADDIUR2_MM: 2173 Opnd = Inst.getOperand(2); 2174 if (!Opnd.isImm()) 2175 return Error(IDLoc, "expected immediate operand kind"); 2176 Imm = Opnd.getImm(); 2177 if (!(Imm == 1 || Imm == -1 || 2178 ((Imm % 4 == 0) && Imm < 28 && Imm > 0))) 2179 return Error(IDLoc, "immediate operand value out of range"); 2180 break; 2181 case Mips::ANDI16_MM: 2182 Opnd = Inst.getOperand(2); 2183 if (!Opnd.isImm()) 2184 return Error(IDLoc, "expected immediate operand kind"); 2185 Imm = Opnd.getImm(); 2186 if (!(Imm == 128 || (Imm >= 1 && Imm <= 4) || Imm == 7 || Imm == 8 || 2187 Imm == 15 || Imm == 16 || Imm == 31 || Imm == 32 || Imm == 63 || 2188 Imm == 64 || Imm == 255 || Imm == 32768 || Imm == 65535)) 2189 return Error(IDLoc, "immediate operand value out of range"); 2190 break; 2191 case Mips::LBU16_MM: 2192 Opnd = Inst.getOperand(2); 2193 if (!Opnd.isImm()) 2194 return Error(IDLoc, "expected immediate operand kind"); 2195 Imm = Opnd.getImm(); 2196 if (Imm < -1 || Imm > 14) 2197 return Error(IDLoc, "immediate operand value out of range"); 2198 break; 2199 case Mips::SB16_MM: 2200 case Mips::SB16_MMR6: 2201 Opnd = Inst.getOperand(2); 2202 if (!Opnd.isImm()) 2203 return Error(IDLoc, "expected immediate operand kind"); 2204 Imm = Opnd.getImm(); 2205 if (Imm < 0 || Imm > 15) 2206 return Error(IDLoc, "immediate operand value out of range"); 2207 break; 2208 case Mips::LHU16_MM: 2209 case Mips::SH16_MM: 2210 case Mips::SH16_MMR6: 2211 Opnd = Inst.getOperand(2); 2212 if (!Opnd.isImm()) 2213 return Error(IDLoc, "expected immediate operand kind"); 2214 Imm = Opnd.getImm(); 2215 if (Imm < 0 || Imm > 30 || (Imm % 2 != 0)) 2216 return Error(IDLoc, "immediate operand value out of range"); 2217 break; 2218 case Mips::LW16_MM: 2219 case Mips::SW16_MM: 2220 case Mips::SW16_MMR6: 2221 Opnd = Inst.getOperand(2); 2222 if (!Opnd.isImm()) 2223 return Error(IDLoc, "expected immediate operand kind"); 2224 Imm = Opnd.getImm(); 2225 if (Imm < 0 || Imm > 60 || (Imm % 4 != 0)) 2226 return Error(IDLoc, "immediate operand value out of range"); 2227 break; 2228 case Mips::ADDIUPC_MM: 2229 Opnd = Inst.getOperand(1); 2230 if (!Opnd.isImm()) 2231 return Error(IDLoc, "expected immediate operand kind"); 2232 Imm = Opnd.getImm(); 2233 if ((Imm % 4 != 0) || !isInt<25>(Imm)) 2234 return Error(IDLoc, "immediate operand value out of range"); 2235 break; 2236 case Mips::LWP_MM: 2237 case Mips::SWP_MM: 2238 if (Inst.getOperand(0).getReg() == Mips::RA) 2239 return Error(IDLoc, "invalid operand for instruction"); 2240 break; 2241 case Mips::MOVEP_MM: 2242 case Mips::MOVEP_MMR6: { 2243 unsigned R0 = Inst.getOperand(0).getReg(); 2244 unsigned R1 = Inst.getOperand(1).getReg(); 2245 bool RegPair = ((R0 == Mips::A1 && R1 == Mips::A2) || 2246 (R0 == Mips::A1 && R1 == Mips::A3) || 2247 (R0 == Mips::A2 && R1 == Mips::A3) || 2248 (R0 == Mips::A0 && R1 == Mips::S5) || 2249 (R0 == Mips::A0 && R1 == Mips::S6) || 2250 (R0 == Mips::A0 && R1 == Mips::A1) || 2251 (R0 == Mips::A0 && R1 == Mips::A2) || 2252 (R0 == Mips::A0 && R1 == Mips::A3)); 2253 if (!RegPair) 2254 return Error(IDLoc, "invalid operand for instruction"); 2255 break; 2256 } 2257 } 2258 } 2259 2260 bool FillDelaySlot = 2261 MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder(); 2262 if (FillDelaySlot) 2263 TOut.emitDirectiveSetNoReorder(); 2264 2265 MacroExpanderResultTy ExpandResult = 2266 tryExpandInstruction(Inst, IDLoc, Out, STI); 2267 switch (ExpandResult) { 2268 case MER_NotAMacro: 2269 Out.EmitInstruction(Inst, *STI); 2270 break; 2271 case MER_Success: 2272 break; 2273 case MER_Fail: 2274 return true; 2275 } 2276 2277 // We know we emitted an instruction on the MER_NotAMacro or MER_Success path. 2278 // If we're in microMIPS mode then we must also set EF_MIPS_MICROMIPS. 2279 if (inMicroMipsMode()) { 2280 TOut.setUsesMicroMips(); 2281 TOut.updateABIInfo(*this); 2282 } 2283 2284 // If this instruction has a delay slot and .set reorder is active, 2285 // emit a NOP after it. 2286 if (FillDelaySlot) { 2287 TOut.emitEmptyDelaySlot(hasShortDelaySlot(Inst.getOpcode()), IDLoc, STI); 2288 TOut.emitDirectiveSetReorder(); 2289 } 2290 2291 if ((Inst.getOpcode() == Mips::JalOneReg || 2292 Inst.getOpcode() == Mips::JalTwoReg || ExpandedJalSym) && 2293 isPicAndNotNxxAbi()) { 2294 if (IsCpRestoreSet) { 2295 // We need a NOP between the JALR and the LW: 2296 // If .set reorder has been used, we've already emitted a NOP. 2297 // If .set noreorder has been used, we need to emit a NOP at this point. 2298 if (!AssemblerOptions.back()->isReorder()) 2299 TOut.emitEmptyDelaySlot(hasShortDelaySlot(Inst.getOpcode()), IDLoc, 2300 STI); 2301 2302 // Load the $gp from the stack. 2303 TOut.emitGPRestore(CpRestoreOffset, IDLoc, STI); 2304 } else 2305 Warning(IDLoc, "no .cprestore used in PIC mode"); 2306 } 2307 2308 return false; 2309 } 2310 2311 MipsAsmParser::MacroExpanderResultTy 2312 MipsAsmParser::tryExpandInstruction(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 2313 const MCSubtargetInfo *STI) { 2314 switch (Inst.getOpcode()) { 2315 default: 2316 return MER_NotAMacro; 2317 case Mips::LoadImm32: 2318 return expandLoadImm(Inst, true, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2319 case Mips::LoadImm64: 2320 return expandLoadImm(Inst, false, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2321 case Mips::LoadAddrImm32: 2322 case Mips::LoadAddrImm64: 2323 assert(Inst.getOperand(0).isReg() && "expected register operand kind"); 2324 assert((Inst.getOperand(1).isImm() || Inst.getOperand(1).isExpr()) && 2325 "expected immediate operand kind"); 2326 2327 return expandLoadAddress(Inst.getOperand(0).getReg(), Mips::NoRegister, 2328 Inst.getOperand(1), 2329 Inst.getOpcode() == Mips::LoadAddrImm32, IDLoc, 2330 Out, STI) 2331 ? MER_Fail 2332 : MER_Success; 2333 case Mips::LoadAddrReg32: 2334 case Mips::LoadAddrReg64: 2335 assert(Inst.getOperand(0).isReg() && "expected register operand kind"); 2336 assert(Inst.getOperand(1).isReg() && "expected register operand kind"); 2337 assert((Inst.getOperand(2).isImm() || Inst.getOperand(2).isExpr()) && 2338 "expected immediate operand kind"); 2339 2340 return expandLoadAddress(Inst.getOperand(0).getReg(), 2341 Inst.getOperand(1).getReg(), Inst.getOperand(2), 2342 Inst.getOpcode() == Mips::LoadAddrReg32, IDLoc, 2343 Out, STI) 2344 ? MER_Fail 2345 : MER_Success; 2346 case Mips::B_MM_Pseudo: 2347 case Mips::B_MMR6_Pseudo: 2348 return expandUncondBranchMMPseudo(Inst, IDLoc, Out, STI) ? MER_Fail 2349 : MER_Success; 2350 case Mips::SWM_MM: 2351 case Mips::LWM_MM: 2352 return expandLoadStoreMultiple(Inst, IDLoc, Out, STI) ? MER_Fail 2353 : MER_Success; 2354 case Mips::JalOneReg: 2355 case Mips::JalTwoReg: 2356 return expandJalWithRegs(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2357 case Mips::BneImm: 2358 case Mips::BeqImm: 2359 case Mips::BEQLImmMacro: 2360 case Mips::BNELImmMacro: 2361 return expandBranchImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2362 case Mips::BLT: 2363 case Mips::BLE: 2364 case Mips::BGE: 2365 case Mips::BGT: 2366 case Mips::BLTU: 2367 case Mips::BLEU: 2368 case Mips::BGEU: 2369 case Mips::BGTU: 2370 case Mips::BLTL: 2371 case Mips::BLEL: 2372 case Mips::BGEL: 2373 case Mips::BGTL: 2374 case Mips::BLTUL: 2375 case Mips::BLEUL: 2376 case Mips::BGEUL: 2377 case Mips::BGTUL: 2378 case Mips::BLTImmMacro: 2379 case Mips::BLEImmMacro: 2380 case Mips::BGEImmMacro: 2381 case Mips::BGTImmMacro: 2382 case Mips::BLTUImmMacro: 2383 case Mips::BLEUImmMacro: 2384 case Mips::BGEUImmMacro: 2385 case Mips::BGTUImmMacro: 2386 case Mips::BLTLImmMacro: 2387 case Mips::BLELImmMacro: 2388 case Mips::BGELImmMacro: 2389 case Mips::BGTLImmMacro: 2390 case Mips::BLTULImmMacro: 2391 case Mips::BLEULImmMacro: 2392 case Mips::BGEULImmMacro: 2393 case Mips::BGTULImmMacro: 2394 return expandCondBranches(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2395 case Mips::SDivMacro: 2396 case Mips::SDivIMacro: 2397 case Mips::SRemMacro: 2398 case Mips::SRemIMacro: 2399 return expandDivRem(Inst, IDLoc, Out, STI, false, true) ? MER_Fail 2400 : MER_Success; 2401 case Mips::DSDivMacro: 2402 case Mips::DSDivIMacro: 2403 case Mips::DSRemMacro: 2404 case Mips::DSRemIMacro: 2405 return expandDivRem(Inst, IDLoc, Out, STI, true, true) ? MER_Fail 2406 : MER_Success; 2407 case Mips::UDivMacro: 2408 case Mips::UDivIMacro: 2409 case Mips::URemMacro: 2410 case Mips::URemIMacro: 2411 return expandDivRem(Inst, IDLoc, Out, STI, false, false) ? MER_Fail 2412 : MER_Success; 2413 case Mips::DUDivMacro: 2414 case Mips::DUDivIMacro: 2415 case Mips::DURemMacro: 2416 case Mips::DURemIMacro: 2417 return expandDivRem(Inst, IDLoc, Out, STI, true, false) ? MER_Fail 2418 : MER_Success; 2419 case Mips::PseudoTRUNC_W_S: 2420 return expandTrunc(Inst, false, false, IDLoc, Out, STI) ? MER_Fail 2421 : MER_Success; 2422 case Mips::PseudoTRUNC_W_D32: 2423 return expandTrunc(Inst, true, false, IDLoc, Out, STI) ? MER_Fail 2424 : MER_Success; 2425 case Mips::PseudoTRUNC_W_D: 2426 return expandTrunc(Inst, true, true, IDLoc, Out, STI) ? MER_Fail 2427 : MER_Success; 2428 2429 case Mips::LoadImmSingleGPR: 2430 return expandLoadImmReal(Inst, true, true, false, IDLoc, Out, STI) 2431 ? MER_Fail 2432 : MER_Success; 2433 case Mips::LoadImmSingleFGR: 2434 return expandLoadImmReal(Inst, true, false, false, IDLoc, Out, STI) 2435 ? MER_Fail 2436 : MER_Success; 2437 case Mips::LoadImmDoubleGPR: 2438 return expandLoadImmReal(Inst, false, true, false, IDLoc, Out, STI) 2439 ? MER_Fail 2440 : MER_Success; 2441 case Mips::LoadImmDoubleFGR: 2442 return expandLoadImmReal(Inst, false, false, true, IDLoc, Out, STI) 2443 ? MER_Fail 2444 : MER_Success; 2445 case Mips::LoadImmDoubleFGR_32: 2446 return expandLoadImmReal(Inst, false, false, false, IDLoc, Out, STI) 2447 ? MER_Fail 2448 : MER_Success; 2449 case Mips::Ulh: 2450 return expandUlh(Inst, true, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2451 case Mips::Ulhu: 2452 return expandUlh(Inst, false, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2453 case Mips::Ush: 2454 return expandUsh(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2455 case Mips::Ulw: 2456 case Mips::Usw: 2457 return expandUxw(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2458 case Mips::NORImm: 2459 case Mips::NORImm64: 2460 return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2461 case Mips::SLTImm64: 2462 if (isInt<16>(Inst.getOperand(2).getImm())) { 2463 Inst.setOpcode(Mips::SLTi64); 2464 return MER_NotAMacro; 2465 } 2466 return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2467 case Mips::SLTUImm64: 2468 if (isInt<16>(Inst.getOperand(2).getImm())) { 2469 Inst.setOpcode(Mips::SLTiu64); 2470 return MER_NotAMacro; 2471 } 2472 return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2473 case Mips::ADDi: case Mips::ADDi_MM: 2474 case Mips::ADDiu: case Mips::ADDiu_MM: 2475 case Mips::SLTi: case Mips::SLTi_MM: 2476 case Mips::SLTiu: case Mips::SLTiu_MM: 2477 if ((Inst.getNumOperands() == 3) && Inst.getOperand(0).isReg() && 2478 Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm()) { 2479 int64_t ImmValue = Inst.getOperand(2).getImm(); 2480 if (isInt<16>(ImmValue)) 2481 return MER_NotAMacro; 2482 return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail 2483 : MER_Success; 2484 } 2485 return MER_NotAMacro; 2486 case Mips::ANDi: case Mips::ANDi_MM: case Mips::ANDi64: 2487 case Mips::ORi: case Mips::ORi_MM: case Mips::ORi64: 2488 case Mips::XORi: case Mips::XORi_MM: case Mips::XORi64: 2489 if ((Inst.getNumOperands() == 3) && Inst.getOperand(0).isReg() && 2490 Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm()) { 2491 int64_t ImmValue = Inst.getOperand(2).getImm(); 2492 if (isUInt<16>(ImmValue)) 2493 return MER_NotAMacro; 2494 return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail 2495 : MER_Success; 2496 } 2497 return MER_NotAMacro; 2498 case Mips::ROL: 2499 case Mips::ROR: 2500 return expandRotation(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2501 case Mips::ROLImm: 2502 case Mips::RORImm: 2503 return expandRotationImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2504 case Mips::DROL: 2505 case Mips::DROR: 2506 return expandDRotation(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2507 case Mips::DROLImm: 2508 case Mips::DRORImm: 2509 return expandDRotationImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2510 case Mips::ABSMacro: 2511 return expandAbs(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2512 case Mips::MULImmMacro: 2513 case Mips::DMULImmMacro: 2514 return expandMulImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2515 case Mips::MULOMacro: 2516 case Mips::DMULOMacro: 2517 return expandMulO(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2518 case Mips::MULOUMacro: 2519 case Mips::DMULOUMacro: 2520 return expandMulOU(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2521 case Mips::DMULMacro: 2522 return expandDMULMacro(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2523 case Mips::LDMacro: 2524 case Mips::SDMacro: 2525 return expandLoadStoreDMacro(Inst, IDLoc, Out, STI, 2526 Inst.getOpcode() == Mips::LDMacro) 2527 ? MER_Fail 2528 : MER_Success; 2529 case Mips::SEQMacro: 2530 return expandSeq(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2531 case Mips::SEQIMacro: 2532 return expandSeqI(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2533 case Mips::MFTC0: case Mips::MTTC0: 2534 case Mips::MFTGPR: case Mips::MTTGPR: 2535 case Mips::MFTLO: case Mips::MTTLO: 2536 case Mips::MFTHI: case Mips::MTTHI: 2537 case Mips::MFTACX: case Mips::MTTACX: 2538 case Mips::MFTDSP: case Mips::MTTDSP: 2539 case Mips::MFTC1: case Mips::MTTC1: 2540 case Mips::MFTHC1: case Mips::MTTHC1: 2541 case Mips::CFTC1: case Mips::CTTC1: 2542 return expandMXTRAlias(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success; 2543 } 2544 } 2545 2546 bool MipsAsmParser::expandJalWithRegs(MCInst &Inst, SMLoc IDLoc, 2547 MCStreamer &Out, 2548 const MCSubtargetInfo *STI) { 2549 MipsTargetStreamer &TOut = getTargetStreamer(); 2550 2551 // Create a JALR instruction which is going to replace the pseudo-JAL. 2552 MCInst JalrInst; 2553 JalrInst.setLoc(IDLoc); 2554 const MCOperand FirstRegOp = Inst.getOperand(0); 2555 const unsigned Opcode = Inst.getOpcode(); 2556 2557 if (Opcode == Mips::JalOneReg) { 2558 // jal $rs => jalr $rs 2559 if (IsCpRestoreSet && inMicroMipsMode()) { 2560 JalrInst.setOpcode(Mips::JALRS16_MM); 2561 JalrInst.addOperand(FirstRegOp); 2562 } else if (inMicroMipsMode()) { 2563 JalrInst.setOpcode(hasMips32r6() ? Mips::JALRC16_MMR6 : Mips::JALR16_MM); 2564 JalrInst.addOperand(FirstRegOp); 2565 } else { 2566 JalrInst.setOpcode(Mips::JALR); 2567 JalrInst.addOperand(MCOperand::createReg(Mips::RA)); 2568 JalrInst.addOperand(FirstRegOp); 2569 } 2570 } else if (Opcode == Mips::JalTwoReg) { 2571 // jal $rd, $rs => jalr $rd, $rs 2572 if (IsCpRestoreSet && inMicroMipsMode()) 2573 JalrInst.setOpcode(Mips::JALRS_MM); 2574 else 2575 JalrInst.setOpcode(inMicroMipsMode() ? Mips::JALR_MM : Mips::JALR); 2576 JalrInst.addOperand(FirstRegOp); 2577 const MCOperand SecondRegOp = Inst.getOperand(1); 2578 JalrInst.addOperand(SecondRegOp); 2579 } 2580 Out.EmitInstruction(JalrInst, *STI); 2581 2582 // If .set reorder is active and branch instruction has a delay slot, 2583 // emit a NOP after it. 2584 const MCInstrDesc &MCID = getInstDesc(JalrInst.getOpcode()); 2585 if (MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder()) 2586 TOut.emitEmptyDelaySlot(hasShortDelaySlot(JalrInst.getOpcode()), IDLoc, 2587 STI); 2588 2589 return false; 2590 } 2591 2592 /// Can the value be represented by a unsigned N-bit value and a shift left? 2593 template <unsigned N> static bool isShiftedUIntAtAnyPosition(uint64_t x) { 2594 unsigned BitNum = findFirstSet(x); 2595 2596 return (x == x >> BitNum << BitNum) && isUInt<N>(x >> BitNum); 2597 } 2598 2599 /// Load (or add) an immediate into a register. 2600 /// 2601 /// @param ImmValue The immediate to load. 2602 /// @param DstReg The register that will hold the immediate. 2603 /// @param SrcReg A register to add to the immediate or Mips::NoRegister 2604 /// for a simple initialization. 2605 /// @param Is32BitImm Is ImmValue 32-bit or 64-bit? 2606 /// @param IsAddress True if the immediate represents an address. False if it 2607 /// is an integer. 2608 /// @param IDLoc Location of the immediate in the source file. 2609 bool MipsAsmParser::loadImmediate(int64_t ImmValue, unsigned DstReg, 2610 unsigned SrcReg, bool Is32BitImm, 2611 bool IsAddress, SMLoc IDLoc, MCStreamer &Out, 2612 const MCSubtargetInfo *STI) { 2613 MipsTargetStreamer &TOut = getTargetStreamer(); 2614 2615 if (!Is32BitImm && !isGP64bit()) { 2616 Error(IDLoc, "instruction requires a 64-bit architecture"); 2617 return true; 2618 } 2619 2620 if (Is32BitImm) { 2621 if (isInt<32>(ImmValue) || isUInt<32>(ImmValue)) { 2622 // Sign extend up to 64-bit so that the predicates match the hardware 2623 // behaviour. In particular, isInt<16>(0xffff8000) and similar should be 2624 // true. 2625 ImmValue = SignExtend64<32>(ImmValue); 2626 } else { 2627 Error(IDLoc, "instruction requires a 32-bit immediate"); 2628 return true; 2629 } 2630 } 2631 2632 unsigned ZeroReg = IsAddress ? ABI.GetNullPtr() : ABI.GetZeroReg(); 2633 unsigned AdduOp = !Is32BitImm ? Mips::DADDu : Mips::ADDu; 2634 2635 bool UseSrcReg = false; 2636 if (SrcReg != Mips::NoRegister) 2637 UseSrcReg = true; 2638 2639 unsigned TmpReg = DstReg; 2640 if (UseSrcReg && 2641 getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, SrcReg)) { 2642 // At this point we need AT to perform the expansions and we exit if it is 2643 // not available. 2644 unsigned ATReg = getATReg(IDLoc); 2645 if (!ATReg) 2646 return true; 2647 TmpReg = ATReg; 2648 } 2649 2650 if (isInt<16>(ImmValue)) { 2651 if (!UseSrcReg) 2652 SrcReg = ZeroReg; 2653 2654 // This doesn't quite follow the usual ABI expectations for N32 but matches 2655 // traditional assembler behaviour. N32 would normally use addiu for both 2656 // integers and addresses. 2657 if (IsAddress && !Is32BitImm) { 2658 TOut.emitRRI(Mips::DADDiu, DstReg, SrcReg, ImmValue, IDLoc, STI); 2659 return false; 2660 } 2661 2662 TOut.emitRRI(Mips::ADDiu, DstReg, SrcReg, ImmValue, IDLoc, STI); 2663 return false; 2664 } 2665 2666 if (isUInt<16>(ImmValue)) { 2667 unsigned TmpReg = DstReg; 2668 if (SrcReg == DstReg) { 2669 TmpReg = getATReg(IDLoc); 2670 if (!TmpReg) 2671 return true; 2672 } 2673 2674 TOut.emitRRI(Mips::ORi, TmpReg, ZeroReg, ImmValue, IDLoc, STI); 2675 if (UseSrcReg) 2676 TOut.emitRRR(ABI.GetPtrAdduOp(), DstReg, TmpReg, SrcReg, IDLoc, STI); 2677 return false; 2678 } 2679 2680 if (isInt<32>(ImmValue) || isUInt<32>(ImmValue)) { 2681 warnIfNoMacro(IDLoc); 2682 2683 uint16_t Bits31To16 = (ImmValue >> 16) & 0xffff; 2684 uint16_t Bits15To0 = ImmValue & 0xffff; 2685 if (!Is32BitImm && !isInt<32>(ImmValue)) { 2686 // Traditional behaviour seems to special case this particular value. It's 2687 // not clear why other masks are handled differently. 2688 if (ImmValue == 0xffffffff) { 2689 TOut.emitRI(Mips::LUi, TmpReg, 0xffff, IDLoc, STI); 2690 TOut.emitRRI(Mips::DSRL32, TmpReg, TmpReg, 0, IDLoc, STI); 2691 if (UseSrcReg) 2692 TOut.emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, STI); 2693 return false; 2694 } 2695 2696 // Expand to an ORi instead of a LUi to avoid sign-extending into the 2697 // upper 32 bits. 2698 TOut.emitRRI(Mips::ORi, TmpReg, ZeroReg, Bits31To16, IDLoc, STI); 2699 TOut.emitRRI(Mips::DSLL, TmpReg, TmpReg, 16, IDLoc, STI); 2700 if (Bits15To0) 2701 TOut.emitRRI(Mips::ORi, TmpReg, TmpReg, Bits15To0, IDLoc, STI); 2702 if (UseSrcReg) 2703 TOut.emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, STI); 2704 return false; 2705 } 2706 2707 TOut.emitRI(Mips::LUi, TmpReg, Bits31To16, IDLoc, STI); 2708 if (Bits15To0) 2709 TOut.emitRRI(Mips::ORi, TmpReg, TmpReg, Bits15To0, IDLoc, STI); 2710 if (UseSrcReg) 2711 TOut.emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, STI); 2712 return false; 2713 } 2714 2715 if (isShiftedUIntAtAnyPosition<16>(ImmValue)) { 2716 if (Is32BitImm) { 2717 Error(IDLoc, "instruction requires a 32-bit immediate"); 2718 return true; 2719 } 2720 2721 // Traditionally, these immediates are shifted as little as possible and as 2722 // such we align the most significant bit to bit 15 of our temporary. 2723 unsigned FirstSet = findFirstSet((uint64_t)ImmValue); 2724 unsigned LastSet = findLastSet((uint64_t)ImmValue); 2725 unsigned ShiftAmount = FirstSet - (15 - (LastSet - FirstSet)); 2726 uint16_t Bits = (ImmValue >> ShiftAmount) & 0xffff; 2727 TOut.emitRRI(Mips::ORi, TmpReg, ZeroReg, Bits, IDLoc, STI); 2728 TOut.emitRRI(Mips::DSLL, TmpReg, TmpReg, ShiftAmount, IDLoc, STI); 2729 2730 if (UseSrcReg) 2731 TOut.emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, STI); 2732 2733 return false; 2734 } 2735 2736 warnIfNoMacro(IDLoc); 2737 2738 // The remaining case is packed with a sequence of dsll and ori with zeros 2739 // being omitted and any neighbouring dsll's being coalesced. 2740 // The highest 32-bit's are equivalent to a 32-bit immediate load. 2741 2742 // Load bits 32-63 of ImmValue into bits 0-31 of the temporary register. 2743 if (loadImmediate(ImmValue >> 32, TmpReg, Mips::NoRegister, true, false, 2744 IDLoc, Out, STI)) 2745 return false; 2746 2747 // Shift and accumulate into the register. If a 16-bit chunk is zero, then 2748 // skip it and defer the shift to the next chunk. 2749 unsigned ShiftCarriedForwards = 16; 2750 for (int BitNum = 16; BitNum >= 0; BitNum -= 16) { 2751 uint16_t ImmChunk = (ImmValue >> BitNum) & 0xffff; 2752 2753 if (ImmChunk != 0) { 2754 TOut.emitDSLL(TmpReg, TmpReg, ShiftCarriedForwards, IDLoc, STI); 2755 TOut.emitRRI(Mips::ORi, TmpReg, TmpReg, ImmChunk, IDLoc, STI); 2756 ShiftCarriedForwards = 0; 2757 } 2758 2759 ShiftCarriedForwards += 16; 2760 } 2761 ShiftCarriedForwards -= 16; 2762 2763 // Finish any remaining shifts left by trailing zeros. 2764 if (ShiftCarriedForwards) 2765 TOut.emitDSLL(TmpReg, TmpReg, ShiftCarriedForwards, IDLoc, STI); 2766 2767 if (UseSrcReg) 2768 TOut.emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, STI); 2769 2770 return false; 2771 } 2772 2773 bool MipsAsmParser::expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc, 2774 MCStreamer &Out, const MCSubtargetInfo *STI) { 2775 const MCOperand &ImmOp = Inst.getOperand(1); 2776 assert(ImmOp.isImm() && "expected immediate operand kind"); 2777 const MCOperand &DstRegOp = Inst.getOperand(0); 2778 assert(DstRegOp.isReg() && "expected register operand kind"); 2779 2780 if (loadImmediate(ImmOp.getImm(), DstRegOp.getReg(), Mips::NoRegister, 2781 Is32BitImm, false, IDLoc, Out, STI)) 2782 return true; 2783 2784 return false; 2785 } 2786 2787 bool MipsAsmParser::expandLoadAddress(unsigned DstReg, unsigned BaseReg, 2788 const MCOperand &Offset, 2789 bool Is32BitAddress, SMLoc IDLoc, 2790 MCStreamer &Out, 2791 const MCSubtargetInfo *STI) { 2792 // la can't produce a usable address when addresses are 64-bit. 2793 if (Is32BitAddress && ABI.ArePtrs64bit()) { 2794 // FIXME: Demote this to a warning and continue as if we had 'dla' instead. 2795 // We currently can't do this because we depend on the equality 2796 // operator and N64 can end up with a GPR32/GPR64 mismatch. 2797 Error(IDLoc, "la used to load 64-bit address"); 2798 // Continue as if we had 'dla' instead. 2799 Is32BitAddress = false; 2800 return true; 2801 } 2802 2803 // dla requires 64-bit addresses. 2804 if (!Is32BitAddress && !hasMips3()) { 2805 Error(IDLoc, "instruction requires a 64-bit architecture"); 2806 return true; 2807 } 2808 2809 if (!Offset.isImm()) 2810 return loadAndAddSymbolAddress(Offset.getExpr(), DstReg, BaseReg, 2811 Is32BitAddress, IDLoc, Out, STI); 2812 2813 if (!ABI.ArePtrs64bit()) { 2814 // Continue as if we had 'la' whether we had 'la' or 'dla'. 2815 Is32BitAddress = true; 2816 } 2817 2818 return loadImmediate(Offset.getImm(), DstReg, BaseReg, Is32BitAddress, true, 2819 IDLoc, Out, STI); 2820 } 2821 2822 bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr, 2823 unsigned DstReg, unsigned SrcReg, 2824 bool Is32BitSym, SMLoc IDLoc, 2825 MCStreamer &Out, 2826 const MCSubtargetInfo *STI) { 2827 // FIXME: These expansions do not respect -mxgot. 2828 MipsTargetStreamer &TOut = getTargetStreamer(); 2829 bool UseSrcReg = SrcReg != Mips::NoRegister; 2830 warnIfNoMacro(IDLoc); 2831 2832 if (inPicMode() && ABI.IsO32()) { 2833 MCValue Res; 2834 if (!SymExpr->evaluateAsRelocatable(Res, nullptr, nullptr)) { 2835 Error(IDLoc, "expected relocatable expression"); 2836 return true; 2837 } 2838 if (Res.getSymB() != nullptr) { 2839 Error(IDLoc, "expected relocatable expression with only one symbol"); 2840 return true; 2841 } 2842 2843 // The case where the result register is $25 is somewhat special. If the 2844 // symbol in the final relocation is external and not modified with a 2845 // constant then we must use R_MIPS_CALL16 instead of R_MIPS_GOT16. 2846 if ((DstReg == Mips::T9 || DstReg == Mips::T9_64) && !UseSrcReg && 2847 Res.getConstant() == 0 && 2848 !(Res.getSymA()->getSymbol().isInSection() || 2849 Res.getSymA()->getSymbol().isTemporary() || 2850 (Res.getSymA()->getSymbol().isELF() && 2851 cast<MCSymbolELF>(Res.getSymA()->getSymbol()).getBinding() == 2852 ELF::STB_LOCAL))) { 2853 const MCExpr *CallExpr = 2854 MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, SymExpr, getContext()); 2855 TOut.emitRRX(Mips::LW, DstReg, ABI.GetGlobalPtr(), 2856 MCOperand::createExpr(CallExpr), IDLoc, STI); 2857 return false; 2858 } 2859 2860 // The remaining cases are: 2861 // External GOT: lw $tmp, %got(symbol+offset)($gp) 2862 // >addiu $tmp, $tmp, %lo(offset) 2863 // >addiu $rd, $tmp, $rs 2864 // Local GOT: lw $tmp, %got(symbol+offset)($gp) 2865 // addiu $tmp, $tmp, %lo(symbol+offset)($gp) 2866 // >addiu $rd, $tmp, $rs 2867 // The addiu's marked with a '>' may be omitted if they are redundant. If 2868 // this happens then the last instruction must use $rd as the result 2869 // register. 2870 const MipsMCExpr *GotExpr = 2871 MipsMCExpr::create(MipsMCExpr::MEK_GOT, SymExpr, getContext()); 2872 const MCExpr *LoExpr = nullptr; 2873 if (Res.getSymA()->getSymbol().isInSection() || 2874 Res.getSymA()->getSymbol().isTemporary()) 2875 LoExpr = MipsMCExpr::create(MipsMCExpr::MEK_LO, SymExpr, getContext()); 2876 else if (Res.getConstant() != 0) { 2877 // External symbols fully resolve the symbol with just the %got(symbol) 2878 // but we must still account for any offset to the symbol for expressions 2879 // like symbol+8. 2880 LoExpr = MCConstantExpr::create(Res.getConstant(), getContext()); 2881 } 2882 2883 unsigned TmpReg = DstReg; 2884 if (UseSrcReg && 2885 getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, 2886 SrcReg)) { 2887 // If $rs is the same as $rd, we need to use AT. 2888 // If it is not available we exit. 2889 unsigned ATReg = getATReg(IDLoc); 2890 if (!ATReg) 2891 return true; 2892 TmpReg = ATReg; 2893 } 2894 2895 TOut.emitRRX(Mips::LW, TmpReg, ABI.GetGlobalPtr(), 2896 MCOperand::createExpr(GotExpr), IDLoc, STI); 2897 2898 if (LoExpr) 2899 TOut.emitRRX(Mips::ADDiu, TmpReg, TmpReg, MCOperand::createExpr(LoExpr), 2900 IDLoc, STI); 2901 2902 if (UseSrcReg) 2903 TOut.emitRRR(Mips::ADDu, DstReg, TmpReg, SrcReg, IDLoc, STI); 2904 2905 return false; 2906 } 2907 2908 if (inPicMode() && ABI.ArePtrs64bit()) { 2909 MCValue Res; 2910 if (!SymExpr->evaluateAsRelocatable(Res, nullptr, nullptr)) { 2911 Error(IDLoc, "expected relocatable expression"); 2912 return true; 2913 } 2914 if (Res.getSymB() != nullptr) { 2915 Error(IDLoc, "expected relocatable expression with only one symbol"); 2916 return true; 2917 } 2918 2919 // The case where the result register is $25 is somewhat special. If the 2920 // symbol in the final relocation is external and not modified with a 2921 // constant then we must use R_MIPS_CALL16 instead of R_MIPS_GOT_DISP. 2922 if ((DstReg == Mips::T9 || DstReg == Mips::T9_64) && !UseSrcReg && 2923 Res.getConstant() == 0 && 2924 !(Res.getSymA()->getSymbol().isInSection() || 2925 Res.getSymA()->getSymbol().isTemporary() || 2926 (Res.getSymA()->getSymbol().isELF() && 2927 cast<MCSymbolELF>(Res.getSymA()->getSymbol()).getBinding() == 2928 ELF::STB_LOCAL))) { 2929 const MCExpr *CallExpr = 2930 MipsMCExpr::create(MipsMCExpr::MEK_GOT_CALL, SymExpr, getContext()); 2931 TOut.emitRRX(Mips::LD, DstReg, ABI.GetGlobalPtr(), 2932 MCOperand::createExpr(CallExpr), IDLoc, STI); 2933 return false; 2934 } 2935 2936 // The remaining cases are: 2937 // Small offset: ld $tmp, %got_disp(symbol)($gp) 2938 // >daddiu $tmp, $tmp, offset 2939 // >daddu $rd, $tmp, $rs 2940 // The daddiu's marked with a '>' may be omitted if they are redundant. If 2941 // this happens then the last instruction must use $rd as the result 2942 // register. 2943 const MipsMCExpr *GotExpr = MipsMCExpr::create(MipsMCExpr::MEK_GOT_DISP, 2944 Res.getSymA(), 2945 getContext()); 2946 const MCExpr *LoExpr = nullptr; 2947 if (Res.getConstant() != 0) { 2948 // Symbols fully resolve with just the %got_disp(symbol) but we 2949 // must still account for any offset to the symbol for 2950 // expressions like symbol+8. 2951 LoExpr = MCConstantExpr::create(Res.getConstant(), getContext()); 2952 2953 // FIXME: Offsets greater than 16 bits are not yet implemented. 2954 // FIXME: The correct range is a 32-bit sign-extended number. 2955 if (Res.getConstant() < -0x8000 || Res.getConstant() > 0x7fff) { 2956 Error(IDLoc, "macro instruction uses large offset, which is not " 2957 "currently supported"); 2958 return true; 2959 } 2960 } 2961 2962 unsigned TmpReg = DstReg; 2963 if (UseSrcReg && 2964 getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, 2965 SrcReg)) { 2966 // If $rs is the same as $rd, we need to use AT. 2967 // If it is not available we exit. 2968 unsigned ATReg = getATReg(IDLoc); 2969 if (!ATReg) 2970 return true; 2971 TmpReg = ATReg; 2972 } 2973 2974 TOut.emitRRX(Mips::LD, TmpReg, ABI.GetGlobalPtr(), 2975 MCOperand::createExpr(GotExpr), IDLoc, STI); 2976 2977 if (LoExpr) 2978 TOut.emitRRX(Mips::DADDiu, TmpReg, TmpReg, MCOperand::createExpr(LoExpr), 2979 IDLoc, STI); 2980 2981 if (UseSrcReg) 2982 TOut.emitRRR(Mips::DADDu, DstReg, TmpReg, SrcReg, IDLoc, STI); 2983 2984 return false; 2985 } 2986 2987 const MipsMCExpr *HiExpr = 2988 MipsMCExpr::create(MipsMCExpr::MEK_HI, SymExpr, getContext()); 2989 const MipsMCExpr *LoExpr = 2990 MipsMCExpr::create(MipsMCExpr::MEK_LO, SymExpr, getContext()); 2991 2992 // This is the 64-bit symbol address expansion. 2993 if (ABI.ArePtrs64bit() && isGP64bit()) { 2994 // We need AT for the 64-bit expansion in the cases where the optional 2995 // source register is the destination register and for the superscalar 2996 // scheduled form. 2997 // 2998 // If it is not available we exit if the destination is the same as the 2999 // source register. 3000 3001 const MipsMCExpr *HighestExpr = 3002 MipsMCExpr::create(MipsMCExpr::MEK_HIGHEST, SymExpr, getContext()); 3003 const MipsMCExpr *HigherExpr = 3004 MipsMCExpr::create(MipsMCExpr::MEK_HIGHER, SymExpr, getContext()); 3005 3006 bool RdRegIsRsReg = 3007 getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, SrcReg); 3008 3009 if (canUseATReg() && UseSrcReg && RdRegIsRsReg) { 3010 unsigned ATReg = getATReg(IDLoc); 3011 3012 // If $rs is the same as $rd: 3013 // (d)la $rd, sym($rd) => lui $at, %highest(sym) 3014 // daddiu $at, $at, %higher(sym) 3015 // dsll $at, $at, 16 3016 // daddiu $at, $at, %hi(sym) 3017 // dsll $at, $at, 16 3018 // daddiu $at, $at, %lo(sym) 3019 // daddu $rd, $at, $rd 3020 TOut.emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HighestExpr), IDLoc, 3021 STI); 3022 TOut.emitRRX(Mips::DADDiu, ATReg, ATReg, 3023 MCOperand::createExpr(HigherExpr), IDLoc, STI); 3024 TOut.emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, STI); 3025 TOut.emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(HiExpr), 3026 IDLoc, STI); 3027 TOut.emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, STI); 3028 TOut.emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(LoExpr), 3029 IDLoc, STI); 3030 TOut.emitRRR(Mips::DADDu, DstReg, ATReg, SrcReg, IDLoc, STI); 3031 3032 return false; 3033 } else if (canUseATReg() && !RdRegIsRsReg) { 3034 unsigned ATReg = getATReg(IDLoc); 3035 3036 // If the $rs is different from $rd or if $rs isn't specified and we 3037 // have $at available: 3038 // (d)la $rd, sym/sym($rs) => lui $rd, %highest(sym) 3039 // lui $at, %hi(sym) 3040 // daddiu $rd, $rd, %higher(sym) 3041 // daddiu $at, $at, %lo(sym) 3042 // dsll32 $rd, $rd, 0 3043 // daddu $rd, $rd, $at 3044 // (daddu $rd, $rd, $rs) 3045 // 3046 // Which is preferred for superscalar issue. 3047 TOut.emitRX(Mips::LUi, DstReg, MCOperand::createExpr(HighestExpr), IDLoc, 3048 STI); 3049 TOut.emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HiExpr), IDLoc, STI); 3050 TOut.emitRRX(Mips::DADDiu, DstReg, DstReg, 3051 MCOperand::createExpr(HigherExpr), IDLoc, STI); 3052 TOut.emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(LoExpr), 3053 IDLoc, STI); 3054 TOut.emitRRI(Mips::DSLL32, DstReg, DstReg, 0, IDLoc, STI); 3055 TOut.emitRRR(Mips::DADDu, DstReg, DstReg, ATReg, IDLoc, STI); 3056 if (UseSrcReg) 3057 TOut.emitRRR(Mips::DADDu, DstReg, DstReg, SrcReg, IDLoc, STI); 3058 3059 return false; 3060 } else if (!canUseATReg() && !RdRegIsRsReg) { 3061 // Otherwise, synthesize the address in the destination register 3062 // serially: 3063 // (d)la $rd, sym/sym($rs) => lui $rd, %highest(sym) 3064 // daddiu $rd, $rd, %higher(sym) 3065 // dsll $rd, $rd, 16 3066 // daddiu $rd, $rd, %hi(sym) 3067 // dsll $rd, $rd, 16 3068 // daddiu $rd, $rd, %lo(sym) 3069 TOut.emitRX(Mips::LUi, DstReg, MCOperand::createExpr(HighestExpr), IDLoc, 3070 STI); 3071 TOut.emitRRX(Mips::DADDiu, DstReg, DstReg, 3072 MCOperand::createExpr(HigherExpr), IDLoc, STI); 3073 TOut.emitRRI(Mips::DSLL, DstReg, DstReg, 16, IDLoc, STI); 3074 TOut.emitRRX(Mips::DADDiu, DstReg, DstReg, 3075 MCOperand::createExpr(HiExpr), IDLoc, STI); 3076 TOut.emitRRI(Mips::DSLL, DstReg, DstReg, 16, IDLoc, STI); 3077 TOut.emitRRX(Mips::DADDiu, DstReg, DstReg, 3078 MCOperand::createExpr(LoExpr), IDLoc, STI); 3079 if (UseSrcReg) 3080 TOut.emitRRR(Mips::DADDu, DstReg, DstReg, SrcReg, IDLoc, STI); 3081 3082 return false; 3083 } else { 3084 // We have a case where SrcReg == DstReg and we don't have $at 3085 // available. We can't expand this case, so error out appropriately. 3086 assert(SrcReg == DstReg && !canUseATReg() && 3087 "Could have expanded dla but didn't?"); 3088 reportParseError(IDLoc, 3089 "pseudo-instruction requires $at, which is not available"); 3090 return true; 3091 } 3092 } 3093 3094 // And now, the 32-bit symbol address expansion: 3095 // If $rs is the same as $rd: 3096 // (d)la $rd, sym($rd) => lui $at, %hi(sym) 3097 // ori $at, $at, %lo(sym) 3098 // addu $rd, $at, $rd 3099 // Otherwise, if the $rs is different from $rd or if $rs isn't specified: 3100 // (d)la $rd, sym/sym($rs) => lui $rd, %hi(sym) 3101 // ori $rd, $rd, %lo(sym) 3102 // (addu $rd, $rd, $rs) 3103 unsigned TmpReg = DstReg; 3104 if (UseSrcReg && 3105 getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, SrcReg)) { 3106 // If $rs is the same as $rd, we need to use AT. 3107 // If it is not available we exit. 3108 unsigned ATReg = getATReg(IDLoc); 3109 if (!ATReg) 3110 return true; 3111 TmpReg = ATReg; 3112 } 3113 3114 TOut.emitRX(Mips::LUi, TmpReg, MCOperand::createExpr(HiExpr), IDLoc, STI); 3115 TOut.emitRRX(Mips::ADDiu, TmpReg, TmpReg, MCOperand::createExpr(LoExpr), 3116 IDLoc, STI); 3117 3118 if (UseSrcReg) 3119 TOut.emitRRR(Mips::ADDu, DstReg, TmpReg, SrcReg, IDLoc, STI); 3120 else 3121 assert( 3122 getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, TmpReg)); 3123 3124 return false; 3125 } 3126 3127 // Each double-precision register DO-D15 overlaps with two of the single 3128 // precision registers F0-F31. As an example, all of the following hold true: 3129 // D0 + 1 == F1, F1 + 1 == D1, F1 + 1 == F2, depending on the context. 3130 static unsigned nextReg(unsigned Reg) { 3131 if (MipsMCRegisterClasses[Mips::FGR32RegClassID].contains(Reg)) 3132 return Reg == (unsigned)Mips::F31 ? (unsigned)Mips::F0 : Reg + 1; 3133 switch (Reg) { 3134 default: llvm_unreachable("Unknown register in assembly macro expansion!"); 3135 case Mips::ZERO: return Mips::AT; 3136 case Mips::AT: return Mips::V0; 3137 case Mips::V0: return Mips::V1; 3138 case Mips::V1: return Mips::A0; 3139 case Mips::A0: return Mips::A1; 3140 case Mips::A1: return Mips::A2; 3141 case Mips::A2: return Mips::A3; 3142 case Mips::A3: return Mips::T0; 3143 case Mips::T0: return Mips::T1; 3144 case Mips::T1: return Mips::T2; 3145 case Mips::T2: return Mips::T3; 3146 case Mips::T3: return Mips::T4; 3147 case Mips::T4: return Mips::T5; 3148 case Mips::T5: return Mips::T6; 3149 case Mips::T6: return Mips::T7; 3150 case Mips::T7: return Mips::S0; 3151 case Mips::S0: return Mips::S1; 3152 case Mips::S1: return Mips::S2; 3153 case Mips::S2: return Mips::S3; 3154 case Mips::S3: return Mips::S4; 3155 case Mips::S4: return Mips::S5; 3156 case Mips::S5: return Mips::S6; 3157 case Mips::S6: return Mips::S7; 3158 case Mips::S7: return Mips::T8; 3159 case Mips::T8: return Mips::T9; 3160 case Mips::T9: return Mips::K0; 3161 case Mips::K0: return Mips::K1; 3162 case Mips::K1: return Mips::GP; 3163 case Mips::GP: return Mips::SP; 3164 case Mips::SP: return Mips::FP; 3165 case Mips::FP: return Mips::RA; 3166 case Mips::RA: return Mips::ZERO; 3167 case Mips::D0: return Mips::F1; 3168 case Mips::D1: return Mips::F3; 3169 case Mips::D2: return Mips::F5; 3170 case Mips::D3: return Mips::F7; 3171 case Mips::D4: return Mips::F9; 3172 case Mips::D5: return Mips::F11; 3173 case Mips::D6: return Mips::F13; 3174 case Mips::D7: return Mips::F15; 3175 case Mips::D8: return Mips::F17; 3176 case Mips::D9: return Mips::F19; 3177 case Mips::D10: return Mips::F21; 3178 case Mips::D11: return Mips::F23; 3179 case Mips::D12: return Mips::F25; 3180 case Mips::D13: return Mips::F27; 3181 case Mips::D14: return Mips::F29; 3182 case Mips::D15: return Mips::F31; 3183 } 3184 } 3185 3186 // FIXME: This method is too general. In principle we should compute the number 3187 // of instructions required to synthesize the immediate inline compared to 3188 // synthesizing the address inline and relying on non .text sections. 3189 // For static O32 and N32 this may yield a small benefit, for static N64 this is 3190 // likely to yield a much larger benefit as we have to synthesize a 64bit 3191 // address to load a 64 bit value. 3192 bool MipsAsmParser::emitPartialAddress(MipsTargetStreamer &TOut, SMLoc IDLoc, 3193 MCSymbol *Sym) { 3194 unsigned ATReg = getATReg(IDLoc); 3195 if (!ATReg) 3196 return true; 3197 3198 if(IsPicEnabled) { 3199 const MCExpr *GotSym = 3200 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3201 const MipsMCExpr *GotExpr = 3202 MipsMCExpr::create(MipsMCExpr::MEK_GOT, GotSym, getContext()); 3203 3204 if(isABI_O32() || isABI_N32()) { 3205 TOut.emitRRX(Mips::LW, ATReg, Mips::GP, MCOperand::createExpr(GotExpr), 3206 IDLoc, STI); 3207 } else { //isABI_N64() 3208 TOut.emitRRX(Mips::LD, ATReg, Mips::GP, MCOperand::createExpr(GotExpr), 3209 IDLoc, STI); 3210 } 3211 } else { //!IsPicEnabled 3212 const MCExpr *HiSym = 3213 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3214 const MipsMCExpr *HiExpr = 3215 MipsMCExpr::create(MipsMCExpr::MEK_HI, HiSym, getContext()); 3216 3217 // FIXME: This is technically correct but gives a different result to gas, 3218 // but gas is incomplete there (it has a fixme noting it doesn't work with 3219 // 64-bit addresses). 3220 // FIXME: With -msym32 option, the address expansion for N64 should probably 3221 // use the O32 / N32 case. It's safe to use the 64 address expansion as the 3222 // symbol's value is considered sign extended. 3223 if(isABI_O32() || isABI_N32()) { 3224 TOut.emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HiExpr), IDLoc, STI); 3225 } else { //isABI_N64() 3226 const MCExpr *HighestSym = 3227 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3228 const MipsMCExpr *HighestExpr = 3229 MipsMCExpr::create(MipsMCExpr::MEK_HIGHEST, HighestSym, getContext()); 3230 const MCExpr *HigherSym = 3231 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3232 const MipsMCExpr *HigherExpr = 3233 MipsMCExpr::create(MipsMCExpr::MEK_HIGHER, HigherSym, getContext()); 3234 3235 TOut.emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HighestExpr), IDLoc, 3236 STI); 3237 TOut.emitRRX(Mips::DADDiu, ATReg, ATReg, 3238 MCOperand::createExpr(HigherExpr), IDLoc, STI); 3239 TOut.emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, STI); 3240 TOut.emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(HiExpr), 3241 IDLoc, STI); 3242 TOut.emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, STI); 3243 } 3244 } 3245 return false; 3246 } 3247 3248 bool MipsAsmParser::expandLoadImmReal(MCInst &Inst, bool IsSingle, bool IsGPR, 3249 bool Is64FPU, SMLoc IDLoc, 3250 MCStreamer &Out, 3251 const MCSubtargetInfo *STI) { 3252 MipsTargetStreamer &TOut = getTargetStreamer(); 3253 assert(Inst.getNumOperands() == 2 && "Invalid operand count"); 3254 assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isImm() && 3255 "Invalid instruction operand."); 3256 3257 unsigned FirstReg = Inst.getOperand(0).getReg(); 3258 uint64_t ImmOp64 = Inst.getOperand(1).getImm(); 3259 3260 uint32_t HiImmOp64 = (ImmOp64 & 0xffffffff00000000) >> 32; 3261 // If ImmOp64 is AsmToken::Integer type (all bits set to zero in the 3262 // exponent field), convert it to double (e.g. 1 to 1.0) 3263 if ((HiImmOp64 & 0x7ff00000) == 0) { 3264 APFloat RealVal(APFloat::IEEEdouble(), ImmOp64); 3265 ImmOp64 = RealVal.bitcastToAPInt().getZExtValue(); 3266 } 3267 3268 uint32_t LoImmOp64 = ImmOp64 & 0xffffffff; 3269 HiImmOp64 = (ImmOp64 & 0xffffffff00000000) >> 32; 3270 3271 if (IsSingle) { 3272 // Conversion of a double in an uint64_t to a float in a uint32_t, 3273 // retaining the bit pattern of a float. 3274 uint32_t ImmOp32; 3275 double doubleImm = BitsToDouble(ImmOp64); 3276 float tmp_float = static_cast<float>(doubleImm); 3277 ImmOp32 = FloatToBits(tmp_float); 3278 3279 if (IsGPR) { 3280 if (loadImmediate(ImmOp32, FirstReg, Mips::NoRegister, true, true, IDLoc, 3281 Out, STI)) 3282 return true; 3283 return false; 3284 } else { 3285 unsigned ATReg = getATReg(IDLoc); 3286 if (!ATReg) 3287 return true; 3288 if (LoImmOp64 == 0) { 3289 if (loadImmediate(ImmOp32, ATReg, Mips::NoRegister, true, true, IDLoc, 3290 Out, STI)) 3291 return true; 3292 TOut.emitRR(Mips::MTC1, FirstReg, ATReg, IDLoc, STI); 3293 return false; 3294 } 3295 3296 MCSection *CS = getStreamer().getCurrentSectionOnly(); 3297 // FIXME: Enhance this expansion to use the .lit4 & .lit8 sections 3298 // where appropriate. 3299 MCSection *ReadOnlySection = getContext().getELFSection( 3300 ".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); 3301 3302 MCSymbol *Sym = getContext().createTempSymbol(); 3303 const MCExpr *LoSym = 3304 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3305 const MipsMCExpr *LoExpr = 3306 MipsMCExpr::create(MipsMCExpr::MEK_LO, LoSym, getContext()); 3307 3308 getStreamer().SwitchSection(ReadOnlySection); 3309 getStreamer().EmitLabel(Sym, IDLoc); 3310 getStreamer().EmitIntValue(ImmOp32, 4); 3311 getStreamer().SwitchSection(CS); 3312 3313 if(emitPartialAddress(TOut, IDLoc, Sym)) 3314 return true; 3315 TOut.emitRRX(Mips::LWC1, FirstReg, ATReg, 3316 MCOperand::createExpr(LoExpr), IDLoc, STI); 3317 } 3318 return false; 3319 } 3320 3321 // if(!IsSingle) 3322 unsigned ATReg = getATReg(IDLoc); 3323 if (!ATReg) 3324 return true; 3325 3326 if (IsGPR) { 3327 if (LoImmOp64 == 0) { 3328 if(isABI_N32() || isABI_N64()) { 3329 if (loadImmediate(HiImmOp64, FirstReg, Mips::NoRegister, false, true, 3330 IDLoc, Out, STI)) 3331 return true; 3332 return false; 3333 } else { 3334 if (loadImmediate(HiImmOp64, FirstReg, Mips::NoRegister, true, true, 3335 IDLoc, Out, STI)) 3336 return true; 3337 3338 if (loadImmediate(0, nextReg(FirstReg), Mips::NoRegister, true, true, 3339 IDLoc, Out, STI)) 3340 return true; 3341 return false; 3342 } 3343 } 3344 3345 MCSection *CS = getStreamer().getCurrentSectionOnly(); 3346 MCSection *ReadOnlySection = getContext().getELFSection( 3347 ".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); 3348 3349 MCSymbol *Sym = getContext().createTempSymbol(); 3350 const MCExpr *LoSym = 3351 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3352 const MipsMCExpr *LoExpr = 3353 MipsMCExpr::create(MipsMCExpr::MEK_LO, LoSym, getContext()); 3354 3355 getStreamer().SwitchSection(ReadOnlySection); 3356 getStreamer().EmitLabel(Sym, IDLoc); 3357 getStreamer().EmitIntValue(HiImmOp64, 4); 3358 getStreamer().EmitIntValue(LoImmOp64, 4); 3359 getStreamer().SwitchSection(CS); 3360 3361 if(emitPartialAddress(TOut, IDLoc, Sym)) 3362 return true; 3363 if(isABI_N64()) 3364 TOut.emitRRX(Mips::DADDiu, ATReg, ATReg, 3365 MCOperand::createExpr(LoExpr), IDLoc, STI); 3366 else 3367 TOut.emitRRX(Mips::ADDiu, ATReg, ATReg, 3368 MCOperand::createExpr(LoExpr), IDLoc, STI); 3369 3370 if(isABI_N32() || isABI_N64()) 3371 TOut.emitRRI(Mips::LD, FirstReg, ATReg, 0, IDLoc, STI); 3372 else { 3373 TOut.emitRRI(Mips::LW, FirstReg, ATReg, 0, IDLoc, STI); 3374 TOut.emitRRI(Mips::LW, nextReg(FirstReg), ATReg, 4, IDLoc, STI); 3375 } 3376 return false; 3377 } else { // if(!IsGPR && !IsSingle) 3378 if ((LoImmOp64 == 0) && 3379 !((HiImmOp64 & 0xffff0000) && (HiImmOp64 & 0x0000ffff))) { 3380 // FIXME: In the case where the constant is zero, we can load the 3381 // register directly from the zero register. 3382 if (loadImmediate(HiImmOp64, ATReg, Mips::NoRegister, true, true, IDLoc, 3383 Out, STI)) 3384 return true; 3385 if (isABI_N32() || isABI_N64()) 3386 TOut.emitRR(Mips::DMTC1, FirstReg, ATReg, IDLoc, STI); 3387 else if (hasMips32r2()) { 3388 TOut.emitRR(Mips::MTC1, FirstReg, Mips::ZERO, IDLoc, STI); 3389 TOut.emitRRR(Mips::MTHC1_D32, FirstReg, FirstReg, ATReg, IDLoc, STI); 3390 } else { 3391 TOut.emitRR(Mips::MTC1, nextReg(FirstReg), ATReg, IDLoc, STI); 3392 TOut.emitRR(Mips::MTC1, FirstReg, Mips::ZERO, IDLoc, STI); 3393 } 3394 return false; 3395 } 3396 3397 MCSection *CS = getStreamer().getCurrentSectionOnly(); 3398 // FIXME: Enhance this expansion to use the .lit4 & .lit8 sections 3399 // where appropriate. 3400 MCSection *ReadOnlySection = getContext().getELFSection( 3401 ".rodata", ELF::SHT_PROGBITS, ELF::SHF_ALLOC); 3402 3403 MCSymbol *Sym = getContext().createTempSymbol(); 3404 const MCExpr *LoSym = 3405 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 3406 const MipsMCExpr *LoExpr = 3407 MipsMCExpr::create(MipsMCExpr::MEK_LO, LoSym, getContext()); 3408 3409 getStreamer().SwitchSection(ReadOnlySection); 3410 getStreamer().EmitLabel(Sym, IDLoc); 3411 getStreamer().EmitIntValue(HiImmOp64, 4); 3412 getStreamer().EmitIntValue(LoImmOp64, 4); 3413 getStreamer().SwitchSection(CS); 3414 3415 if(emitPartialAddress(TOut, IDLoc, Sym)) 3416 return true; 3417 TOut.emitRRX(Is64FPU ? Mips::LDC164 : Mips::LDC1, FirstReg, ATReg, 3418 MCOperand::createExpr(LoExpr), IDLoc, STI); 3419 } 3420 return false; 3421 } 3422 3423 bool MipsAsmParser::expandUncondBranchMMPseudo(MCInst &Inst, SMLoc IDLoc, 3424 MCStreamer &Out, 3425 const MCSubtargetInfo *STI) { 3426 MipsTargetStreamer &TOut = getTargetStreamer(); 3427 3428 assert(getInstDesc(Inst.getOpcode()).getNumOperands() == 1 && 3429 "unexpected number of operands"); 3430 3431 MCOperand Offset = Inst.getOperand(0); 3432 if (Offset.isExpr()) { 3433 Inst.clear(); 3434 Inst.setOpcode(Mips::BEQ_MM); 3435 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 3436 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 3437 Inst.addOperand(MCOperand::createExpr(Offset.getExpr())); 3438 } else { 3439 assert(Offset.isImm() && "expected immediate operand kind"); 3440 if (isInt<11>(Offset.getImm())) { 3441 // If offset fits into 11 bits then this instruction becomes microMIPS 3442 // 16-bit unconditional branch instruction. 3443 if (inMicroMipsMode()) 3444 Inst.setOpcode(hasMips32r6() ? Mips::BC16_MMR6 : Mips::B16_MM); 3445 } else { 3446 if (!isInt<17>(Offset.getImm())) 3447 return Error(IDLoc, "branch target out of range"); 3448 if (OffsetToAlignment(Offset.getImm(), 1LL << 1)) 3449 return Error(IDLoc, "branch to misaligned address"); 3450 Inst.clear(); 3451 Inst.setOpcode(Mips::BEQ_MM); 3452 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 3453 Inst.addOperand(MCOperand::createReg(Mips::ZERO)); 3454 Inst.addOperand(MCOperand::createImm(Offset.getImm())); 3455 } 3456 } 3457 Out.EmitInstruction(Inst, *STI); 3458 3459 // If .set reorder is active and branch instruction has a delay slot, 3460 // emit a NOP after it. 3461 const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode()); 3462 if (MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder()) 3463 TOut.emitEmptyDelaySlot(true, IDLoc, STI); 3464 3465 return false; 3466 } 3467 3468 bool MipsAsmParser::expandBranchImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 3469 const MCSubtargetInfo *STI) { 3470 MipsTargetStreamer &TOut = getTargetStreamer(); 3471 const MCOperand &DstRegOp = Inst.getOperand(0); 3472 assert(DstRegOp.isReg() && "expected register operand kind"); 3473 3474 const MCOperand &ImmOp = Inst.getOperand(1); 3475 assert(ImmOp.isImm() && "expected immediate operand kind"); 3476 3477 const MCOperand &MemOffsetOp = Inst.getOperand(2); 3478 assert((MemOffsetOp.isImm() || MemOffsetOp.isExpr()) && 3479 "expected immediate or expression operand"); 3480 3481 bool IsLikely = false; 3482 3483 unsigned OpCode = 0; 3484 switch(Inst.getOpcode()) { 3485 case Mips::BneImm: 3486 OpCode = Mips::BNE; 3487 break; 3488 case Mips::BeqImm: 3489 OpCode = Mips::BEQ; 3490 break; 3491 case Mips::BEQLImmMacro: 3492 OpCode = Mips::BEQL; 3493 IsLikely = true; 3494 break; 3495 case Mips::BNELImmMacro: 3496 OpCode = Mips::BNEL; 3497 IsLikely = true; 3498 break; 3499 default: 3500 llvm_unreachable("Unknown immediate branch pseudo-instruction."); 3501 break; 3502 } 3503 3504 int64_t ImmValue = ImmOp.getImm(); 3505 if (ImmValue == 0) { 3506 if (IsLikely) { 3507 TOut.emitRRX(OpCode, DstRegOp.getReg(), Mips::ZERO, 3508 MCOperand::createExpr(MemOffsetOp.getExpr()), IDLoc, STI); 3509 TOut.emitRRI(Mips::SLL, Mips::ZERO, Mips::ZERO, 0, IDLoc, STI); 3510 } else 3511 TOut.emitRRX(OpCode, DstRegOp.getReg(), Mips::ZERO, MemOffsetOp, IDLoc, 3512 STI); 3513 } else { 3514 warnIfNoMacro(IDLoc); 3515 3516 unsigned ATReg = getATReg(IDLoc); 3517 if (!ATReg) 3518 return true; 3519 3520 if (loadImmediate(ImmValue, ATReg, Mips::NoRegister, !isGP64bit(), true, 3521 IDLoc, Out, STI)) 3522 return true; 3523 3524 if (IsLikely) { 3525 TOut.emitRRX(OpCode, DstRegOp.getReg(), ATReg, 3526 MCOperand::createExpr(MemOffsetOp.getExpr()), IDLoc, STI); 3527 TOut.emitRRI(Mips::SLL, Mips::ZERO, Mips::ZERO, 0, IDLoc, STI); 3528 } else 3529 TOut.emitRRX(OpCode, DstRegOp.getReg(), ATReg, MemOffsetOp, IDLoc, STI); 3530 } 3531 return false; 3532 } 3533 3534 void MipsAsmParser::expandMemInst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 3535 const MCSubtargetInfo *STI, bool IsLoad) { 3536 const MCOperand &DstRegOp = Inst.getOperand(0); 3537 assert(DstRegOp.isReg() && "expected register operand kind"); 3538 const MCOperand &BaseRegOp = Inst.getOperand(1); 3539 assert(BaseRegOp.isReg() && "expected register operand kind"); 3540 const MCOperand &OffsetOp = Inst.getOperand(2); 3541 3542 MipsTargetStreamer &TOut = getTargetStreamer(); 3543 unsigned DstReg = DstRegOp.getReg(); 3544 unsigned BaseReg = BaseRegOp.getReg(); 3545 unsigned TmpReg = DstReg; 3546 3547 const MCInstrDesc &Desc = getInstDesc(Inst.getOpcode()); 3548 int16_t DstRegClass = Desc.OpInfo[0].RegClass; 3549 unsigned DstRegClassID = 3550 getContext().getRegisterInfo()->getRegClass(DstRegClass).getID(); 3551 bool IsGPR = (DstRegClassID == Mips::GPR32RegClassID) || 3552 (DstRegClassID == Mips::GPR64RegClassID); 3553 3554 if (!IsLoad || !IsGPR || (BaseReg == DstReg)) { 3555 // At this point we need AT to perform the expansions 3556 // and we exit if it is not available. 3557 TmpReg = getATReg(IDLoc); 3558 if (!TmpReg) 3559 return; 3560 } 3561 3562 if (OffsetOp.isImm()) { 3563 int64_t LoOffset = OffsetOp.getImm() & 0xffff; 3564 int64_t HiOffset = OffsetOp.getImm() & ~0xffff; 3565 3566 // If msb of LoOffset is 1(negative number) we must increment 3567 // HiOffset to account for the sign-extension of the low part. 3568 if (LoOffset & 0x8000) 3569 HiOffset += 0x10000; 3570 3571 bool IsLargeOffset = HiOffset != 0; 3572 3573 if (IsLargeOffset) { 3574 bool Is32BitImm = (HiOffset >> 32) == 0; 3575 if (loadImmediate(HiOffset, TmpReg, Mips::NoRegister, Is32BitImm, true, 3576 IDLoc, Out, STI)) 3577 return; 3578 } 3579 3580 if (BaseReg != Mips::ZERO && BaseReg != Mips::ZERO_64) 3581 TOut.emitRRR(isGP64bit() ? Mips::DADDu : Mips::ADDu, TmpReg, TmpReg, 3582 BaseReg, IDLoc, STI); 3583 TOut.emitRRI(Inst.getOpcode(), DstReg, TmpReg, LoOffset, IDLoc, STI); 3584 } else { 3585 assert(OffsetOp.isExpr() && "expected expression operand kind"); 3586 const MCExpr *ExprOffset = OffsetOp.getExpr(); 3587 MCOperand LoOperand = MCOperand::createExpr( 3588 MipsMCExpr::create(MipsMCExpr::MEK_LO, ExprOffset, getContext())); 3589 MCOperand HiOperand = MCOperand::createExpr( 3590 MipsMCExpr::create(MipsMCExpr::MEK_HI, ExprOffset, getContext())); 3591 3592 if (IsLoad) 3593 TOut.emitLoadWithSymOffset(Inst.getOpcode(), DstReg, BaseReg, HiOperand, 3594 LoOperand, TmpReg, IDLoc, STI); 3595 else 3596 TOut.emitStoreWithSymOffset(Inst.getOpcode(), DstReg, BaseReg, HiOperand, 3597 LoOperand, TmpReg, IDLoc, STI); 3598 } 3599 } 3600 3601 bool MipsAsmParser::expandLoadStoreMultiple(MCInst &Inst, SMLoc IDLoc, 3602 MCStreamer &Out, 3603 const MCSubtargetInfo *STI) { 3604 unsigned OpNum = Inst.getNumOperands(); 3605 unsigned Opcode = Inst.getOpcode(); 3606 unsigned NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM32_MM : Mips::LWM32_MM; 3607 3608 assert(Inst.getOperand(OpNum - 1).isImm() && 3609 Inst.getOperand(OpNum - 2).isReg() && 3610 Inst.getOperand(OpNum - 3).isReg() && "Invalid instruction operand."); 3611 3612 if (OpNum < 8 && Inst.getOperand(OpNum - 1).getImm() <= 60 && 3613 Inst.getOperand(OpNum - 1).getImm() >= 0 && 3614 (Inst.getOperand(OpNum - 2).getReg() == Mips::SP || 3615 Inst.getOperand(OpNum - 2).getReg() == Mips::SP_64) && 3616 (Inst.getOperand(OpNum - 3).getReg() == Mips::RA || 3617 Inst.getOperand(OpNum - 3).getReg() == Mips::RA_64)) { 3618 // It can be implemented as SWM16 or LWM16 instruction. 3619 if (inMicroMipsMode() && hasMips32r6()) 3620 NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM16_MMR6 : Mips::LWM16_MMR6; 3621 else 3622 NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM16_MM : Mips::LWM16_MM; 3623 } 3624 3625 Inst.setOpcode(NewOpcode); 3626 Out.EmitInstruction(Inst, *STI); 3627 return false; 3628 } 3629 3630 bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc, 3631 MCStreamer &Out, 3632 const MCSubtargetInfo *STI) { 3633 MipsTargetStreamer &TOut = getTargetStreamer(); 3634 bool EmittedNoMacroWarning = false; 3635 unsigned PseudoOpcode = Inst.getOpcode(); 3636 unsigned SrcReg = Inst.getOperand(0).getReg(); 3637 const MCOperand &TrgOp = Inst.getOperand(1); 3638 const MCExpr *OffsetExpr = Inst.getOperand(2).getExpr(); 3639 3640 unsigned ZeroSrcOpcode, ZeroTrgOpcode; 3641 bool ReverseOrderSLT, IsUnsigned, IsLikely, AcceptsEquality; 3642 3643 unsigned TrgReg; 3644 if (TrgOp.isReg()) 3645 TrgReg = TrgOp.getReg(); 3646 else if (TrgOp.isImm()) { 3647 warnIfNoMacro(IDLoc); 3648 EmittedNoMacroWarning = true; 3649 3650 TrgReg = getATReg(IDLoc); 3651 if (!TrgReg) 3652 return true; 3653 3654 switch(PseudoOpcode) { 3655 default: 3656 llvm_unreachable("unknown opcode for branch pseudo-instruction"); 3657 case Mips::BLTImmMacro: 3658 PseudoOpcode = Mips::BLT; 3659 break; 3660 case Mips::BLEImmMacro: 3661 PseudoOpcode = Mips::BLE; 3662 break; 3663 case Mips::BGEImmMacro: 3664 PseudoOpcode = Mips::BGE; 3665 break; 3666 case Mips::BGTImmMacro: 3667 PseudoOpcode = Mips::BGT; 3668 break; 3669 case Mips::BLTUImmMacro: 3670 PseudoOpcode = Mips::BLTU; 3671 break; 3672 case Mips::BLEUImmMacro: 3673 PseudoOpcode = Mips::BLEU; 3674 break; 3675 case Mips::BGEUImmMacro: 3676 PseudoOpcode = Mips::BGEU; 3677 break; 3678 case Mips::BGTUImmMacro: 3679 PseudoOpcode = Mips::BGTU; 3680 break; 3681 case Mips::BLTLImmMacro: 3682 PseudoOpcode = Mips::BLTL; 3683 break; 3684 case Mips::BLELImmMacro: 3685 PseudoOpcode = Mips::BLEL; 3686 break; 3687 case Mips::BGELImmMacro: 3688 PseudoOpcode = Mips::BGEL; 3689 break; 3690 case Mips::BGTLImmMacro: 3691 PseudoOpcode = Mips::BGTL; 3692 break; 3693 case Mips::BLTULImmMacro: 3694 PseudoOpcode = Mips::BLTUL; 3695 break; 3696 case Mips::BLEULImmMacro: 3697 PseudoOpcode = Mips::BLEUL; 3698 break; 3699 case Mips::BGEULImmMacro: 3700 PseudoOpcode = Mips::BGEUL; 3701 break; 3702 case Mips::BGTULImmMacro: 3703 PseudoOpcode = Mips::BGTUL; 3704 break; 3705 } 3706 3707 if (loadImmediate(TrgOp.getImm(), TrgReg, Mips::NoRegister, !isGP64bit(), 3708 false, IDLoc, Out, STI)) 3709 return true; 3710 } 3711 3712 switch (PseudoOpcode) { 3713 case Mips::BLT: 3714 case Mips::BLTU: 3715 case Mips::BLTL: 3716 case Mips::BLTUL: 3717 AcceptsEquality = false; 3718 ReverseOrderSLT = false; 3719 IsUnsigned = 3720 ((PseudoOpcode == Mips::BLTU) || (PseudoOpcode == Mips::BLTUL)); 3721 IsLikely = ((PseudoOpcode == Mips::BLTL) || (PseudoOpcode == Mips::BLTUL)); 3722 ZeroSrcOpcode = Mips::BGTZ; 3723 ZeroTrgOpcode = Mips::BLTZ; 3724 break; 3725 case Mips::BLE: 3726 case Mips::BLEU: 3727 case Mips::BLEL: 3728 case Mips::BLEUL: 3729 AcceptsEquality = true; 3730 ReverseOrderSLT = true; 3731 IsUnsigned = 3732 ((PseudoOpcode == Mips::BLEU) || (PseudoOpcode == Mips::BLEUL)); 3733 IsLikely = ((PseudoOpcode == Mips::BLEL) || (PseudoOpcode == Mips::BLEUL)); 3734 ZeroSrcOpcode = Mips::BGEZ; 3735 ZeroTrgOpcode = Mips::BLEZ; 3736 break; 3737 case Mips::BGE: 3738 case Mips::BGEU: 3739 case Mips::BGEL: 3740 case Mips::BGEUL: 3741 AcceptsEquality = true; 3742 ReverseOrderSLT = false; 3743 IsUnsigned = 3744 ((PseudoOpcode == Mips::BGEU) || (PseudoOpcode == Mips::BGEUL)); 3745 IsLikely = ((PseudoOpcode == Mips::BGEL) || (PseudoOpcode == Mips::BGEUL)); 3746 ZeroSrcOpcode = Mips::BLEZ; 3747 ZeroTrgOpcode = Mips::BGEZ; 3748 break; 3749 case Mips::BGT: 3750 case Mips::BGTU: 3751 case Mips::BGTL: 3752 case Mips::BGTUL: 3753 AcceptsEquality = false; 3754 ReverseOrderSLT = true; 3755 IsUnsigned = 3756 ((PseudoOpcode == Mips::BGTU) || (PseudoOpcode == Mips::BGTUL)); 3757 IsLikely = ((PseudoOpcode == Mips::BGTL) || (PseudoOpcode == Mips::BGTUL)); 3758 ZeroSrcOpcode = Mips::BLTZ; 3759 ZeroTrgOpcode = Mips::BGTZ; 3760 break; 3761 default: 3762 llvm_unreachable("unknown opcode for branch pseudo-instruction"); 3763 } 3764 3765 bool IsTrgRegZero = (TrgReg == Mips::ZERO); 3766 bool IsSrcRegZero = (SrcReg == Mips::ZERO); 3767 if (IsSrcRegZero && IsTrgRegZero) { 3768 // FIXME: All of these Opcode-specific if's are needed for compatibility 3769 // with GAS' behaviour. However, they may not generate the most efficient 3770 // code in some circumstances. 3771 if (PseudoOpcode == Mips::BLT) { 3772 TOut.emitRX(Mips::BLTZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), 3773 IDLoc, STI); 3774 return false; 3775 } 3776 if (PseudoOpcode == Mips::BLE) { 3777 TOut.emitRX(Mips::BLEZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), 3778 IDLoc, STI); 3779 Warning(IDLoc, "branch is always taken"); 3780 return false; 3781 } 3782 if (PseudoOpcode == Mips::BGE) { 3783 TOut.emitRX(Mips::BGEZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), 3784 IDLoc, STI); 3785 Warning(IDLoc, "branch is always taken"); 3786 return false; 3787 } 3788 if (PseudoOpcode == Mips::BGT) { 3789 TOut.emitRX(Mips::BGTZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), 3790 IDLoc, STI); 3791 return false; 3792 } 3793 if (PseudoOpcode == Mips::BGTU) { 3794 TOut.emitRRX(Mips::BNE, Mips::ZERO, Mips::ZERO, 3795 MCOperand::createExpr(OffsetExpr), IDLoc, STI); 3796 return false; 3797 } 3798 if (AcceptsEquality) { 3799 // If both registers are $0 and the pseudo-branch accepts equality, it 3800 // will always be taken, so we emit an unconditional branch. 3801 TOut.emitRRX(Mips::BEQ, Mips::ZERO, Mips::ZERO, 3802 MCOperand::createExpr(OffsetExpr), IDLoc, STI); 3803 Warning(IDLoc, "branch is always taken"); 3804 return false; 3805 } 3806 // If both registers are $0 and the pseudo-branch does not accept 3807 // equality, it will never be taken, so we don't have to emit anything. 3808 return false; 3809 } 3810 if (IsSrcRegZero || IsTrgRegZero) { 3811 if ((IsSrcRegZero && PseudoOpcode == Mips::BGTU) || 3812 (IsTrgRegZero && PseudoOpcode == Mips::BLTU)) { 3813 // If the $rs is $0 and the pseudo-branch is BGTU (0 > x) or 3814 // if the $rt is $0 and the pseudo-branch is BLTU (x < 0), 3815 // the pseudo-branch will never be taken, so we don't emit anything. 3816 // This only applies to unsigned pseudo-branches. 3817 return false; 3818 } 3819 if ((IsSrcRegZero && PseudoOpcode == Mips::BLEU) || 3820 (IsTrgRegZero && PseudoOpcode == Mips::BGEU)) { 3821 // If the $rs is $0 and the pseudo-branch is BLEU (0 <= x) or 3822 // if the $rt is $0 and the pseudo-branch is BGEU (x >= 0), 3823 // the pseudo-branch will always be taken, so we emit an unconditional 3824 // branch. 3825 // This only applies to unsigned pseudo-branches. 3826 TOut.emitRRX(Mips::BEQ, Mips::ZERO, Mips::ZERO, 3827 MCOperand::createExpr(OffsetExpr), IDLoc, STI); 3828 Warning(IDLoc, "branch is always taken"); 3829 return false; 3830 } 3831 if (IsUnsigned) { 3832 // If the $rs is $0 and the pseudo-branch is BLTU (0 < x) or 3833 // if the $rt is $0 and the pseudo-branch is BGTU (x > 0), 3834 // the pseudo-branch will be taken only when the non-zero register is 3835 // different from 0, so we emit a BNEZ. 3836 // 3837 // If the $rs is $0 and the pseudo-branch is BGEU (0 >= x) or 3838 // if the $rt is $0 and the pseudo-branch is BLEU (x <= 0), 3839 // the pseudo-branch will be taken only when the non-zero register is 3840 // equal to 0, so we emit a BEQZ. 3841 // 3842 // Because only BLEU and BGEU branch on equality, we can use the 3843 // AcceptsEquality variable to decide when to emit the BEQZ. 3844 TOut.emitRRX(AcceptsEquality ? Mips::BEQ : Mips::BNE, 3845 IsSrcRegZero ? TrgReg : SrcReg, Mips::ZERO, 3846 MCOperand::createExpr(OffsetExpr), IDLoc, STI); 3847 return false; 3848 } 3849 // If we have a signed pseudo-branch and one of the registers is $0, 3850 // we can use an appropriate compare-to-zero branch. We select which one 3851 // to use in the switch statement above. 3852 TOut.emitRX(IsSrcRegZero ? ZeroSrcOpcode : ZeroTrgOpcode, 3853 IsSrcRegZero ? TrgReg : SrcReg, 3854 MCOperand::createExpr(OffsetExpr), IDLoc, STI); 3855 return false; 3856 } 3857 3858 // If neither the SrcReg nor the TrgReg are $0, we need AT to perform the 3859 // expansions. If it is not available, we return. 3860 unsigned ATRegNum = getATReg(IDLoc); 3861 if (!ATRegNum) 3862 return true; 3863 3864 if (!EmittedNoMacroWarning) 3865 warnIfNoMacro(IDLoc); 3866 3867 // SLT fits well with 2 of our 4 pseudo-branches: 3868 // BLT, where $rs < $rt, translates into "slt $at, $rs, $rt" and 3869 // BGT, where $rs > $rt, translates into "slt $at, $rt, $rs". 3870 // If the result of the SLT is 1, we branch, and if it's 0, we don't. 3871 // This is accomplished by using a BNEZ with the result of the SLT. 3872 // 3873 // The other 2 pseudo-branches are opposites of the above 2 (BGE with BLT 3874 // and BLE with BGT), so we change the BNEZ into a BEQZ. 3875 // Because only BGE and BLE branch on equality, we can use the 3876 // AcceptsEquality variable to decide when to emit the BEQZ. 3877 // Note that the order of the SLT arguments doesn't change between 3878 // opposites. 3879 // 3880 // The same applies to the unsigned variants, except that SLTu is used 3881 // instead of SLT. 3882 TOut.emitRRR(IsUnsigned ? Mips::SLTu : Mips::SLT, ATRegNum, 3883 ReverseOrderSLT ? TrgReg : SrcReg, 3884 ReverseOrderSLT ? SrcReg : TrgReg, IDLoc, STI); 3885 3886 TOut.emitRRX(IsLikely ? (AcceptsEquality ? Mips::BEQL : Mips::BNEL) 3887 : (AcceptsEquality ? Mips::BEQ : Mips::BNE), 3888 ATRegNum, Mips::ZERO, MCOperand::createExpr(OffsetExpr), IDLoc, 3889 STI); 3890 return false; 3891 } 3892 3893 // Expand a integer division macro. 3894 // 3895 // Notably we don't have to emit a warning when encountering $rt as the $zero 3896 // register, or 0 as an immediate. processInstruction() has already done that. 3897 // 3898 // The destination register can only be $zero when expanding (S)DivIMacro or 3899 // D(S)DivMacro. 3900 3901 bool MipsAsmParser::expandDivRem(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 3902 const MCSubtargetInfo *STI, const bool IsMips64, 3903 const bool Signed) { 3904 MipsTargetStreamer &TOut = getTargetStreamer(); 3905 3906 warnIfNoMacro(IDLoc); 3907 3908 const MCOperand &RdRegOp = Inst.getOperand(0); 3909 assert(RdRegOp.isReg() && "expected register operand kind"); 3910 unsigned RdReg = RdRegOp.getReg(); 3911 3912 const MCOperand &RsRegOp = Inst.getOperand(1); 3913 assert(RsRegOp.isReg() && "expected register operand kind"); 3914 unsigned RsReg = RsRegOp.getReg(); 3915 3916 unsigned RtReg; 3917 int64_t ImmValue; 3918 3919 const MCOperand &RtOp = Inst.getOperand(2); 3920 assert((RtOp.isReg() || RtOp.isImm()) && 3921 "expected register or immediate operand kind"); 3922 if (RtOp.isReg()) 3923 RtReg = RtOp.getReg(); 3924 else 3925 ImmValue = RtOp.getImm(); 3926 3927 unsigned DivOp; 3928 unsigned ZeroReg; 3929 unsigned SubOp; 3930 3931 if (IsMips64) { 3932 DivOp = Signed ? Mips::DSDIV : Mips::DUDIV; 3933 ZeroReg = Mips::ZERO_64; 3934 SubOp = Mips::DSUB; 3935 } else { 3936 DivOp = Signed ? Mips::SDIV : Mips::UDIV; 3937 ZeroReg = Mips::ZERO; 3938 SubOp = Mips::SUB; 3939 } 3940 3941 bool UseTraps = useTraps(); 3942 3943 unsigned Opcode = Inst.getOpcode(); 3944 bool isDiv = Opcode == Mips::SDivMacro || Opcode == Mips::SDivIMacro || 3945 Opcode == Mips::UDivMacro || Opcode == Mips::UDivIMacro || 3946 Opcode == Mips::DSDivMacro || Opcode == Mips::DSDivIMacro || 3947 Opcode == Mips::DUDivMacro || Opcode == Mips::DUDivIMacro; 3948 3949 bool isRem = Opcode == Mips::SRemMacro || Opcode == Mips::SRemIMacro || 3950 Opcode == Mips::URemMacro || Opcode == Mips::URemIMacro || 3951 Opcode == Mips::DSRemMacro || Opcode == Mips::DSRemIMacro || 3952 Opcode == Mips::DURemMacro || Opcode == Mips::DURemIMacro; 3953 3954 if (RtOp.isImm()) { 3955 unsigned ATReg = getATReg(IDLoc); 3956 if (!ATReg) 3957 return true; 3958 3959 if (ImmValue == 0) { 3960 if (UseTraps) 3961 TOut.emitRRI(Mips::TEQ, ZeroReg, ZeroReg, 0x7, IDLoc, STI); 3962 else 3963 TOut.emitII(Mips::BREAK, 0x7, 0, IDLoc, STI); 3964 return false; 3965 } 3966 3967 if (isRem && (ImmValue == 1 || (Signed && (ImmValue == -1)))) { 3968 TOut.emitRRR(Mips::OR, RdReg, ZeroReg, ZeroReg, IDLoc, STI); 3969 return false; 3970 } else if (isDiv && ImmValue == 1) { 3971 TOut.emitRRR(Mips::OR, RdReg, RsReg, Mips::ZERO, IDLoc, STI); 3972 return false; 3973 } else if (isDiv && Signed && ImmValue == -1) { 3974 TOut.emitRRR(SubOp, RdReg, ZeroReg, RsReg, IDLoc, STI); 3975 return false; 3976 } else { 3977 if (loadImmediate(ImmValue, ATReg, Mips::NoRegister, isInt<32>(ImmValue), 3978 false, Inst.getLoc(), Out, STI)) 3979 return true; 3980 TOut.emitRR(DivOp, RsReg, ATReg, IDLoc, STI); 3981 TOut.emitR(isDiv ? Mips::MFLO : Mips::MFHI, RdReg, IDLoc, STI); 3982 return false; 3983 } 3984 return true; 3985 } 3986 3987 // If the macro expansion of (d)div(u) or (d)rem(u) would always trap or 3988 // break, insert the trap/break and exit. This gives a different result to 3989 // GAS. GAS has an inconsistency/missed optimization in that not all cases 3990 // are handled equivalently. As the observed behaviour is the same, we're ok. 3991 if (RtReg == Mips::ZERO || RtReg == Mips::ZERO_64) { 3992 if (UseTraps) { 3993 TOut.emitRRI(Mips::TEQ, ZeroReg, ZeroReg, 0x7, IDLoc, STI); 3994 return false; 3995 } 3996 TOut.emitII(Mips::BREAK, 0x7, 0, IDLoc, STI); 3997 return false; 3998 } 3999 4000 // (d)rem(u) $0, $X, $Y is a special case. Like div $zero, $X, $Y, it does 4001 // not expand to macro sequence. 4002 if (isRem && (RdReg == Mips::ZERO || RdReg == Mips::ZERO_64)) { 4003 TOut.emitRR(DivOp, RsReg, RtReg, IDLoc, STI); 4004 return false; 4005 } 4006 4007 // Temporary label for first branch traget 4008 MCContext &Context = TOut.getStreamer().getContext(); 4009 MCSymbol *BrTarget; 4010 MCOperand LabelOp; 4011 4012 if (UseTraps) { 4013 TOut.emitRRI(Mips::TEQ, RtReg, ZeroReg, 0x7, IDLoc, STI); 4014 } else { 4015 // Branch to the li instruction. 4016 BrTarget = Context.createTempSymbol(); 4017 LabelOp = MCOperand::createExpr(MCSymbolRefExpr::create(BrTarget, Context)); 4018 TOut.emitRRX(Mips::BNE, RtReg, ZeroReg, LabelOp, IDLoc, STI); 4019 } 4020 4021 TOut.emitRR(DivOp, RsReg, RtReg, IDLoc, STI); 4022 4023 if (!UseTraps) 4024 TOut.emitII(Mips::BREAK, 0x7, 0, IDLoc, STI); 4025 4026 if (!Signed) { 4027 if (!UseTraps) 4028 TOut.getStreamer().EmitLabel(BrTarget); 4029 4030 TOut.emitR(isDiv ? Mips::MFLO : Mips::MFHI, RdReg, IDLoc, STI); 4031 return false; 4032 } 4033 4034 unsigned ATReg = getATReg(IDLoc); 4035 if (!ATReg) 4036 return true; 4037 4038 if (!UseTraps) 4039 TOut.getStreamer().EmitLabel(BrTarget); 4040 4041 TOut.emitRRI(Mips::ADDiu, ATReg, ZeroReg, -1, IDLoc, STI); 4042 4043 // Temporary label for the second branch target. 4044 MCSymbol *BrTargetEnd = Context.createTempSymbol(); 4045 MCOperand LabelOpEnd = 4046 MCOperand::createExpr(MCSymbolRefExpr::create(BrTargetEnd, Context)); 4047 4048 // Branch to the mflo instruction. 4049 TOut.emitRRX(Mips::BNE, RtReg, ATReg, LabelOpEnd, IDLoc, STI); 4050 4051 if (IsMips64) { 4052 TOut.emitRRI(Mips::ADDiu, ATReg, ZeroReg, 1, IDLoc, STI); 4053 TOut.emitDSLL(ATReg, ATReg, 63, IDLoc, STI); 4054 } else { 4055 TOut.emitRI(Mips::LUi, ATReg, (uint16_t)0x8000, IDLoc, STI); 4056 } 4057 4058 if (UseTraps) 4059 TOut.emitRRI(Mips::TEQ, RsReg, ATReg, 0x6, IDLoc, STI); 4060 else { 4061 // Branch to the mflo instruction. 4062 TOut.emitRRX(Mips::BNE, RsReg, ATReg, LabelOpEnd, IDLoc, STI); 4063 TOut.emitNop(IDLoc, STI); 4064 TOut.emitII(Mips::BREAK, 0x6, 0, IDLoc, STI); 4065 } 4066 4067 TOut.getStreamer().EmitLabel(BrTargetEnd); 4068 TOut.emitR(isDiv ? Mips::MFLO : Mips::MFHI, RdReg, IDLoc, STI); 4069 return false; 4070 } 4071 4072 bool MipsAsmParser::expandTrunc(MCInst &Inst, bool IsDouble, bool Is64FPU, 4073 SMLoc IDLoc, MCStreamer &Out, 4074 const MCSubtargetInfo *STI) { 4075 MipsTargetStreamer &TOut = getTargetStreamer(); 4076 4077 assert(Inst.getNumOperands() == 3 && "Invalid operand count"); 4078 assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isReg() && 4079 Inst.getOperand(2).isReg() && "Invalid instruction operand."); 4080 4081 unsigned FirstReg = Inst.getOperand(0).getReg(); 4082 unsigned SecondReg = Inst.getOperand(1).getReg(); 4083 unsigned ThirdReg = Inst.getOperand(2).getReg(); 4084 4085 if (hasMips1() && !hasMips2()) { 4086 unsigned ATReg = getATReg(IDLoc); 4087 if (!ATReg) 4088 return true; 4089 TOut.emitRR(Mips::CFC1, ThirdReg, Mips::RA, IDLoc, STI); 4090 TOut.emitRR(Mips::CFC1, ThirdReg, Mips::RA, IDLoc, STI); 4091 TOut.emitNop(IDLoc, STI); 4092 TOut.emitRRI(Mips::ORi, ATReg, ThirdReg, 0x3, IDLoc, STI); 4093 TOut.emitRRI(Mips::XORi, ATReg, ATReg, 0x2, IDLoc, STI); 4094 TOut.emitRR(Mips::CTC1, Mips::RA, ATReg, IDLoc, STI); 4095 TOut.emitNop(IDLoc, STI); 4096 TOut.emitRR(IsDouble ? (Is64FPU ? Mips::CVT_W_D64 : Mips::CVT_W_D32) 4097 : Mips::CVT_W_S, 4098 FirstReg, SecondReg, IDLoc, STI); 4099 TOut.emitRR(Mips::CTC1, Mips::RA, ThirdReg, IDLoc, STI); 4100 TOut.emitNop(IDLoc, STI); 4101 return false; 4102 } 4103 4104 TOut.emitRR(IsDouble ? (Is64FPU ? Mips::TRUNC_W_D64 : Mips::TRUNC_W_D32) 4105 : Mips::TRUNC_W_S, 4106 FirstReg, SecondReg, IDLoc, STI); 4107 4108 return false; 4109 } 4110 4111 bool MipsAsmParser::expandUlh(MCInst &Inst, bool Signed, SMLoc IDLoc, 4112 MCStreamer &Out, const MCSubtargetInfo *STI) { 4113 if (hasMips32r6() || hasMips64r6()) { 4114 return Error(IDLoc, "instruction not supported on mips32r6 or mips64r6"); 4115 } 4116 4117 const MCOperand &DstRegOp = Inst.getOperand(0); 4118 assert(DstRegOp.isReg() && "expected register operand kind"); 4119 const MCOperand &SrcRegOp = Inst.getOperand(1); 4120 assert(SrcRegOp.isReg() && "expected register operand kind"); 4121 const MCOperand &OffsetImmOp = Inst.getOperand(2); 4122 assert(OffsetImmOp.isImm() && "expected immediate operand kind"); 4123 4124 MipsTargetStreamer &TOut = getTargetStreamer(); 4125 unsigned DstReg = DstRegOp.getReg(); 4126 unsigned SrcReg = SrcRegOp.getReg(); 4127 int64_t OffsetValue = OffsetImmOp.getImm(); 4128 4129 // NOTE: We always need AT for ULHU, as it is always used as the source 4130 // register for one of the LBu's. 4131 warnIfNoMacro(IDLoc); 4132 unsigned ATReg = getATReg(IDLoc); 4133 if (!ATReg) 4134 return true; 4135 4136 bool IsLargeOffset = !(isInt<16>(OffsetValue + 1) && isInt<16>(OffsetValue)); 4137 if (IsLargeOffset) { 4138 if (loadImmediate(OffsetValue, ATReg, SrcReg, !ABI.ArePtrs64bit(), true, 4139 IDLoc, Out, STI)) 4140 return true; 4141 } 4142 4143 int64_t FirstOffset = IsLargeOffset ? 0 : OffsetValue; 4144 int64_t SecondOffset = IsLargeOffset ? 1 : (OffsetValue + 1); 4145 if (isLittle()) 4146 std::swap(FirstOffset, SecondOffset); 4147 4148 unsigned FirstLbuDstReg = IsLargeOffset ? DstReg : ATReg; 4149 unsigned SecondLbuDstReg = IsLargeOffset ? ATReg : DstReg; 4150 4151 unsigned LbuSrcReg = IsLargeOffset ? ATReg : SrcReg; 4152 unsigned SllReg = IsLargeOffset ? DstReg : ATReg; 4153 4154 TOut.emitRRI(Signed ? Mips::LB : Mips::LBu, FirstLbuDstReg, LbuSrcReg, 4155 FirstOffset, IDLoc, STI); 4156 TOut.emitRRI(Mips::LBu, SecondLbuDstReg, LbuSrcReg, SecondOffset, IDLoc, STI); 4157 TOut.emitRRI(Mips::SLL, SllReg, SllReg, 8, IDLoc, STI); 4158 TOut.emitRRR(Mips::OR, DstReg, DstReg, ATReg, IDLoc, STI); 4159 4160 return false; 4161 } 4162 4163 bool MipsAsmParser::expandUsh(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4164 const MCSubtargetInfo *STI) { 4165 if (hasMips32r6() || hasMips64r6()) { 4166 return Error(IDLoc, "instruction not supported on mips32r6 or mips64r6"); 4167 } 4168 4169 const MCOperand &DstRegOp = Inst.getOperand(0); 4170 assert(DstRegOp.isReg() && "expected register operand kind"); 4171 const MCOperand &SrcRegOp = Inst.getOperand(1); 4172 assert(SrcRegOp.isReg() && "expected register operand kind"); 4173 const MCOperand &OffsetImmOp = Inst.getOperand(2); 4174 assert(OffsetImmOp.isImm() && "expected immediate operand kind"); 4175 4176 MipsTargetStreamer &TOut = getTargetStreamer(); 4177 unsigned DstReg = DstRegOp.getReg(); 4178 unsigned SrcReg = SrcRegOp.getReg(); 4179 int64_t OffsetValue = OffsetImmOp.getImm(); 4180 4181 warnIfNoMacro(IDLoc); 4182 unsigned ATReg = getATReg(IDLoc); 4183 if (!ATReg) 4184 return true; 4185 4186 bool IsLargeOffset = !(isInt<16>(OffsetValue + 1) && isInt<16>(OffsetValue)); 4187 if (IsLargeOffset) { 4188 if (loadImmediate(OffsetValue, ATReg, SrcReg, !ABI.ArePtrs64bit(), true, 4189 IDLoc, Out, STI)) 4190 return true; 4191 } 4192 4193 int64_t FirstOffset = IsLargeOffset ? 1 : (OffsetValue + 1); 4194 int64_t SecondOffset = IsLargeOffset ? 0 : OffsetValue; 4195 if (isLittle()) 4196 std::swap(FirstOffset, SecondOffset); 4197 4198 if (IsLargeOffset) { 4199 TOut.emitRRI(Mips::SB, DstReg, ATReg, FirstOffset, IDLoc, STI); 4200 TOut.emitRRI(Mips::SRL, DstReg, DstReg, 8, IDLoc, STI); 4201 TOut.emitRRI(Mips::SB, DstReg, ATReg, SecondOffset, IDLoc, STI); 4202 TOut.emitRRI(Mips::LBu, ATReg, ATReg, 0, IDLoc, STI); 4203 TOut.emitRRI(Mips::SLL, DstReg, DstReg, 8, IDLoc, STI); 4204 TOut.emitRRR(Mips::OR, DstReg, DstReg, ATReg, IDLoc, STI); 4205 } else { 4206 TOut.emitRRI(Mips::SB, DstReg, SrcReg, FirstOffset, IDLoc, STI); 4207 TOut.emitRRI(Mips::SRL, ATReg, DstReg, 8, IDLoc, STI); 4208 TOut.emitRRI(Mips::SB, ATReg, SrcReg, SecondOffset, IDLoc, STI); 4209 } 4210 4211 return false; 4212 } 4213 4214 bool MipsAsmParser::expandUxw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4215 const MCSubtargetInfo *STI) { 4216 if (hasMips32r6() || hasMips64r6()) { 4217 return Error(IDLoc, "instruction not supported on mips32r6 or mips64r6"); 4218 } 4219 4220 const MCOperand &DstRegOp = Inst.getOperand(0); 4221 assert(DstRegOp.isReg() && "expected register operand kind"); 4222 const MCOperand &SrcRegOp = Inst.getOperand(1); 4223 assert(SrcRegOp.isReg() && "expected register operand kind"); 4224 const MCOperand &OffsetImmOp = Inst.getOperand(2); 4225 assert(OffsetImmOp.isImm() && "expected immediate operand kind"); 4226 4227 MipsTargetStreamer &TOut = getTargetStreamer(); 4228 unsigned DstReg = DstRegOp.getReg(); 4229 unsigned SrcReg = SrcRegOp.getReg(); 4230 int64_t OffsetValue = OffsetImmOp.getImm(); 4231 4232 // Compute left/right load/store offsets. 4233 bool IsLargeOffset = !(isInt<16>(OffsetValue + 3) && isInt<16>(OffsetValue)); 4234 int64_t LxlOffset = IsLargeOffset ? 0 : OffsetValue; 4235 int64_t LxrOffset = IsLargeOffset ? 3 : (OffsetValue + 3); 4236 if (isLittle()) 4237 std::swap(LxlOffset, LxrOffset); 4238 4239 bool IsLoadInst = (Inst.getOpcode() == Mips::Ulw); 4240 bool DoMove = IsLoadInst && (SrcReg == DstReg) && !IsLargeOffset; 4241 unsigned TmpReg = SrcReg; 4242 if (IsLargeOffset || DoMove) { 4243 warnIfNoMacro(IDLoc); 4244 TmpReg = getATReg(IDLoc); 4245 if (!TmpReg) 4246 return true; 4247 } 4248 4249 if (IsLargeOffset) { 4250 if (loadImmediate(OffsetValue, TmpReg, SrcReg, !ABI.ArePtrs64bit(), true, 4251 IDLoc, Out, STI)) 4252 return true; 4253 } 4254 4255 if (DoMove) 4256 std::swap(DstReg, TmpReg); 4257 4258 unsigned XWL = IsLoadInst ? Mips::LWL : Mips::SWL; 4259 unsigned XWR = IsLoadInst ? Mips::LWR : Mips::SWR; 4260 TOut.emitRRI(XWL, DstReg, TmpReg, LxlOffset, IDLoc, STI); 4261 TOut.emitRRI(XWR, DstReg, TmpReg, LxrOffset, IDLoc, STI); 4262 4263 if (DoMove) 4264 TOut.emitRRR(Mips::OR, TmpReg, DstReg, Mips::ZERO, IDLoc, STI); 4265 4266 return false; 4267 } 4268 4269 bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, 4270 MCStreamer &Out, 4271 const MCSubtargetInfo *STI) { 4272 MipsTargetStreamer &TOut = getTargetStreamer(); 4273 4274 assert(Inst.getNumOperands() == 3 && "Invalid operand count"); 4275 assert(Inst.getOperand(0).isReg() && 4276 Inst.getOperand(1).isReg() && 4277 Inst.getOperand(2).isImm() && "Invalid instruction operand."); 4278 4279 unsigned ATReg = Mips::NoRegister; 4280 unsigned FinalDstReg = Mips::NoRegister; 4281 unsigned DstReg = Inst.getOperand(0).getReg(); 4282 unsigned SrcReg = Inst.getOperand(1).getReg(); 4283 int64_t ImmValue = Inst.getOperand(2).getImm(); 4284 4285 bool Is32Bit = isInt<32>(ImmValue) || (!isGP64bit() && isUInt<32>(ImmValue)); 4286 4287 unsigned FinalOpcode = Inst.getOpcode(); 4288 4289 if (DstReg == SrcReg) { 4290 ATReg = getATReg(Inst.getLoc()); 4291 if (!ATReg) 4292 return true; 4293 FinalDstReg = DstReg; 4294 DstReg = ATReg; 4295 } 4296 4297 if (!loadImmediate(ImmValue, DstReg, Mips::NoRegister, Is32Bit, false, 4298 Inst.getLoc(), Out, STI)) { 4299 switch (FinalOpcode) { 4300 default: 4301 llvm_unreachable("unimplemented expansion"); 4302 case Mips::ADDi: 4303 FinalOpcode = Mips::ADD; 4304 break; 4305 case Mips::ADDiu: 4306 FinalOpcode = Mips::ADDu; 4307 break; 4308 case Mips::ANDi: 4309 FinalOpcode = Mips::AND; 4310 break; 4311 case Mips::NORImm: 4312 FinalOpcode = Mips::NOR; 4313 break; 4314 case Mips::ORi: 4315 FinalOpcode = Mips::OR; 4316 break; 4317 case Mips::SLTi: 4318 FinalOpcode = Mips::SLT; 4319 break; 4320 case Mips::SLTiu: 4321 FinalOpcode = Mips::SLTu; 4322 break; 4323 case Mips::XORi: 4324 FinalOpcode = Mips::XOR; 4325 break; 4326 case Mips::ADDi_MM: 4327 FinalOpcode = Mips::ADD_MM; 4328 break; 4329 case Mips::ADDiu_MM: 4330 FinalOpcode = Mips::ADDu_MM; 4331 break; 4332 case Mips::ANDi_MM: 4333 FinalOpcode = Mips::AND_MM; 4334 break; 4335 case Mips::ORi_MM: 4336 FinalOpcode = Mips::OR_MM; 4337 break; 4338 case Mips::SLTi_MM: 4339 FinalOpcode = Mips::SLT_MM; 4340 break; 4341 case Mips::SLTiu_MM: 4342 FinalOpcode = Mips::SLTu_MM; 4343 break; 4344 case Mips::XORi_MM: 4345 FinalOpcode = Mips::XOR_MM; 4346 break; 4347 case Mips::ANDi64: 4348 FinalOpcode = Mips::AND64; 4349 break; 4350 case Mips::NORImm64: 4351 FinalOpcode = Mips::NOR64; 4352 break; 4353 case Mips::ORi64: 4354 FinalOpcode = Mips::OR64; 4355 break; 4356 case Mips::SLTImm64: 4357 FinalOpcode = Mips::SLT64; 4358 break; 4359 case Mips::SLTUImm64: 4360 FinalOpcode = Mips::SLTu64; 4361 break; 4362 case Mips::XORi64: 4363 FinalOpcode = Mips::XOR64; 4364 break; 4365 } 4366 4367 if (FinalDstReg == Mips::NoRegister) 4368 TOut.emitRRR(FinalOpcode, DstReg, DstReg, SrcReg, IDLoc, STI); 4369 else 4370 TOut.emitRRR(FinalOpcode, FinalDstReg, FinalDstReg, DstReg, IDLoc, STI); 4371 return false; 4372 } 4373 return true; 4374 } 4375 4376 bool MipsAsmParser::expandRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4377 const MCSubtargetInfo *STI) { 4378 MipsTargetStreamer &TOut = getTargetStreamer(); 4379 unsigned ATReg = Mips::NoRegister; 4380 unsigned DReg = Inst.getOperand(0).getReg(); 4381 unsigned SReg = Inst.getOperand(1).getReg(); 4382 unsigned TReg = Inst.getOperand(2).getReg(); 4383 unsigned TmpReg = DReg; 4384 4385 unsigned FirstShift = Mips::NOP; 4386 unsigned SecondShift = Mips::NOP; 4387 4388 if (hasMips32r2()) { 4389 if (DReg == SReg) { 4390 TmpReg = getATReg(Inst.getLoc()); 4391 if (!TmpReg) 4392 return true; 4393 } 4394 4395 if (Inst.getOpcode() == Mips::ROL) { 4396 TOut.emitRRR(Mips::SUBu, TmpReg, Mips::ZERO, TReg, Inst.getLoc(), STI); 4397 TOut.emitRRR(Mips::ROTRV, DReg, SReg, TmpReg, Inst.getLoc(), STI); 4398 return false; 4399 } 4400 4401 if (Inst.getOpcode() == Mips::ROR) { 4402 TOut.emitRRR(Mips::ROTRV, DReg, SReg, TReg, Inst.getLoc(), STI); 4403 return false; 4404 } 4405 4406 return true; 4407 } 4408 4409 if (hasMips32()) { 4410 switch (Inst.getOpcode()) { 4411 default: 4412 llvm_unreachable("unexpected instruction opcode"); 4413 case Mips::ROL: 4414 FirstShift = Mips::SRLV; 4415 SecondShift = Mips::SLLV; 4416 break; 4417 case Mips::ROR: 4418 FirstShift = Mips::SLLV; 4419 SecondShift = Mips::SRLV; 4420 break; 4421 } 4422 4423 ATReg = getATReg(Inst.getLoc()); 4424 if (!ATReg) 4425 return true; 4426 4427 TOut.emitRRR(Mips::SUBu, ATReg, Mips::ZERO, TReg, Inst.getLoc(), STI); 4428 TOut.emitRRR(FirstShift, ATReg, SReg, ATReg, Inst.getLoc(), STI); 4429 TOut.emitRRR(SecondShift, DReg, SReg, TReg, Inst.getLoc(), STI); 4430 TOut.emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), STI); 4431 4432 return false; 4433 } 4434 4435 return true; 4436 } 4437 4438 bool MipsAsmParser::expandRotationImm(MCInst &Inst, SMLoc IDLoc, 4439 MCStreamer &Out, 4440 const MCSubtargetInfo *STI) { 4441 MipsTargetStreamer &TOut = getTargetStreamer(); 4442 unsigned ATReg = Mips::NoRegister; 4443 unsigned DReg = Inst.getOperand(0).getReg(); 4444 unsigned SReg = Inst.getOperand(1).getReg(); 4445 int64_t ImmValue = Inst.getOperand(2).getImm(); 4446 4447 unsigned FirstShift = Mips::NOP; 4448 unsigned SecondShift = Mips::NOP; 4449 4450 if (hasMips32r2()) { 4451 if (Inst.getOpcode() == Mips::ROLImm) { 4452 uint64_t MaxShift = 32; 4453 uint64_t ShiftValue = ImmValue; 4454 if (ImmValue != 0) 4455 ShiftValue = MaxShift - ImmValue; 4456 TOut.emitRRI(Mips::ROTR, DReg, SReg, ShiftValue, Inst.getLoc(), STI); 4457 return false; 4458 } 4459 4460 if (Inst.getOpcode() == Mips::RORImm) { 4461 TOut.emitRRI(Mips::ROTR, DReg, SReg, ImmValue, Inst.getLoc(), STI); 4462 return false; 4463 } 4464 4465 return true; 4466 } 4467 4468 if (hasMips32()) { 4469 if (ImmValue == 0) { 4470 TOut.emitRRI(Mips::SRL, DReg, SReg, 0, Inst.getLoc(), STI); 4471 return false; 4472 } 4473 4474 switch (Inst.getOpcode()) { 4475 default: 4476 llvm_unreachable("unexpected instruction opcode"); 4477 case Mips::ROLImm: 4478 FirstShift = Mips::SLL; 4479 SecondShift = Mips::SRL; 4480 break; 4481 case Mips::RORImm: 4482 FirstShift = Mips::SRL; 4483 SecondShift = Mips::SLL; 4484 break; 4485 } 4486 4487 ATReg = getATReg(Inst.getLoc()); 4488 if (!ATReg) 4489 return true; 4490 4491 TOut.emitRRI(FirstShift, ATReg, SReg, ImmValue, Inst.getLoc(), STI); 4492 TOut.emitRRI(SecondShift, DReg, SReg, 32 - ImmValue, Inst.getLoc(), STI); 4493 TOut.emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), STI); 4494 4495 return false; 4496 } 4497 4498 return true; 4499 } 4500 4501 bool MipsAsmParser::expandDRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4502 const MCSubtargetInfo *STI) { 4503 MipsTargetStreamer &TOut = getTargetStreamer(); 4504 unsigned ATReg = Mips::NoRegister; 4505 unsigned DReg = Inst.getOperand(0).getReg(); 4506 unsigned SReg = Inst.getOperand(1).getReg(); 4507 unsigned TReg = Inst.getOperand(2).getReg(); 4508 unsigned TmpReg = DReg; 4509 4510 unsigned FirstShift = Mips::NOP; 4511 unsigned SecondShift = Mips::NOP; 4512 4513 if (hasMips64r2()) { 4514 if (TmpReg == SReg) { 4515 TmpReg = getATReg(Inst.getLoc()); 4516 if (!TmpReg) 4517 return true; 4518 } 4519 4520 if (Inst.getOpcode() == Mips::DROL) { 4521 TOut.emitRRR(Mips::DSUBu, TmpReg, Mips::ZERO, TReg, Inst.getLoc(), STI); 4522 TOut.emitRRR(Mips::DROTRV, DReg, SReg, TmpReg, Inst.getLoc(), STI); 4523 return false; 4524 } 4525 4526 if (Inst.getOpcode() == Mips::DROR) { 4527 TOut.emitRRR(Mips::DROTRV, DReg, SReg, TReg, Inst.getLoc(), STI); 4528 return false; 4529 } 4530 4531 return true; 4532 } 4533 4534 if (hasMips64()) { 4535 switch (Inst.getOpcode()) { 4536 default: 4537 llvm_unreachable("unexpected instruction opcode"); 4538 case Mips::DROL: 4539 FirstShift = Mips::DSRLV; 4540 SecondShift = Mips::DSLLV; 4541 break; 4542 case Mips::DROR: 4543 FirstShift = Mips::DSLLV; 4544 SecondShift = Mips::DSRLV; 4545 break; 4546 } 4547 4548 ATReg = getATReg(Inst.getLoc()); 4549 if (!ATReg) 4550 return true; 4551 4552 TOut.emitRRR(Mips::DSUBu, ATReg, Mips::ZERO, TReg, Inst.getLoc(), STI); 4553 TOut.emitRRR(FirstShift, ATReg, SReg, ATReg, Inst.getLoc(), STI); 4554 TOut.emitRRR(SecondShift, DReg, SReg, TReg, Inst.getLoc(), STI); 4555 TOut.emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), STI); 4556 4557 return false; 4558 } 4559 4560 return true; 4561 } 4562 4563 bool MipsAsmParser::expandDRotationImm(MCInst &Inst, SMLoc IDLoc, 4564 MCStreamer &Out, 4565 const MCSubtargetInfo *STI) { 4566 MipsTargetStreamer &TOut = getTargetStreamer(); 4567 unsigned ATReg = Mips::NoRegister; 4568 unsigned DReg = Inst.getOperand(0).getReg(); 4569 unsigned SReg = Inst.getOperand(1).getReg(); 4570 int64_t ImmValue = Inst.getOperand(2).getImm() % 64; 4571 4572 unsigned FirstShift = Mips::NOP; 4573 unsigned SecondShift = Mips::NOP; 4574 4575 MCInst TmpInst; 4576 4577 if (hasMips64r2()) { 4578 unsigned FinalOpcode = Mips::NOP; 4579 if (ImmValue == 0) 4580 FinalOpcode = Mips::DROTR; 4581 else if (ImmValue % 32 == 0) 4582 FinalOpcode = Mips::DROTR32; 4583 else if ((ImmValue >= 1) && (ImmValue <= 32)) { 4584 if (Inst.getOpcode() == Mips::DROLImm) 4585 FinalOpcode = Mips::DROTR32; 4586 else 4587 FinalOpcode = Mips::DROTR; 4588 } else if (ImmValue >= 33) { 4589 if (Inst.getOpcode() == Mips::DROLImm) 4590 FinalOpcode = Mips::DROTR; 4591 else 4592 FinalOpcode = Mips::DROTR32; 4593 } 4594 4595 uint64_t ShiftValue = ImmValue % 32; 4596 if (Inst.getOpcode() == Mips::DROLImm) 4597 ShiftValue = (32 - ImmValue % 32) % 32; 4598 4599 TOut.emitRRI(FinalOpcode, DReg, SReg, ShiftValue, Inst.getLoc(), STI); 4600 4601 return false; 4602 } 4603 4604 if (hasMips64()) { 4605 if (ImmValue == 0) { 4606 TOut.emitRRI(Mips::DSRL, DReg, SReg, 0, Inst.getLoc(), STI); 4607 return false; 4608 } 4609 4610 switch (Inst.getOpcode()) { 4611 default: 4612 llvm_unreachable("unexpected instruction opcode"); 4613 case Mips::DROLImm: 4614 if ((ImmValue >= 1) && (ImmValue <= 31)) { 4615 FirstShift = Mips::DSLL; 4616 SecondShift = Mips::DSRL32; 4617 } 4618 if (ImmValue == 32) { 4619 FirstShift = Mips::DSLL32; 4620 SecondShift = Mips::DSRL32; 4621 } 4622 if ((ImmValue >= 33) && (ImmValue <= 63)) { 4623 FirstShift = Mips::DSLL32; 4624 SecondShift = Mips::DSRL; 4625 } 4626 break; 4627 case Mips::DRORImm: 4628 if ((ImmValue >= 1) && (ImmValue <= 31)) { 4629 FirstShift = Mips::DSRL; 4630 SecondShift = Mips::DSLL32; 4631 } 4632 if (ImmValue == 32) { 4633 FirstShift = Mips::DSRL32; 4634 SecondShift = Mips::DSLL32; 4635 } 4636 if ((ImmValue >= 33) && (ImmValue <= 63)) { 4637 FirstShift = Mips::DSRL32; 4638 SecondShift = Mips::DSLL; 4639 } 4640 break; 4641 } 4642 4643 ATReg = getATReg(Inst.getLoc()); 4644 if (!ATReg) 4645 return true; 4646 4647 TOut.emitRRI(FirstShift, ATReg, SReg, ImmValue % 32, Inst.getLoc(), STI); 4648 TOut.emitRRI(SecondShift, DReg, SReg, (32 - ImmValue % 32) % 32, 4649 Inst.getLoc(), STI); 4650 TOut.emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), STI); 4651 4652 return false; 4653 } 4654 4655 return true; 4656 } 4657 4658 bool MipsAsmParser::expandAbs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4659 const MCSubtargetInfo *STI) { 4660 MipsTargetStreamer &TOut = getTargetStreamer(); 4661 unsigned FirstRegOp = Inst.getOperand(0).getReg(); 4662 unsigned SecondRegOp = Inst.getOperand(1).getReg(); 4663 4664 TOut.emitRI(Mips::BGEZ, SecondRegOp, 8, IDLoc, STI); 4665 if (FirstRegOp != SecondRegOp) 4666 TOut.emitRRR(Mips::ADDu, FirstRegOp, SecondRegOp, Mips::ZERO, IDLoc, STI); 4667 else 4668 TOut.emitEmptyDelaySlot(false, IDLoc, STI); 4669 TOut.emitRRR(Mips::SUB, FirstRegOp, Mips::ZERO, SecondRegOp, IDLoc, STI); 4670 4671 return false; 4672 } 4673 4674 bool MipsAsmParser::expandMulImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4675 const MCSubtargetInfo *STI) { 4676 MipsTargetStreamer &TOut = getTargetStreamer(); 4677 unsigned ATReg = Mips::NoRegister; 4678 unsigned DstReg = Inst.getOperand(0).getReg(); 4679 unsigned SrcReg = Inst.getOperand(1).getReg(); 4680 int32_t ImmValue = Inst.getOperand(2).getImm(); 4681 4682 ATReg = getATReg(IDLoc); 4683 if (!ATReg) 4684 return true; 4685 4686 loadImmediate(ImmValue, ATReg, Mips::NoRegister, true, false, IDLoc, Out, 4687 STI); 4688 4689 TOut.emitRR(Inst.getOpcode() == Mips::MULImmMacro ? Mips::MULT : Mips::DMULT, 4690 SrcReg, ATReg, IDLoc, STI); 4691 4692 TOut.emitR(Mips::MFLO, DstReg, IDLoc, STI); 4693 4694 return false; 4695 } 4696 4697 bool MipsAsmParser::expandMulO(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4698 const MCSubtargetInfo *STI) { 4699 MipsTargetStreamer &TOut = getTargetStreamer(); 4700 unsigned ATReg = Mips::NoRegister; 4701 unsigned DstReg = Inst.getOperand(0).getReg(); 4702 unsigned SrcReg = Inst.getOperand(1).getReg(); 4703 unsigned TmpReg = Inst.getOperand(2).getReg(); 4704 4705 ATReg = getATReg(Inst.getLoc()); 4706 if (!ATReg) 4707 return true; 4708 4709 TOut.emitRR(Inst.getOpcode() == Mips::MULOMacro ? Mips::MULT : Mips::DMULT, 4710 SrcReg, TmpReg, IDLoc, STI); 4711 4712 TOut.emitR(Mips::MFLO, DstReg, IDLoc, STI); 4713 4714 TOut.emitRRI(Inst.getOpcode() == Mips::MULOMacro ? Mips::SRA : Mips::DSRA32, 4715 DstReg, DstReg, 0x1F, IDLoc, STI); 4716 4717 TOut.emitR(Mips::MFHI, ATReg, IDLoc, STI); 4718 4719 if (useTraps()) { 4720 TOut.emitRRI(Mips::TNE, DstReg, ATReg, 6, IDLoc, STI); 4721 } else { 4722 MCContext & Context = TOut.getStreamer().getContext(); 4723 MCSymbol * BrTarget = Context.createTempSymbol(); 4724 MCOperand LabelOp = 4725 MCOperand::createExpr(MCSymbolRefExpr::create(BrTarget, Context)); 4726 4727 TOut.emitRRX(Mips::BEQ, DstReg, ATReg, LabelOp, IDLoc, STI); 4728 if (AssemblerOptions.back()->isReorder()) 4729 TOut.emitNop(IDLoc, STI); 4730 TOut.emitII(Mips::BREAK, 6, 0, IDLoc, STI); 4731 4732 TOut.getStreamer().EmitLabel(BrTarget); 4733 } 4734 TOut.emitR(Mips::MFLO, DstReg, IDLoc, STI); 4735 4736 return false; 4737 } 4738 4739 bool MipsAsmParser::expandMulOU(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4740 const MCSubtargetInfo *STI) { 4741 MipsTargetStreamer &TOut = getTargetStreamer(); 4742 unsigned ATReg = Mips::NoRegister; 4743 unsigned DstReg = Inst.getOperand(0).getReg(); 4744 unsigned SrcReg = Inst.getOperand(1).getReg(); 4745 unsigned TmpReg = Inst.getOperand(2).getReg(); 4746 4747 ATReg = getATReg(IDLoc); 4748 if (!ATReg) 4749 return true; 4750 4751 TOut.emitRR(Inst.getOpcode() == Mips::MULOUMacro ? Mips::MULTu : Mips::DMULTu, 4752 SrcReg, TmpReg, IDLoc, STI); 4753 4754 TOut.emitR(Mips::MFHI, ATReg, IDLoc, STI); 4755 TOut.emitR(Mips::MFLO, DstReg, IDLoc, STI); 4756 if (useTraps()) { 4757 TOut.emitRRI(Mips::TNE, ATReg, Mips::ZERO, 6, IDLoc, STI); 4758 } else { 4759 MCContext & Context = TOut.getStreamer().getContext(); 4760 MCSymbol * BrTarget = Context.createTempSymbol(); 4761 MCOperand LabelOp = 4762 MCOperand::createExpr(MCSymbolRefExpr::create(BrTarget, Context)); 4763 4764 TOut.emitRRX(Mips::BEQ, ATReg, Mips::ZERO, LabelOp, IDLoc, STI); 4765 if (AssemblerOptions.back()->isReorder()) 4766 TOut.emitNop(IDLoc, STI); 4767 TOut.emitII(Mips::BREAK, 6, 0, IDLoc, STI); 4768 4769 TOut.getStreamer().EmitLabel(BrTarget); 4770 } 4771 4772 return false; 4773 } 4774 4775 bool MipsAsmParser::expandDMULMacro(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4776 const MCSubtargetInfo *STI) { 4777 MipsTargetStreamer &TOut = getTargetStreamer(); 4778 unsigned DstReg = Inst.getOperand(0).getReg(); 4779 unsigned SrcReg = Inst.getOperand(1).getReg(); 4780 unsigned TmpReg = Inst.getOperand(2).getReg(); 4781 4782 TOut.emitRR(Mips::DMULTu, SrcReg, TmpReg, IDLoc, STI); 4783 TOut.emitR(Mips::MFLO, DstReg, IDLoc, STI); 4784 4785 return false; 4786 } 4787 4788 // Expand 'ld $<reg> offset($reg2)' to 'lw $<reg>, offset($reg2); 4789 // lw $<reg+1>>, offset+4($reg2)' 4790 // or expand 'sd $<reg> offset($reg2)' to 'sw $<reg>, offset($reg2); 4791 // sw $<reg+1>>, offset+4($reg2)' 4792 // for O32. 4793 bool MipsAsmParser::expandLoadStoreDMacro(MCInst &Inst, SMLoc IDLoc, 4794 MCStreamer &Out, 4795 const MCSubtargetInfo *STI, 4796 bool IsLoad) { 4797 if (!isABI_O32()) 4798 return true; 4799 4800 warnIfNoMacro(IDLoc); 4801 4802 MipsTargetStreamer &TOut = getTargetStreamer(); 4803 unsigned Opcode = IsLoad ? Mips::LW : Mips::SW; 4804 unsigned FirstReg = Inst.getOperand(0).getReg(); 4805 unsigned SecondReg = nextReg(FirstReg); 4806 unsigned BaseReg = Inst.getOperand(1).getReg(); 4807 if (!SecondReg) 4808 return true; 4809 4810 warnIfRegIndexIsAT(FirstReg, IDLoc); 4811 4812 assert(Inst.getOperand(2).isImm() && 4813 "Offset for load macro is not immediate!"); 4814 4815 MCOperand &FirstOffset = Inst.getOperand(2); 4816 signed NextOffset = FirstOffset.getImm() + 4; 4817 MCOperand SecondOffset = MCOperand::createImm(NextOffset); 4818 4819 if (!isInt<16>(FirstOffset.getImm()) || !isInt<16>(NextOffset)) 4820 return true; 4821 4822 // For loads, clobber the base register with the second load instead of the 4823 // first if the BaseReg == FirstReg. 4824 if (FirstReg != BaseReg || !IsLoad) { 4825 TOut.emitRRX(Opcode, FirstReg, BaseReg, FirstOffset, IDLoc, STI); 4826 TOut.emitRRX(Opcode, SecondReg, BaseReg, SecondOffset, IDLoc, STI); 4827 } else { 4828 TOut.emitRRX(Opcode, SecondReg, BaseReg, SecondOffset, IDLoc, STI); 4829 TOut.emitRRX(Opcode, FirstReg, BaseReg, FirstOffset, IDLoc, STI); 4830 } 4831 4832 return false; 4833 } 4834 4835 bool MipsAsmParser::expandSeq(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4836 const MCSubtargetInfo *STI) { 4837 4838 warnIfNoMacro(IDLoc); 4839 MipsTargetStreamer &TOut = getTargetStreamer(); 4840 4841 if (Inst.getOperand(1).getReg() != Mips::ZERO && 4842 Inst.getOperand(2).getReg() != Mips::ZERO) { 4843 TOut.emitRRR(Mips::XOR, Inst.getOperand(0).getReg(), 4844 Inst.getOperand(1).getReg(), Inst.getOperand(2).getReg(), 4845 IDLoc, STI); 4846 TOut.emitRRI(Mips::SLTiu, Inst.getOperand(0).getReg(), 4847 Inst.getOperand(0).getReg(), 1, IDLoc, STI); 4848 return false; 4849 } 4850 4851 unsigned Reg = 0; 4852 if (Inst.getOperand(1).getReg() == Mips::ZERO) { 4853 Reg = Inst.getOperand(2).getReg(); 4854 } else { 4855 Reg = Inst.getOperand(1).getReg(); 4856 } 4857 TOut.emitRRI(Mips::SLTiu, Inst.getOperand(0).getReg(), Reg, 1, IDLoc, STI); 4858 return false; 4859 } 4860 4861 bool MipsAsmParser::expandSeqI(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 4862 const MCSubtargetInfo *STI) { 4863 warnIfNoMacro(IDLoc); 4864 MipsTargetStreamer &TOut = getTargetStreamer(); 4865 4866 unsigned Opc; 4867 int64_t Imm = Inst.getOperand(2).getImm(); 4868 unsigned Reg = Inst.getOperand(1).getReg(); 4869 4870 if (Imm == 0) { 4871 TOut.emitRRI(Mips::SLTiu, Inst.getOperand(0).getReg(), 4872 Inst.getOperand(1).getReg(), 1, IDLoc, STI); 4873 return false; 4874 } else { 4875 4876 if (Reg == Mips::ZERO) { 4877 Warning(IDLoc, "comparison is always false"); 4878 TOut.emitRRR(isGP64bit() ? Mips::DADDu : Mips::ADDu, 4879 Inst.getOperand(0).getReg(), Reg, Reg, IDLoc, STI); 4880 return false; 4881 } 4882 4883 if (Imm > -0x8000 && Imm < 0) { 4884 Imm = -Imm; 4885 Opc = isGP64bit() ? Mips::DADDiu : Mips::ADDiu; 4886 } else { 4887 Opc = Mips::XORi; 4888 } 4889 } 4890 if (!isUInt<16>(Imm)) { 4891 unsigned ATReg = getATReg(IDLoc); 4892 if (!ATReg) 4893 return true; 4894 4895 if (loadImmediate(Imm, ATReg, Mips::NoRegister, true, isGP64bit(), IDLoc, 4896 Out, STI)) 4897 return true; 4898 4899 TOut.emitRRR(Mips::XOR, Inst.getOperand(0).getReg(), 4900 Inst.getOperand(1).getReg(), ATReg, IDLoc, STI); 4901 TOut.emitRRI(Mips::SLTiu, Inst.getOperand(0).getReg(), 4902 Inst.getOperand(0).getReg(), 1, IDLoc, STI); 4903 return false; 4904 } 4905 4906 TOut.emitRRI(Opc, Inst.getOperand(0).getReg(), Inst.getOperand(1).getReg(), 4907 Imm, IDLoc, STI); 4908 TOut.emitRRI(Mips::SLTiu, Inst.getOperand(0).getReg(), 4909 Inst.getOperand(0).getReg(), 1, IDLoc, STI); 4910 return false; 4911 } 4912 4913 // Map the DSP accumulator and control register to the corresponding gpr 4914 // operand. Unlike the other alias, the m(f|t)t(lo|hi|acx) instructions 4915 // do not map the DSP registers contigously to gpr registers. 4916 static unsigned getRegisterForMxtrDSP(MCInst &Inst, bool IsMFDSP) { 4917 switch (Inst.getOpcode()) { 4918 case Mips::MFTLO: 4919 case Mips::MTTLO: 4920 switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg()) { 4921 case Mips::AC0: 4922 return Mips::ZERO; 4923 case Mips::AC1: 4924 return Mips::A0; 4925 case Mips::AC2: 4926 return Mips::T0; 4927 case Mips::AC3: 4928 return Mips::T4; 4929 default: 4930 llvm_unreachable("Unknown register for 'mttr' alias!"); 4931 } 4932 case Mips::MFTHI: 4933 case Mips::MTTHI: 4934 switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg()) { 4935 case Mips::AC0: 4936 return Mips::AT; 4937 case Mips::AC1: 4938 return Mips::A1; 4939 case Mips::AC2: 4940 return Mips::T1; 4941 case Mips::AC3: 4942 return Mips::T5; 4943 default: 4944 llvm_unreachable("Unknown register for 'mttr' alias!"); 4945 } 4946 case Mips::MFTACX: 4947 case Mips::MTTACX: 4948 switch (Inst.getOperand(IsMFDSP ? 1 : 0).getReg()) { 4949 case Mips::AC0: 4950 return Mips::V0; 4951 case Mips::AC1: 4952 return Mips::A2; 4953 case Mips::AC2: 4954 return Mips::T2; 4955 case Mips::AC3: 4956 return Mips::T6; 4957 default: 4958 llvm_unreachable("Unknown register for 'mttr' alias!"); 4959 } 4960 case Mips::MFTDSP: 4961 case Mips::MTTDSP: 4962 return Mips::S0; 4963 default: 4964 llvm_unreachable("Unknown instruction for 'mttr' dsp alias!"); 4965 } 4966 } 4967 4968 // Map the floating point register operand to the corresponding register 4969 // operand. 4970 static unsigned getRegisterForMxtrFP(MCInst &Inst, bool IsMFTC1) { 4971 switch (Inst.getOperand(IsMFTC1 ? 1 : 0).getReg()) { 4972 case Mips::F0: return Mips::ZERO; 4973 case Mips::F1: return Mips::AT; 4974 case Mips::F2: return Mips::V0; 4975 case Mips::F3: return Mips::V1; 4976 case Mips::F4: return Mips::A0; 4977 case Mips::F5: return Mips::A1; 4978 case Mips::F6: return Mips::A2; 4979 case Mips::F7: return Mips::A3; 4980 case Mips::F8: return Mips::T0; 4981 case Mips::F9: return Mips::T1; 4982 case Mips::F10: return Mips::T2; 4983 case Mips::F11: return Mips::T3; 4984 case Mips::F12: return Mips::T4; 4985 case Mips::F13: return Mips::T5; 4986 case Mips::F14: return Mips::T6; 4987 case Mips::F15: return Mips::T7; 4988 case Mips::F16: return Mips::S0; 4989 case Mips::F17: return Mips::S1; 4990 case Mips::F18: return Mips::S2; 4991 case Mips::F19: return Mips::S3; 4992 case Mips::F20: return Mips::S4; 4993 case Mips::F21: return Mips::S5; 4994 case Mips::F22: return Mips::S6; 4995 case Mips::F23: return Mips::S7; 4996 case Mips::F24: return Mips::T8; 4997 case Mips::F25: return Mips::T9; 4998 case Mips::F26: return Mips::K0; 4999 case Mips::F27: return Mips::K1; 5000 case Mips::F28: return Mips::GP; 5001 case Mips::F29: return Mips::SP; 5002 case Mips::F30: return Mips::FP; 5003 case Mips::F31: return Mips::RA; 5004 default: llvm_unreachable("Unknown register for mttc1 alias!"); 5005 } 5006 } 5007 5008 // Map the coprocessor operand the corresponding gpr register operand. 5009 static unsigned getRegisterForMxtrC0(MCInst &Inst, bool IsMFTC0) { 5010 switch (Inst.getOperand(IsMFTC0 ? 1 : 0).getReg()) { 5011 case Mips::COP00: return Mips::ZERO; 5012 case Mips::COP01: return Mips::AT; 5013 case Mips::COP02: return Mips::V0; 5014 case Mips::COP03: return Mips::V1; 5015 case Mips::COP04: return Mips::A0; 5016 case Mips::COP05: return Mips::A1; 5017 case Mips::COP06: return Mips::A2; 5018 case Mips::COP07: return Mips::A3; 5019 case Mips::COP08: return Mips::T0; 5020 case Mips::COP09: return Mips::T1; 5021 case Mips::COP010: return Mips::T2; 5022 case Mips::COP011: return Mips::T3; 5023 case Mips::COP012: return Mips::T4; 5024 case Mips::COP013: return Mips::T5; 5025 case Mips::COP014: return Mips::T6; 5026 case Mips::COP015: return Mips::T7; 5027 case Mips::COP016: return Mips::S0; 5028 case Mips::COP017: return Mips::S1; 5029 case Mips::COP018: return Mips::S2; 5030 case Mips::COP019: return Mips::S3; 5031 case Mips::COP020: return Mips::S4; 5032 case Mips::COP021: return Mips::S5; 5033 case Mips::COP022: return Mips::S6; 5034 case Mips::COP023: return Mips::S7; 5035 case Mips::COP024: return Mips::T8; 5036 case Mips::COP025: return Mips::T9; 5037 case Mips::COP026: return Mips::K0; 5038 case Mips::COP027: return Mips::K1; 5039 case Mips::COP028: return Mips::GP; 5040 case Mips::COP029: return Mips::SP; 5041 case Mips::COP030: return Mips::FP; 5042 case Mips::COP031: return Mips::RA; 5043 default: llvm_unreachable("Unknown register for mttc0 alias!"); 5044 } 5045 } 5046 5047 /// Expand an alias of 'mftr' or 'mttr' into the full instruction, by producing 5048 /// an mftr or mttr with the correctly mapped gpr register, u, sel and h bits. 5049 bool MipsAsmParser::expandMXTRAlias(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out, 5050 const MCSubtargetInfo *STI) { 5051 MipsTargetStreamer &TOut = getTargetStreamer(); 5052 unsigned rd = 0; 5053 unsigned u = 1; 5054 unsigned sel = 0; 5055 unsigned h = 0; 5056 bool IsMFTR = false; 5057 switch (Inst.getOpcode()) { 5058 case Mips::MFTC0: 5059 IsMFTR = true; 5060 LLVM_FALLTHROUGH; 5061 case Mips::MTTC0: 5062 u = 0; 5063 rd = getRegisterForMxtrC0(Inst, IsMFTR); 5064 sel = Inst.getOperand(2).getImm(); 5065 break; 5066 case Mips::MFTGPR: 5067 IsMFTR = true; 5068 LLVM_FALLTHROUGH; 5069 case Mips::MTTGPR: 5070 rd = Inst.getOperand(IsMFTR ? 1 : 0).getReg(); 5071 break; 5072 case Mips::MFTLO: 5073 case Mips::MFTHI: 5074 case Mips::MFTACX: 5075 case Mips::MFTDSP: 5076 IsMFTR = true; 5077 LLVM_FALLTHROUGH; 5078 case Mips::MTTLO: 5079 case Mips::MTTHI: 5080 case Mips::MTTACX: 5081 case Mips::MTTDSP: 5082 rd = getRegisterForMxtrDSP(Inst, IsMFTR); 5083 sel = 1; 5084 break; 5085 case Mips::MFTHC1: 5086 h = 1; 5087 LLVM_FALLTHROUGH; 5088 case Mips::MFTC1: 5089 IsMFTR = true; 5090 rd = getRegisterForMxtrFP(Inst, IsMFTR); 5091 sel = 2; 5092 break; 5093 case Mips::MTTHC1: 5094 h = 1; 5095 LLVM_FALLTHROUGH; 5096 case Mips::MTTC1: 5097 rd = getRegisterForMxtrFP(Inst, IsMFTR); 5098 sel = 2; 5099 break; 5100 case Mips::CFTC1: 5101 IsMFTR = true; 5102 LLVM_FALLTHROUGH; 5103 case Mips::CTTC1: 5104 rd = getRegisterForMxtrFP(Inst, IsMFTR); 5105 sel = 3; 5106 break; 5107 } 5108 unsigned Op0 = IsMFTR ? Inst.getOperand(0).getReg() : rd; 5109 unsigned Op1 = 5110 IsMFTR ? rd 5111 : (Inst.getOpcode() != Mips::MTTDSP ? Inst.getOperand(1).getReg() 5112 : Inst.getOperand(0).getReg()); 5113 5114 TOut.emitRRIII(IsMFTR ? Mips::MFTR : Mips::MTTR, Op0, Op1, u, sel, h, IDLoc, 5115 STI); 5116 return false; 5117 } 5118 5119 unsigned 5120 MipsAsmParser::checkEarlyTargetMatchPredicate(MCInst &Inst, 5121 const OperandVector &Operands) { 5122 switch (Inst.getOpcode()) { 5123 default: 5124 return Match_Success; 5125 case Mips::DATI: 5126 case Mips::DAHI: 5127 if (static_cast<MipsOperand &>(*Operands[1]) 5128 .isValidForTie(static_cast<MipsOperand &>(*Operands[2]))) 5129 return Match_Success; 5130 return Match_RequiresSameSrcAndDst; 5131 } 5132 } 5133 5134 unsigned MipsAsmParser::checkTargetMatchPredicate(MCInst &Inst) { 5135 switch (Inst.getOpcode()) { 5136 // As described by the MIPSR6 spec, daui must not use the zero operand for 5137 // its source operand. 5138 case Mips::DAUI: 5139 if (Inst.getOperand(1).getReg() == Mips::ZERO || 5140 Inst.getOperand(1).getReg() == Mips::ZERO_64) 5141 return Match_RequiresNoZeroRegister; 5142 return Match_Success; 5143 // As described by the Mips32r2 spec, the registers Rd and Rs for 5144 // jalr.hb must be different. 5145 // It also applies for registers Rt and Rs of microMIPSr6 jalrc.hb instruction 5146 // and registers Rd and Base for microMIPS lwp instruction 5147 case Mips::JALR_HB: 5148 case Mips::JALR_HB64: 5149 case Mips::JALRC_HB_MMR6: 5150 case Mips::JALRC_MMR6: 5151 if (Inst.getOperand(0).getReg() == Inst.getOperand(1).getReg()) 5152 return Match_RequiresDifferentSrcAndDst; 5153 return Match_Success; 5154 case Mips::LWP_MM: 5155 if (Inst.getOperand(0).getReg() == Inst.getOperand(2).getReg()) 5156 return Match_RequiresDifferentSrcAndDst; 5157 return Match_Success; 5158 case Mips::SYNC: 5159 if (Inst.getOperand(0).getImm() != 0 && !hasMips32()) 5160 return Match_NonZeroOperandForSync; 5161 return Match_Success; 5162 case Mips::MFC0: 5163 case Mips::MTC0: 5164 case Mips::MTC2: 5165 case Mips::MFC2: 5166 if (Inst.getOperand(2).getImm() != 0 && !hasMips32()) 5167 return Match_NonZeroOperandForMTCX; 5168 return Match_Success; 5169 // As described the MIPSR6 spec, the compact branches that compare registers 5170 // must: 5171 // a) Not use the zero register. 5172 // b) Not use the same register twice. 5173 // c) rs < rt for bnec, beqc. 5174 // NB: For this case, the encoding will swap the operands as their 5175 // ordering doesn't matter. GAS performs this transformation too. 5176 // Hence, that constraint does not have to be enforced. 5177 // 5178 // The compact branches that branch iff the signed addition of two registers 5179 // would overflow must have rs >= rt. That can be handled like beqc/bnec with 5180 // operand swapping. They do not have restriction of using the zero register. 5181 case Mips::BLEZC: case Mips::BLEZC_MMR6: 5182 case Mips::BGEZC: case Mips::BGEZC_MMR6: 5183 case Mips::BGTZC: case Mips::BGTZC_MMR6: 5184 case Mips::BLTZC: case Mips::BLTZC_MMR6: 5185 case Mips::BEQZC: case Mips::BEQZC_MMR6: 5186 case Mips::BNEZC: case Mips::BNEZC_MMR6: 5187 case Mips::BLEZC64: 5188 case Mips::BGEZC64: 5189 case Mips::BGTZC64: 5190 case Mips::BLTZC64: 5191 case Mips::BEQZC64: 5192 case Mips::BNEZC64: 5193 if (Inst.getOperand(0).getReg() == Mips::ZERO || 5194 Inst.getOperand(0).getReg() == Mips::ZERO_64) 5195 return Match_RequiresNoZeroRegister; 5196 return Match_Success; 5197 case Mips::BGEC: case Mips::BGEC_MMR6: 5198 case Mips::BLTC: case Mips::BLTC_MMR6: 5199 case Mips::BGEUC: case Mips::BGEUC_MMR6: 5200 case Mips::BLTUC: case Mips::BLTUC_MMR6: 5201 case Mips::BEQC: case Mips::BEQC_MMR6: 5202 case Mips::BNEC: case Mips::BNEC_MMR6: 5203 case Mips::BGEC64: 5204 case Mips::BLTC64: 5205 case Mips::BGEUC64: 5206 case Mips::BLTUC64: 5207 case Mips::BEQC64: 5208 case Mips::BNEC64: 5209 if (Inst.getOperand(0).getReg() == Mips::ZERO || 5210 Inst.getOperand(0).getReg() == Mips::ZERO_64) 5211 return Match_RequiresNoZeroRegister; 5212 if (Inst.getOperand(1).getReg() == Mips::ZERO || 5213 Inst.getOperand(1).getReg() == Mips::ZERO_64) 5214 return Match_RequiresNoZeroRegister; 5215 if (Inst.getOperand(0).getReg() == Inst.getOperand(1).getReg()) 5216 return Match_RequiresDifferentOperands; 5217 return Match_Success; 5218 case Mips::DINS: { 5219 assert(Inst.getOperand(2).isImm() && Inst.getOperand(3).isImm() && 5220 "Operands must be immediates for dins!"); 5221 const signed Pos = Inst.getOperand(2).getImm(); 5222 const signed Size = Inst.getOperand(3).getImm(); 5223 if ((0 > (Pos + Size)) || ((Pos + Size) > 32)) 5224 return Match_RequiresPosSizeRange0_32; 5225 return Match_Success; 5226 } 5227 case Mips::DINSM: 5228 case Mips::DINSU: { 5229 assert(Inst.getOperand(2).isImm() && Inst.getOperand(3).isImm() && 5230 "Operands must be immediates for dinsm/dinsu!"); 5231 const signed Pos = Inst.getOperand(2).getImm(); 5232 const signed Size = Inst.getOperand(3).getImm(); 5233 if ((32 >= (Pos + Size)) || ((Pos + Size) > 64)) 5234 return Match_RequiresPosSizeRange33_64; 5235 return Match_Success; 5236 } 5237 case Mips::DEXT: { 5238 assert(Inst.getOperand(2).isImm() && Inst.getOperand(3).isImm() && 5239 "Operands must be immediates for DEXTM!"); 5240 const signed Pos = Inst.getOperand(2).getImm(); 5241 const signed Size = Inst.getOperand(3).getImm(); 5242 if ((1 > (Pos + Size)) || ((Pos + Size) > 63)) 5243 return Match_RequiresPosSizeUImm6; 5244 return Match_Success; 5245 } 5246 case Mips::DEXTM: 5247 case Mips::DEXTU: { 5248 assert(Inst.getOperand(2).isImm() && Inst.getOperand(3).isImm() && 5249 "Operands must be immediates for dextm/dextu!"); 5250 const signed Pos = Inst.getOperand(2).getImm(); 5251 const signed Size = Inst.getOperand(3).getImm(); 5252 if ((32 > (Pos + Size)) || ((Pos + Size) > 64)) 5253 return Match_RequiresPosSizeRange33_64; 5254 return Match_Success; 5255 } 5256 case Mips::CRC32B: case Mips::CRC32CB: 5257 case Mips::CRC32H: case Mips::CRC32CH: 5258 case Mips::CRC32W: case Mips::CRC32CW: 5259 case Mips::CRC32D: case Mips::CRC32CD: 5260 if (Inst.getOperand(0).getReg() != Inst.getOperand(2).getReg()) 5261 return Match_RequiresSameSrcAndDst; 5262 return Match_Success; 5263 } 5264 5265 uint64_t TSFlags = getInstDesc(Inst.getOpcode()).TSFlags; 5266 if ((TSFlags & MipsII::HasFCCRegOperand) && 5267 (Inst.getOperand(0).getReg() != Mips::FCC0) && !hasEightFccRegisters()) 5268 return Match_NoFCCRegisterForCurrentISA; 5269 5270 return Match_Success; 5271 5272 } 5273 5274 static SMLoc RefineErrorLoc(const SMLoc Loc, const OperandVector &Operands, 5275 uint64_t ErrorInfo) { 5276 if (ErrorInfo != ~0ULL && ErrorInfo < Operands.size()) { 5277 SMLoc ErrorLoc = Operands[ErrorInfo]->getStartLoc(); 5278 if (ErrorLoc == SMLoc()) 5279 return Loc; 5280 return ErrorLoc; 5281 } 5282 return Loc; 5283 } 5284 5285 bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, 5286 OperandVector &Operands, 5287 MCStreamer &Out, 5288 uint64_t &ErrorInfo, 5289 bool MatchingInlineAsm) { 5290 MCInst Inst; 5291 unsigned MatchResult = 5292 MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm); 5293 5294 switch (MatchResult) { 5295 case Match_Success: 5296 if (processInstruction(Inst, IDLoc, Out, STI)) 5297 return true; 5298 return false; 5299 case Match_MissingFeature: 5300 Error(IDLoc, "instruction requires a CPU feature not currently enabled"); 5301 return true; 5302 case Match_InvalidOperand: { 5303 SMLoc ErrorLoc = IDLoc; 5304 if (ErrorInfo != ~0ULL) { 5305 if (ErrorInfo >= Operands.size()) 5306 return Error(IDLoc, "too few operands for instruction"); 5307 5308 ErrorLoc = Operands[ErrorInfo]->getStartLoc(); 5309 if (ErrorLoc == SMLoc()) 5310 ErrorLoc = IDLoc; 5311 } 5312 5313 return Error(ErrorLoc, "invalid operand for instruction"); 5314 } 5315 case Match_NonZeroOperandForSync: 5316 return Error(IDLoc, 5317 "s-type must be zero or unspecified for pre-MIPS32 ISAs"); 5318 case Match_NonZeroOperandForMTCX: 5319 return Error(IDLoc, "selector must be zero for pre-MIPS32 ISAs"); 5320 case Match_MnemonicFail: 5321 return Error(IDLoc, "invalid instruction"); 5322 case Match_RequiresDifferentSrcAndDst: 5323 return Error(IDLoc, "source and destination must be different"); 5324 case Match_RequiresDifferentOperands: 5325 return Error(IDLoc, "registers must be different"); 5326 case Match_RequiresNoZeroRegister: 5327 return Error(IDLoc, "invalid operand ($zero) for instruction"); 5328 case Match_RequiresSameSrcAndDst: 5329 return Error(IDLoc, "source and destination must match"); 5330 case Match_NoFCCRegisterForCurrentISA: 5331 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5332 "non-zero fcc register doesn't exist in current ISA level"); 5333 case Match_Immz: 5334 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), "expected '0'"); 5335 case Match_UImm1_0: 5336 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5337 "expected 1-bit unsigned immediate"); 5338 case Match_UImm2_0: 5339 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5340 "expected 2-bit unsigned immediate"); 5341 case Match_UImm2_1: 5342 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5343 "expected immediate in range 1 .. 4"); 5344 case Match_UImm3_0: 5345 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5346 "expected 3-bit unsigned immediate"); 5347 case Match_UImm4_0: 5348 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5349 "expected 4-bit unsigned immediate"); 5350 case Match_SImm4_0: 5351 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5352 "expected 4-bit signed immediate"); 5353 case Match_UImm5_0: 5354 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5355 "expected 5-bit unsigned immediate"); 5356 case Match_SImm5_0: 5357 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5358 "expected 5-bit signed immediate"); 5359 case Match_UImm5_1: 5360 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5361 "expected immediate in range 1 .. 32"); 5362 case Match_UImm5_32: 5363 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5364 "expected immediate in range 32 .. 63"); 5365 case Match_UImm5_33: 5366 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5367 "expected immediate in range 33 .. 64"); 5368 case Match_UImm5_0_Report_UImm6: 5369 // This is used on UImm5 operands that have a corresponding UImm5_32 5370 // operand to avoid confusing the user. 5371 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5372 "expected 6-bit unsigned immediate"); 5373 case Match_UImm5_Lsl2: 5374 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5375 "expected both 7-bit unsigned immediate and multiple of 4"); 5376 case Match_UImmRange2_64: 5377 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5378 "expected immediate in range 2 .. 64"); 5379 case Match_UImm6_0: 5380 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5381 "expected 6-bit unsigned immediate"); 5382 case Match_UImm6_Lsl2: 5383 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5384 "expected both 8-bit unsigned immediate and multiple of 4"); 5385 case Match_SImm6_0: 5386 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5387 "expected 6-bit signed immediate"); 5388 case Match_UImm7_0: 5389 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5390 "expected 7-bit unsigned immediate"); 5391 case Match_UImm7_N1: 5392 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5393 "expected immediate in range -1 .. 126"); 5394 case Match_SImm7_Lsl2: 5395 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5396 "expected both 9-bit signed immediate and multiple of 4"); 5397 case Match_UImm8_0: 5398 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5399 "expected 8-bit unsigned immediate"); 5400 case Match_UImm10_0: 5401 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5402 "expected 10-bit unsigned immediate"); 5403 case Match_SImm10_0: 5404 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5405 "expected 10-bit signed immediate"); 5406 case Match_SImm11_0: 5407 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5408 "expected 11-bit signed immediate"); 5409 case Match_UImm16: 5410 case Match_UImm16_Relaxed: 5411 case Match_UImm16_AltRelaxed: 5412 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5413 "expected 16-bit unsigned immediate"); 5414 case Match_SImm16: 5415 case Match_SImm16_Relaxed: 5416 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5417 "expected 16-bit signed immediate"); 5418 case Match_SImm19_Lsl2: 5419 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5420 "expected both 19-bit signed immediate and multiple of 4"); 5421 case Match_UImm20_0: 5422 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5423 "expected 20-bit unsigned immediate"); 5424 case Match_UImm26_0: 5425 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5426 "expected 26-bit unsigned immediate"); 5427 case Match_SImm32: 5428 case Match_SImm32_Relaxed: 5429 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5430 "expected 32-bit signed immediate"); 5431 case Match_UImm32_Coerced: 5432 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5433 "expected 32-bit immediate"); 5434 case Match_MemSImm9: 5435 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5436 "expected memory with 9-bit signed offset"); 5437 case Match_MemSImm10: 5438 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5439 "expected memory with 10-bit signed offset"); 5440 case Match_MemSImm10Lsl1: 5441 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5442 "expected memory with 11-bit signed offset and multiple of 2"); 5443 case Match_MemSImm10Lsl2: 5444 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5445 "expected memory with 12-bit signed offset and multiple of 4"); 5446 case Match_MemSImm10Lsl3: 5447 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5448 "expected memory with 13-bit signed offset and multiple of 8"); 5449 case Match_MemSImm11: 5450 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5451 "expected memory with 11-bit signed offset"); 5452 case Match_MemSImm12: 5453 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5454 "expected memory with 12-bit signed offset"); 5455 case Match_MemSImm16: 5456 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5457 "expected memory with 16-bit signed offset"); 5458 case Match_MemSImmPtr: 5459 return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), 5460 "expected memory with 32-bit signed offset"); 5461 case Match_RequiresPosSizeRange0_32: { 5462 SMLoc ErrorStart = Operands[3]->getStartLoc(); 5463 SMLoc ErrorEnd = Operands[4]->getEndLoc(); 5464 return Error(ErrorStart, "size plus position are not in the range 0 .. 32", 5465 SMRange(ErrorStart, ErrorEnd)); 5466 } 5467 case Match_RequiresPosSizeUImm6: { 5468 SMLoc ErrorStart = Operands[3]->getStartLoc(); 5469 SMLoc ErrorEnd = Operands[4]->getEndLoc(); 5470 return Error(ErrorStart, "size plus position are not in the range 1 .. 63", 5471 SMRange(ErrorStart, ErrorEnd)); 5472 } 5473 case Match_RequiresPosSizeRange33_64: { 5474 SMLoc ErrorStart = Operands[3]->getStartLoc(); 5475 SMLoc ErrorEnd = Operands[4]->getEndLoc(); 5476 return Error(ErrorStart, "size plus position are not in the range 33 .. 64", 5477 SMRange(ErrorStart, ErrorEnd)); 5478 } 5479 } 5480 5481 llvm_unreachable("Implement any new match types added!"); 5482 } 5483 5484 void MipsAsmParser::warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc) { 5485 if (RegIndex != 0 && AssemblerOptions.back()->getATRegIndex() == RegIndex) 5486 Warning(Loc, "used $at (currently $" + Twine(RegIndex) + 5487 ") without \".set noat\""); 5488 } 5489 5490 void MipsAsmParser::warnIfNoMacro(SMLoc Loc) { 5491 if (!AssemblerOptions.back()->isMacro()) 5492 Warning(Loc, "macro instruction expanded into multiple instructions"); 5493 } 5494 5495 void MipsAsmParser::ConvertXWPOperands(MCInst &Inst, 5496 const OperandVector &Operands) { 5497 assert( 5498 (Inst.getOpcode() == Mips::LWP_MM || Inst.getOpcode() == Mips::SWP_MM) && 5499 "Unexpected instruction!"); 5500 ((MipsOperand &)*Operands[1]).addGPR32ZeroAsmRegOperands(Inst, 1); 5501 int NextReg = nextReg(((MipsOperand &)*Operands[1]).getGPR32Reg()); 5502 Inst.addOperand(MCOperand::createReg(NextReg)); 5503 ((MipsOperand &)*Operands[2]).addMemOperands(Inst, 2); 5504 } 5505 5506 void 5507 MipsAsmParser::printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg, 5508 SMRange Range, bool ShowColors) { 5509 getSourceManager().PrintMessage(Range.Start, SourceMgr::DK_Warning, Msg, 5510 Range, SMFixIt(Range, FixMsg), 5511 ShowColors); 5512 } 5513 5514 int MipsAsmParser::matchCPURegisterName(StringRef Name) { 5515 int CC; 5516 5517 CC = StringSwitch<unsigned>(Name) 5518 .Case("zero", 0) 5519 .Cases("at", "AT", 1) 5520 .Case("a0", 4) 5521 .Case("a1", 5) 5522 .Case("a2", 6) 5523 .Case("a3", 7) 5524 .Case("v0", 2) 5525 .Case("v1", 3) 5526 .Case("s0", 16) 5527 .Case("s1", 17) 5528 .Case("s2", 18) 5529 .Case("s3", 19) 5530 .Case("s4", 20) 5531 .Case("s5", 21) 5532 .Case("s6", 22) 5533 .Case("s7", 23) 5534 .Case("k0", 26) 5535 .Case("k1", 27) 5536 .Case("gp", 28) 5537 .Case("sp", 29) 5538 .Case("fp", 30) 5539 .Case("s8", 30) 5540 .Case("ra", 31) 5541 .Case("t0", 8) 5542 .Case("t1", 9) 5543 .Case("t2", 10) 5544 .Case("t3", 11) 5545 .Case("t4", 12) 5546 .Case("t5", 13) 5547 .Case("t6", 14) 5548 .Case("t7", 15) 5549 .Case("t8", 24) 5550 .Case("t9", 25) 5551 .Default(-1); 5552 5553 if (!(isABI_N32() || isABI_N64())) 5554 return CC; 5555 5556 if (12 <= CC && CC <= 15) { 5557 // Name is one of t4-t7 5558 AsmToken RegTok = getLexer().peekTok(); 5559 SMRange RegRange = RegTok.getLocRange(); 5560 5561 StringRef FixedName = StringSwitch<StringRef>(Name) 5562 .Case("t4", "t0") 5563 .Case("t5", "t1") 5564 .Case("t6", "t2") 5565 .Case("t7", "t3") 5566 .Default(""); 5567 assert(FixedName != "" && "Register name is not one of t4-t7."); 5568 5569 printWarningWithFixIt("register names $t4-$t7 are only available in O32.", 5570 "Did you mean $" + FixedName + "?", RegRange); 5571 } 5572 5573 // Although SGI documentation just cuts out t0-t3 for n32/n64, 5574 // GNU pushes the values of t0-t3 to override the o32/o64 values for t4-t7 5575 // We are supporting both cases, so for t0-t3 we'll just push them to t4-t7. 5576 if (8 <= CC && CC <= 11) 5577 CC += 4; 5578 5579 if (CC == -1) 5580 CC = StringSwitch<unsigned>(Name) 5581 .Case("a4", 8) 5582 .Case("a5", 9) 5583 .Case("a6", 10) 5584 .Case("a7", 11) 5585 .Case("kt0", 26) 5586 .Case("kt1", 27) 5587 .Default(-1); 5588 5589 return CC; 5590 } 5591 5592 int MipsAsmParser::matchHWRegsRegisterName(StringRef Name) { 5593 int CC; 5594 5595 CC = StringSwitch<unsigned>(Name) 5596 .Case("hwr_cpunum", 0) 5597 .Case("hwr_synci_step", 1) 5598 .Case("hwr_cc", 2) 5599 .Case("hwr_ccres", 3) 5600 .Case("hwr_ulr", 29) 5601 .Default(-1); 5602 5603 return CC; 5604 } 5605 5606 int MipsAsmParser::matchFPURegisterName(StringRef Name) { 5607 if (Name[0] == 'f') { 5608 StringRef NumString = Name.substr(1); 5609 unsigned IntVal; 5610 if (NumString.getAsInteger(10, IntVal)) 5611 return -1; // This is not an integer. 5612 if (IntVal > 31) // Maximum index for fpu register. 5613 return -1; 5614 return IntVal; 5615 } 5616 return -1; 5617 } 5618 5619 int MipsAsmParser::matchFCCRegisterName(StringRef Name) { 5620 if (Name.startswith("fcc")) { 5621 StringRef NumString = Name.substr(3); 5622 unsigned IntVal; 5623 if (NumString.getAsInteger(10, IntVal)) 5624 return -1; // This is not an integer. 5625 if (IntVal > 7) // There are only 8 fcc registers. 5626 return -1; 5627 return IntVal; 5628 } 5629 return -1; 5630 } 5631 5632 int MipsAsmParser::matchACRegisterName(StringRef Name) { 5633 if (Name.startswith("ac")) { 5634 StringRef NumString = Name.substr(2); 5635 unsigned IntVal; 5636 if (NumString.getAsInteger(10, IntVal)) 5637 return -1; // This is not an integer. 5638 if (IntVal > 3) // There are only 3 acc registers. 5639 return -1; 5640 return IntVal; 5641 } 5642 return -1; 5643 } 5644 5645 int MipsAsmParser::matchMSA128RegisterName(StringRef Name) { 5646 unsigned IntVal; 5647 5648 if (Name.front() != 'w' || Name.drop_front(1).getAsInteger(10, IntVal)) 5649 return -1; 5650 5651 if (IntVal > 31) 5652 return -1; 5653 5654 return IntVal; 5655 } 5656 5657 int MipsAsmParser::matchMSA128CtrlRegisterName(StringRef Name) { 5658 int CC; 5659 5660 CC = StringSwitch<unsigned>(Name) 5661 .Case("msair", 0) 5662 .Case("msacsr", 1) 5663 .Case("msaaccess", 2) 5664 .Case("msasave", 3) 5665 .Case("msamodify", 4) 5666 .Case("msarequest", 5) 5667 .Case("msamap", 6) 5668 .Case("msaunmap", 7) 5669 .Default(-1); 5670 5671 return CC; 5672 } 5673 5674 bool MipsAsmParser::canUseATReg() { 5675 return AssemblerOptions.back()->getATRegIndex() != 0; 5676 } 5677 5678 unsigned MipsAsmParser::getATReg(SMLoc Loc) { 5679 unsigned ATIndex = AssemblerOptions.back()->getATRegIndex(); 5680 if (ATIndex == 0) { 5681 reportParseError(Loc, 5682 "pseudo-instruction requires $at, which is not available"); 5683 return 0; 5684 } 5685 unsigned AT = getReg( 5686 (isGP64bit()) ? Mips::GPR64RegClassID : Mips::GPR32RegClassID, ATIndex); 5687 return AT; 5688 } 5689 5690 unsigned MipsAsmParser::getReg(int RC, int RegNo) { 5691 return *(getContext().getRegisterInfo()->getRegClass(RC).begin() + RegNo); 5692 } 5693 5694 bool MipsAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) { 5695 MCAsmParser &Parser = getParser(); 5696 LLVM_DEBUG(dbgs() << "parseOperand\n"); 5697 5698 // Check if the current operand has a custom associated parser, if so, try to 5699 // custom parse the operand, or fallback to the general approach. 5700 OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic); 5701 if (ResTy == MatchOperand_Success) 5702 return false; 5703 // If there wasn't a custom match, try the generic matcher below. Otherwise, 5704 // there was a match, but an error occurred, in which case, just return that 5705 // the operand parsing failed. 5706 if (ResTy == MatchOperand_ParseFail) 5707 return true; 5708 5709 LLVM_DEBUG(dbgs() << ".. Generic Parser\n"); 5710 5711 switch (getLexer().getKind()) { 5712 case AsmToken::Dollar: { 5713 // Parse the register. 5714 SMLoc S = Parser.getTok().getLoc(); 5715 5716 // Almost all registers have been parsed by custom parsers. There is only 5717 // one exception to this. $zero (and it's alias $0) will reach this point 5718 // for div, divu, and similar instructions because it is not an operand 5719 // to the instruction definition but an explicit register. Special case 5720 // this situation for now. 5721 if (parseAnyRegister(Operands) != MatchOperand_NoMatch) 5722 return false; 5723 5724 // Maybe it is a symbol reference. 5725 StringRef Identifier; 5726 if (Parser.parseIdentifier(Identifier)) 5727 return true; 5728 5729 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 5730 MCSymbol *Sym = getContext().getOrCreateSymbol("$" + Identifier); 5731 // Otherwise create a symbol reference. 5732 const MCExpr *Res = 5733 MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext()); 5734 5735 Operands.push_back(MipsOperand::CreateImm(Res, S, E, *this)); 5736 return false; 5737 } 5738 default: { 5739 LLVM_DEBUG(dbgs() << ".. generic integer expression\n"); 5740 5741 const MCExpr *Expr; 5742 SMLoc S = Parser.getTok().getLoc(); // Start location of the operand. 5743 if (getParser().parseExpression(Expr)) 5744 return true; 5745 5746 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 5747 5748 Operands.push_back(MipsOperand::CreateImm(Expr, S, E, *this)); 5749 return false; 5750 } 5751 } // switch(getLexer().getKind()) 5752 return true; 5753 } 5754 5755 bool MipsAsmParser::isEvaluated(const MCExpr *Expr) { 5756 switch (Expr->getKind()) { 5757 case MCExpr::Constant: 5758 return true; 5759 case MCExpr::SymbolRef: 5760 return (cast<MCSymbolRefExpr>(Expr)->getKind() != MCSymbolRefExpr::VK_None); 5761 case MCExpr::Binary: { 5762 const MCBinaryExpr *BE = cast<MCBinaryExpr>(Expr); 5763 if (!isEvaluated(BE->getLHS())) 5764 return false; 5765 return isEvaluated(BE->getRHS()); 5766 } 5767 case MCExpr::Unary: 5768 return isEvaluated(cast<MCUnaryExpr>(Expr)->getSubExpr()); 5769 case MCExpr::Target: 5770 return true; 5771 } 5772 return false; 5773 } 5774 5775 bool MipsAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc, 5776 SMLoc &EndLoc) { 5777 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> Operands; 5778 OperandMatchResultTy ResTy = parseAnyRegister(Operands); 5779 if (ResTy == MatchOperand_Success) { 5780 assert(Operands.size() == 1); 5781 MipsOperand &Operand = static_cast<MipsOperand &>(*Operands.front()); 5782 StartLoc = Operand.getStartLoc(); 5783 EndLoc = Operand.getEndLoc(); 5784 5785 // AFAIK, we only support numeric registers and named GPR's in CFI 5786 // directives. 5787 // Don't worry about eating tokens before failing. Using an unrecognised 5788 // register is a parse error. 5789 if (Operand.isGPRAsmReg()) { 5790 // Resolve to GPR32 or GPR64 appropriately. 5791 RegNo = isGP64bit() ? Operand.getGPR64Reg() : Operand.getGPR32Reg(); 5792 } 5793 5794 return (RegNo == (unsigned)-1); 5795 } 5796 5797 assert(Operands.size() == 0); 5798 return (RegNo == (unsigned)-1); 5799 } 5800 5801 bool MipsAsmParser::parseMemOffset(const MCExpr *&Res, bool isParenExpr) { 5802 SMLoc S; 5803 5804 if (isParenExpr) 5805 return getParser().parseParenExprOfDepth(0, Res, S); 5806 return getParser().parseExpression(Res); 5807 } 5808 5809 OperandMatchResultTy 5810 MipsAsmParser::parseMemOperand(OperandVector &Operands) { 5811 MCAsmParser &Parser = getParser(); 5812 LLVM_DEBUG(dbgs() << "parseMemOperand\n"); 5813 const MCExpr *IdVal = nullptr; 5814 SMLoc S; 5815 bool isParenExpr = false; 5816 OperandMatchResultTy Res = MatchOperand_NoMatch; 5817 // First operand is the offset. 5818 S = Parser.getTok().getLoc(); 5819 5820 if (getLexer().getKind() == AsmToken::LParen) { 5821 Parser.Lex(); 5822 isParenExpr = true; 5823 } 5824 5825 if (getLexer().getKind() != AsmToken::Dollar) { 5826 if (parseMemOffset(IdVal, isParenExpr)) 5827 return MatchOperand_ParseFail; 5828 5829 const AsmToken &Tok = Parser.getTok(); // Get the next token. 5830 if (Tok.isNot(AsmToken::LParen)) { 5831 MipsOperand &Mnemonic = static_cast<MipsOperand &>(*Operands[0]); 5832 if (Mnemonic.getToken() == "la" || Mnemonic.getToken() == "dla") { 5833 SMLoc E = 5834 SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 5835 Operands.push_back(MipsOperand::CreateImm(IdVal, S, E, *this)); 5836 return MatchOperand_Success; 5837 } 5838 if (Tok.is(AsmToken::EndOfStatement)) { 5839 SMLoc E = 5840 SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 5841 5842 // Zero register assumed, add a memory operand with ZERO as its base. 5843 // "Base" will be managed by k_Memory. 5844 auto Base = MipsOperand::createGPRReg( 5845 0, "0", getContext().getRegisterInfo(), S, E, *this); 5846 Operands.push_back( 5847 MipsOperand::CreateMem(std::move(Base), IdVal, S, E, *this)); 5848 return MatchOperand_Success; 5849 } 5850 MCBinaryExpr::Opcode Opcode; 5851 // GAS and LLVM treat comparison operators different. GAS will generate -1 5852 // or 0, while LLVM will generate 0 or 1. Since a comparsion operator is 5853 // highly unlikely to be found in a memory offset expression, we don't 5854 // handle them. 5855 switch (Tok.getKind()) { 5856 case AsmToken::Plus: 5857 Opcode = MCBinaryExpr::Add; 5858 Parser.Lex(); 5859 break; 5860 case AsmToken::Minus: 5861 Opcode = MCBinaryExpr::Sub; 5862 Parser.Lex(); 5863 break; 5864 case AsmToken::Star: 5865 Opcode = MCBinaryExpr::Mul; 5866 Parser.Lex(); 5867 break; 5868 case AsmToken::Pipe: 5869 Opcode = MCBinaryExpr::Or; 5870 Parser.Lex(); 5871 break; 5872 case AsmToken::Amp: 5873 Opcode = MCBinaryExpr::And; 5874 Parser.Lex(); 5875 break; 5876 case AsmToken::LessLess: 5877 Opcode = MCBinaryExpr::Shl; 5878 Parser.Lex(); 5879 break; 5880 case AsmToken::GreaterGreater: 5881 Opcode = MCBinaryExpr::LShr; 5882 Parser.Lex(); 5883 break; 5884 case AsmToken::Caret: 5885 Opcode = MCBinaryExpr::Xor; 5886 Parser.Lex(); 5887 break; 5888 case AsmToken::Slash: 5889 Opcode = MCBinaryExpr::Div; 5890 Parser.Lex(); 5891 break; 5892 case AsmToken::Percent: 5893 Opcode = MCBinaryExpr::Mod; 5894 Parser.Lex(); 5895 break; 5896 default: 5897 Error(Parser.getTok().getLoc(), "'(' or expression expected"); 5898 return MatchOperand_ParseFail; 5899 } 5900 const MCExpr * NextExpr; 5901 if (getParser().parseExpression(NextExpr)) 5902 return MatchOperand_ParseFail; 5903 IdVal = MCBinaryExpr::create(Opcode, IdVal, NextExpr, getContext()); 5904 } 5905 5906 Parser.Lex(); // Eat the '(' token. 5907 } 5908 5909 Res = parseAnyRegister(Operands); 5910 if (Res != MatchOperand_Success) 5911 return Res; 5912 5913 if (Parser.getTok().isNot(AsmToken::RParen)) { 5914 Error(Parser.getTok().getLoc(), "')' expected"); 5915 return MatchOperand_ParseFail; 5916 } 5917 5918 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 5919 5920 Parser.Lex(); // Eat the ')' token. 5921 5922 if (!IdVal) 5923 IdVal = MCConstantExpr::create(0, getContext()); 5924 5925 // Replace the register operand with the memory operand. 5926 std::unique_ptr<MipsOperand> op( 5927 static_cast<MipsOperand *>(Operands.back().release())); 5928 // Remove the register from the operands. 5929 // "op" will be managed by k_Memory. 5930 Operands.pop_back(); 5931 // Add the memory operand. 5932 if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(IdVal)) { 5933 int64_t Imm; 5934 if (IdVal->evaluateAsAbsolute(Imm)) 5935 IdVal = MCConstantExpr::create(Imm, getContext()); 5936 else if (BE->getLHS()->getKind() != MCExpr::SymbolRef) 5937 IdVal = MCBinaryExpr::create(BE->getOpcode(), BE->getRHS(), BE->getLHS(), 5938 getContext()); 5939 } 5940 5941 Operands.push_back(MipsOperand::CreateMem(std::move(op), IdVal, S, E, *this)); 5942 return MatchOperand_Success; 5943 } 5944 5945 bool MipsAsmParser::searchSymbolAlias(OperandVector &Operands) { 5946 MCAsmParser &Parser = getParser(); 5947 MCSymbol *Sym = getContext().lookupSymbol(Parser.getTok().getIdentifier()); 5948 if (!Sym) 5949 return false; 5950 5951 SMLoc S = Parser.getTok().getLoc(); 5952 if (Sym->isVariable()) { 5953 const MCExpr *Expr = Sym->getVariableValue(); 5954 if (Expr->getKind() == MCExpr::SymbolRef) { 5955 const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr); 5956 StringRef DefSymbol = Ref->getSymbol().getName(); 5957 if (DefSymbol.startswith("$")) { 5958 OperandMatchResultTy ResTy = 5959 matchAnyRegisterNameWithoutDollar(Operands, DefSymbol.substr(1), S); 5960 if (ResTy == MatchOperand_Success) { 5961 Parser.Lex(); 5962 return true; 5963 } 5964 if (ResTy == MatchOperand_ParseFail) 5965 llvm_unreachable("Should never ParseFail"); 5966 } 5967 } 5968 } else if (Sym->isUnset()) { 5969 // If symbol is unset, it might be created in the `parseSetAssignment` 5970 // routine as an alias for a numeric register name. 5971 // Lookup in the aliases list. 5972 auto Entry = RegisterSets.find(Sym->getName()); 5973 if (Entry != RegisterSets.end()) { 5974 OperandMatchResultTy ResTy = 5975 matchAnyRegisterWithoutDollar(Operands, Entry->getValue(), S); 5976 if (ResTy == MatchOperand_Success) { 5977 Parser.Lex(); 5978 return true; 5979 } 5980 } 5981 } 5982 5983 return false; 5984 } 5985 5986 OperandMatchResultTy 5987 MipsAsmParser::matchAnyRegisterNameWithoutDollar(OperandVector &Operands, 5988 StringRef Identifier, 5989 SMLoc S) { 5990 int Index = matchCPURegisterName(Identifier); 5991 if (Index != -1) { 5992 Operands.push_back(MipsOperand::createGPRReg( 5993 Index, Identifier, getContext().getRegisterInfo(), S, 5994 getLexer().getLoc(), *this)); 5995 return MatchOperand_Success; 5996 } 5997 5998 Index = matchHWRegsRegisterName(Identifier); 5999 if (Index != -1) { 6000 Operands.push_back(MipsOperand::createHWRegsReg( 6001 Index, Identifier, getContext().getRegisterInfo(), S, 6002 getLexer().getLoc(), *this)); 6003 return MatchOperand_Success; 6004 } 6005 6006 Index = matchFPURegisterName(Identifier); 6007 if (Index != -1) { 6008 Operands.push_back(MipsOperand::createFGRReg( 6009 Index, Identifier, getContext().getRegisterInfo(), S, 6010 getLexer().getLoc(), *this)); 6011 return MatchOperand_Success; 6012 } 6013 6014 Index = matchFCCRegisterName(Identifier); 6015 if (Index != -1) { 6016 Operands.push_back(MipsOperand::createFCCReg( 6017 Index, Identifier, getContext().getRegisterInfo(), S, 6018 getLexer().getLoc(), *this)); 6019 return MatchOperand_Success; 6020 } 6021 6022 Index = matchACRegisterName(Identifier); 6023 if (Index != -1) { 6024 Operands.push_back(MipsOperand::createACCReg( 6025 Index, Identifier, getContext().getRegisterInfo(), S, 6026 getLexer().getLoc(), *this)); 6027 return MatchOperand_Success; 6028 } 6029 6030 Index = matchMSA128RegisterName(Identifier); 6031 if (Index != -1) { 6032 Operands.push_back(MipsOperand::createMSA128Reg( 6033 Index, Identifier, getContext().getRegisterInfo(), S, 6034 getLexer().getLoc(), *this)); 6035 return MatchOperand_Success; 6036 } 6037 6038 Index = matchMSA128CtrlRegisterName(Identifier); 6039 if (Index != -1) { 6040 Operands.push_back(MipsOperand::createMSACtrlReg( 6041 Index, Identifier, getContext().getRegisterInfo(), S, 6042 getLexer().getLoc(), *this)); 6043 return MatchOperand_Success; 6044 } 6045 6046 return MatchOperand_NoMatch; 6047 } 6048 6049 OperandMatchResultTy 6050 MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, 6051 const AsmToken &Token, SMLoc S) { 6052 if (Token.is(AsmToken::Identifier)) { 6053 LLVM_DEBUG(dbgs() << ".. identifier\n"); 6054 StringRef Identifier = Token.getIdentifier(); 6055 OperandMatchResultTy ResTy = 6056 matchAnyRegisterNameWithoutDollar(Operands, Identifier, S); 6057 return ResTy; 6058 } else if (Token.is(AsmToken::Integer)) { 6059 LLVM_DEBUG(dbgs() << ".. integer\n"); 6060 int64_t RegNum = Token.getIntVal(); 6061 if (RegNum < 0 || RegNum > 31) { 6062 // Show the error, but treat invalid register 6063 // number as a normal one to continue parsing 6064 // and catch other possible errors. 6065 Error(getLexer().getLoc(), "invalid register number"); 6066 } 6067 Operands.push_back(MipsOperand::createNumericReg( 6068 RegNum, Token.getString(), getContext().getRegisterInfo(), S, 6069 Token.getLoc(), *this)); 6070 return MatchOperand_Success; 6071 } 6072 6073 LLVM_DEBUG(dbgs() << Token.getKind() << "\n"); 6074 6075 return MatchOperand_NoMatch; 6076 } 6077 6078 OperandMatchResultTy 6079 MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) { 6080 auto Token = getLexer().peekTok(false); 6081 return matchAnyRegisterWithoutDollar(Operands, Token, S); 6082 } 6083 6084 OperandMatchResultTy 6085 MipsAsmParser::parseAnyRegister(OperandVector &Operands) { 6086 MCAsmParser &Parser = getParser(); 6087 LLVM_DEBUG(dbgs() << "parseAnyRegister\n"); 6088 6089 auto Token = Parser.getTok(); 6090 6091 SMLoc S = Token.getLoc(); 6092 6093 if (Token.isNot(AsmToken::Dollar)) { 6094 LLVM_DEBUG(dbgs() << ".. !$ -> try sym aliasing\n"); 6095 if (Token.is(AsmToken::Identifier)) { 6096 if (searchSymbolAlias(Operands)) 6097 return MatchOperand_Success; 6098 } 6099 LLVM_DEBUG(dbgs() << ".. !symalias -> NoMatch\n"); 6100 return MatchOperand_NoMatch; 6101 } 6102 LLVM_DEBUG(dbgs() << ".. $\n"); 6103 6104 OperandMatchResultTy ResTy = matchAnyRegisterWithoutDollar(Operands, S); 6105 if (ResTy == MatchOperand_Success) { 6106 Parser.Lex(); // $ 6107 Parser.Lex(); // identifier 6108 } 6109 return ResTy; 6110 } 6111 6112 OperandMatchResultTy 6113 MipsAsmParser::parseJumpTarget(OperandVector &Operands) { 6114 MCAsmParser &Parser = getParser(); 6115 LLVM_DEBUG(dbgs() << "parseJumpTarget\n"); 6116 6117 SMLoc S = getLexer().getLoc(); 6118 6119 // Registers are a valid target and have priority over symbols. 6120 OperandMatchResultTy ResTy = parseAnyRegister(Operands); 6121 if (ResTy != MatchOperand_NoMatch) 6122 return ResTy; 6123 6124 // Integers and expressions are acceptable 6125 const MCExpr *Expr = nullptr; 6126 if (Parser.parseExpression(Expr)) { 6127 // We have no way of knowing if a symbol was consumed so we must ParseFail 6128 return MatchOperand_ParseFail; 6129 } 6130 Operands.push_back( 6131 MipsOperand::CreateImm(Expr, S, getLexer().getLoc(), *this)); 6132 return MatchOperand_Success; 6133 } 6134 6135 OperandMatchResultTy 6136 MipsAsmParser::parseInvNum(OperandVector &Operands) { 6137 MCAsmParser &Parser = getParser(); 6138 const MCExpr *IdVal; 6139 // If the first token is '$' we may have register operand. We have to reject 6140 // cases where it is not a register. Complicating the matter is that 6141 // register names are not reserved across all ABIs. 6142 // Peek past the dollar to see if it's a register name for this ABI. 6143 SMLoc S = Parser.getTok().getLoc(); 6144 if (Parser.getTok().is(AsmToken::Dollar)) { 6145 return matchCPURegisterName(Parser.getLexer().peekTok().getString()) == -1 6146 ? MatchOperand_ParseFail 6147 : MatchOperand_NoMatch; 6148 } 6149 if (getParser().parseExpression(IdVal)) 6150 return MatchOperand_ParseFail; 6151 const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(IdVal); 6152 if (!MCE) 6153 return MatchOperand_NoMatch; 6154 int64_t Val = MCE->getValue(); 6155 SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1); 6156 Operands.push_back(MipsOperand::CreateImm( 6157 MCConstantExpr::create(0 - Val, getContext()), S, E, *this)); 6158 return MatchOperand_Success; 6159 } 6160 6161 OperandMatchResultTy 6162 MipsAsmParser::parseRegisterList(OperandVector &Operands) { 6163 MCAsmParser &Parser = getParser(); 6164 SmallVector<unsigned, 10> Regs; 6165 unsigned RegNo; 6166 unsigned PrevReg = Mips::NoRegister; 6167 bool RegRange = false; 6168 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 8> TmpOperands; 6169 6170 if (Parser.getTok().isNot(AsmToken::Dollar)) 6171 return MatchOperand_ParseFail; 6172 6173 SMLoc S = Parser.getTok().getLoc(); 6174 while (parseAnyRegister(TmpOperands) == MatchOperand_Success) { 6175 SMLoc E = getLexer().getLoc(); 6176 MipsOperand &Reg = static_cast<MipsOperand &>(*TmpOperands.back()); 6177 RegNo = isGP64bit() ? Reg.getGPR64Reg() : Reg.getGPR32Reg(); 6178 if (RegRange) { 6179 // Remove last register operand because registers from register range 6180 // should be inserted first. 6181 if ((isGP64bit() && RegNo == Mips::RA_64) || 6182 (!isGP64bit() && RegNo == Mips::RA)) { 6183 Regs.push_back(RegNo); 6184 } else { 6185 unsigned TmpReg = PrevReg + 1; 6186 while (TmpReg <= RegNo) { 6187 if ((((TmpReg < Mips::S0) || (TmpReg > Mips::S7)) && !isGP64bit()) || 6188 (((TmpReg < Mips::S0_64) || (TmpReg > Mips::S7_64)) && 6189 isGP64bit())) { 6190 Error(E, "invalid register operand"); 6191 return MatchOperand_ParseFail; 6192 } 6193 6194 PrevReg = TmpReg; 6195 Regs.push_back(TmpReg++); 6196 } 6197 } 6198 6199 RegRange = false; 6200 } else { 6201 if ((PrevReg == Mips::NoRegister) && 6202 ((isGP64bit() && (RegNo != Mips::S0_64) && (RegNo != Mips::RA_64)) || 6203 (!isGP64bit() && (RegNo != Mips::S0) && (RegNo != Mips::RA)))) { 6204 Error(E, "$16 or $31 expected"); 6205 return MatchOperand_ParseFail; 6206 } else if (!(((RegNo == Mips::FP || RegNo == Mips::RA || 6207 (RegNo >= Mips::S0 && RegNo <= Mips::S7)) && 6208 !isGP64bit()) || 6209 ((RegNo == Mips::FP_64 || RegNo == Mips::RA_64 || 6210 (RegNo >= Mips::S0_64 && RegNo <= Mips::S7_64)) && 6211 isGP64bit()))) { 6212 Error(E, "invalid register operand"); 6213 return MatchOperand_ParseFail; 6214 } else if ((PrevReg != Mips::NoRegister) && (RegNo != PrevReg + 1) && 6215 ((RegNo != Mips::FP && RegNo != Mips::RA && !isGP64bit()) || 6216 (RegNo != Mips::FP_64 && RegNo != Mips::RA_64 && 6217 isGP64bit()))) { 6218 Error(E, "consecutive register numbers expected"); 6219 return MatchOperand_ParseFail; 6220 } 6221 6222 Regs.push_back(RegNo); 6223 } 6224 6225 if (Parser.getTok().is(AsmToken::Minus)) 6226 RegRange = true; 6227 6228 if (!Parser.getTok().isNot(AsmToken::Minus) && 6229 !Parser.getTok().isNot(AsmToken::Comma)) { 6230 Error(E, "',' or '-' expected"); 6231 return MatchOperand_ParseFail; 6232 } 6233 6234 Lex(); // Consume comma or minus 6235 if (Parser.getTok().isNot(AsmToken::Dollar)) 6236 break; 6237 6238 PrevReg = RegNo; 6239 } 6240 6241 SMLoc E = Parser.getTok().getLoc(); 6242 Operands.push_back(MipsOperand::CreateRegList(Regs, S, E, *this)); 6243 parseMemOperand(Operands); 6244 return MatchOperand_Success; 6245 } 6246 6247 /// Sometimes (i.e. load/stores) the operand may be followed immediately by 6248 /// either this. 6249 /// ::= '(', register, ')' 6250 /// handle it before we iterate so we don't get tripped up by the lack of 6251 /// a comma. 6252 bool MipsAsmParser::parseParenSuffix(StringRef Name, OperandVector &Operands) { 6253 MCAsmParser &Parser = getParser(); 6254 if (getLexer().is(AsmToken::LParen)) { 6255 Operands.push_back( 6256 MipsOperand::CreateToken("(", getLexer().getLoc(), *this)); 6257 Parser.Lex(); 6258 if (parseOperand(Operands, Name)) { 6259 SMLoc Loc = getLexer().getLoc(); 6260 return Error(Loc, "unexpected token in argument list"); 6261 } 6262 if (Parser.getTok().isNot(AsmToken::RParen)) { 6263 SMLoc Loc = getLexer().getLoc(); 6264 return Error(Loc, "unexpected token, expected ')'"); 6265 } 6266 Operands.push_back( 6267 MipsOperand::CreateToken(")", getLexer().getLoc(), *this)); 6268 Parser.Lex(); 6269 } 6270 return false; 6271 } 6272 6273 /// Sometimes (i.e. in MSA) the operand may be followed immediately by 6274 /// either one of these. 6275 /// ::= '[', register, ']' 6276 /// ::= '[', integer, ']' 6277 /// handle it before we iterate so we don't get tripped up by the lack of 6278 /// a comma. 6279 bool MipsAsmParser::parseBracketSuffix(StringRef Name, 6280 OperandVector &Operands) { 6281 MCAsmParser &Parser = getParser(); 6282 if (getLexer().is(AsmToken::LBrac)) { 6283 Operands.push_back( 6284 MipsOperand::CreateToken("[", getLexer().getLoc(), *this)); 6285 Parser.Lex(); 6286 if (parseOperand(Operands, Name)) { 6287 SMLoc Loc = getLexer().getLoc(); 6288 return Error(Loc, "unexpected token in argument list"); 6289 } 6290 if (Parser.getTok().isNot(AsmToken::RBrac)) { 6291 SMLoc Loc = getLexer().getLoc(); 6292 return Error(Loc, "unexpected token, expected ']'"); 6293 } 6294 Operands.push_back( 6295 MipsOperand::CreateToken("]", getLexer().getLoc(), *this)); 6296 Parser.Lex(); 6297 } 6298 return false; 6299 } 6300 6301 static std::string MipsMnemonicSpellCheck(StringRef S, uint64_t FBS, 6302 unsigned VariantID = 0); 6303 6304 bool MipsAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name, 6305 SMLoc NameLoc, OperandVector &Operands) { 6306 MCAsmParser &Parser = getParser(); 6307 LLVM_DEBUG(dbgs() << "ParseInstruction\n"); 6308 6309 // We have reached first instruction, module directive are now forbidden. 6310 getTargetStreamer().forbidModuleDirective(); 6311 6312 // Check if we have valid mnemonic 6313 if (!mnemonicIsValid(Name, 0)) { 6314 uint64_t FBS = ComputeAvailableFeatures(getSTI().getFeatureBits()); 6315 std::string Suggestion = MipsMnemonicSpellCheck(Name, FBS); 6316 return Error(NameLoc, "unknown instruction" + Suggestion); 6317 } 6318 // First operand in MCInst is instruction mnemonic. 6319 Operands.push_back(MipsOperand::CreateToken(Name, NameLoc, *this)); 6320 6321 // Read the remaining operands. 6322 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6323 // Read the first operand. 6324 if (parseOperand(Operands, Name)) { 6325 SMLoc Loc = getLexer().getLoc(); 6326 return Error(Loc, "unexpected token in argument list"); 6327 } 6328 if (getLexer().is(AsmToken::LBrac) && parseBracketSuffix(Name, Operands)) 6329 return true; 6330 // AFAIK, parenthesis suffixes are never on the first operand 6331 6332 while (getLexer().is(AsmToken::Comma)) { 6333 Parser.Lex(); // Eat the comma. 6334 // Parse and remember the operand. 6335 if (parseOperand(Operands, Name)) { 6336 SMLoc Loc = getLexer().getLoc(); 6337 return Error(Loc, "unexpected token in argument list"); 6338 } 6339 // Parse bracket and parenthesis suffixes before we iterate 6340 if (getLexer().is(AsmToken::LBrac)) { 6341 if (parseBracketSuffix(Name, Operands)) 6342 return true; 6343 } else if (getLexer().is(AsmToken::LParen) && 6344 parseParenSuffix(Name, Operands)) 6345 return true; 6346 } 6347 } 6348 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6349 SMLoc Loc = getLexer().getLoc(); 6350 return Error(Loc, "unexpected token in argument list"); 6351 } 6352 Parser.Lex(); // Consume the EndOfStatement. 6353 return false; 6354 } 6355 6356 // FIXME: Given that these have the same name, these should both be 6357 // consistent on affecting the Parser. 6358 bool MipsAsmParser::reportParseError(Twine ErrorMsg) { 6359 SMLoc Loc = getLexer().getLoc(); 6360 return Error(Loc, ErrorMsg); 6361 } 6362 6363 bool MipsAsmParser::reportParseError(SMLoc Loc, Twine ErrorMsg) { 6364 return Error(Loc, ErrorMsg); 6365 } 6366 6367 bool MipsAsmParser::parseSetNoAtDirective() { 6368 MCAsmParser &Parser = getParser(); 6369 // Line should look like: ".set noat". 6370 6371 // Set the $at register to $0. 6372 AssemblerOptions.back()->setATRegIndex(0); 6373 6374 Parser.Lex(); // Eat "noat". 6375 6376 // If this is not the end of the statement, report an error. 6377 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6378 reportParseError("unexpected token, expected end of statement"); 6379 return false; 6380 } 6381 6382 getTargetStreamer().emitDirectiveSetNoAt(); 6383 Parser.Lex(); // Consume the EndOfStatement. 6384 return false; 6385 } 6386 6387 bool MipsAsmParser::parseSetAtDirective() { 6388 // Line can be: ".set at", which sets $at to $1 6389 // or ".set at=$reg", which sets $at to $reg. 6390 MCAsmParser &Parser = getParser(); 6391 Parser.Lex(); // Eat "at". 6392 6393 if (getLexer().is(AsmToken::EndOfStatement)) { 6394 // No register was specified, so we set $at to $1. 6395 AssemblerOptions.back()->setATRegIndex(1); 6396 6397 getTargetStreamer().emitDirectiveSetAt(); 6398 Parser.Lex(); // Consume the EndOfStatement. 6399 return false; 6400 } 6401 6402 if (getLexer().isNot(AsmToken::Equal)) { 6403 reportParseError("unexpected token, expected equals sign"); 6404 return false; 6405 } 6406 Parser.Lex(); // Eat "=". 6407 6408 if (getLexer().isNot(AsmToken::Dollar)) { 6409 if (getLexer().is(AsmToken::EndOfStatement)) { 6410 reportParseError("no register specified"); 6411 return false; 6412 } else { 6413 reportParseError("unexpected token, expected dollar sign '$'"); 6414 return false; 6415 } 6416 } 6417 Parser.Lex(); // Eat "$". 6418 6419 // Find out what "reg" is. 6420 unsigned AtRegNo; 6421 const AsmToken &Reg = Parser.getTok(); 6422 if (Reg.is(AsmToken::Identifier)) { 6423 AtRegNo = matchCPURegisterName(Reg.getIdentifier()); 6424 } else if (Reg.is(AsmToken::Integer)) { 6425 AtRegNo = Reg.getIntVal(); 6426 } else { 6427 reportParseError("unexpected token, expected identifier or integer"); 6428 return false; 6429 } 6430 6431 // Check if $reg is a valid register. If it is, set $at to $reg. 6432 if (!AssemblerOptions.back()->setATRegIndex(AtRegNo)) { 6433 reportParseError("invalid register"); 6434 return false; 6435 } 6436 Parser.Lex(); // Eat "reg". 6437 6438 // If this is not the end of the statement, report an error. 6439 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6440 reportParseError("unexpected token, expected end of statement"); 6441 return false; 6442 } 6443 6444 getTargetStreamer().emitDirectiveSetAtWithArg(AtRegNo); 6445 6446 Parser.Lex(); // Consume the EndOfStatement. 6447 return false; 6448 } 6449 6450 bool MipsAsmParser::parseSetReorderDirective() { 6451 MCAsmParser &Parser = getParser(); 6452 Parser.Lex(); 6453 // If this is not the end of the statement, report an error. 6454 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6455 reportParseError("unexpected token, expected end of statement"); 6456 return false; 6457 } 6458 AssemblerOptions.back()->setReorder(); 6459 getTargetStreamer().emitDirectiveSetReorder(); 6460 Parser.Lex(); // Consume the EndOfStatement. 6461 return false; 6462 } 6463 6464 bool MipsAsmParser::parseSetNoReorderDirective() { 6465 MCAsmParser &Parser = getParser(); 6466 Parser.Lex(); 6467 // If this is not the end of the statement, report an error. 6468 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6469 reportParseError("unexpected token, expected end of statement"); 6470 return false; 6471 } 6472 AssemblerOptions.back()->setNoReorder(); 6473 getTargetStreamer().emitDirectiveSetNoReorder(); 6474 Parser.Lex(); // Consume the EndOfStatement. 6475 return false; 6476 } 6477 6478 bool MipsAsmParser::parseSetMacroDirective() { 6479 MCAsmParser &Parser = getParser(); 6480 Parser.Lex(); 6481 // If this is not the end of the statement, report an error. 6482 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6483 reportParseError("unexpected token, expected end of statement"); 6484 return false; 6485 } 6486 AssemblerOptions.back()->setMacro(); 6487 getTargetStreamer().emitDirectiveSetMacro(); 6488 Parser.Lex(); // Consume the EndOfStatement. 6489 return false; 6490 } 6491 6492 bool MipsAsmParser::parseSetNoMacroDirective() { 6493 MCAsmParser &Parser = getParser(); 6494 Parser.Lex(); 6495 // If this is not the end of the statement, report an error. 6496 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6497 reportParseError("unexpected token, expected end of statement"); 6498 return false; 6499 } 6500 if (AssemblerOptions.back()->isReorder()) { 6501 reportParseError("`noreorder' must be set before `nomacro'"); 6502 return false; 6503 } 6504 AssemblerOptions.back()->setNoMacro(); 6505 getTargetStreamer().emitDirectiveSetNoMacro(); 6506 Parser.Lex(); // Consume the EndOfStatement. 6507 return false; 6508 } 6509 6510 bool MipsAsmParser::parseSetMsaDirective() { 6511 MCAsmParser &Parser = getParser(); 6512 Parser.Lex(); 6513 6514 // If this is not the end of the statement, report an error. 6515 if (getLexer().isNot(AsmToken::EndOfStatement)) 6516 return reportParseError("unexpected token, expected end of statement"); 6517 6518 setFeatureBits(Mips::FeatureMSA, "msa"); 6519 getTargetStreamer().emitDirectiveSetMsa(); 6520 return false; 6521 } 6522 6523 bool MipsAsmParser::parseSetNoMsaDirective() { 6524 MCAsmParser &Parser = getParser(); 6525 Parser.Lex(); 6526 6527 // If this is not the end of the statement, report an error. 6528 if (getLexer().isNot(AsmToken::EndOfStatement)) 6529 return reportParseError("unexpected token, expected end of statement"); 6530 6531 clearFeatureBits(Mips::FeatureMSA, "msa"); 6532 getTargetStreamer().emitDirectiveSetNoMsa(); 6533 return false; 6534 } 6535 6536 bool MipsAsmParser::parseSetNoDspDirective() { 6537 MCAsmParser &Parser = getParser(); 6538 Parser.Lex(); // Eat "nodsp". 6539 6540 // If this is not the end of the statement, report an error. 6541 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6542 reportParseError("unexpected token, expected end of statement"); 6543 return false; 6544 } 6545 6546 clearFeatureBits(Mips::FeatureDSP, "dsp"); 6547 getTargetStreamer().emitDirectiveSetNoDsp(); 6548 return false; 6549 } 6550 6551 bool MipsAsmParser::parseSetMips16Directive() { 6552 MCAsmParser &Parser = getParser(); 6553 Parser.Lex(); // Eat "mips16". 6554 6555 // If this is not the end of the statement, report an error. 6556 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6557 reportParseError("unexpected token, expected end of statement"); 6558 return false; 6559 } 6560 6561 setFeatureBits(Mips::FeatureMips16, "mips16"); 6562 getTargetStreamer().emitDirectiveSetMips16(); 6563 Parser.Lex(); // Consume the EndOfStatement. 6564 return false; 6565 } 6566 6567 bool MipsAsmParser::parseSetNoMips16Directive() { 6568 MCAsmParser &Parser = getParser(); 6569 Parser.Lex(); // Eat "nomips16". 6570 6571 // If this is not the end of the statement, report an error. 6572 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6573 reportParseError("unexpected token, expected end of statement"); 6574 return false; 6575 } 6576 6577 clearFeatureBits(Mips::FeatureMips16, "mips16"); 6578 getTargetStreamer().emitDirectiveSetNoMips16(); 6579 Parser.Lex(); // Consume the EndOfStatement. 6580 return false; 6581 } 6582 6583 bool MipsAsmParser::parseSetFpDirective() { 6584 MCAsmParser &Parser = getParser(); 6585 MipsABIFlagsSection::FpABIKind FpAbiVal; 6586 // Line can be: .set fp=32 6587 // .set fp=xx 6588 // .set fp=64 6589 Parser.Lex(); // Eat fp token 6590 AsmToken Tok = Parser.getTok(); 6591 if (Tok.isNot(AsmToken::Equal)) { 6592 reportParseError("unexpected token, expected equals sign '='"); 6593 return false; 6594 } 6595 Parser.Lex(); // Eat '=' token. 6596 Tok = Parser.getTok(); 6597 6598 if (!parseFpABIValue(FpAbiVal, ".set")) 6599 return false; 6600 6601 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6602 reportParseError("unexpected token, expected end of statement"); 6603 return false; 6604 } 6605 getTargetStreamer().emitDirectiveSetFp(FpAbiVal); 6606 Parser.Lex(); // Consume the EndOfStatement. 6607 return false; 6608 } 6609 6610 bool MipsAsmParser::parseSetOddSPRegDirective() { 6611 MCAsmParser &Parser = getParser(); 6612 6613 Parser.Lex(); // Eat "oddspreg". 6614 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6615 reportParseError("unexpected token, expected end of statement"); 6616 return false; 6617 } 6618 6619 clearFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 6620 getTargetStreamer().emitDirectiveSetOddSPReg(); 6621 return false; 6622 } 6623 6624 bool MipsAsmParser::parseSetNoOddSPRegDirective() { 6625 MCAsmParser &Parser = getParser(); 6626 6627 Parser.Lex(); // Eat "nooddspreg". 6628 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6629 reportParseError("unexpected token, expected end of statement"); 6630 return false; 6631 } 6632 6633 setFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 6634 getTargetStreamer().emitDirectiveSetNoOddSPReg(); 6635 return false; 6636 } 6637 6638 bool MipsAsmParser::parseSetMtDirective() { 6639 MCAsmParser &Parser = getParser(); 6640 Parser.Lex(); // Eat "mt". 6641 6642 // If this is not the end of the statement, report an error. 6643 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6644 reportParseError("unexpected token, expected end of statement"); 6645 return false; 6646 } 6647 6648 setFeatureBits(Mips::FeatureMT, "mt"); 6649 getTargetStreamer().emitDirectiveSetMt(); 6650 Parser.Lex(); // Consume the EndOfStatement. 6651 return false; 6652 } 6653 6654 bool MipsAsmParser::parseSetNoMtDirective() { 6655 MCAsmParser &Parser = getParser(); 6656 Parser.Lex(); // Eat "nomt". 6657 6658 // If this is not the end of the statement, report an error. 6659 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6660 reportParseError("unexpected token, expected end of statement"); 6661 return false; 6662 } 6663 6664 clearFeatureBits(Mips::FeatureMT, "mt"); 6665 6666 getTargetStreamer().emitDirectiveSetNoMt(); 6667 Parser.Lex(); // Consume the EndOfStatement. 6668 return false; 6669 } 6670 6671 bool MipsAsmParser::parseSetNoCRCDirective() { 6672 MCAsmParser &Parser = getParser(); 6673 Parser.Lex(); // Eat "nocrc". 6674 6675 // If this is not the end of the statement, report an error. 6676 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6677 reportParseError("unexpected token, expected end of statement"); 6678 return false; 6679 } 6680 6681 clearFeatureBits(Mips::FeatureCRC, "crc"); 6682 6683 getTargetStreamer().emitDirectiveSetNoCRC(); 6684 Parser.Lex(); // Consume the EndOfStatement. 6685 return false; 6686 } 6687 6688 bool MipsAsmParser::parseSetNoVirtDirective() { 6689 MCAsmParser &Parser = getParser(); 6690 Parser.Lex(); // Eat "novirt". 6691 6692 // If this is not the end of the statement, report an error. 6693 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6694 reportParseError("unexpected token, expected end of statement"); 6695 return false; 6696 } 6697 6698 clearFeatureBits(Mips::FeatureVirt, "virt"); 6699 6700 getTargetStreamer().emitDirectiveSetNoVirt(); 6701 Parser.Lex(); // Consume the EndOfStatement. 6702 return false; 6703 } 6704 6705 bool MipsAsmParser::parseSetNoGINVDirective() { 6706 MCAsmParser &Parser = getParser(); 6707 Parser.Lex(); // Eat "noginv". 6708 6709 // If this is not the end of the statement, report an error. 6710 if (getLexer().isNot(AsmToken::EndOfStatement)) { 6711 reportParseError("unexpected token, expected end of statement"); 6712 return false; 6713 } 6714 6715 clearFeatureBits(Mips::FeatureGINV, "ginv"); 6716 6717 getTargetStreamer().emitDirectiveSetNoGINV(); 6718 Parser.Lex(); // Consume the EndOfStatement. 6719 return false; 6720 } 6721 6722 bool MipsAsmParser::parseSetPopDirective() { 6723 MCAsmParser &Parser = getParser(); 6724 SMLoc Loc = getLexer().getLoc(); 6725 6726 Parser.Lex(); 6727 if (getLexer().isNot(AsmToken::EndOfStatement)) 6728 return reportParseError("unexpected token, expected end of statement"); 6729 6730 // Always keep an element on the options "stack" to prevent the user 6731 // from changing the initial options. This is how we remember them. 6732 if (AssemblerOptions.size() == 2) 6733 return reportParseError(Loc, ".set pop with no .set push"); 6734 6735 MCSubtargetInfo &STI = copySTI(); 6736 AssemblerOptions.pop_back(); 6737 setAvailableFeatures( 6738 ComputeAvailableFeatures(AssemblerOptions.back()->getFeatures())); 6739 STI.setFeatureBits(AssemblerOptions.back()->getFeatures()); 6740 6741 getTargetStreamer().emitDirectiveSetPop(); 6742 return false; 6743 } 6744 6745 bool MipsAsmParser::parseSetPushDirective() { 6746 MCAsmParser &Parser = getParser(); 6747 Parser.Lex(); 6748 if (getLexer().isNot(AsmToken::EndOfStatement)) 6749 return reportParseError("unexpected token, expected end of statement"); 6750 6751 // Create a copy of the current assembler options environment and push it. 6752 AssemblerOptions.push_back( 6753 llvm::make_unique<MipsAssemblerOptions>(AssemblerOptions.back().get())); 6754 6755 getTargetStreamer().emitDirectiveSetPush(); 6756 return false; 6757 } 6758 6759 bool MipsAsmParser::parseSetSoftFloatDirective() { 6760 MCAsmParser &Parser = getParser(); 6761 Parser.Lex(); 6762 if (getLexer().isNot(AsmToken::EndOfStatement)) 6763 return reportParseError("unexpected token, expected end of statement"); 6764 6765 setFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 6766 getTargetStreamer().emitDirectiveSetSoftFloat(); 6767 return false; 6768 } 6769 6770 bool MipsAsmParser::parseSetHardFloatDirective() { 6771 MCAsmParser &Parser = getParser(); 6772 Parser.Lex(); 6773 if (getLexer().isNot(AsmToken::EndOfStatement)) 6774 return reportParseError("unexpected token, expected end of statement"); 6775 6776 clearFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 6777 getTargetStreamer().emitDirectiveSetHardFloat(); 6778 return false; 6779 } 6780 6781 bool MipsAsmParser::parseSetAssignment() { 6782 StringRef Name; 6783 const MCExpr *Value; 6784 MCAsmParser &Parser = getParser(); 6785 6786 if (Parser.parseIdentifier(Name)) 6787 return reportParseError("expected identifier after .set"); 6788 6789 if (getLexer().isNot(AsmToken::Comma)) 6790 return reportParseError("unexpected token, expected comma"); 6791 Lex(); // Eat comma 6792 6793 if (getLexer().is(AsmToken::Dollar) && 6794 getLexer().peekTok().is(AsmToken::Integer)) { 6795 // Parse assignment of a numeric register: 6796 // .set r1,$1 6797 Parser.Lex(); // Eat $. 6798 RegisterSets[Name] = Parser.getTok(); 6799 Parser.Lex(); // Eat identifier. 6800 getContext().getOrCreateSymbol(Name); 6801 } else if (!Parser.parseExpression(Value)) { 6802 // Parse assignment of an expression including 6803 // symbolic registers: 6804 // .set $tmp, $BB0-$BB1 6805 // .set r2, $f2 6806 MCSymbol *Sym = getContext().getOrCreateSymbol(Name); 6807 Sym->setVariableValue(Value); 6808 } else { 6809 return reportParseError("expected valid expression after comma"); 6810 } 6811 6812 return false; 6813 } 6814 6815 bool MipsAsmParser::parseSetMips0Directive() { 6816 MCAsmParser &Parser = getParser(); 6817 Parser.Lex(); 6818 if (getLexer().isNot(AsmToken::EndOfStatement)) 6819 return reportParseError("unexpected token, expected end of statement"); 6820 6821 // Reset assembler options to their initial values. 6822 MCSubtargetInfo &STI = copySTI(); 6823 setAvailableFeatures( 6824 ComputeAvailableFeatures(AssemblerOptions.front()->getFeatures())); 6825 STI.setFeatureBits(AssemblerOptions.front()->getFeatures()); 6826 AssemblerOptions.back()->setFeatures(AssemblerOptions.front()->getFeatures()); 6827 6828 getTargetStreamer().emitDirectiveSetMips0(); 6829 return false; 6830 } 6831 6832 bool MipsAsmParser::parseSetArchDirective() { 6833 MCAsmParser &Parser = getParser(); 6834 Parser.Lex(); 6835 if (getLexer().isNot(AsmToken::Equal)) 6836 return reportParseError("unexpected token, expected equals sign"); 6837 6838 Parser.Lex(); 6839 StringRef Arch; 6840 if (Parser.parseIdentifier(Arch)) 6841 return reportParseError("expected arch identifier"); 6842 6843 StringRef ArchFeatureName = 6844 StringSwitch<StringRef>(Arch) 6845 .Case("mips1", "mips1") 6846 .Case("mips2", "mips2") 6847 .Case("mips3", "mips3") 6848 .Case("mips4", "mips4") 6849 .Case("mips5", "mips5") 6850 .Case("mips32", "mips32") 6851 .Case("mips32r2", "mips32r2") 6852 .Case("mips32r3", "mips32r3") 6853 .Case("mips32r5", "mips32r5") 6854 .Case("mips32r6", "mips32r6") 6855 .Case("mips64", "mips64") 6856 .Case("mips64r2", "mips64r2") 6857 .Case("mips64r3", "mips64r3") 6858 .Case("mips64r5", "mips64r5") 6859 .Case("mips64r6", "mips64r6") 6860 .Case("octeon", "cnmips") 6861 .Case("r4000", "mips3") // This is an implementation of Mips3. 6862 .Default(""); 6863 6864 if (ArchFeatureName.empty()) 6865 return reportParseError("unsupported architecture"); 6866 6867 if (ArchFeatureName == "mips64r6" && inMicroMipsMode()) 6868 return reportParseError("mips64r6 does not support microMIPS"); 6869 6870 selectArch(ArchFeatureName); 6871 getTargetStreamer().emitDirectiveSetArch(Arch); 6872 return false; 6873 } 6874 6875 bool MipsAsmParser::parseSetFeature(uint64_t Feature) { 6876 MCAsmParser &Parser = getParser(); 6877 Parser.Lex(); 6878 if (getLexer().isNot(AsmToken::EndOfStatement)) 6879 return reportParseError("unexpected token, expected end of statement"); 6880 6881 switch (Feature) { 6882 default: 6883 llvm_unreachable("Unimplemented feature"); 6884 case Mips::FeatureDSP: 6885 setFeatureBits(Mips::FeatureDSP, "dsp"); 6886 getTargetStreamer().emitDirectiveSetDsp(); 6887 break; 6888 case Mips::FeatureDSPR2: 6889 setFeatureBits(Mips::FeatureDSPR2, "dspr2"); 6890 getTargetStreamer().emitDirectiveSetDspr2(); 6891 break; 6892 case Mips::FeatureMicroMips: 6893 setFeatureBits(Mips::FeatureMicroMips, "micromips"); 6894 getTargetStreamer().emitDirectiveSetMicroMips(); 6895 break; 6896 case Mips::FeatureMips1: 6897 selectArch("mips1"); 6898 getTargetStreamer().emitDirectiveSetMips1(); 6899 break; 6900 case Mips::FeatureMips2: 6901 selectArch("mips2"); 6902 getTargetStreamer().emitDirectiveSetMips2(); 6903 break; 6904 case Mips::FeatureMips3: 6905 selectArch("mips3"); 6906 getTargetStreamer().emitDirectiveSetMips3(); 6907 break; 6908 case Mips::FeatureMips4: 6909 selectArch("mips4"); 6910 getTargetStreamer().emitDirectiveSetMips4(); 6911 break; 6912 case Mips::FeatureMips5: 6913 selectArch("mips5"); 6914 getTargetStreamer().emitDirectiveSetMips5(); 6915 break; 6916 case Mips::FeatureMips32: 6917 selectArch("mips32"); 6918 getTargetStreamer().emitDirectiveSetMips32(); 6919 break; 6920 case Mips::FeatureMips32r2: 6921 selectArch("mips32r2"); 6922 getTargetStreamer().emitDirectiveSetMips32R2(); 6923 break; 6924 case Mips::FeatureMips32r3: 6925 selectArch("mips32r3"); 6926 getTargetStreamer().emitDirectiveSetMips32R3(); 6927 break; 6928 case Mips::FeatureMips32r5: 6929 selectArch("mips32r5"); 6930 getTargetStreamer().emitDirectiveSetMips32R5(); 6931 break; 6932 case Mips::FeatureMips32r6: 6933 selectArch("mips32r6"); 6934 getTargetStreamer().emitDirectiveSetMips32R6(); 6935 break; 6936 case Mips::FeatureMips64: 6937 selectArch("mips64"); 6938 getTargetStreamer().emitDirectiveSetMips64(); 6939 break; 6940 case Mips::FeatureMips64r2: 6941 selectArch("mips64r2"); 6942 getTargetStreamer().emitDirectiveSetMips64R2(); 6943 break; 6944 case Mips::FeatureMips64r3: 6945 selectArch("mips64r3"); 6946 getTargetStreamer().emitDirectiveSetMips64R3(); 6947 break; 6948 case Mips::FeatureMips64r5: 6949 selectArch("mips64r5"); 6950 getTargetStreamer().emitDirectiveSetMips64R5(); 6951 break; 6952 case Mips::FeatureMips64r6: 6953 selectArch("mips64r6"); 6954 getTargetStreamer().emitDirectiveSetMips64R6(); 6955 break; 6956 case Mips::FeatureCRC: 6957 setFeatureBits(Mips::FeatureCRC, "crc"); 6958 getTargetStreamer().emitDirectiveSetCRC(); 6959 break; 6960 case Mips::FeatureVirt: 6961 setFeatureBits(Mips::FeatureVirt, "virt"); 6962 getTargetStreamer().emitDirectiveSetVirt(); 6963 break; 6964 case Mips::FeatureGINV: 6965 setFeatureBits(Mips::FeatureGINV, "ginv"); 6966 getTargetStreamer().emitDirectiveSetGINV(); 6967 break; 6968 } 6969 return false; 6970 } 6971 6972 bool MipsAsmParser::eatComma(StringRef ErrorStr) { 6973 MCAsmParser &Parser = getParser(); 6974 if (getLexer().isNot(AsmToken::Comma)) { 6975 SMLoc Loc = getLexer().getLoc(); 6976 return Error(Loc, ErrorStr); 6977 } 6978 6979 Parser.Lex(); // Eat the comma. 6980 return true; 6981 } 6982 6983 // Used to determine if .cpload, .cprestore, and .cpsetup have any effect. 6984 // In this class, it is only used for .cprestore. 6985 // FIXME: Only keep track of IsPicEnabled in one place, instead of in both 6986 // MipsTargetELFStreamer and MipsAsmParser. 6987 bool MipsAsmParser::isPicAndNotNxxAbi() { 6988 return inPicMode() && !(isABI_N32() || isABI_N64()); 6989 } 6990 6991 bool MipsAsmParser::parseDirectiveCpLoad(SMLoc Loc) { 6992 if (AssemblerOptions.back()->isReorder()) 6993 Warning(Loc, ".cpload should be inside a noreorder section"); 6994 6995 if (inMips16Mode()) { 6996 reportParseError(".cpload is not supported in Mips16 mode"); 6997 return false; 6998 } 6999 7000 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> Reg; 7001 OperandMatchResultTy ResTy = parseAnyRegister(Reg); 7002 if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) { 7003 reportParseError("expected register containing function address"); 7004 return false; 7005 } 7006 7007 MipsOperand &RegOpnd = static_cast<MipsOperand &>(*Reg[0]); 7008 if (!RegOpnd.isGPRAsmReg()) { 7009 reportParseError(RegOpnd.getStartLoc(), "invalid register"); 7010 return false; 7011 } 7012 7013 // If this is not the end of the statement, report an error. 7014 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7015 reportParseError("unexpected token, expected end of statement"); 7016 return false; 7017 } 7018 7019 getTargetStreamer().emitDirectiveCpLoad(RegOpnd.getGPR32Reg()); 7020 return false; 7021 } 7022 7023 bool MipsAsmParser::parseDirectiveCpRestore(SMLoc Loc) { 7024 MCAsmParser &Parser = getParser(); 7025 7026 // Note that .cprestore is ignored if used with the N32 and N64 ABIs or if it 7027 // is used in non-PIC mode. 7028 7029 if (inMips16Mode()) { 7030 reportParseError(".cprestore is not supported in Mips16 mode"); 7031 return false; 7032 } 7033 7034 // Get the stack offset value. 7035 const MCExpr *StackOffset; 7036 int64_t StackOffsetVal; 7037 if (Parser.parseExpression(StackOffset)) { 7038 reportParseError("expected stack offset value"); 7039 return false; 7040 } 7041 7042 if (!StackOffset->evaluateAsAbsolute(StackOffsetVal)) { 7043 reportParseError("stack offset is not an absolute expression"); 7044 return false; 7045 } 7046 7047 if (StackOffsetVal < 0) { 7048 Warning(Loc, ".cprestore with negative stack offset has no effect"); 7049 IsCpRestoreSet = false; 7050 } else { 7051 IsCpRestoreSet = true; 7052 CpRestoreOffset = StackOffsetVal; 7053 } 7054 7055 // If this is not the end of the statement, report an error. 7056 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7057 reportParseError("unexpected token, expected end of statement"); 7058 return false; 7059 } 7060 7061 if (!getTargetStreamer().emitDirectiveCpRestore( 7062 CpRestoreOffset, [&]() { return getATReg(Loc); }, Loc, STI)) 7063 return true; 7064 Parser.Lex(); // Consume the EndOfStatement. 7065 return false; 7066 } 7067 7068 bool MipsAsmParser::parseDirectiveCPSetup() { 7069 MCAsmParser &Parser = getParser(); 7070 unsigned FuncReg; 7071 unsigned Save; 7072 bool SaveIsReg = true; 7073 7074 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg; 7075 OperandMatchResultTy ResTy = parseAnyRegister(TmpReg); 7076 if (ResTy == MatchOperand_NoMatch) { 7077 reportParseError("expected register containing function address"); 7078 return false; 7079 } 7080 7081 MipsOperand &FuncRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 7082 if (!FuncRegOpnd.isGPRAsmReg()) { 7083 reportParseError(FuncRegOpnd.getStartLoc(), "invalid register"); 7084 return false; 7085 } 7086 7087 FuncReg = FuncRegOpnd.getGPR32Reg(); 7088 TmpReg.clear(); 7089 7090 if (!eatComma("unexpected token, expected comma")) 7091 return true; 7092 7093 ResTy = parseAnyRegister(TmpReg); 7094 if (ResTy == MatchOperand_NoMatch) { 7095 const MCExpr *OffsetExpr; 7096 int64_t OffsetVal; 7097 SMLoc ExprLoc = getLexer().getLoc(); 7098 7099 if (Parser.parseExpression(OffsetExpr) || 7100 !OffsetExpr->evaluateAsAbsolute(OffsetVal)) { 7101 reportParseError(ExprLoc, "expected save register or stack offset"); 7102 return false; 7103 } 7104 7105 Save = OffsetVal; 7106 SaveIsReg = false; 7107 } else { 7108 MipsOperand &SaveOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 7109 if (!SaveOpnd.isGPRAsmReg()) { 7110 reportParseError(SaveOpnd.getStartLoc(), "invalid register"); 7111 return false; 7112 } 7113 Save = SaveOpnd.getGPR32Reg(); 7114 } 7115 7116 if (!eatComma("unexpected token, expected comma")) 7117 return true; 7118 7119 const MCExpr *Expr; 7120 if (Parser.parseExpression(Expr)) { 7121 reportParseError("expected expression"); 7122 return false; 7123 } 7124 7125 if (Expr->getKind() != MCExpr::SymbolRef) { 7126 reportParseError("expected symbol"); 7127 return false; 7128 } 7129 const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr); 7130 7131 CpSaveLocation = Save; 7132 CpSaveLocationIsRegister = SaveIsReg; 7133 7134 getTargetStreamer().emitDirectiveCpsetup(FuncReg, Save, Ref->getSymbol(), 7135 SaveIsReg); 7136 return false; 7137 } 7138 7139 bool MipsAsmParser::parseDirectiveCPReturn() { 7140 getTargetStreamer().emitDirectiveCpreturn(CpSaveLocation, 7141 CpSaveLocationIsRegister); 7142 return false; 7143 } 7144 7145 bool MipsAsmParser::parseDirectiveNaN() { 7146 MCAsmParser &Parser = getParser(); 7147 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7148 const AsmToken &Tok = Parser.getTok(); 7149 7150 if (Tok.getString() == "2008") { 7151 Parser.Lex(); 7152 getTargetStreamer().emitDirectiveNaN2008(); 7153 return false; 7154 } else if (Tok.getString() == "legacy") { 7155 Parser.Lex(); 7156 getTargetStreamer().emitDirectiveNaNLegacy(); 7157 return false; 7158 } 7159 } 7160 // If we don't recognize the option passed to the .nan 7161 // directive (e.g. no option or unknown option), emit an error. 7162 reportParseError("invalid option in .nan directive"); 7163 return false; 7164 } 7165 7166 bool MipsAsmParser::parseDirectiveSet() { 7167 const AsmToken &Tok = getParser().getTok(); 7168 StringRef IdVal = Tok.getString(); 7169 SMLoc Loc = Tok.getLoc(); 7170 7171 if (IdVal == "noat") 7172 return parseSetNoAtDirective(); 7173 if (IdVal == "at") 7174 return parseSetAtDirective(); 7175 if (IdVal == "arch") 7176 return parseSetArchDirective(); 7177 if (IdVal == "bopt") { 7178 Warning(Loc, "'bopt' feature is unsupported"); 7179 getParser().Lex(); 7180 return false; 7181 } 7182 if (IdVal == "nobopt") { 7183 // We're already running in nobopt mode, so nothing to do. 7184 getParser().Lex(); 7185 return false; 7186 } 7187 if (IdVal == "fp") 7188 return parseSetFpDirective(); 7189 if (IdVal == "oddspreg") 7190 return parseSetOddSPRegDirective(); 7191 if (IdVal == "nooddspreg") 7192 return parseSetNoOddSPRegDirective(); 7193 if (IdVal == "pop") 7194 return parseSetPopDirective(); 7195 if (IdVal == "push") 7196 return parseSetPushDirective(); 7197 if (IdVal == "reorder") 7198 return parseSetReorderDirective(); 7199 if (IdVal == "noreorder") 7200 return parseSetNoReorderDirective(); 7201 if (IdVal == "macro") 7202 return parseSetMacroDirective(); 7203 if (IdVal == "nomacro") 7204 return parseSetNoMacroDirective(); 7205 if (IdVal == "mips16") 7206 return parseSetMips16Directive(); 7207 if (IdVal == "nomips16") 7208 return parseSetNoMips16Directive(); 7209 if (IdVal == "nomicromips") { 7210 clearFeatureBits(Mips::FeatureMicroMips, "micromips"); 7211 getTargetStreamer().emitDirectiveSetNoMicroMips(); 7212 getParser().eatToEndOfStatement(); 7213 return false; 7214 } 7215 if (IdVal == "micromips") { 7216 if (hasMips64r6()) { 7217 Error(Loc, ".set micromips directive is not supported with MIPS64R6"); 7218 return false; 7219 } 7220 return parseSetFeature(Mips::FeatureMicroMips); 7221 } 7222 if (IdVal == "mips0") 7223 return parseSetMips0Directive(); 7224 if (IdVal == "mips1") 7225 return parseSetFeature(Mips::FeatureMips1); 7226 if (IdVal == "mips2") 7227 return parseSetFeature(Mips::FeatureMips2); 7228 if (IdVal == "mips3") 7229 return parseSetFeature(Mips::FeatureMips3); 7230 if (IdVal == "mips4") 7231 return parseSetFeature(Mips::FeatureMips4); 7232 if (IdVal == "mips5") 7233 return parseSetFeature(Mips::FeatureMips5); 7234 if (IdVal == "mips32") 7235 return parseSetFeature(Mips::FeatureMips32); 7236 if (IdVal == "mips32r2") 7237 return parseSetFeature(Mips::FeatureMips32r2); 7238 if (IdVal == "mips32r3") 7239 return parseSetFeature(Mips::FeatureMips32r3); 7240 if (IdVal == "mips32r5") 7241 return parseSetFeature(Mips::FeatureMips32r5); 7242 if (IdVal == "mips32r6") 7243 return parseSetFeature(Mips::FeatureMips32r6); 7244 if (IdVal == "mips64") 7245 return parseSetFeature(Mips::FeatureMips64); 7246 if (IdVal == "mips64r2") 7247 return parseSetFeature(Mips::FeatureMips64r2); 7248 if (IdVal == "mips64r3") 7249 return parseSetFeature(Mips::FeatureMips64r3); 7250 if (IdVal == "mips64r5") 7251 return parseSetFeature(Mips::FeatureMips64r5); 7252 if (IdVal == "mips64r6") { 7253 if (inMicroMipsMode()) { 7254 Error(Loc, "MIPS64R6 is not supported with microMIPS"); 7255 return false; 7256 } 7257 return parseSetFeature(Mips::FeatureMips64r6); 7258 } 7259 if (IdVal == "dsp") 7260 return parseSetFeature(Mips::FeatureDSP); 7261 if (IdVal == "dspr2") 7262 return parseSetFeature(Mips::FeatureDSPR2); 7263 if (IdVal == "nodsp") 7264 return parseSetNoDspDirective(); 7265 if (IdVal == "msa") 7266 return parseSetMsaDirective(); 7267 if (IdVal == "nomsa") 7268 return parseSetNoMsaDirective(); 7269 if (IdVal == "mt") 7270 return parseSetMtDirective(); 7271 if (IdVal == "nomt") 7272 return parseSetNoMtDirective(); 7273 if (IdVal == "softfloat") 7274 return parseSetSoftFloatDirective(); 7275 if (IdVal == "hardfloat") 7276 return parseSetHardFloatDirective(); 7277 if (IdVal == "crc") 7278 return parseSetFeature(Mips::FeatureCRC); 7279 if (IdVal == "nocrc") 7280 return parseSetNoCRCDirective(); 7281 if (IdVal == "virt") 7282 return parseSetFeature(Mips::FeatureVirt); 7283 if (IdVal == "novirt") 7284 return parseSetNoVirtDirective(); 7285 if (IdVal == "ginv") 7286 return parseSetFeature(Mips::FeatureGINV); 7287 if (IdVal == "noginv") 7288 return parseSetNoGINVDirective(); 7289 7290 // It is just an identifier, look for an assignment. 7291 return parseSetAssignment(); 7292 } 7293 7294 /// parseDirectiveGpWord 7295 /// ::= .gpword local_sym 7296 bool MipsAsmParser::parseDirectiveGpWord() { 7297 MCAsmParser &Parser = getParser(); 7298 const MCExpr *Value; 7299 // EmitGPRel32Value requires an expression, so we are using base class 7300 // method to evaluate the expression. 7301 if (getParser().parseExpression(Value)) 7302 return true; 7303 getParser().getStreamer().EmitGPRel32Value(Value); 7304 7305 if (getLexer().isNot(AsmToken::EndOfStatement)) 7306 return Error(getLexer().getLoc(), 7307 "unexpected token, expected end of statement"); 7308 Parser.Lex(); // Eat EndOfStatement token. 7309 return false; 7310 } 7311 7312 /// parseDirectiveGpDWord 7313 /// ::= .gpdword local_sym 7314 bool MipsAsmParser::parseDirectiveGpDWord() { 7315 MCAsmParser &Parser = getParser(); 7316 const MCExpr *Value; 7317 // EmitGPRel64Value requires an expression, so we are using base class 7318 // method to evaluate the expression. 7319 if (getParser().parseExpression(Value)) 7320 return true; 7321 getParser().getStreamer().EmitGPRel64Value(Value); 7322 7323 if (getLexer().isNot(AsmToken::EndOfStatement)) 7324 return Error(getLexer().getLoc(), 7325 "unexpected token, expected end of statement"); 7326 Parser.Lex(); // Eat EndOfStatement token. 7327 return false; 7328 } 7329 7330 /// parseDirectiveDtpRelWord 7331 /// ::= .dtprelword tls_sym 7332 bool MipsAsmParser::parseDirectiveDtpRelWord() { 7333 MCAsmParser &Parser = getParser(); 7334 const MCExpr *Value; 7335 // EmitDTPRel32Value requires an expression, so we are using base class 7336 // method to evaluate the expression. 7337 if (getParser().parseExpression(Value)) 7338 return true; 7339 getParser().getStreamer().EmitDTPRel32Value(Value); 7340 7341 if (getLexer().isNot(AsmToken::EndOfStatement)) 7342 return Error(getLexer().getLoc(), 7343 "unexpected token, expected end of statement"); 7344 Parser.Lex(); // Eat EndOfStatement token. 7345 return false; 7346 } 7347 7348 /// parseDirectiveDtpRelDWord 7349 /// ::= .dtpreldword tls_sym 7350 bool MipsAsmParser::parseDirectiveDtpRelDWord() { 7351 MCAsmParser &Parser = getParser(); 7352 const MCExpr *Value; 7353 // EmitDTPRel64Value requires an expression, so we are using base class 7354 // method to evaluate the expression. 7355 if (getParser().parseExpression(Value)) 7356 return true; 7357 getParser().getStreamer().EmitDTPRel64Value(Value); 7358 7359 if (getLexer().isNot(AsmToken::EndOfStatement)) 7360 return Error(getLexer().getLoc(), 7361 "unexpected token, expected end of statement"); 7362 Parser.Lex(); // Eat EndOfStatement token. 7363 return false; 7364 } 7365 7366 /// parseDirectiveTpRelWord 7367 /// ::= .tprelword tls_sym 7368 bool MipsAsmParser::parseDirectiveTpRelWord() { 7369 MCAsmParser &Parser = getParser(); 7370 const MCExpr *Value; 7371 // EmitTPRel32Value requires an expression, so we are using base class 7372 // method to evaluate the expression. 7373 if (getParser().parseExpression(Value)) 7374 return true; 7375 getParser().getStreamer().EmitTPRel32Value(Value); 7376 7377 if (getLexer().isNot(AsmToken::EndOfStatement)) 7378 return Error(getLexer().getLoc(), 7379 "unexpected token, expected end of statement"); 7380 Parser.Lex(); // Eat EndOfStatement token. 7381 return false; 7382 } 7383 7384 /// parseDirectiveTpRelDWord 7385 /// ::= .tpreldword tls_sym 7386 bool MipsAsmParser::parseDirectiveTpRelDWord() { 7387 MCAsmParser &Parser = getParser(); 7388 const MCExpr *Value; 7389 // EmitTPRel64Value requires an expression, so we are using base class 7390 // method to evaluate the expression. 7391 if (getParser().parseExpression(Value)) 7392 return true; 7393 getParser().getStreamer().EmitTPRel64Value(Value); 7394 7395 if (getLexer().isNot(AsmToken::EndOfStatement)) 7396 return Error(getLexer().getLoc(), 7397 "unexpected token, expected end of statement"); 7398 Parser.Lex(); // Eat EndOfStatement token. 7399 return false; 7400 } 7401 7402 bool MipsAsmParser::parseDirectiveOption() { 7403 MCAsmParser &Parser = getParser(); 7404 // Get the option token. 7405 AsmToken Tok = Parser.getTok(); 7406 // At the moment only identifiers are supported. 7407 if (Tok.isNot(AsmToken::Identifier)) { 7408 return Error(Parser.getTok().getLoc(), 7409 "unexpected token, expected identifier"); 7410 } 7411 7412 StringRef Option = Tok.getIdentifier(); 7413 7414 if (Option == "pic0") { 7415 // MipsAsmParser needs to know if the current PIC mode changes. 7416 IsPicEnabled = false; 7417 7418 getTargetStreamer().emitDirectiveOptionPic0(); 7419 Parser.Lex(); 7420 if (Parser.getTok().isNot(AsmToken::EndOfStatement)) { 7421 return Error(Parser.getTok().getLoc(), 7422 "unexpected token, expected end of statement"); 7423 } 7424 return false; 7425 } 7426 7427 if (Option == "pic2") { 7428 // MipsAsmParser needs to know if the current PIC mode changes. 7429 IsPicEnabled = true; 7430 7431 getTargetStreamer().emitDirectiveOptionPic2(); 7432 Parser.Lex(); 7433 if (Parser.getTok().isNot(AsmToken::EndOfStatement)) { 7434 return Error(Parser.getTok().getLoc(), 7435 "unexpected token, expected end of statement"); 7436 } 7437 return false; 7438 } 7439 7440 // Unknown option. 7441 Warning(Parser.getTok().getLoc(), 7442 "unknown option, expected 'pic0' or 'pic2'"); 7443 Parser.eatToEndOfStatement(); 7444 return false; 7445 } 7446 7447 /// parseInsnDirective 7448 /// ::= .insn 7449 bool MipsAsmParser::parseInsnDirective() { 7450 // If this is not the end of the statement, report an error. 7451 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7452 reportParseError("unexpected token, expected end of statement"); 7453 return false; 7454 } 7455 7456 // The actual label marking happens in 7457 // MipsELFStreamer::createPendingLabelRelocs(). 7458 getTargetStreamer().emitDirectiveInsn(); 7459 7460 getParser().Lex(); // Eat EndOfStatement token. 7461 return false; 7462 } 7463 7464 /// parseRSectionDirective 7465 /// ::= .rdata 7466 bool MipsAsmParser::parseRSectionDirective(StringRef Section) { 7467 // If this is not the end of the statement, report an error. 7468 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7469 reportParseError("unexpected token, expected end of statement"); 7470 return false; 7471 } 7472 7473 MCSection *ELFSection = getContext().getELFSection( 7474 Section, ELF::SHT_PROGBITS, ELF::SHF_ALLOC); 7475 getParser().getStreamer().SwitchSection(ELFSection); 7476 7477 getParser().Lex(); // Eat EndOfStatement token. 7478 return false; 7479 } 7480 7481 /// parseSSectionDirective 7482 /// ::= .sbss 7483 /// ::= .sdata 7484 bool MipsAsmParser::parseSSectionDirective(StringRef Section, unsigned Type) { 7485 // If this is not the end of the statement, report an error. 7486 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7487 reportParseError("unexpected token, expected end of statement"); 7488 return false; 7489 } 7490 7491 MCSection *ELFSection = getContext().getELFSection( 7492 Section, Type, ELF::SHF_WRITE | ELF::SHF_ALLOC | ELF::SHF_MIPS_GPREL); 7493 getParser().getStreamer().SwitchSection(ELFSection); 7494 7495 getParser().Lex(); // Eat EndOfStatement token. 7496 return false; 7497 } 7498 7499 /// parseDirectiveModule 7500 /// ::= .module oddspreg 7501 /// ::= .module nooddspreg 7502 /// ::= .module fp=value 7503 /// ::= .module softfloat 7504 /// ::= .module hardfloat 7505 /// ::= .module mt 7506 /// ::= .module crc 7507 /// ::= .module nocrc 7508 /// ::= .module virt 7509 /// ::= .module novirt 7510 /// ::= .module ginv 7511 /// ::= .module noginv 7512 bool MipsAsmParser::parseDirectiveModule() { 7513 MCAsmParser &Parser = getParser(); 7514 MCAsmLexer &Lexer = getLexer(); 7515 SMLoc L = Lexer.getLoc(); 7516 7517 if (!getTargetStreamer().isModuleDirectiveAllowed()) { 7518 // TODO : get a better message. 7519 reportParseError(".module directive must appear before any code"); 7520 return false; 7521 } 7522 7523 StringRef Option; 7524 if (Parser.parseIdentifier(Option)) { 7525 reportParseError("expected .module option identifier"); 7526 return false; 7527 } 7528 7529 if (Option == "oddspreg") { 7530 clearModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 7531 7532 // Synchronize the abiflags information with the FeatureBits information we 7533 // changed above. 7534 getTargetStreamer().updateABIInfo(*this); 7535 7536 // If printing assembly, use the recently updated abiflags information. 7537 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7538 // emitted at the end). 7539 getTargetStreamer().emitDirectiveModuleOddSPReg(); 7540 7541 // If this is not the end of the statement, report an error. 7542 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7543 reportParseError("unexpected token, expected end of statement"); 7544 return false; 7545 } 7546 7547 return false; // parseDirectiveModule has finished successfully. 7548 } else if (Option == "nooddspreg") { 7549 if (!isABI_O32()) { 7550 return Error(L, "'.module nooddspreg' requires the O32 ABI"); 7551 } 7552 7553 setModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg"); 7554 7555 // Synchronize the abiflags information with the FeatureBits information we 7556 // changed above. 7557 getTargetStreamer().updateABIInfo(*this); 7558 7559 // If printing assembly, use the recently updated abiflags information. 7560 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7561 // emitted at the end). 7562 getTargetStreamer().emitDirectiveModuleOddSPReg(); 7563 7564 // If this is not the end of the statement, report an error. 7565 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7566 reportParseError("unexpected token, expected end of statement"); 7567 return false; 7568 } 7569 7570 return false; // parseDirectiveModule has finished successfully. 7571 } else if (Option == "fp") { 7572 return parseDirectiveModuleFP(); 7573 } else if (Option == "softfloat") { 7574 setModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 7575 7576 // Synchronize the ABI Flags information with the FeatureBits information we 7577 // updated above. 7578 getTargetStreamer().updateABIInfo(*this); 7579 7580 // If printing assembly, use the recently updated ABI Flags information. 7581 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7582 // emitted later). 7583 getTargetStreamer().emitDirectiveModuleSoftFloat(); 7584 7585 // If this is not the end of the statement, report an error. 7586 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7587 reportParseError("unexpected token, expected end of statement"); 7588 return false; 7589 } 7590 7591 return false; // parseDirectiveModule has finished successfully. 7592 } else if (Option == "hardfloat") { 7593 clearModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float"); 7594 7595 // Synchronize the ABI Flags information with the FeatureBits information we 7596 // updated above. 7597 getTargetStreamer().updateABIInfo(*this); 7598 7599 // If printing assembly, use the recently updated ABI Flags information. 7600 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7601 // emitted later). 7602 getTargetStreamer().emitDirectiveModuleHardFloat(); 7603 7604 // If this is not the end of the statement, report an error. 7605 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7606 reportParseError("unexpected token, expected end of statement"); 7607 return false; 7608 } 7609 7610 return false; // parseDirectiveModule has finished successfully. 7611 } else if (Option == "mt") { 7612 setModuleFeatureBits(Mips::FeatureMT, "mt"); 7613 7614 // Synchronize the ABI Flags information with the FeatureBits information we 7615 // updated above. 7616 getTargetStreamer().updateABIInfo(*this); 7617 7618 // If printing assembly, use the recently updated ABI Flags information. 7619 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7620 // emitted later). 7621 getTargetStreamer().emitDirectiveModuleMT(); 7622 7623 // If this is not the end of the statement, report an error. 7624 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7625 reportParseError("unexpected token, expected end of statement"); 7626 return false; 7627 } 7628 7629 return false; // parseDirectiveModule has finished successfully. 7630 } else if (Option == "crc") { 7631 setModuleFeatureBits(Mips::FeatureCRC, "crc"); 7632 7633 // Synchronize the ABI Flags information with the FeatureBits information we 7634 // updated above. 7635 getTargetStreamer().updateABIInfo(*this); 7636 7637 // If printing assembly, use the recently updated ABI Flags information. 7638 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7639 // emitted later). 7640 getTargetStreamer().emitDirectiveModuleCRC(); 7641 7642 // If this is not the end of the statement, report an error. 7643 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7644 reportParseError("unexpected token, expected end of statement"); 7645 return false; 7646 } 7647 7648 return false; // parseDirectiveModule has finished successfully. 7649 } else if (Option == "nocrc") { 7650 clearModuleFeatureBits(Mips::FeatureCRC, "crc"); 7651 7652 // Synchronize the ABI Flags information with the FeatureBits information we 7653 // updated above. 7654 getTargetStreamer().updateABIInfo(*this); 7655 7656 // If printing assembly, use the recently updated ABI Flags information. 7657 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7658 // emitted later). 7659 getTargetStreamer().emitDirectiveModuleNoCRC(); 7660 7661 // If this is not the end of the statement, report an error. 7662 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7663 reportParseError("unexpected token, expected end of statement"); 7664 return false; 7665 } 7666 7667 return false; // parseDirectiveModule has finished successfully. 7668 } else if (Option == "virt") { 7669 setModuleFeatureBits(Mips::FeatureVirt, "virt"); 7670 7671 // Synchronize the ABI Flags information with the FeatureBits information we 7672 // updated above. 7673 getTargetStreamer().updateABIInfo(*this); 7674 7675 // If printing assembly, use the recently updated ABI Flags information. 7676 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7677 // emitted later). 7678 getTargetStreamer().emitDirectiveModuleVirt(); 7679 7680 // If this is not the end of the statement, report an error. 7681 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7682 reportParseError("unexpected token, expected end of statement"); 7683 return false; 7684 } 7685 7686 return false; // parseDirectiveModule has finished successfully. 7687 } else if (Option == "novirt") { 7688 clearModuleFeatureBits(Mips::FeatureVirt, "virt"); 7689 7690 // Synchronize the ABI Flags information with the FeatureBits information we 7691 // updated above. 7692 getTargetStreamer().updateABIInfo(*this); 7693 7694 // If printing assembly, use the recently updated ABI Flags information. 7695 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7696 // emitted later). 7697 getTargetStreamer().emitDirectiveModuleNoVirt(); 7698 7699 // If this is not the end of the statement, report an error. 7700 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7701 reportParseError("unexpected token, expected end of statement"); 7702 return false; 7703 } 7704 7705 return false; // parseDirectiveModule has finished successfully. 7706 } else if (Option == "ginv") { 7707 setModuleFeatureBits(Mips::FeatureGINV, "ginv"); 7708 7709 // Synchronize the ABI Flags information with the FeatureBits information we 7710 // updated above. 7711 getTargetStreamer().updateABIInfo(*this); 7712 7713 // If printing assembly, use the recently updated ABI Flags information. 7714 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7715 // emitted later). 7716 getTargetStreamer().emitDirectiveModuleGINV(); 7717 7718 // If this is not the end of the statement, report an error. 7719 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7720 reportParseError("unexpected token, expected end of statement"); 7721 return false; 7722 } 7723 7724 return false; // parseDirectiveModule has finished successfully. 7725 } else if (Option == "noginv") { 7726 clearModuleFeatureBits(Mips::FeatureGINV, "ginv"); 7727 7728 // Synchronize the ABI Flags information with the FeatureBits information we 7729 // updated above. 7730 getTargetStreamer().updateABIInfo(*this); 7731 7732 // If printing assembly, use the recently updated ABI Flags information. 7733 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7734 // emitted later). 7735 getTargetStreamer().emitDirectiveModuleNoGINV(); 7736 7737 // If this is not the end of the statement, report an error. 7738 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7739 reportParseError("unexpected token, expected end of statement"); 7740 return false; 7741 } 7742 7743 return false; // parseDirectiveModule has finished successfully. 7744 } else { 7745 return Error(L, "'" + Twine(Option) + "' is not a valid .module option."); 7746 } 7747 } 7748 7749 /// parseDirectiveModuleFP 7750 /// ::= =32 7751 /// ::= =xx 7752 /// ::= =64 7753 bool MipsAsmParser::parseDirectiveModuleFP() { 7754 MCAsmParser &Parser = getParser(); 7755 MCAsmLexer &Lexer = getLexer(); 7756 7757 if (Lexer.isNot(AsmToken::Equal)) { 7758 reportParseError("unexpected token, expected equals sign '='"); 7759 return false; 7760 } 7761 Parser.Lex(); // Eat '=' token. 7762 7763 MipsABIFlagsSection::FpABIKind FpABI; 7764 if (!parseFpABIValue(FpABI, ".module")) 7765 return false; 7766 7767 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7768 reportParseError("unexpected token, expected end of statement"); 7769 return false; 7770 } 7771 7772 // Synchronize the abiflags information with the FeatureBits information we 7773 // changed above. 7774 getTargetStreamer().updateABIInfo(*this); 7775 7776 // If printing assembly, use the recently updated abiflags information. 7777 // If generating ELF, don't do anything (the .MIPS.abiflags section gets 7778 // emitted at the end). 7779 getTargetStreamer().emitDirectiveModuleFP(); 7780 7781 Parser.Lex(); // Consume the EndOfStatement. 7782 return false; 7783 } 7784 7785 bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI, 7786 StringRef Directive) { 7787 MCAsmParser &Parser = getParser(); 7788 MCAsmLexer &Lexer = getLexer(); 7789 bool ModuleLevelOptions = Directive == ".module"; 7790 7791 if (Lexer.is(AsmToken::Identifier)) { 7792 StringRef Value = Parser.getTok().getString(); 7793 Parser.Lex(); 7794 7795 if (Value != "xx") { 7796 reportParseError("unsupported value, expected 'xx', '32' or '64'"); 7797 return false; 7798 } 7799 7800 if (!isABI_O32()) { 7801 reportParseError("'" + Directive + " fp=xx' requires the O32 ABI"); 7802 return false; 7803 } 7804 7805 FpABI = MipsABIFlagsSection::FpABIKind::XX; 7806 if (ModuleLevelOptions) { 7807 setModuleFeatureBits(Mips::FeatureFPXX, "fpxx"); 7808 clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64"); 7809 } else { 7810 setFeatureBits(Mips::FeatureFPXX, "fpxx"); 7811 clearFeatureBits(Mips::FeatureFP64Bit, "fp64"); 7812 } 7813 return true; 7814 } 7815 7816 if (Lexer.is(AsmToken::Integer)) { 7817 unsigned Value = Parser.getTok().getIntVal(); 7818 Parser.Lex(); 7819 7820 if (Value != 32 && Value != 64) { 7821 reportParseError("unsupported value, expected 'xx', '32' or '64'"); 7822 return false; 7823 } 7824 7825 if (Value == 32) { 7826 if (!isABI_O32()) { 7827 reportParseError("'" + Directive + " fp=32' requires the O32 ABI"); 7828 return false; 7829 } 7830 7831 FpABI = MipsABIFlagsSection::FpABIKind::S32; 7832 if (ModuleLevelOptions) { 7833 clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx"); 7834 clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64"); 7835 } else { 7836 clearFeatureBits(Mips::FeatureFPXX, "fpxx"); 7837 clearFeatureBits(Mips::FeatureFP64Bit, "fp64"); 7838 } 7839 } else { 7840 FpABI = MipsABIFlagsSection::FpABIKind::S64; 7841 if (ModuleLevelOptions) { 7842 clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx"); 7843 setModuleFeatureBits(Mips::FeatureFP64Bit, "fp64"); 7844 } else { 7845 clearFeatureBits(Mips::FeatureFPXX, "fpxx"); 7846 setFeatureBits(Mips::FeatureFP64Bit, "fp64"); 7847 } 7848 } 7849 7850 return true; 7851 } 7852 7853 return false; 7854 } 7855 7856 bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) { 7857 // This returns false if this function recognizes the directive 7858 // regardless of whether it is successfully handles or reports an 7859 // error. Otherwise it returns true to give the generic parser a 7860 // chance at recognizing it. 7861 7862 MCAsmParser &Parser = getParser(); 7863 StringRef IDVal = DirectiveID.getString(); 7864 7865 if (IDVal == ".cpload") { 7866 parseDirectiveCpLoad(DirectiveID.getLoc()); 7867 return false; 7868 } 7869 if (IDVal == ".cprestore") { 7870 parseDirectiveCpRestore(DirectiveID.getLoc()); 7871 return false; 7872 } 7873 if (IDVal == ".ent") { 7874 StringRef SymbolName; 7875 7876 if (Parser.parseIdentifier(SymbolName)) { 7877 reportParseError("expected identifier after .ent"); 7878 return false; 7879 } 7880 7881 // There's an undocumented extension that allows an integer to 7882 // follow the name of the procedure which AFAICS is ignored by GAS. 7883 // Example: .ent foo,2 7884 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7885 if (getLexer().isNot(AsmToken::Comma)) { 7886 // Even though we accept this undocumented extension for compatibility 7887 // reasons, the additional integer argument does not actually change 7888 // the behaviour of the '.ent' directive, so we would like to discourage 7889 // its use. We do this by not referring to the extended version in 7890 // error messages which are not directly related to its use. 7891 reportParseError("unexpected token, expected end of statement"); 7892 return false; 7893 } 7894 Parser.Lex(); // Eat the comma. 7895 const MCExpr *DummyNumber; 7896 int64_t DummyNumberVal; 7897 // If the user was explicitly trying to use the extended version, 7898 // we still give helpful extension-related error messages. 7899 if (Parser.parseExpression(DummyNumber)) { 7900 reportParseError("expected number after comma"); 7901 return false; 7902 } 7903 if (!DummyNumber->evaluateAsAbsolute(DummyNumberVal)) { 7904 reportParseError("expected an absolute expression after comma"); 7905 return false; 7906 } 7907 } 7908 7909 // If this is not the end of the statement, report an error. 7910 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7911 reportParseError("unexpected token, expected end of statement"); 7912 return false; 7913 } 7914 7915 MCSymbol *Sym = getContext().getOrCreateSymbol(SymbolName); 7916 7917 getTargetStreamer().emitDirectiveEnt(*Sym); 7918 CurrentFn = Sym; 7919 IsCpRestoreSet = false; 7920 return false; 7921 } 7922 7923 if (IDVal == ".end") { 7924 StringRef SymbolName; 7925 7926 if (Parser.parseIdentifier(SymbolName)) { 7927 reportParseError("expected identifier after .end"); 7928 return false; 7929 } 7930 7931 if (getLexer().isNot(AsmToken::EndOfStatement)) { 7932 reportParseError("unexpected token, expected end of statement"); 7933 return false; 7934 } 7935 7936 if (CurrentFn == nullptr) { 7937 reportParseError(".end used without .ent"); 7938 return false; 7939 } 7940 7941 if ((SymbolName != CurrentFn->getName())) { 7942 reportParseError(".end symbol does not match .ent symbol"); 7943 return false; 7944 } 7945 7946 getTargetStreamer().emitDirectiveEnd(SymbolName); 7947 CurrentFn = nullptr; 7948 IsCpRestoreSet = false; 7949 return false; 7950 } 7951 7952 if (IDVal == ".frame") { 7953 // .frame $stack_reg, frame_size_in_bytes, $return_reg 7954 SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg; 7955 OperandMatchResultTy ResTy = parseAnyRegister(TmpReg); 7956 if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) { 7957 reportParseError("expected stack register"); 7958 return false; 7959 } 7960 7961 MipsOperand &StackRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 7962 if (!StackRegOpnd.isGPRAsmReg()) { 7963 reportParseError(StackRegOpnd.getStartLoc(), 7964 "expected general purpose register"); 7965 return false; 7966 } 7967 unsigned StackReg = StackRegOpnd.getGPR32Reg(); 7968 7969 if (Parser.getTok().is(AsmToken::Comma)) 7970 Parser.Lex(); 7971 else { 7972 reportParseError("unexpected token, expected comma"); 7973 return false; 7974 } 7975 7976 // Parse the frame size. 7977 const MCExpr *FrameSize; 7978 int64_t FrameSizeVal; 7979 7980 if (Parser.parseExpression(FrameSize)) { 7981 reportParseError("expected frame size value"); 7982 return false; 7983 } 7984 7985 if (!FrameSize->evaluateAsAbsolute(FrameSizeVal)) { 7986 reportParseError("frame size not an absolute expression"); 7987 return false; 7988 } 7989 7990 if (Parser.getTok().is(AsmToken::Comma)) 7991 Parser.Lex(); 7992 else { 7993 reportParseError("unexpected token, expected comma"); 7994 return false; 7995 } 7996 7997 // Parse the return register. 7998 TmpReg.clear(); 7999 ResTy = parseAnyRegister(TmpReg); 8000 if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) { 8001 reportParseError("expected return register"); 8002 return false; 8003 } 8004 8005 MipsOperand &ReturnRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]); 8006 if (!ReturnRegOpnd.isGPRAsmReg()) { 8007 reportParseError(ReturnRegOpnd.getStartLoc(), 8008 "expected general purpose register"); 8009 return false; 8010 } 8011 8012 // If this is not the end of the statement, report an error. 8013 if (getLexer().isNot(AsmToken::EndOfStatement)) { 8014 reportParseError("unexpected token, expected end of statement"); 8015 return false; 8016 } 8017 8018 getTargetStreamer().emitFrame(StackReg, FrameSizeVal, 8019 ReturnRegOpnd.getGPR32Reg()); 8020 IsCpRestoreSet = false; 8021 return false; 8022 } 8023 8024 if (IDVal == ".set") { 8025 parseDirectiveSet(); 8026 return false; 8027 } 8028 8029 if (IDVal == ".mask" || IDVal == ".fmask") { 8030 // .mask bitmask, frame_offset 8031 // bitmask: One bit for each register used. 8032 // frame_offset: Offset from Canonical Frame Address ($sp on entry) where 8033 // first register is expected to be saved. 8034 // Examples: 8035 // .mask 0x80000000, -4 8036 // .fmask 0x80000000, -4 8037 // 8038 8039 // Parse the bitmask 8040 const MCExpr *BitMask; 8041 int64_t BitMaskVal; 8042 8043 if (Parser.parseExpression(BitMask)) { 8044 reportParseError("expected bitmask value"); 8045 return false; 8046 } 8047 8048 if (!BitMask->evaluateAsAbsolute(BitMaskVal)) { 8049 reportParseError("bitmask not an absolute expression"); 8050 return false; 8051 } 8052 8053 if (Parser.getTok().is(AsmToken::Comma)) 8054 Parser.Lex(); 8055 else { 8056 reportParseError("unexpected token, expected comma"); 8057 return false; 8058 } 8059 8060 // Parse the frame_offset 8061 const MCExpr *FrameOffset; 8062 int64_t FrameOffsetVal; 8063 8064 if (Parser.parseExpression(FrameOffset)) { 8065 reportParseError("expected frame offset value"); 8066 return false; 8067 } 8068 8069 if (!FrameOffset->evaluateAsAbsolute(FrameOffsetVal)) { 8070 reportParseError("frame offset not an absolute expression"); 8071 return false; 8072 } 8073 8074 // If this is not the end of the statement, report an error. 8075 if (getLexer().isNot(AsmToken::EndOfStatement)) { 8076 reportParseError("unexpected token, expected end of statement"); 8077 return false; 8078 } 8079 8080 if (IDVal == ".mask") 8081 getTargetStreamer().emitMask(BitMaskVal, FrameOffsetVal); 8082 else 8083 getTargetStreamer().emitFMask(BitMaskVal, FrameOffsetVal); 8084 return false; 8085 } 8086 8087 if (IDVal == ".nan") 8088 return parseDirectiveNaN(); 8089 8090 if (IDVal == ".gpword") { 8091 parseDirectiveGpWord(); 8092 return false; 8093 } 8094 8095 if (IDVal == ".gpdword") { 8096 parseDirectiveGpDWord(); 8097 return false; 8098 } 8099 8100 if (IDVal == ".dtprelword") { 8101 parseDirectiveDtpRelWord(); 8102 return false; 8103 } 8104 8105 if (IDVal == ".dtpreldword") { 8106 parseDirectiveDtpRelDWord(); 8107 return false; 8108 } 8109 8110 if (IDVal == ".tprelword") { 8111 parseDirectiveTpRelWord(); 8112 return false; 8113 } 8114 8115 if (IDVal == ".tpreldword") { 8116 parseDirectiveTpRelDWord(); 8117 return false; 8118 } 8119 8120 if (IDVal == ".option") { 8121 parseDirectiveOption(); 8122 return false; 8123 } 8124 8125 if (IDVal == ".abicalls") { 8126 getTargetStreamer().emitDirectiveAbiCalls(); 8127 if (Parser.getTok().isNot(AsmToken::EndOfStatement)) { 8128 Error(Parser.getTok().getLoc(), 8129 "unexpected token, expected end of statement"); 8130 } 8131 return false; 8132 } 8133 8134 if (IDVal == ".cpsetup") { 8135 parseDirectiveCPSetup(); 8136 return false; 8137 } 8138 if (IDVal == ".cpreturn") { 8139 parseDirectiveCPReturn(); 8140 return false; 8141 } 8142 if (IDVal == ".module") { 8143 parseDirectiveModule(); 8144 return false; 8145 } 8146 if (IDVal == ".llvm_internal_mips_reallow_module_directive") { 8147 parseInternalDirectiveReallowModule(); 8148 return false; 8149 } 8150 if (IDVal == ".insn") { 8151 parseInsnDirective(); 8152 return false; 8153 } 8154 if (IDVal == ".rdata") { 8155 parseRSectionDirective(".rodata"); 8156 return false; 8157 } 8158 if (IDVal == ".sbss") { 8159 parseSSectionDirective(IDVal, ELF::SHT_NOBITS); 8160 return false; 8161 } 8162 if (IDVal == ".sdata") { 8163 parseSSectionDirective(IDVal, ELF::SHT_PROGBITS); 8164 return false; 8165 } 8166 8167 return true; 8168 } 8169 8170 bool MipsAsmParser::parseInternalDirectiveReallowModule() { 8171 // If this is not the end of the statement, report an error. 8172 if (getLexer().isNot(AsmToken::EndOfStatement)) { 8173 reportParseError("unexpected token, expected end of statement"); 8174 return false; 8175 } 8176 8177 getTargetStreamer().reallowModuleDirective(); 8178 8179 getParser().Lex(); // Eat EndOfStatement token. 8180 return false; 8181 } 8182 8183 extern "C" void LLVMInitializeMipsAsmParser() { 8184 RegisterMCAsmParser<MipsAsmParser> X(getTheMipsTarget()); 8185 RegisterMCAsmParser<MipsAsmParser> Y(getTheMipselTarget()); 8186 RegisterMCAsmParser<MipsAsmParser> A(getTheMips64Target()); 8187 RegisterMCAsmParser<MipsAsmParser> B(getTheMips64elTarget()); 8188 } 8189 8190 #define GET_REGISTER_MATCHER 8191 #define GET_MATCHER_IMPLEMENTATION 8192 #define GET_MNEMONIC_SPELL_CHECKER 8193 #include "MipsGenAsmMatcher.inc" 8194 8195 bool MipsAsmParser::mnemonicIsValid(StringRef Mnemonic, unsigned VariantID) { 8196 // Find the appropriate table for this asm variant. 8197 const MatchEntry *Start, *End; 8198 switch (VariantID) { 8199 default: llvm_unreachable("invalid variant!"); 8200 case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break; 8201 } 8202 // Search the table. 8203 auto MnemonicRange = std::equal_range(Start, End, Mnemonic, LessOpcode()); 8204 return MnemonicRange.first != MnemonicRange.second; 8205 } 8206