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