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.
6016   if (Parser.getTok().is(AsmToken::Dollar))
6017     return MatchOperand_NoMatch;
6018   SMLoc S = Parser.getTok().getLoc();
6019   if (getParser().parseExpression(IdVal))
6020     return MatchOperand_ParseFail;
6021   const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(IdVal);
6022   assert(MCE && "Unexpected MCExpr type.");
6023   int64_t Val = MCE->getValue();
6024   SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
6025   Operands.push_back(MipsOperand::CreateImm(
6026       MCConstantExpr::create(0 - Val, getContext()), S, E, *this));
6027   return MatchOperand_Success;
6028 }
6029 
6030 OperandMatchResultTy
6031 MipsAsmParser::parseRegisterList(OperandVector &Operands) {
6032   MCAsmParser &Parser = getParser();
6033   SmallVector<unsigned, 10> Regs;
6034   unsigned RegNo;
6035   unsigned PrevReg = Mips::NoRegister;
6036   bool RegRange = false;
6037   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 8> TmpOperands;
6038 
6039   if (Parser.getTok().isNot(AsmToken::Dollar))
6040     return MatchOperand_ParseFail;
6041 
6042   SMLoc S = Parser.getTok().getLoc();
6043   while (parseAnyRegister(TmpOperands) == MatchOperand_Success) {
6044     SMLoc E = getLexer().getLoc();
6045     MipsOperand &Reg = static_cast<MipsOperand &>(*TmpOperands.back());
6046     RegNo = isGP64bit() ? Reg.getGPR64Reg() : Reg.getGPR32Reg();
6047     if (RegRange) {
6048       // Remove last register operand because registers from register range
6049       // should be inserted first.
6050       if ((isGP64bit() && RegNo == Mips::RA_64) ||
6051           (!isGP64bit() && RegNo == Mips::RA)) {
6052         Regs.push_back(RegNo);
6053       } else {
6054         unsigned TmpReg = PrevReg + 1;
6055         while (TmpReg <= RegNo) {
6056           if ((((TmpReg < Mips::S0) || (TmpReg > Mips::S7)) && !isGP64bit()) ||
6057               (((TmpReg < Mips::S0_64) || (TmpReg > Mips::S7_64)) &&
6058                isGP64bit())) {
6059             Error(E, "invalid register operand");
6060             return MatchOperand_ParseFail;
6061           }
6062 
6063           PrevReg = TmpReg;
6064           Regs.push_back(TmpReg++);
6065         }
6066       }
6067 
6068       RegRange = false;
6069     } else {
6070       if ((PrevReg == Mips::NoRegister) &&
6071           ((isGP64bit() && (RegNo != Mips::S0_64) && (RegNo != Mips::RA_64)) ||
6072           (!isGP64bit() && (RegNo != Mips::S0) && (RegNo != Mips::RA)))) {
6073         Error(E, "$16 or $31 expected");
6074         return MatchOperand_ParseFail;
6075       } else if (!(((RegNo == Mips::FP || RegNo == Mips::RA ||
6076                     (RegNo >= Mips::S0 && RegNo <= Mips::S7)) &&
6077                     !isGP64bit()) ||
6078                    ((RegNo == Mips::FP_64 || RegNo == Mips::RA_64 ||
6079                     (RegNo >= Mips::S0_64 && RegNo <= Mips::S7_64)) &&
6080                     isGP64bit()))) {
6081         Error(E, "invalid register operand");
6082         return MatchOperand_ParseFail;
6083       } else if ((PrevReg != Mips::NoRegister) && (RegNo != PrevReg + 1) &&
6084                  ((RegNo != Mips::FP && RegNo != Mips::RA && !isGP64bit()) ||
6085                   (RegNo != Mips::FP_64 && RegNo != Mips::RA_64 &&
6086                    isGP64bit()))) {
6087         Error(E, "consecutive register numbers expected");
6088         return MatchOperand_ParseFail;
6089       }
6090 
6091       Regs.push_back(RegNo);
6092     }
6093 
6094     if (Parser.getTok().is(AsmToken::Minus))
6095       RegRange = true;
6096 
6097     if (!Parser.getTok().isNot(AsmToken::Minus) &&
6098         !Parser.getTok().isNot(AsmToken::Comma)) {
6099       Error(E, "',' or '-' expected");
6100       return MatchOperand_ParseFail;
6101     }
6102 
6103     Lex(); // Consume comma or minus
6104     if (Parser.getTok().isNot(AsmToken::Dollar))
6105       break;
6106 
6107     PrevReg = RegNo;
6108   }
6109 
6110   SMLoc E = Parser.getTok().getLoc();
6111   Operands.push_back(MipsOperand::CreateRegList(Regs, S, E, *this));
6112   parseMemOperand(Operands);
6113   return MatchOperand_Success;
6114 }
6115 
6116 OperandMatchResultTy
6117 MipsAsmParser::parseRegisterPair(OperandVector &Operands) {
6118   MCAsmParser &Parser = getParser();
6119 
6120   SMLoc S = Parser.getTok().getLoc();
6121   if (parseAnyRegister(Operands) != MatchOperand_Success)
6122     return MatchOperand_ParseFail;
6123 
6124   SMLoc E = Parser.getTok().getLoc();
6125   MipsOperand Op = static_cast<MipsOperand &>(*Operands.back());
6126 
6127   Operands.pop_back();
6128   Operands.push_back(MipsOperand::CreateRegPair(Op, S, E, *this));
6129   return MatchOperand_Success;
6130 }
6131 
6132 OperandMatchResultTy
6133 MipsAsmParser::parseMovePRegPair(OperandVector &Operands) {
6134   MCAsmParser &Parser = getParser();
6135   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 8> TmpOperands;
6136   SmallVector<unsigned, 10> Regs;
6137 
6138   if (Parser.getTok().isNot(AsmToken::Dollar))
6139     return MatchOperand_ParseFail;
6140 
6141   SMLoc S = Parser.getTok().getLoc();
6142 
6143   if (parseAnyRegister(TmpOperands) != MatchOperand_Success)
6144     return MatchOperand_ParseFail;
6145 
6146   MipsOperand *Reg = &static_cast<MipsOperand &>(*TmpOperands.back());
6147   unsigned RegNo = isGP64bit() ? Reg->getGPR64Reg() : Reg->getGPR32Reg();
6148   Regs.push_back(RegNo);
6149 
6150   SMLoc E = Parser.getTok().getLoc();
6151   if (Parser.getTok().isNot(AsmToken::Comma)) {
6152     Error(E, "',' expected");
6153     return MatchOperand_ParseFail;
6154   }
6155 
6156   // Remove comma.
6157   Parser.Lex();
6158 
6159   if (parseAnyRegister(TmpOperands) != MatchOperand_Success)
6160     return MatchOperand_ParseFail;
6161 
6162   Reg = &static_cast<MipsOperand &>(*TmpOperands.back());
6163   RegNo = isGP64bit() ? Reg->getGPR64Reg() : Reg->getGPR32Reg();
6164   Regs.push_back(RegNo);
6165 
6166   Operands.push_back(MipsOperand::CreateRegList(Regs, S, E, *this));
6167 
6168   return MatchOperand_Success;
6169 }
6170 
6171 /// Sometimes (i.e. load/stores) the operand may be followed immediately by
6172 /// either this.
6173 /// ::= '(', register, ')'
6174 /// handle it before we iterate so we don't get tripped up by the lack of
6175 /// a comma.
6176 bool MipsAsmParser::parseParenSuffix(StringRef Name, OperandVector &Operands) {
6177   MCAsmParser &Parser = getParser();
6178   if (getLexer().is(AsmToken::LParen)) {
6179     Operands.push_back(
6180         MipsOperand::CreateToken("(", getLexer().getLoc(), *this));
6181     Parser.Lex();
6182     if (parseOperand(Operands, Name)) {
6183       SMLoc Loc = getLexer().getLoc();
6184       return Error(Loc, "unexpected token in argument list");
6185     }
6186     if (Parser.getTok().isNot(AsmToken::RParen)) {
6187       SMLoc Loc = getLexer().getLoc();
6188       return Error(Loc, "unexpected token, expected ')'");
6189     }
6190     Operands.push_back(
6191         MipsOperand::CreateToken(")", getLexer().getLoc(), *this));
6192     Parser.Lex();
6193   }
6194   return false;
6195 }
6196 
6197 /// Sometimes (i.e. in MSA) the operand may be followed immediately by
6198 /// either one of these.
6199 /// ::= '[', register, ']'
6200 /// ::= '[', integer, ']'
6201 /// handle it before we iterate so we don't get tripped up by the lack of
6202 /// a comma.
6203 bool MipsAsmParser::parseBracketSuffix(StringRef Name,
6204                                        OperandVector &Operands) {
6205   MCAsmParser &Parser = getParser();
6206   if (getLexer().is(AsmToken::LBrac)) {
6207     Operands.push_back(
6208         MipsOperand::CreateToken("[", getLexer().getLoc(), *this));
6209     Parser.Lex();
6210     if (parseOperand(Operands, Name)) {
6211       SMLoc Loc = getLexer().getLoc();
6212       return Error(Loc, "unexpected token in argument list");
6213     }
6214     if (Parser.getTok().isNot(AsmToken::RBrac)) {
6215       SMLoc Loc = getLexer().getLoc();
6216       return Error(Loc, "unexpected token, expected ']'");
6217     }
6218     Operands.push_back(
6219         MipsOperand::CreateToken("]", getLexer().getLoc(), *this));
6220     Parser.Lex();
6221   }
6222   return false;
6223 }
6224 
6225 bool MipsAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
6226                                      SMLoc NameLoc, OperandVector &Operands) {
6227   MCAsmParser &Parser = getParser();
6228   DEBUG(dbgs() << "ParseInstruction\n");
6229 
6230   // We have reached first instruction, module directive are now forbidden.
6231   getTargetStreamer().forbidModuleDirective();
6232 
6233   // Check if we have valid mnemonic
6234   if (!mnemonicIsValid(Name, 0)) {
6235     return Error(NameLoc, "unknown instruction");
6236   }
6237   // First operand in MCInst is instruction mnemonic.
6238   Operands.push_back(MipsOperand::CreateToken(Name, NameLoc, *this));
6239 
6240   // Read the remaining operands.
6241   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6242     // Read the first operand.
6243     if (parseOperand(Operands, Name)) {
6244       SMLoc Loc = getLexer().getLoc();
6245       return Error(Loc, "unexpected token in argument list");
6246     }
6247     if (getLexer().is(AsmToken::LBrac) && parseBracketSuffix(Name, Operands))
6248       return true;
6249     // AFAIK, parenthesis suffixes are never on the first operand
6250 
6251     while (getLexer().is(AsmToken::Comma)) {
6252       Parser.Lex(); // Eat the comma.
6253       // Parse and remember the operand.
6254       if (parseOperand(Operands, Name)) {
6255         SMLoc Loc = getLexer().getLoc();
6256         return Error(Loc, "unexpected token in argument list");
6257       }
6258       // Parse bracket and parenthesis suffixes before we iterate
6259       if (getLexer().is(AsmToken::LBrac)) {
6260         if (parseBracketSuffix(Name, Operands))
6261           return true;
6262       } else if (getLexer().is(AsmToken::LParen) &&
6263                  parseParenSuffix(Name, Operands))
6264         return true;
6265     }
6266   }
6267   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6268     SMLoc Loc = getLexer().getLoc();
6269     return Error(Loc, "unexpected token in argument list");
6270   }
6271   Parser.Lex(); // Consume the EndOfStatement.
6272   return false;
6273 }
6274 
6275 // FIXME: Given that these have the same name, these should both be
6276 // consistent on affecting the Parser.
6277 bool MipsAsmParser::reportParseError(Twine ErrorMsg) {
6278   SMLoc Loc = getLexer().getLoc();
6279   return Error(Loc, ErrorMsg);
6280 }
6281 
6282 bool MipsAsmParser::reportParseError(SMLoc Loc, Twine ErrorMsg) {
6283   return Error(Loc, ErrorMsg);
6284 }
6285 
6286 bool MipsAsmParser::parseSetNoAtDirective() {
6287   MCAsmParser &Parser = getParser();
6288   // Line should look like: ".set noat".
6289 
6290   // Set the $at register to $0.
6291   AssemblerOptions.back()->setATRegIndex(0);
6292 
6293   Parser.Lex(); // Eat "noat".
6294 
6295   // If this is not the end of the statement, report an error.
6296   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6297     reportParseError("unexpected token, expected end of statement");
6298     return false;
6299   }
6300 
6301   getTargetStreamer().emitDirectiveSetNoAt();
6302   Parser.Lex(); // Consume the EndOfStatement.
6303   return false;
6304 }
6305 
6306 bool MipsAsmParser::parseSetAtDirective() {
6307   // Line can be: ".set at", which sets $at to $1
6308   //          or  ".set at=$reg", which sets $at to $reg.
6309   MCAsmParser &Parser = getParser();
6310   Parser.Lex(); // Eat "at".
6311 
6312   if (getLexer().is(AsmToken::EndOfStatement)) {
6313     // No register was specified, so we set $at to $1.
6314     AssemblerOptions.back()->setATRegIndex(1);
6315 
6316     getTargetStreamer().emitDirectiveSetAt();
6317     Parser.Lex(); // Consume the EndOfStatement.
6318     return false;
6319   }
6320 
6321   if (getLexer().isNot(AsmToken::Equal)) {
6322     reportParseError("unexpected token, expected equals sign");
6323     return false;
6324   }
6325   Parser.Lex(); // Eat "=".
6326 
6327   if (getLexer().isNot(AsmToken::Dollar)) {
6328     if (getLexer().is(AsmToken::EndOfStatement)) {
6329       reportParseError("no register specified");
6330       return false;
6331     } else {
6332       reportParseError("unexpected token, expected dollar sign '$'");
6333       return false;
6334     }
6335   }
6336   Parser.Lex(); // Eat "$".
6337 
6338   // Find out what "reg" is.
6339   unsigned AtRegNo;
6340   const AsmToken &Reg = Parser.getTok();
6341   if (Reg.is(AsmToken::Identifier)) {
6342     AtRegNo = matchCPURegisterName(Reg.getIdentifier());
6343   } else if (Reg.is(AsmToken::Integer)) {
6344     AtRegNo = Reg.getIntVal();
6345   } else {
6346     reportParseError("unexpected token, expected identifier or integer");
6347     return false;
6348   }
6349 
6350   // Check if $reg is a valid register. If it is, set $at to $reg.
6351   if (!AssemblerOptions.back()->setATRegIndex(AtRegNo)) {
6352     reportParseError("invalid register");
6353     return false;
6354   }
6355   Parser.Lex(); // Eat "reg".
6356 
6357   // If this is not the end of the statement, report an error.
6358   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6359     reportParseError("unexpected token, expected end of statement");
6360     return false;
6361   }
6362 
6363   getTargetStreamer().emitDirectiveSetAtWithArg(AtRegNo);
6364 
6365   Parser.Lex(); // Consume the EndOfStatement.
6366   return false;
6367 }
6368 
6369 bool MipsAsmParser::parseSetReorderDirective() {
6370   MCAsmParser &Parser = getParser();
6371   Parser.Lex();
6372   // If this is not the end of the statement, report an error.
6373   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6374     reportParseError("unexpected token, expected end of statement");
6375     return false;
6376   }
6377   AssemblerOptions.back()->setReorder();
6378   getTargetStreamer().emitDirectiveSetReorder();
6379   Parser.Lex(); // Consume the EndOfStatement.
6380   return false;
6381 }
6382 
6383 bool MipsAsmParser::parseSetNoReorderDirective() {
6384   MCAsmParser &Parser = getParser();
6385   Parser.Lex();
6386   // If this is not the end of the statement, report an error.
6387   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6388     reportParseError("unexpected token, expected end of statement");
6389     return false;
6390   }
6391   AssemblerOptions.back()->setNoReorder();
6392   getTargetStreamer().emitDirectiveSetNoReorder();
6393   Parser.Lex(); // Consume the EndOfStatement.
6394   return false;
6395 }
6396 
6397 bool MipsAsmParser::parseSetMacroDirective() {
6398   MCAsmParser &Parser = getParser();
6399   Parser.Lex();
6400   // If this is not the end of the statement, report an error.
6401   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6402     reportParseError("unexpected token, expected end of statement");
6403     return false;
6404   }
6405   AssemblerOptions.back()->setMacro();
6406   getTargetStreamer().emitDirectiveSetMacro();
6407   Parser.Lex(); // Consume the EndOfStatement.
6408   return false;
6409 }
6410 
6411 bool MipsAsmParser::parseSetNoMacroDirective() {
6412   MCAsmParser &Parser = getParser();
6413   Parser.Lex();
6414   // If this is not the end of the statement, report an error.
6415   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6416     reportParseError("unexpected token, expected end of statement");
6417     return false;
6418   }
6419   if (AssemblerOptions.back()->isReorder()) {
6420     reportParseError("`noreorder' must be set before `nomacro'");
6421     return false;
6422   }
6423   AssemblerOptions.back()->setNoMacro();
6424   getTargetStreamer().emitDirectiveSetNoMacro();
6425   Parser.Lex(); // Consume the EndOfStatement.
6426   return false;
6427 }
6428 
6429 bool MipsAsmParser::parseSetMsaDirective() {
6430   MCAsmParser &Parser = getParser();
6431   Parser.Lex();
6432 
6433   // If this is not the end of the statement, report an error.
6434   if (getLexer().isNot(AsmToken::EndOfStatement))
6435     return reportParseError("unexpected token, expected end of statement");
6436 
6437   setFeatureBits(Mips::FeatureMSA, "msa");
6438   getTargetStreamer().emitDirectiveSetMsa();
6439   return false;
6440 }
6441 
6442 bool MipsAsmParser::parseSetNoMsaDirective() {
6443   MCAsmParser &Parser = getParser();
6444   Parser.Lex();
6445 
6446   // If this is not the end of the statement, report an error.
6447   if (getLexer().isNot(AsmToken::EndOfStatement))
6448     return reportParseError("unexpected token, expected end of statement");
6449 
6450   clearFeatureBits(Mips::FeatureMSA, "msa");
6451   getTargetStreamer().emitDirectiveSetNoMsa();
6452   return false;
6453 }
6454 
6455 bool MipsAsmParser::parseSetNoDspDirective() {
6456   MCAsmParser &Parser = getParser();
6457   Parser.Lex(); // Eat "nodsp".
6458 
6459   // If this is not the end of the statement, report an error.
6460   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6461     reportParseError("unexpected token, expected end of statement");
6462     return false;
6463   }
6464 
6465   clearFeatureBits(Mips::FeatureDSP, "dsp");
6466   getTargetStreamer().emitDirectiveSetNoDsp();
6467   return false;
6468 }
6469 
6470 bool MipsAsmParser::parseSetMips16Directive() {
6471   MCAsmParser &Parser = getParser();
6472   Parser.Lex(); // Eat "mips16".
6473 
6474   // If this is not the end of the statement, report an error.
6475   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6476     reportParseError("unexpected token, expected end of statement");
6477     return false;
6478   }
6479 
6480   setFeatureBits(Mips::FeatureMips16, "mips16");
6481   getTargetStreamer().emitDirectiveSetMips16();
6482   Parser.Lex(); // Consume the EndOfStatement.
6483   return false;
6484 }
6485 
6486 bool MipsAsmParser::parseSetNoMips16Directive() {
6487   MCAsmParser &Parser = getParser();
6488   Parser.Lex(); // Eat "nomips16".
6489 
6490   // If this is not the end of the statement, report an error.
6491   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6492     reportParseError("unexpected token, expected end of statement");
6493     return false;
6494   }
6495 
6496   clearFeatureBits(Mips::FeatureMips16, "mips16");
6497   getTargetStreamer().emitDirectiveSetNoMips16();
6498   Parser.Lex(); // Consume the EndOfStatement.
6499   return false;
6500 }
6501 
6502 bool MipsAsmParser::parseSetFpDirective() {
6503   MCAsmParser &Parser = getParser();
6504   MipsABIFlagsSection::FpABIKind FpAbiVal;
6505   // Line can be: .set fp=32
6506   //              .set fp=xx
6507   //              .set fp=64
6508   Parser.Lex(); // Eat fp token
6509   AsmToken Tok = Parser.getTok();
6510   if (Tok.isNot(AsmToken::Equal)) {
6511     reportParseError("unexpected token, expected equals sign '='");
6512     return false;
6513   }
6514   Parser.Lex(); // Eat '=' token.
6515   Tok = Parser.getTok();
6516 
6517   if (!parseFpABIValue(FpAbiVal, ".set"))
6518     return false;
6519 
6520   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6521     reportParseError("unexpected token, expected end of statement");
6522     return false;
6523   }
6524   getTargetStreamer().emitDirectiveSetFp(FpAbiVal);
6525   Parser.Lex(); // Consume the EndOfStatement.
6526   return false;
6527 }
6528 
6529 bool MipsAsmParser::parseSetOddSPRegDirective() {
6530   MCAsmParser &Parser = getParser();
6531 
6532   Parser.Lex(); // Eat "oddspreg".
6533   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6534     reportParseError("unexpected token, expected end of statement");
6535     return false;
6536   }
6537 
6538   clearFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
6539   getTargetStreamer().emitDirectiveSetOddSPReg();
6540   return false;
6541 }
6542 
6543 bool MipsAsmParser::parseSetNoOddSPRegDirective() {
6544   MCAsmParser &Parser = getParser();
6545 
6546   Parser.Lex(); // Eat "nooddspreg".
6547   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6548     reportParseError("unexpected token, expected end of statement");
6549     return false;
6550   }
6551 
6552   setFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
6553   getTargetStreamer().emitDirectiveSetNoOddSPReg();
6554   return false;
6555 }
6556 
6557 bool MipsAsmParser::parseSetMtDirective() {
6558   MCAsmParser &Parser = getParser();
6559   Parser.Lex(); // Eat "mt".
6560 
6561   // If this is not the end of the statement, report an error.
6562   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6563     reportParseError("unexpected token, expected end of statement");
6564     return false;
6565   }
6566 
6567   setFeatureBits(Mips::FeatureMT, "mt");
6568   getTargetStreamer().emitDirectiveSetMt();
6569   Parser.Lex(); // Consume the EndOfStatement.
6570   return false;
6571 }
6572 
6573 bool MipsAsmParser::parseSetNoMtDirective() {
6574   MCAsmParser &Parser = getParser();
6575   Parser.Lex(); // Eat "nomt".
6576 
6577   // If this is not the end of the statement, report an error.
6578   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6579     reportParseError("unexpected token, expected end of statement");
6580     return false;
6581   }
6582 
6583   clearFeatureBits(Mips::FeatureMT, "mt");
6584 
6585   getTargetStreamer().emitDirectiveSetNoMt();
6586   Parser.Lex(); // Consume the EndOfStatement.
6587   return false;
6588 }
6589 
6590 bool MipsAsmParser::parseSetPopDirective() {
6591   MCAsmParser &Parser = getParser();
6592   SMLoc Loc = getLexer().getLoc();
6593 
6594   Parser.Lex();
6595   if (getLexer().isNot(AsmToken::EndOfStatement))
6596     return reportParseError("unexpected token, expected end of statement");
6597 
6598   // Always keep an element on the options "stack" to prevent the user
6599   // from changing the initial options. This is how we remember them.
6600   if (AssemblerOptions.size() == 2)
6601     return reportParseError(Loc, ".set pop with no .set push");
6602 
6603   MCSubtargetInfo &STI = copySTI();
6604   AssemblerOptions.pop_back();
6605   setAvailableFeatures(
6606       ComputeAvailableFeatures(AssemblerOptions.back()->getFeatures()));
6607   STI.setFeatureBits(AssemblerOptions.back()->getFeatures());
6608 
6609   getTargetStreamer().emitDirectiveSetPop();
6610   return false;
6611 }
6612 
6613 bool MipsAsmParser::parseSetPushDirective() {
6614   MCAsmParser &Parser = getParser();
6615   Parser.Lex();
6616   if (getLexer().isNot(AsmToken::EndOfStatement))
6617     return reportParseError("unexpected token, expected end of statement");
6618 
6619   // Create a copy of the current assembler options environment and push it.
6620   AssemblerOptions.push_back(
6621         llvm::make_unique<MipsAssemblerOptions>(AssemblerOptions.back().get()));
6622 
6623   getTargetStreamer().emitDirectiveSetPush();
6624   return false;
6625 }
6626 
6627 bool MipsAsmParser::parseSetSoftFloatDirective() {
6628   MCAsmParser &Parser = getParser();
6629   Parser.Lex();
6630   if (getLexer().isNot(AsmToken::EndOfStatement))
6631     return reportParseError("unexpected token, expected end of statement");
6632 
6633   setFeatureBits(Mips::FeatureSoftFloat, "soft-float");
6634   getTargetStreamer().emitDirectiveSetSoftFloat();
6635   return false;
6636 }
6637 
6638 bool MipsAsmParser::parseSetHardFloatDirective() {
6639   MCAsmParser &Parser = getParser();
6640   Parser.Lex();
6641   if (getLexer().isNot(AsmToken::EndOfStatement))
6642     return reportParseError("unexpected token, expected end of statement");
6643 
6644   clearFeatureBits(Mips::FeatureSoftFloat, "soft-float");
6645   getTargetStreamer().emitDirectiveSetHardFloat();
6646   return false;
6647 }
6648 
6649 bool MipsAsmParser::parseSetAssignment() {
6650   StringRef Name;
6651   const MCExpr *Value;
6652   MCAsmParser &Parser = getParser();
6653 
6654   if (Parser.parseIdentifier(Name))
6655     reportParseError("expected identifier after .set");
6656 
6657   if (getLexer().isNot(AsmToken::Comma))
6658     return reportParseError("unexpected token, expected comma");
6659   Lex(); // Eat comma
6660 
6661   if (Parser.parseExpression(Value))
6662     return reportParseError("expected valid expression after comma");
6663 
6664   MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
6665   Sym->setVariableValue(Value);
6666 
6667   return false;
6668 }
6669 
6670 bool MipsAsmParser::parseSetMips0Directive() {
6671   MCAsmParser &Parser = getParser();
6672   Parser.Lex();
6673   if (getLexer().isNot(AsmToken::EndOfStatement))
6674     return reportParseError("unexpected token, expected end of statement");
6675 
6676   // Reset assembler options to their initial values.
6677   MCSubtargetInfo &STI = copySTI();
6678   setAvailableFeatures(
6679       ComputeAvailableFeatures(AssemblerOptions.front()->getFeatures()));
6680   STI.setFeatureBits(AssemblerOptions.front()->getFeatures());
6681   AssemblerOptions.back()->setFeatures(AssemblerOptions.front()->getFeatures());
6682 
6683   getTargetStreamer().emitDirectiveSetMips0();
6684   return false;
6685 }
6686 
6687 bool MipsAsmParser::parseSetArchDirective() {
6688   MCAsmParser &Parser = getParser();
6689   Parser.Lex();
6690   if (getLexer().isNot(AsmToken::Equal))
6691     return reportParseError("unexpected token, expected equals sign");
6692 
6693   Parser.Lex();
6694   StringRef Arch;
6695   if (Parser.parseIdentifier(Arch))
6696     return reportParseError("expected arch identifier");
6697 
6698   StringRef ArchFeatureName =
6699       StringSwitch<StringRef>(Arch)
6700           .Case("mips1", "mips1")
6701           .Case("mips2", "mips2")
6702           .Case("mips3", "mips3")
6703           .Case("mips4", "mips4")
6704           .Case("mips5", "mips5")
6705           .Case("mips32", "mips32")
6706           .Case("mips32r2", "mips32r2")
6707           .Case("mips32r3", "mips32r3")
6708           .Case("mips32r5", "mips32r5")
6709           .Case("mips32r6", "mips32r6")
6710           .Case("mips64", "mips64")
6711           .Case("mips64r2", "mips64r2")
6712           .Case("mips64r3", "mips64r3")
6713           .Case("mips64r5", "mips64r5")
6714           .Case("mips64r6", "mips64r6")
6715           .Case("octeon", "cnmips")
6716           .Case("r4000", "mips3") // This is an implementation of Mips3.
6717           .Default("");
6718 
6719   if (ArchFeatureName.empty())
6720     return reportParseError("unsupported architecture");
6721 
6722   selectArch(ArchFeatureName);
6723   getTargetStreamer().emitDirectiveSetArch(Arch);
6724   return false;
6725 }
6726 
6727 bool MipsAsmParser::parseSetFeature(uint64_t Feature) {
6728   MCAsmParser &Parser = getParser();
6729   Parser.Lex();
6730   if (getLexer().isNot(AsmToken::EndOfStatement))
6731     return reportParseError("unexpected token, expected end of statement");
6732 
6733   switch (Feature) {
6734   default:
6735     llvm_unreachable("Unimplemented feature");
6736   case Mips::FeatureDSP:
6737     setFeatureBits(Mips::FeatureDSP, "dsp");
6738     getTargetStreamer().emitDirectiveSetDsp();
6739     break;
6740   case Mips::FeatureMicroMips:
6741     setFeatureBits(Mips::FeatureMicroMips, "micromips");
6742     getTargetStreamer().emitDirectiveSetMicroMips();
6743     break;
6744   case Mips::FeatureMips1:
6745     selectArch("mips1");
6746     getTargetStreamer().emitDirectiveSetMips1();
6747     break;
6748   case Mips::FeatureMips2:
6749     selectArch("mips2");
6750     getTargetStreamer().emitDirectiveSetMips2();
6751     break;
6752   case Mips::FeatureMips3:
6753     selectArch("mips3");
6754     getTargetStreamer().emitDirectiveSetMips3();
6755     break;
6756   case Mips::FeatureMips4:
6757     selectArch("mips4");
6758     getTargetStreamer().emitDirectiveSetMips4();
6759     break;
6760   case Mips::FeatureMips5:
6761     selectArch("mips5");
6762     getTargetStreamer().emitDirectiveSetMips5();
6763     break;
6764   case Mips::FeatureMips32:
6765     selectArch("mips32");
6766     getTargetStreamer().emitDirectiveSetMips32();
6767     break;
6768   case Mips::FeatureMips32r2:
6769     selectArch("mips32r2");
6770     getTargetStreamer().emitDirectiveSetMips32R2();
6771     break;
6772   case Mips::FeatureMips32r3:
6773     selectArch("mips32r3");
6774     getTargetStreamer().emitDirectiveSetMips32R3();
6775     break;
6776   case Mips::FeatureMips32r5:
6777     selectArch("mips32r5");
6778     getTargetStreamer().emitDirectiveSetMips32R5();
6779     break;
6780   case Mips::FeatureMips32r6:
6781     selectArch("mips32r6");
6782     getTargetStreamer().emitDirectiveSetMips32R6();
6783     break;
6784   case Mips::FeatureMips64:
6785     selectArch("mips64");
6786     getTargetStreamer().emitDirectiveSetMips64();
6787     break;
6788   case Mips::FeatureMips64r2:
6789     selectArch("mips64r2");
6790     getTargetStreamer().emitDirectiveSetMips64R2();
6791     break;
6792   case Mips::FeatureMips64r3:
6793     selectArch("mips64r3");
6794     getTargetStreamer().emitDirectiveSetMips64R3();
6795     break;
6796   case Mips::FeatureMips64r5:
6797     selectArch("mips64r5");
6798     getTargetStreamer().emitDirectiveSetMips64R5();
6799     break;
6800   case Mips::FeatureMips64r6:
6801     selectArch("mips64r6");
6802     getTargetStreamer().emitDirectiveSetMips64R6();
6803     break;
6804   }
6805   return false;
6806 }
6807 
6808 bool MipsAsmParser::eatComma(StringRef ErrorStr) {
6809   MCAsmParser &Parser = getParser();
6810   if (getLexer().isNot(AsmToken::Comma)) {
6811     SMLoc Loc = getLexer().getLoc();
6812     return Error(Loc, ErrorStr);
6813   }
6814 
6815   Parser.Lex(); // Eat the comma.
6816   return true;
6817 }
6818 
6819 // Used to determine if .cpload, .cprestore, and .cpsetup have any effect.
6820 // In this class, it is only used for .cprestore.
6821 // FIXME: Only keep track of IsPicEnabled in one place, instead of in both
6822 // MipsTargetELFStreamer and MipsAsmParser.
6823 bool MipsAsmParser::isPicAndNotNxxAbi() {
6824   return inPicMode() && !(isABI_N32() || isABI_N64());
6825 }
6826 
6827 bool MipsAsmParser::parseDirectiveCpLoad(SMLoc Loc) {
6828   if (AssemblerOptions.back()->isReorder())
6829     Warning(Loc, ".cpload should be inside a noreorder section");
6830 
6831   if (inMips16Mode()) {
6832     reportParseError(".cpload is not supported in Mips16 mode");
6833     return false;
6834   }
6835 
6836   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> Reg;
6837   OperandMatchResultTy ResTy = parseAnyRegister(Reg);
6838   if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) {
6839     reportParseError("expected register containing function address");
6840     return false;
6841   }
6842 
6843   MipsOperand &RegOpnd = static_cast<MipsOperand &>(*Reg[0]);
6844   if (!RegOpnd.isGPRAsmReg()) {
6845     reportParseError(RegOpnd.getStartLoc(), "invalid register");
6846     return false;
6847   }
6848 
6849   // If this is not the end of the statement, report an error.
6850   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6851     reportParseError("unexpected token, expected end of statement");
6852     return false;
6853   }
6854 
6855   getTargetStreamer().emitDirectiveCpLoad(RegOpnd.getGPR32Reg());
6856   return false;
6857 }
6858 
6859 bool MipsAsmParser::parseDirectiveCpRestore(SMLoc Loc) {
6860   MCAsmParser &Parser = getParser();
6861 
6862   // Note that .cprestore is ignored if used with the N32 and N64 ABIs or if it
6863   // is used in non-PIC mode.
6864 
6865   if (inMips16Mode()) {
6866     reportParseError(".cprestore is not supported in Mips16 mode");
6867     return false;
6868   }
6869 
6870   // Get the stack offset value.
6871   const MCExpr *StackOffset;
6872   int64_t StackOffsetVal;
6873   if (Parser.parseExpression(StackOffset)) {
6874     reportParseError("expected stack offset value");
6875     return false;
6876   }
6877 
6878   if (!StackOffset->evaluateAsAbsolute(StackOffsetVal)) {
6879     reportParseError("stack offset is not an absolute expression");
6880     return false;
6881   }
6882 
6883   if (StackOffsetVal < 0) {
6884     Warning(Loc, ".cprestore with negative stack offset has no effect");
6885     IsCpRestoreSet = false;
6886   } else {
6887     IsCpRestoreSet = true;
6888     CpRestoreOffset = StackOffsetVal;
6889   }
6890 
6891   // If this is not the end of the statement, report an error.
6892   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6893     reportParseError("unexpected token, expected end of statement");
6894     return false;
6895   }
6896 
6897   if (!getTargetStreamer().emitDirectiveCpRestore(
6898           CpRestoreOffset, [&]() { return getATReg(Loc); }, Loc, STI))
6899     return true;
6900   Parser.Lex(); // Consume the EndOfStatement.
6901   return false;
6902 }
6903 
6904 bool MipsAsmParser::parseDirectiveCPSetup() {
6905   MCAsmParser &Parser = getParser();
6906   unsigned FuncReg;
6907   unsigned Save;
6908   bool SaveIsReg = true;
6909 
6910   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg;
6911   OperandMatchResultTy ResTy = parseAnyRegister(TmpReg);
6912   if (ResTy == MatchOperand_NoMatch) {
6913     reportParseError("expected register containing function address");
6914     return false;
6915   }
6916 
6917   MipsOperand &FuncRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
6918   if (!FuncRegOpnd.isGPRAsmReg()) {
6919     reportParseError(FuncRegOpnd.getStartLoc(), "invalid register");
6920     return false;
6921   }
6922 
6923   FuncReg = FuncRegOpnd.getGPR32Reg();
6924   TmpReg.clear();
6925 
6926   if (!eatComma("unexpected token, expected comma"))
6927     return true;
6928 
6929   ResTy = parseAnyRegister(TmpReg);
6930   if (ResTy == MatchOperand_NoMatch) {
6931     const MCExpr *OffsetExpr;
6932     int64_t OffsetVal;
6933     SMLoc ExprLoc = getLexer().getLoc();
6934 
6935     if (Parser.parseExpression(OffsetExpr) ||
6936         !OffsetExpr->evaluateAsAbsolute(OffsetVal)) {
6937       reportParseError(ExprLoc, "expected save register or stack offset");
6938       return false;
6939     }
6940 
6941     Save = OffsetVal;
6942     SaveIsReg = false;
6943   } else {
6944     MipsOperand &SaveOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
6945     if (!SaveOpnd.isGPRAsmReg()) {
6946       reportParseError(SaveOpnd.getStartLoc(), "invalid register");
6947       return false;
6948     }
6949     Save = SaveOpnd.getGPR32Reg();
6950   }
6951 
6952   if (!eatComma("unexpected token, expected comma"))
6953     return true;
6954 
6955   const MCExpr *Expr;
6956   if (Parser.parseExpression(Expr)) {
6957     reportParseError("expected expression");
6958     return false;
6959   }
6960 
6961   if (Expr->getKind() != MCExpr::SymbolRef) {
6962     reportParseError("expected symbol");
6963     return false;
6964   }
6965   const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr);
6966 
6967   CpSaveLocation = Save;
6968   CpSaveLocationIsRegister = SaveIsReg;
6969 
6970   getTargetStreamer().emitDirectiveCpsetup(FuncReg, Save, Ref->getSymbol(),
6971                                            SaveIsReg);
6972   return false;
6973 }
6974 
6975 bool MipsAsmParser::parseDirectiveCPReturn() {
6976   getTargetStreamer().emitDirectiveCpreturn(CpSaveLocation,
6977                                             CpSaveLocationIsRegister);
6978   return false;
6979 }
6980 
6981 bool MipsAsmParser::parseDirectiveNaN() {
6982   MCAsmParser &Parser = getParser();
6983   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6984     const AsmToken &Tok = Parser.getTok();
6985 
6986     if (Tok.getString() == "2008") {
6987       Parser.Lex();
6988       getTargetStreamer().emitDirectiveNaN2008();
6989       return false;
6990     } else if (Tok.getString() == "legacy") {
6991       Parser.Lex();
6992       getTargetStreamer().emitDirectiveNaNLegacy();
6993       return false;
6994     }
6995   }
6996   // If we don't recognize the option passed to the .nan
6997   // directive (e.g. no option or unknown option), emit an error.
6998   reportParseError("invalid option in .nan directive");
6999   return false;
7000 }
7001 
7002 bool MipsAsmParser::parseDirectiveSet() {
7003   MCAsmParser &Parser = getParser();
7004   // Get the next token.
7005   const AsmToken &Tok = Parser.getTok();
7006 
7007   if (Tok.getString() == "noat") {
7008     return parseSetNoAtDirective();
7009   } else if (Tok.getString() == "at") {
7010     return parseSetAtDirective();
7011   } else if (Tok.getString() == "arch") {
7012     return parseSetArchDirective();
7013   } else if (Tok.getString() == "bopt") {
7014     Warning(Tok.getLoc(), "'bopt' feature is unsupported");
7015     getParser().Lex();
7016     return false;
7017   } else if (Tok.getString() == "nobopt") {
7018     // We're already running in nobopt mode, so nothing to do.
7019     getParser().Lex();
7020     return false;
7021   } else if (Tok.getString() == "fp") {
7022     return parseSetFpDirective();
7023   } else if (Tok.getString() == "oddspreg") {
7024     return parseSetOddSPRegDirective();
7025   } else if (Tok.getString() == "nooddspreg") {
7026     return parseSetNoOddSPRegDirective();
7027   } else if (Tok.getString() == "pop") {
7028     return parseSetPopDirective();
7029   } else if (Tok.getString() == "push") {
7030     return parseSetPushDirective();
7031   } else if (Tok.getString() == "reorder") {
7032     return parseSetReorderDirective();
7033   } else if (Tok.getString() == "noreorder") {
7034     return parseSetNoReorderDirective();
7035   } else if (Tok.getString() == "macro") {
7036     return parseSetMacroDirective();
7037   } else if (Tok.getString() == "nomacro") {
7038     return parseSetNoMacroDirective();
7039   } else if (Tok.getString() == "mips16") {
7040     return parseSetMips16Directive();
7041   } else if (Tok.getString() == "nomips16") {
7042     return parseSetNoMips16Directive();
7043   } else if (Tok.getString() == "nomicromips") {
7044     clearFeatureBits(Mips::FeatureMicroMips, "micromips");
7045     getTargetStreamer().emitDirectiveSetNoMicroMips();
7046     Parser.eatToEndOfStatement();
7047     return false;
7048   } else if (Tok.getString() == "micromips") {
7049     return parseSetFeature(Mips::FeatureMicroMips);
7050   } else if (Tok.getString() == "mips0") {
7051     return parseSetMips0Directive();
7052   } else if (Tok.getString() == "mips1") {
7053     return parseSetFeature(Mips::FeatureMips1);
7054   } else if (Tok.getString() == "mips2") {
7055     return parseSetFeature(Mips::FeatureMips2);
7056   } else if (Tok.getString() == "mips3") {
7057     return parseSetFeature(Mips::FeatureMips3);
7058   } else if (Tok.getString() == "mips4") {
7059     return parseSetFeature(Mips::FeatureMips4);
7060   } else if (Tok.getString() == "mips5") {
7061     return parseSetFeature(Mips::FeatureMips5);
7062   } else if (Tok.getString() == "mips32") {
7063     return parseSetFeature(Mips::FeatureMips32);
7064   } else if (Tok.getString() == "mips32r2") {
7065     return parseSetFeature(Mips::FeatureMips32r2);
7066   } else if (Tok.getString() == "mips32r3") {
7067     return parseSetFeature(Mips::FeatureMips32r3);
7068   } else if (Tok.getString() == "mips32r5") {
7069     return parseSetFeature(Mips::FeatureMips32r5);
7070   } else if (Tok.getString() == "mips32r6") {
7071     return parseSetFeature(Mips::FeatureMips32r6);
7072   } else if (Tok.getString() == "mips64") {
7073     return parseSetFeature(Mips::FeatureMips64);
7074   } else if (Tok.getString() == "mips64r2") {
7075     return parseSetFeature(Mips::FeatureMips64r2);
7076   } else if (Tok.getString() == "mips64r3") {
7077     return parseSetFeature(Mips::FeatureMips64r3);
7078   } else if (Tok.getString() == "mips64r5") {
7079     return parseSetFeature(Mips::FeatureMips64r5);
7080   } else if (Tok.getString() == "mips64r6") {
7081     return parseSetFeature(Mips::FeatureMips64r6);
7082   } else if (Tok.getString() == "dsp") {
7083     return parseSetFeature(Mips::FeatureDSP);
7084   } else if (Tok.getString() == "nodsp") {
7085     return parseSetNoDspDirective();
7086   } else if (Tok.getString() == "msa") {
7087     return parseSetMsaDirective();
7088   } else if (Tok.getString() == "nomsa") {
7089     return parseSetNoMsaDirective();
7090   } else if (Tok.getString() == "mt") {
7091     return parseSetMtDirective();
7092   } else if (Tok.getString() == "nomt") {
7093     return parseSetNoMtDirective();
7094   } else if (Tok.getString() == "softfloat") {
7095     return parseSetSoftFloatDirective();
7096   } else if (Tok.getString() == "hardfloat") {
7097     return parseSetHardFloatDirective();
7098   } else {
7099     // It is just an identifier, look for an assignment.
7100     parseSetAssignment();
7101     return false;
7102   }
7103 
7104   return true;
7105 }
7106 
7107 /// parseDataDirective
7108 ///  ::= .word [ expression (, expression)* ]
7109 bool MipsAsmParser::parseDataDirective(unsigned Size, SMLoc L) {
7110   MCAsmParser &Parser = getParser();
7111   if (getLexer().isNot(AsmToken::EndOfStatement)) {
7112     while (true) {
7113       const MCExpr *Value;
7114       if (getParser().parseExpression(Value))
7115         return true;
7116 
7117       getParser().getStreamer().EmitValue(Value, Size);
7118 
7119       if (getLexer().is(AsmToken::EndOfStatement))
7120         break;
7121 
7122       if (getLexer().isNot(AsmToken::Comma))
7123         return Error(L, "unexpected token, expected comma");
7124       Parser.Lex();
7125     }
7126   }
7127 
7128   Parser.Lex();
7129   return false;
7130 }
7131 
7132 /// parseDirectiveGpWord
7133 ///  ::= .gpword local_sym
7134 bool MipsAsmParser::parseDirectiveGpWord() {
7135   MCAsmParser &Parser = getParser();
7136   const MCExpr *Value;
7137   // EmitGPRel32Value requires an expression, so we are using base class
7138   // method to evaluate the expression.
7139   if (getParser().parseExpression(Value))
7140     return true;
7141   getParser().getStreamer().EmitGPRel32Value(Value);
7142 
7143   if (getLexer().isNot(AsmToken::EndOfStatement))
7144     return Error(getLexer().getLoc(),
7145                 "unexpected token, expected end of statement");
7146   Parser.Lex(); // Eat EndOfStatement token.
7147   return false;
7148 }
7149 
7150 /// parseDirectiveGpDWord
7151 ///  ::= .gpdword local_sym
7152 bool MipsAsmParser::parseDirectiveGpDWord() {
7153   MCAsmParser &Parser = getParser();
7154   const MCExpr *Value;
7155   // EmitGPRel64Value requires an expression, so we are using base class
7156   // method to evaluate the expression.
7157   if (getParser().parseExpression(Value))
7158     return true;
7159   getParser().getStreamer().EmitGPRel64Value(Value);
7160 
7161   if (getLexer().isNot(AsmToken::EndOfStatement))
7162     return Error(getLexer().getLoc(),
7163                 "unexpected token, expected end of statement");
7164   Parser.Lex(); // Eat EndOfStatement token.
7165   return false;
7166 }
7167 
7168 /// parseDirectiveDtpRelWord
7169 ///  ::= .dtprelword tls_sym
7170 bool MipsAsmParser::parseDirectiveDtpRelWord() {
7171   MCAsmParser &Parser = getParser();
7172   const MCExpr *Value;
7173   // EmitDTPRel32Value requires an expression, so we are using base class
7174   // method to evaluate the expression.
7175   if (getParser().parseExpression(Value))
7176     return true;
7177   getParser().getStreamer().EmitDTPRel32Value(Value);
7178 
7179   if (getLexer().isNot(AsmToken::EndOfStatement))
7180     return Error(getLexer().getLoc(),
7181                 "unexpected token, expected end of statement");
7182   Parser.Lex(); // Eat EndOfStatement token.
7183   return false;
7184 }
7185 
7186 /// parseDirectiveDtpRelDWord
7187 ///  ::= .dtpreldword tls_sym
7188 bool MipsAsmParser::parseDirectiveDtpRelDWord() {
7189   MCAsmParser &Parser = getParser();
7190   const MCExpr *Value;
7191   // EmitDTPRel64Value requires an expression, so we are using base class
7192   // method to evaluate the expression.
7193   if (getParser().parseExpression(Value))
7194     return true;
7195   getParser().getStreamer().EmitDTPRel64Value(Value);
7196 
7197   if (getLexer().isNot(AsmToken::EndOfStatement))
7198     return Error(getLexer().getLoc(),
7199                 "unexpected token, expected end of statement");
7200   Parser.Lex(); // Eat EndOfStatement token.
7201   return false;
7202 }
7203 
7204 /// parseDirectiveTpRelWord
7205 ///  ::= .tprelword tls_sym
7206 bool MipsAsmParser::parseDirectiveTpRelWord() {
7207   MCAsmParser &Parser = getParser();
7208   const MCExpr *Value;
7209   // EmitTPRel32Value requires an expression, so we are using base class
7210   // method to evaluate the expression.
7211   if (getParser().parseExpression(Value))
7212     return true;
7213   getParser().getStreamer().EmitTPRel32Value(Value);
7214 
7215   if (getLexer().isNot(AsmToken::EndOfStatement))
7216     return Error(getLexer().getLoc(),
7217                 "unexpected token, expected end of statement");
7218   Parser.Lex(); // Eat EndOfStatement token.
7219   return false;
7220 }
7221 
7222 /// parseDirectiveTpRelDWord
7223 ///  ::= .tpreldword tls_sym
7224 bool MipsAsmParser::parseDirectiveTpRelDWord() {
7225   MCAsmParser &Parser = getParser();
7226   const MCExpr *Value;
7227   // EmitTPRel64Value requires an expression, so we are using base class
7228   // method to evaluate the expression.
7229   if (getParser().parseExpression(Value))
7230     return true;
7231   getParser().getStreamer().EmitTPRel64Value(Value);
7232 
7233   if (getLexer().isNot(AsmToken::EndOfStatement))
7234     return Error(getLexer().getLoc(),
7235                 "unexpected token, expected end of statement");
7236   Parser.Lex(); // Eat EndOfStatement token.
7237   return false;
7238 }
7239 
7240 bool MipsAsmParser::parseDirectiveOption() {
7241   MCAsmParser &Parser = getParser();
7242   // Get the option token.
7243   AsmToken Tok = Parser.getTok();
7244   // At the moment only identifiers are supported.
7245   if (Tok.isNot(AsmToken::Identifier)) {
7246     return Error(Parser.getTok().getLoc(),
7247                  "unexpected token, expected identifier");
7248   }
7249 
7250   StringRef Option = Tok.getIdentifier();
7251 
7252   if (Option == "pic0") {
7253     // MipsAsmParser needs to know if the current PIC mode changes.
7254     IsPicEnabled = false;
7255 
7256     getTargetStreamer().emitDirectiveOptionPic0();
7257     Parser.Lex();
7258     if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
7259       return Error(Parser.getTok().getLoc(),
7260                    "unexpected token, expected end of statement");
7261     }
7262     return false;
7263   }
7264 
7265   if (Option == "pic2") {
7266     // MipsAsmParser needs to know if the current PIC mode changes.
7267     IsPicEnabled = true;
7268 
7269     getTargetStreamer().emitDirectiveOptionPic2();
7270     Parser.Lex();
7271     if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
7272       return Error(Parser.getTok().getLoc(),
7273                    "unexpected token, expected end of statement");
7274     }
7275     return false;
7276   }
7277 
7278   // Unknown option.
7279   Warning(Parser.getTok().getLoc(),
7280           "unknown option, expected 'pic0' or 'pic2'");
7281   Parser.eatToEndOfStatement();
7282   return false;
7283 }
7284 
7285 /// parseInsnDirective
7286 ///  ::= .insn
7287 bool MipsAsmParser::parseInsnDirective() {
7288   // If this is not the end of the statement, report an error.
7289   if (getLexer().isNot(AsmToken::EndOfStatement)) {
7290     reportParseError("unexpected token, expected end of statement");
7291     return false;
7292   }
7293 
7294   // The actual label marking happens in
7295   // MipsELFStreamer::createPendingLabelRelocs().
7296   getTargetStreamer().emitDirectiveInsn();
7297 
7298   getParser().Lex(); // Eat EndOfStatement token.
7299   return false;
7300 }
7301 
7302 /// parseRSectionDirective
7303 ///  ::= .rdata
7304 bool MipsAsmParser::parseRSectionDirective(StringRef Section) {
7305   // If this is not the end of the statement, report an error.
7306   if (getLexer().isNot(AsmToken::EndOfStatement)) {
7307     reportParseError("unexpected token, expected end of statement");
7308     return false;
7309   }
7310 
7311   MCSection *ELFSection = getContext().getELFSection(
7312       Section, ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
7313   getParser().getStreamer().SwitchSection(ELFSection);
7314 
7315   getParser().Lex(); // Eat EndOfStatement token.
7316   return false;
7317 }
7318 
7319 /// parseSSectionDirective
7320 ///  ::= .sbss
7321 ///  ::= .sdata
7322 bool MipsAsmParser::parseSSectionDirective(StringRef Section, unsigned Type) {
7323   // If this is not the end of the statement, report an error.
7324   if (getLexer().isNot(AsmToken::EndOfStatement)) {
7325     reportParseError("unexpected token, expected end of statement");
7326     return false;
7327   }
7328 
7329   MCSection *ELFSection = getContext().getELFSection(
7330       Section, Type, ELF::SHF_WRITE | ELF::SHF_ALLOC | ELF::SHF_MIPS_GPREL);
7331   getParser().getStreamer().SwitchSection(ELFSection);
7332 
7333   getParser().Lex(); // Eat EndOfStatement token.
7334   return false;
7335 }
7336 
7337 /// parseDirectiveModule
7338 ///  ::= .module oddspreg
7339 ///  ::= .module nooddspreg
7340 ///  ::= .module fp=value
7341 ///  ::= .module softfloat
7342 ///  ::= .module hardfloat
7343 ///  ::= .module mt
7344 bool MipsAsmParser::parseDirectiveModule() {
7345   MCAsmParser &Parser = getParser();
7346   MCAsmLexer &Lexer = getLexer();
7347   SMLoc L = Lexer.getLoc();
7348 
7349   if (!getTargetStreamer().isModuleDirectiveAllowed()) {
7350     // TODO : get a better message.
7351     reportParseError(".module directive must appear before any code");
7352     return false;
7353   }
7354 
7355   StringRef Option;
7356   if (Parser.parseIdentifier(Option)) {
7357     reportParseError("expected .module option identifier");
7358     return false;
7359   }
7360 
7361   if (Option == "oddspreg") {
7362     clearModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
7363 
7364     // Synchronize the abiflags information with the FeatureBits information we
7365     // changed above.
7366     getTargetStreamer().updateABIInfo(*this);
7367 
7368     // If printing assembly, use the recently updated abiflags information.
7369     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
7370     // emitted at the end).
7371     getTargetStreamer().emitDirectiveModuleOddSPReg();
7372 
7373     // If this is not the end of the statement, report an error.
7374     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7375       reportParseError("unexpected token, expected end of statement");
7376       return false;
7377     }
7378 
7379     return false; // parseDirectiveModule has finished successfully.
7380   } else if (Option == "nooddspreg") {
7381     if (!isABI_O32()) {
7382       return Error(L, "'.module nooddspreg' requires the O32 ABI");
7383     }
7384 
7385     setModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
7386 
7387     // Synchronize the abiflags information with the FeatureBits information we
7388     // changed above.
7389     getTargetStreamer().updateABIInfo(*this);
7390 
7391     // If printing assembly, use the recently updated abiflags information.
7392     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
7393     // emitted at the end).
7394     getTargetStreamer().emitDirectiveModuleOddSPReg();
7395 
7396     // If this is not the end of the statement, report an error.
7397     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7398       reportParseError("unexpected token, expected end of statement");
7399       return false;
7400     }
7401 
7402     return false; // parseDirectiveModule has finished successfully.
7403   } else if (Option == "fp") {
7404     return parseDirectiveModuleFP();
7405   } else if (Option == "softfloat") {
7406     setModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float");
7407 
7408     // Synchronize the ABI Flags information with the FeatureBits information we
7409     // updated above.
7410     getTargetStreamer().updateABIInfo(*this);
7411 
7412     // If printing assembly, use the recently updated ABI Flags information.
7413     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
7414     // emitted later).
7415     getTargetStreamer().emitDirectiveModuleSoftFloat();
7416 
7417     // If this is not the end of the statement, report an error.
7418     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7419       reportParseError("unexpected token, expected end of statement");
7420       return false;
7421     }
7422 
7423     return false; // parseDirectiveModule has finished successfully.
7424   } else if (Option == "hardfloat") {
7425     clearModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float");
7426 
7427     // Synchronize the ABI Flags information with the FeatureBits information we
7428     // updated above.
7429     getTargetStreamer().updateABIInfo(*this);
7430 
7431     // If printing assembly, use the recently updated ABI Flags information.
7432     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
7433     // emitted later).
7434     getTargetStreamer().emitDirectiveModuleHardFloat();
7435 
7436     // If this is not the end of the statement, report an error.
7437     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7438       reportParseError("unexpected token, expected end of statement");
7439       return false;
7440     }
7441 
7442     return false; // parseDirectiveModule has finished successfully.
7443   } else if (Option == "mt") {
7444     setModuleFeatureBits(Mips::FeatureMT, "mt");
7445 
7446     // Synchronize the ABI Flags information with the FeatureBits information we
7447     // updated above.
7448     getTargetStreamer().updateABIInfo(*this);
7449 
7450     // If printing assembly, use the recently updated ABI Flags information.
7451     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
7452     // emitted later).
7453     getTargetStreamer().emitDirectiveModuleMT();
7454 
7455     // If this is not the end of the statement, report an error.
7456     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7457       reportParseError("unexpected token, expected end of statement");
7458       return false;
7459     }
7460 
7461     return false; // parseDirectiveModule has finished successfully.
7462   } else {
7463     return Error(L, "'" + Twine(Option) + "' is not a valid .module option.");
7464   }
7465 }
7466 
7467 /// parseDirectiveModuleFP
7468 ///  ::= =32
7469 ///  ::= =xx
7470 ///  ::= =64
7471 bool MipsAsmParser::parseDirectiveModuleFP() {
7472   MCAsmParser &Parser = getParser();
7473   MCAsmLexer &Lexer = getLexer();
7474 
7475   if (Lexer.isNot(AsmToken::Equal)) {
7476     reportParseError("unexpected token, expected equals sign '='");
7477     return false;
7478   }
7479   Parser.Lex(); // Eat '=' token.
7480 
7481   MipsABIFlagsSection::FpABIKind FpABI;
7482   if (!parseFpABIValue(FpABI, ".module"))
7483     return false;
7484 
7485   if (getLexer().isNot(AsmToken::EndOfStatement)) {
7486     reportParseError("unexpected token, expected end of statement");
7487     return false;
7488   }
7489 
7490   // Synchronize the abiflags information with the FeatureBits information we
7491   // changed above.
7492   getTargetStreamer().updateABIInfo(*this);
7493 
7494   // If printing assembly, use the recently updated abiflags information.
7495   // If generating ELF, don't do anything (the .MIPS.abiflags section gets
7496   // emitted at the end).
7497   getTargetStreamer().emitDirectiveModuleFP();
7498 
7499   Parser.Lex(); // Consume the EndOfStatement.
7500   return false;
7501 }
7502 
7503 bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI,
7504                                     StringRef Directive) {
7505   MCAsmParser &Parser = getParser();
7506   MCAsmLexer &Lexer = getLexer();
7507   bool ModuleLevelOptions = Directive == ".module";
7508 
7509   if (Lexer.is(AsmToken::Identifier)) {
7510     StringRef Value = Parser.getTok().getString();
7511     Parser.Lex();
7512 
7513     if (Value != "xx") {
7514       reportParseError("unsupported value, expected 'xx', '32' or '64'");
7515       return false;
7516     }
7517 
7518     if (!isABI_O32()) {
7519       reportParseError("'" + Directive + " fp=xx' requires the O32 ABI");
7520       return false;
7521     }
7522 
7523     FpABI = MipsABIFlagsSection::FpABIKind::XX;
7524     if (ModuleLevelOptions) {
7525       setModuleFeatureBits(Mips::FeatureFPXX, "fpxx");
7526       clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64");
7527     } else {
7528       setFeatureBits(Mips::FeatureFPXX, "fpxx");
7529       clearFeatureBits(Mips::FeatureFP64Bit, "fp64");
7530     }
7531     return true;
7532   }
7533 
7534   if (Lexer.is(AsmToken::Integer)) {
7535     unsigned Value = Parser.getTok().getIntVal();
7536     Parser.Lex();
7537 
7538     if (Value != 32 && Value != 64) {
7539       reportParseError("unsupported value, expected 'xx', '32' or '64'");
7540       return false;
7541     }
7542 
7543     if (Value == 32) {
7544       if (!isABI_O32()) {
7545         reportParseError("'" + Directive + " fp=32' requires the O32 ABI");
7546         return false;
7547       }
7548 
7549       FpABI = MipsABIFlagsSection::FpABIKind::S32;
7550       if (ModuleLevelOptions) {
7551         clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx");
7552         clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64");
7553       } else {
7554         clearFeatureBits(Mips::FeatureFPXX, "fpxx");
7555         clearFeatureBits(Mips::FeatureFP64Bit, "fp64");
7556       }
7557     } else {
7558       FpABI = MipsABIFlagsSection::FpABIKind::S64;
7559       if (ModuleLevelOptions) {
7560         clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx");
7561         setModuleFeatureBits(Mips::FeatureFP64Bit, "fp64");
7562       } else {
7563         clearFeatureBits(Mips::FeatureFPXX, "fpxx");
7564         setFeatureBits(Mips::FeatureFP64Bit, "fp64");
7565       }
7566     }
7567 
7568     return true;
7569   }
7570 
7571   return false;
7572 }
7573 
7574 bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
7575   // This returns false if this function recognizes the directive
7576   // regardless of whether it is successfully handles or reports an
7577   // error. Otherwise it returns true to give the generic parser a
7578   // chance at recognizing it.
7579 
7580   MCAsmParser &Parser = getParser();
7581   StringRef IDVal = DirectiveID.getString();
7582 
7583   if (IDVal == ".cpload") {
7584     parseDirectiveCpLoad(DirectiveID.getLoc());
7585     return false;
7586   }
7587   if (IDVal == ".cprestore") {
7588     parseDirectiveCpRestore(DirectiveID.getLoc());
7589     return false;
7590   }
7591   if (IDVal == ".dword") {
7592     parseDataDirective(8, DirectiveID.getLoc());
7593     return false;
7594   }
7595   if (IDVal == ".ent") {
7596     StringRef SymbolName;
7597 
7598     if (Parser.parseIdentifier(SymbolName)) {
7599       reportParseError("expected identifier after .ent");
7600       return false;
7601     }
7602 
7603     // There's an undocumented extension that allows an integer to
7604     // follow the name of the procedure which AFAICS is ignored by GAS.
7605     // Example: .ent foo,2
7606     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7607       if (getLexer().isNot(AsmToken::Comma)) {
7608         // Even though we accept this undocumented extension for compatibility
7609         // reasons, the additional integer argument does not actually change
7610         // the behaviour of the '.ent' directive, so we would like to discourage
7611         // its use. We do this by not referring to the extended version in
7612         // error messages which are not directly related to its use.
7613         reportParseError("unexpected token, expected end of statement");
7614         return false;
7615       }
7616       Parser.Lex(); // Eat the comma.
7617       const MCExpr *DummyNumber;
7618       int64_t DummyNumberVal;
7619       // If the user was explicitly trying to use the extended version,
7620       // we still give helpful extension-related error messages.
7621       if (Parser.parseExpression(DummyNumber)) {
7622         reportParseError("expected number after comma");
7623         return false;
7624       }
7625       if (!DummyNumber->evaluateAsAbsolute(DummyNumberVal)) {
7626         reportParseError("expected an absolute expression after comma");
7627         return false;
7628       }
7629     }
7630 
7631     // If this is not the end of the statement, report an error.
7632     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7633       reportParseError("unexpected token, expected end of statement");
7634       return false;
7635     }
7636 
7637     MCSymbol *Sym = getContext().getOrCreateSymbol(SymbolName);
7638 
7639     getTargetStreamer().emitDirectiveEnt(*Sym);
7640     CurrentFn = Sym;
7641     IsCpRestoreSet = false;
7642     return false;
7643   }
7644 
7645   if (IDVal == ".end") {
7646     StringRef SymbolName;
7647 
7648     if (Parser.parseIdentifier(SymbolName)) {
7649       reportParseError("expected identifier after .end");
7650       return false;
7651     }
7652 
7653     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7654       reportParseError("unexpected token, expected end of statement");
7655       return false;
7656     }
7657 
7658     if (CurrentFn == nullptr) {
7659       reportParseError(".end used without .ent");
7660       return false;
7661     }
7662 
7663     if ((SymbolName != CurrentFn->getName())) {
7664       reportParseError(".end symbol does not match .ent symbol");
7665       return false;
7666     }
7667 
7668     getTargetStreamer().emitDirectiveEnd(SymbolName);
7669     CurrentFn = nullptr;
7670     IsCpRestoreSet = false;
7671     return false;
7672   }
7673 
7674   if (IDVal == ".frame") {
7675     // .frame $stack_reg, frame_size_in_bytes, $return_reg
7676     SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg;
7677     OperandMatchResultTy ResTy = parseAnyRegister(TmpReg);
7678     if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) {
7679       reportParseError("expected stack register");
7680       return false;
7681     }
7682 
7683     MipsOperand &StackRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
7684     if (!StackRegOpnd.isGPRAsmReg()) {
7685       reportParseError(StackRegOpnd.getStartLoc(),
7686                        "expected general purpose register");
7687       return false;
7688     }
7689     unsigned StackReg = StackRegOpnd.getGPR32Reg();
7690 
7691     if (Parser.getTok().is(AsmToken::Comma))
7692       Parser.Lex();
7693     else {
7694       reportParseError("unexpected token, expected comma");
7695       return false;
7696     }
7697 
7698     // Parse the frame size.
7699     const MCExpr *FrameSize;
7700     int64_t FrameSizeVal;
7701 
7702     if (Parser.parseExpression(FrameSize)) {
7703       reportParseError("expected frame size value");
7704       return false;
7705     }
7706 
7707     if (!FrameSize->evaluateAsAbsolute(FrameSizeVal)) {
7708       reportParseError("frame size not an absolute expression");
7709       return false;
7710     }
7711 
7712     if (Parser.getTok().is(AsmToken::Comma))
7713       Parser.Lex();
7714     else {
7715       reportParseError("unexpected token, expected comma");
7716       return false;
7717     }
7718 
7719     // Parse the return register.
7720     TmpReg.clear();
7721     ResTy = parseAnyRegister(TmpReg);
7722     if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) {
7723       reportParseError("expected return register");
7724       return false;
7725     }
7726 
7727     MipsOperand &ReturnRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
7728     if (!ReturnRegOpnd.isGPRAsmReg()) {
7729       reportParseError(ReturnRegOpnd.getStartLoc(),
7730                        "expected general purpose register");
7731       return false;
7732     }
7733 
7734     // If this is not the end of the statement, report an error.
7735     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7736       reportParseError("unexpected token, expected end of statement");
7737       return false;
7738     }
7739 
7740     getTargetStreamer().emitFrame(StackReg, FrameSizeVal,
7741                                   ReturnRegOpnd.getGPR32Reg());
7742     IsCpRestoreSet = false;
7743     return false;
7744   }
7745 
7746   if (IDVal == ".set") {
7747     parseDirectiveSet();
7748     return false;
7749   }
7750 
7751   if (IDVal == ".mask" || IDVal == ".fmask") {
7752     // .mask bitmask, frame_offset
7753     // bitmask: One bit for each register used.
7754     // frame_offset: Offset from Canonical Frame Address ($sp on entry) where
7755     //               first register is expected to be saved.
7756     // Examples:
7757     //   .mask 0x80000000, -4
7758     //   .fmask 0x80000000, -4
7759     //
7760 
7761     // Parse the bitmask
7762     const MCExpr *BitMask;
7763     int64_t BitMaskVal;
7764 
7765     if (Parser.parseExpression(BitMask)) {
7766       reportParseError("expected bitmask value");
7767       return false;
7768     }
7769 
7770     if (!BitMask->evaluateAsAbsolute(BitMaskVal)) {
7771       reportParseError("bitmask not an absolute expression");
7772       return false;
7773     }
7774 
7775     if (Parser.getTok().is(AsmToken::Comma))
7776       Parser.Lex();
7777     else {
7778       reportParseError("unexpected token, expected comma");
7779       return false;
7780     }
7781 
7782     // Parse the frame_offset
7783     const MCExpr *FrameOffset;
7784     int64_t FrameOffsetVal;
7785 
7786     if (Parser.parseExpression(FrameOffset)) {
7787       reportParseError("expected frame offset value");
7788       return false;
7789     }
7790 
7791     if (!FrameOffset->evaluateAsAbsolute(FrameOffsetVal)) {
7792       reportParseError("frame offset not an absolute expression");
7793       return false;
7794     }
7795 
7796     // If this is not the end of the statement, report an error.
7797     if (getLexer().isNot(AsmToken::EndOfStatement)) {
7798       reportParseError("unexpected token, expected end of statement");
7799       return false;
7800     }
7801 
7802     if (IDVal == ".mask")
7803       getTargetStreamer().emitMask(BitMaskVal, FrameOffsetVal);
7804     else
7805       getTargetStreamer().emitFMask(BitMaskVal, FrameOffsetVal);
7806     return false;
7807   }
7808 
7809   if (IDVal == ".nan")
7810     return parseDirectiveNaN();
7811 
7812   if (IDVal == ".gpword") {
7813     parseDirectiveGpWord();
7814     return false;
7815   }
7816 
7817   if (IDVal == ".gpdword") {
7818     parseDirectiveGpDWord();
7819     return false;
7820   }
7821 
7822   if (IDVal == ".dtprelword") {
7823     parseDirectiveDtpRelWord();
7824     return false;
7825   }
7826 
7827   if (IDVal == ".dtpreldword") {
7828     parseDirectiveDtpRelDWord();
7829     return false;
7830   }
7831 
7832   if (IDVal == ".tprelword") {
7833     parseDirectiveTpRelWord();
7834     return false;
7835   }
7836 
7837   if (IDVal == ".tpreldword") {
7838     parseDirectiveTpRelDWord();
7839     return false;
7840   }
7841 
7842   if (IDVal == ".word") {
7843     parseDataDirective(4, DirectiveID.getLoc());
7844     return false;
7845   }
7846 
7847   if (IDVal == ".hword") {
7848     parseDataDirective(2, DirectiveID.getLoc());
7849     return false;
7850   }
7851 
7852   if (IDVal == ".option") {
7853     parseDirectiveOption();
7854     return false;
7855   }
7856 
7857   if (IDVal == ".abicalls") {
7858     getTargetStreamer().emitDirectiveAbiCalls();
7859     if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
7860       Error(Parser.getTok().getLoc(),
7861             "unexpected token, expected end of statement");
7862     }
7863     return false;
7864   }
7865 
7866   if (IDVal == ".cpsetup") {
7867     parseDirectiveCPSetup();
7868     return false;
7869   }
7870   if (IDVal == ".cpreturn") {
7871     parseDirectiveCPReturn();
7872     return false;
7873   }
7874   if (IDVal == ".module") {
7875     parseDirectiveModule();
7876     return false;
7877   }
7878   if (IDVal == ".llvm_internal_mips_reallow_module_directive") {
7879     parseInternalDirectiveReallowModule();
7880     return false;
7881   }
7882   if (IDVal == ".insn") {
7883     parseInsnDirective();
7884     return false;
7885   }
7886   if (IDVal == ".rdata") {
7887     parseRSectionDirective(".rodata");
7888     return false;
7889   }
7890   if (IDVal == ".sbss") {
7891     parseSSectionDirective(IDVal, ELF::SHT_NOBITS);
7892     return false;
7893   }
7894   if (IDVal == ".sdata") {
7895     parseSSectionDirective(IDVal, ELF::SHT_PROGBITS);
7896     return false;
7897   }
7898 
7899   return true;
7900 }
7901 
7902 bool MipsAsmParser::parseInternalDirectiveReallowModule() {
7903   // If this is not the end of the statement, report an error.
7904   if (getLexer().isNot(AsmToken::EndOfStatement)) {
7905     reportParseError("unexpected token, expected end of statement");
7906     return false;
7907   }
7908 
7909   getTargetStreamer().reallowModuleDirective();
7910 
7911   getParser().Lex(); // Eat EndOfStatement token.
7912   return false;
7913 }
7914 
7915 extern "C" void LLVMInitializeMipsAsmParser() {
7916   RegisterMCAsmParser<MipsAsmParser> X(getTheMipsTarget());
7917   RegisterMCAsmParser<MipsAsmParser> Y(getTheMipselTarget());
7918   RegisterMCAsmParser<MipsAsmParser> A(getTheMips64Target());
7919   RegisterMCAsmParser<MipsAsmParser> B(getTheMips64elTarget());
7920 }
7921 
7922 #define GET_REGISTER_MATCHER
7923 #define GET_MATCHER_IMPLEMENTATION
7924 #include "MipsGenAsmMatcher.inc"
7925 
7926 bool MipsAsmParser::mnemonicIsValid(StringRef Mnemonic, unsigned VariantID) {
7927   // Find the appropriate table for this asm variant.
7928   const MatchEntry *Start, *End;
7929   switch (VariantID) {
7930   default: llvm_unreachable("invalid variant!");
7931   case 0: Start = std::begin(MatchTable0); End = std::end(MatchTable0); break;
7932   }
7933   // Search the table.
7934   auto MnemonicRange = std::equal_range(Start, End, Mnemonic, LessOpcode());
7935   return MnemonicRange.first != MnemonicRange.second;
7936 }
7937