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