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