1 //===-- MipsAsmParser.cpp - Parse Mips assembly to MCInst instructions ----===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "MCTargetDesc/MipsABIInfo.h"
11 #include "MCTargetDesc/MipsMCExpr.h"
12 #include "MCTargetDesc/MipsMCTargetDesc.h"
13 #include "MipsRegisterInfo.h"
14 #include "MipsTargetObjectFile.h"
15 #include "MipsTargetStreamer.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/StringSwitch.h"
18 #include "llvm/MC/MCContext.h"
19 #include "llvm/MC/MCExpr.h"
20 #include "llvm/MC/MCInst.h"
21 #include "llvm/MC/MCInstBuilder.h"
22 #include "llvm/MC/MCParser/MCAsmLexer.h"
23 #include "llvm/MC/MCParser/MCParsedAsmOperand.h"
24 #include "llvm/MC/MCParser/MCTargetAsmParser.h"
25 #include "llvm/MC/MCSectionELF.h"
26 #include "llvm/MC/MCStreamer.h"
27 #include "llvm/MC/MCSubtargetInfo.h"
28 #include "llvm/MC/MCSymbol.h"
29 #include "llvm/Support/Debug.h"
30 #include "llvm/Support/ELF.h"
31 #include "llvm/Support/MathExtras.h"
32 #include "llvm/Support/SourceMgr.h"
33 #include "llvm/Support/TargetRegistry.h"
34 #include "llvm/Support/raw_ostream.h"
35 #include <memory>
36 
37 using namespace llvm;
38 
39 #define DEBUG_TYPE "mips-asm-parser"
40 
41 namespace llvm {
42 class MCInstrInfo;
43 }
44 
45 namespace {
46 class MipsAssemblerOptions {
47 public:
48   MipsAssemblerOptions(const FeatureBitset &Features_) :
49     ATReg(1), Reorder(true), Macro(true), Features(Features_) {}
50 
51   MipsAssemblerOptions(const MipsAssemblerOptions *Opts) {
52     ATReg = Opts->getATRegIndex();
53     Reorder = Opts->isReorder();
54     Macro = Opts->isMacro();
55     Features = Opts->getFeatures();
56   }
57 
58   unsigned getATRegIndex() const { return ATReg; }
59   bool setATRegIndex(unsigned Reg) {
60     if (Reg > 31)
61       return false;
62 
63     ATReg = Reg;
64     return true;
65   }
66 
67   bool isReorder() const { return Reorder; }
68   void setReorder() { Reorder = true; }
69   void setNoReorder() { Reorder = false; }
70 
71   bool isMacro() const { return Macro; }
72   void setMacro() { Macro = true; }
73   void setNoMacro() { Macro = false; }
74 
75   const FeatureBitset &getFeatures() const { return Features; }
76   void setFeatures(const FeatureBitset &Features_) { Features = Features_; }
77 
78   // Set of features that are either architecture features or referenced
79   // by them (e.g.: FeatureNaN2008 implied by FeatureMips32r6).
80   // The full table can be found in MipsGenSubtargetInfo.inc (MipsFeatureKV[]).
81   // The reason we need this mask is explained in the selectArch function.
82   // FIXME: Ideally we would like TableGen to generate this information.
83   static const FeatureBitset AllArchRelatedMask;
84 
85 private:
86   unsigned ATReg;
87   bool Reorder;
88   bool Macro;
89   FeatureBitset Features;
90 };
91 }
92 
93 const FeatureBitset MipsAssemblerOptions::AllArchRelatedMask = {
94     Mips::FeatureMips1, Mips::FeatureMips2, Mips::FeatureMips3,
95     Mips::FeatureMips3_32, Mips::FeatureMips3_32r2, Mips::FeatureMips4,
96     Mips::FeatureMips4_32, Mips::FeatureMips4_32r2, Mips::FeatureMips5,
97     Mips::FeatureMips5_32r2, Mips::FeatureMips32, Mips::FeatureMips32r2,
98     Mips::FeatureMips32r3, Mips::FeatureMips32r5, Mips::FeatureMips32r6,
99     Mips::FeatureMips64, Mips::FeatureMips64r2, Mips::FeatureMips64r3,
100     Mips::FeatureMips64r5, Mips::FeatureMips64r6, Mips::FeatureCnMips,
101     Mips::FeatureFP64Bit, Mips::FeatureGP64Bit, Mips::FeatureNaN2008
102 };
103 
104 namespace {
105 class MipsAsmParser : public MCTargetAsmParser {
106   MipsTargetStreamer &getTargetStreamer() {
107     MCTargetStreamer &TS = *getParser().getStreamer().getTargetStreamer();
108     return static_cast<MipsTargetStreamer &>(TS);
109   }
110 
111   MipsABIInfo ABI;
112   SmallVector<std::unique_ptr<MipsAssemblerOptions>, 2> AssemblerOptions;
113   MCSymbol *CurrentFn; // Pointer to the function being parsed. It may be a
114                        // nullptr, which indicates that no function is currently
115                        // selected. This usually happens after an '.end func'
116                        // directive.
117   bool IsLittleEndian;
118   bool IsPicEnabled;
119   bool IsCpRestoreSet;
120   int CpRestoreOffset;
121   unsigned CpSaveLocation;
122   /// If true, then CpSaveLocation is a register, otherwise it's an offset.
123   bool     CpSaveLocationIsRegister;
124 
125   // Print a warning along with its fix-it message at the given range.
126   void printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg,
127                              SMRange Range, bool ShowColors = true);
128 
129 #define GET_ASSEMBLER_HEADER
130 #include "MipsGenAsmMatcher.inc"
131 
132   unsigned checkTargetMatchPredicate(MCInst &Inst) override;
133 
134   bool MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
135                                OperandVector &Operands, MCStreamer &Out,
136                                uint64_t &ErrorInfo,
137                                bool MatchingInlineAsm) override;
138 
139   /// Parse a register as used in CFI directives
140   bool ParseRegister(unsigned &RegNo, SMLoc &StartLoc, SMLoc &EndLoc) override;
141 
142   bool parseParenSuffix(StringRef Name, OperandVector &Operands);
143 
144   bool parseBracketSuffix(StringRef Name, OperandVector &Operands);
145 
146   bool ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
147                         SMLoc NameLoc, OperandVector &Operands) override;
148 
149   bool ParseDirective(AsmToken DirectiveID) override;
150 
151   OperandMatchResultTy parseMemOperand(OperandVector &Operands);
152   OperandMatchResultTy
153   matchAnyRegisterNameWithoutDollar(OperandVector &Operands,
154                                     StringRef Identifier, SMLoc S);
155   OperandMatchResultTy matchAnyRegisterWithoutDollar(OperandVector &Operands,
156                                                      SMLoc S);
157   OperandMatchResultTy parseAnyRegister(OperandVector &Operands);
158   OperandMatchResultTy parseImm(OperandVector &Operands);
159   OperandMatchResultTy parseJumpTarget(OperandVector &Operands);
160   OperandMatchResultTy parseInvNum(OperandVector &Operands);
161   OperandMatchResultTy parseLSAImm(OperandVector &Operands);
162   OperandMatchResultTy parseRegisterPair(OperandVector &Operands);
163   OperandMatchResultTy parseMovePRegPair(OperandVector &Operands);
164   OperandMatchResultTy parseRegisterList(OperandVector &Operands);
165 
166   bool searchSymbolAlias(OperandVector &Operands);
167 
168   bool parseOperand(OperandVector &, StringRef Mnemonic);
169 
170   enum MacroExpanderResultTy {
171     MER_NotAMacro,
172     MER_Success,
173     MER_Fail,
174   };
175 
176   // Expands assembly pseudo instructions.
177   MacroExpanderResultTy tryExpandInstruction(MCInst &Inst, SMLoc IDLoc,
178                                              MCStreamer &Out,
179                                              const MCSubtargetInfo *STI);
180 
181   bool expandJalWithRegs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
182                          const MCSubtargetInfo *STI);
183 
184   bool loadImmediate(int64_t ImmValue, unsigned DstReg, unsigned SrcReg,
185                      bool Is32BitImm, bool IsAddress, SMLoc IDLoc,
186                      MCStreamer &Out, const MCSubtargetInfo *STI);
187 
188   bool loadAndAddSymbolAddress(const MCExpr *SymExpr, unsigned DstReg,
189                                unsigned SrcReg, bool Is32BitSym, SMLoc IDLoc,
190                                MCStreamer &Out, const MCSubtargetInfo *STI);
191 
192   bool expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc,
193                      MCStreamer &Out, const MCSubtargetInfo *STI);
194 
195   bool expandLoadAddress(unsigned DstReg, unsigned BaseReg,
196                          const MCOperand &Offset, bool Is32BitAddress,
197                          SMLoc IDLoc, MCStreamer &Out,
198                          const MCSubtargetInfo *STI);
199 
200   bool expandUncondBranchMMPseudo(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
201                                   const MCSubtargetInfo *STI);
202 
203   void expandMemInst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
204                      const MCSubtargetInfo *STI, bool isLoad, bool isImmOpnd);
205 
206   bool expandLoadStoreMultiple(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
207                                const MCSubtargetInfo *STI);
208 
209   bool expandAliasImmediate(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
210                             const MCSubtargetInfo *STI);
211 
212   bool expandBranchImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
213                        const MCSubtargetInfo *STI);
214 
215   bool expandCondBranches(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
216                           const MCSubtargetInfo *STI);
217 
218   bool expandDiv(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
219                  const MCSubtargetInfo *STI, const bool IsMips64,
220                  const bool Signed);
221 
222   bool expandTrunc(MCInst &Inst, bool IsDouble, bool Is64FPU, SMLoc IDLoc,
223                    MCStreamer &Out, const MCSubtargetInfo *STI);
224 
225   bool expandUlh(MCInst &Inst, bool Signed, SMLoc IDLoc, MCStreamer &Out,
226                  const MCSubtargetInfo *STI);
227 
228   bool expandUlw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
229                  const MCSubtargetInfo *STI);
230 
231   bool expandRotation(MCInst &Inst, SMLoc IDLoc,
232                       MCStreamer &Out, const MCSubtargetInfo *STI);
233   bool expandRotationImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
234                          const MCSubtargetInfo *STI);
235   bool expandDRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
236                        const MCSubtargetInfo *STI);
237   bool expandDRotationImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
238                           const MCSubtargetInfo *STI);
239 
240   bool expandAbs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
241                  const MCSubtargetInfo *STI);
242 
243   void createNop(bool hasShortDelaySlot, SMLoc IDLoc, MCStreamer &Out,
244                  const MCSubtargetInfo *STI);
245 
246   void createAddu(unsigned DstReg, unsigned SrcReg, unsigned TrgReg,
247                   bool Is64Bit, MCStreamer &Out, const MCSubtargetInfo *STI);
248 
249   void createCpRestoreMemOp(bool IsLoad, int StackOffset, SMLoc IDLoc,
250                             MCStreamer &Out, const MCSubtargetInfo *STI);
251 
252   bool reportParseError(Twine ErrorMsg);
253   bool reportParseError(SMLoc Loc, Twine ErrorMsg);
254 
255   bool parseMemOffset(const MCExpr *&Res, bool isParenExpr);
256   bool parseRelocOperand(const MCExpr *&Res);
257 
258   const MCExpr *evaluateRelocExpr(const MCExpr *Expr, StringRef RelocStr);
259 
260   bool isEvaluated(const MCExpr *Expr);
261   bool parseSetMips0Directive();
262   bool parseSetArchDirective();
263   bool parseSetFeature(uint64_t Feature);
264   bool isPicAndNotNxxAbi(); // Used by .cpload, .cprestore, and .cpsetup.
265   bool parseDirectiveCpLoad(SMLoc Loc);
266   bool parseDirectiveCpRestore(SMLoc Loc);
267   bool parseDirectiveCPSetup();
268   bool parseDirectiveCPReturn();
269   bool parseDirectiveNaN();
270   bool parseDirectiveSet();
271   bool parseDirectiveOption();
272   bool parseInsnDirective();
273   bool parseSSectionDirective(StringRef Section, unsigned Type);
274 
275   bool parseSetAtDirective();
276   bool parseSetNoAtDirective();
277   bool parseSetMacroDirective();
278   bool parseSetNoMacroDirective();
279   bool parseSetMsaDirective();
280   bool parseSetNoMsaDirective();
281   bool parseSetNoDspDirective();
282   bool parseSetReorderDirective();
283   bool parseSetNoReorderDirective();
284   bool parseSetMips16Directive();
285   bool parseSetNoMips16Directive();
286   bool parseSetFpDirective();
287   bool parseSetOddSPRegDirective();
288   bool parseSetNoOddSPRegDirective();
289   bool parseSetPopDirective();
290   bool parseSetPushDirective();
291   bool parseSetSoftFloatDirective();
292   bool parseSetHardFloatDirective();
293 
294   bool parseSetAssignment();
295 
296   bool parseDataDirective(unsigned Size, SMLoc L);
297   bool parseDirectiveGpWord();
298   bool parseDirectiveGpDWord();
299   bool parseDirectiveModule();
300   bool parseDirectiveModuleFP();
301   bool parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI,
302                        StringRef Directive);
303 
304   bool parseInternalDirectiveReallowModule();
305 
306   MCSymbolRefExpr::VariantKind getVariantKind(StringRef Symbol);
307 
308   bool eatComma(StringRef ErrorStr);
309 
310   int matchCPURegisterName(StringRef Symbol);
311 
312   int matchHWRegsRegisterName(StringRef Symbol);
313 
314   int matchRegisterByNumber(unsigned RegNum, unsigned RegClass);
315 
316   int matchFPURegisterName(StringRef Name);
317 
318   int matchFCCRegisterName(StringRef Name);
319 
320   int matchACRegisterName(StringRef Name);
321 
322   int matchMSA128RegisterName(StringRef Name);
323 
324   int matchMSA128CtrlRegisterName(StringRef Name);
325 
326   unsigned getReg(int RC, int RegNo);
327 
328   unsigned getGPR(int RegNo);
329 
330   /// Returns the internal register number for the current AT. Also checks if
331   /// the current AT is unavailable (set to $0) and gives an error if it is.
332   /// This should be used in pseudo-instruction expansions which need AT.
333   unsigned getATReg(SMLoc Loc);
334 
335   bool processInstruction(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
336                           const MCSubtargetInfo *STI);
337 
338   // Helper function that checks if the value of a vector index is within the
339   // boundaries of accepted values for each RegisterKind
340   // Example: INSERT.B $w0[n], $1 => 16 > n >= 0
341   bool validateMSAIndex(int Val, int RegKind);
342 
343   // Selects a new architecture by updating the FeatureBits with the necessary
344   // info including implied dependencies.
345   // Internally, it clears all the feature bits related to *any* architecture
346   // and selects the new one using the ToggleFeature functionality of the
347   // MCSubtargetInfo object that handles implied dependencies. The reason we
348   // clear all the arch related bits manually is because ToggleFeature only
349   // clears the features that imply the feature being cleared and not the
350   // features implied by the feature being cleared. This is easier to see
351   // with an example:
352   //  --------------------------------------------------
353   // | Feature         | Implies                        |
354   // | -------------------------------------------------|
355   // | FeatureMips1    | None                           |
356   // | FeatureMips2    | FeatureMips1                   |
357   // | FeatureMips3    | FeatureMips2 | FeatureMipsGP64 |
358   // | FeatureMips4    | FeatureMips3                   |
359   // | ...             |                                |
360   //  --------------------------------------------------
361   //
362   // Setting Mips3 is equivalent to set: (FeatureMips3 | FeatureMips2 |
363   // FeatureMipsGP64 | FeatureMips1)
364   // Clearing Mips3 is equivalent to clear (FeatureMips3 | FeatureMips4).
365   void selectArch(StringRef ArchFeature) {
366     MCSubtargetInfo &STI = copySTI();
367     FeatureBitset FeatureBits = STI.getFeatureBits();
368     FeatureBits &= ~MipsAssemblerOptions::AllArchRelatedMask;
369     STI.setFeatureBits(FeatureBits);
370     setAvailableFeatures(
371         ComputeAvailableFeatures(STI.ToggleFeature(ArchFeature)));
372     AssemblerOptions.back()->setFeatures(STI.getFeatureBits());
373   }
374 
375   void setFeatureBits(uint64_t Feature, StringRef FeatureString) {
376     if (!(getSTI().getFeatureBits()[Feature])) {
377       MCSubtargetInfo &STI = copySTI();
378       setAvailableFeatures(
379           ComputeAvailableFeatures(STI.ToggleFeature(FeatureString)));
380       AssemblerOptions.back()->setFeatures(STI.getFeatureBits());
381     }
382   }
383 
384   void clearFeatureBits(uint64_t Feature, StringRef FeatureString) {
385     if (getSTI().getFeatureBits()[Feature]) {
386       MCSubtargetInfo &STI = copySTI();
387       setAvailableFeatures(
388           ComputeAvailableFeatures(STI.ToggleFeature(FeatureString)));
389       AssemblerOptions.back()->setFeatures(STI.getFeatureBits());
390     }
391   }
392 
393   void setModuleFeatureBits(uint64_t Feature, StringRef FeatureString) {
394     setFeatureBits(Feature, FeatureString);
395     AssemblerOptions.front()->setFeatures(getSTI().getFeatureBits());
396   }
397 
398   void clearModuleFeatureBits(uint64_t Feature, StringRef FeatureString) {
399     clearFeatureBits(Feature, FeatureString);
400     AssemblerOptions.front()->setFeatures(getSTI().getFeatureBits());
401   }
402 
403 public:
404   enum MipsMatchResultTy {
405     Match_RequiresDifferentSrcAndDst = FIRST_TARGET_MATCH_RESULT_TY,
406 #define GET_OPERAND_DIAGNOSTIC_TYPES
407 #include "MipsGenAsmMatcher.inc"
408 #undef GET_OPERAND_DIAGNOSTIC_TYPES
409   };
410 
411   MipsAsmParser(const MCSubtargetInfo &sti, MCAsmParser &parser,
412                 const MCInstrInfo &MII, const MCTargetOptions &Options)
413     : MCTargetAsmParser(Options, sti),
414         ABI(MipsABIInfo::computeTargetABI(Triple(sti.getTargetTriple()),
415                                           sti.getCPU(), Options)) {
416     MCAsmParserExtension::Initialize(parser);
417 
418     parser.addAliasForDirective(".asciiz", ".asciz");
419 
420     // Initialize the set of available features.
421     setAvailableFeatures(ComputeAvailableFeatures(getSTI().getFeatureBits()));
422 
423     // Remember the initial assembler options. The user can not modify these.
424     AssemblerOptions.push_back(
425         llvm::make_unique<MipsAssemblerOptions>(getSTI().getFeatureBits()));
426 
427     // Create an assembler options environment for the user to modify.
428     AssemblerOptions.push_back(
429         llvm::make_unique<MipsAssemblerOptions>(getSTI().getFeatureBits()));
430 
431     getTargetStreamer().updateABIInfo(*this);
432 
433     if (!isABI_O32() && !useOddSPReg() != 0)
434       report_fatal_error("-mno-odd-spreg requires the O32 ABI");
435 
436     CurrentFn = nullptr;
437 
438     IsPicEnabled =
439         (getContext().getObjectFileInfo()->getRelocM() == Reloc::PIC_);
440 
441     IsCpRestoreSet = false;
442     CpRestoreOffset = -1;
443 
444     Triple TheTriple(sti.getTargetTriple());
445     if ((TheTriple.getArch() == Triple::mips) ||
446         (TheTriple.getArch() == Triple::mips64))
447       IsLittleEndian = false;
448     else
449       IsLittleEndian = true;
450   }
451 
452   /// True if all of $fcc0 - $fcc7 exist for the current ISA.
453   bool hasEightFccRegisters() const { return hasMips4() || hasMips32(); }
454 
455   bool isGP64bit() const {
456     return getSTI().getFeatureBits()[Mips::FeatureGP64Bit];
457   }
458   bool isFP64bit() const {
459     return getSTI().getFeatureBits()[Mips::FeatureFP64Bit];
460   }
461   const MipsABIInfo &getABI() const { return ABI; }
462   bool isABI_N32() const { return ABI.IsN32(); }
463   bool isABI_N64() const { return ABI.IsN64(); }
464   bool isABI_O32() const { return ABI.IsO32(); }
465   bool isABI_FPXX() const {
466     return getSTI().getFeatureBits()[Mips::FeatureFPXX];
467   }
468 
469   bool useOddSPReg() const {
470     return !(getSTI().getFeatureBits()[Mips::FeatureNoOddSPReg]);
471   }
472 
473   bool inMicroMipsMode() const {
474     return getSTI().getFeatureBits()[Mips::FeatureMicroMips];
475   }
476   bool hasMips1() const {
477     return getSTI().getFeatureBits()[Mips::FeatureMips1];
478   }
479   bool hasMips2() const {
480     return getSTI().getFeatureBits()[Mips::FeatureMips2];
481   }
482   bool hasMips3() const {
483     return getSTI().getFeatureBits()[Mips::FeatureMips3];
484   }
485   bool hasMips4() const {
486     return getSTI().getFeatureBits()[Mips::FeatureMips4];
487   }
488   bool hasMips5() const {
489     return getSTI().getFeatureBits()[Mips::FeatureMips5];
490   }
491   bool hasMips32() const {
492     return getSTI().getFeatureBits()[Mips::FeatureMips32];
493   }
494   bool hasMips64() const {
495     return getSTI().getFeatureBits()[Mips::FeatureMips64];
496   }
497   bool hasMips32r2() const {
498     return getSTI().getFeatureBits()[Mips::FeatureMips32r2];
499   }
500   bool hasMips64r2() const {
501     return getSTI().getFeatureBits()[Mips::FeatureMips64r2];
502   }
503   bool hasMips32r3() const {
504     return (getSTI().getFeatureBits()[Mips::FeatureMips32r3]);
505   }
506   bool hasMips64r3() const {
507     return (getSTI().getFeatureBits()[Mips::FeatureMips64r3]);
508   }
509   bool hasMips32r5() const {
510     return (getSTI().getFeatureBits()[Mips::FeatureMips32r5]);
511   }
512   bool hasMips64r5() const {
513     return (getSTI().getFeatureBits()[Mips::FeatureMips64r5]);
514   }
515   bool hasMips32r6() const {
516     return getSTI().getFeatureBits()[Mips::FeatureMips32r6];
517   }
518   bool hasMips64r6() const {
519     return getSTI().getFeatureBits()[Mips::FeatureMips64r6];
520   }
521 
522   bool hasDSP() const {
523     return getSTI().getFeatureBits()[Mips::FeatureDSP];
524   }
525   bool hasDSPR2() const {
526     return getSTI().getFeatureBits()[Mips::FeatureDSPR2];
527   }
528   bool hasDSPR3() const {
529     return getSTI().getFeatureBits()[Mips::FeatureDSPR3];
530   }
531   bool hasMSA() const {
532     return getSTI().getFeatureBits()[Mips::FeatureMSA];
533   }
534   bool hasCnMips() const {
535     return (getSTI().getFeatureBits()[Mips::FeatureCnMips]);
536   }
537 
538   bool inPicMode() {
539     return IsPicEnabled;
540   }
541 
542   bool inMips16Mode() const {
543     return getSTI().getFeatureBits()[Mips::FeatureMips16];
544   }
545 
546   bool useTraps() const {
547     return getSTI().getFeatureBits()[Mips::FeatureUseTCCInDIV];
548   }
549 
550   bool useSoftFloat() const {
551     return getSTI().getFeatureBits()[Mips::FeatureSoftFloat];
552   }
553 
554   /// Warn if RegIndex is the same as the current AT.
555   void warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc);
556 
557   void warnIfNoMacro(SMLoc Loc);
558 
559   bool isLittle() const { return IsLittleEndian; }
560 };
561 }
562 
563 namespace {
564 
565 /// MipsOperand - Instances of this class represent a parsed Mips machine
566 /// instruction.
567 class MipsOperand : public MCParsedAsmOperand {
568 public:
569   /// Broad categories of register classes
570   /// The exact class is finalized by the render method.
571   enum RegKind {
572     RegKind_GPR = 1,      /// GPR32 and GPR64 (depending on isGP64bit())
573     RegKind_FGR = 2,      /// FGR32, FGR64, AFGR64 (depending on context and
574                           /// isFP64bit())
575     RegKind_FCC = 4,      /// FCC
576     RegKind_MSA128 = 8,   /// MSA128[BHWD] (makes no difference which)
577     RegKind_MSACtrl = 16, /// MSA control registers
578     RegKind_COP2 = 32,    /// COP2
579     RegKind_ACC = 64,     /// HI32DSP, LO32DSP, and ACC64DSP (depending on
580                           /// context).
581     RegKind_CCR = 128,    /// CCR
582     RegKind_HWRegs = 256, /// HWRegs
583     RegKind_COP3 = 512,   /// COP3
584     RegKind_COP0 = 1024,  /// COP0
585     /// Potentially any (e.g. $1)
586     RegKind_Numeric = RegKind_GPR | RegKind_FGR | RegKind_FCC | RegKind_MSA128 |
587                       RegKind_MSACtrl | RegKind_COP2 | RegKind_ACC |
588                       RegKind_CCR | RegKind_HWRegs | RegKind_COP3 | RegKind_COP0
589   };
590 
591 private:
592   enum KindTy {
593     k_Immediate,     /// An immediate (possibly involving symbol references)
594     k_Memory,        /// Base + Offset Memory Address
595     k_PhysRegister,  /// A physical register from the Mips namespace
596     k_RegisterIndex, /// A register index in one or more RegKind.
597     k_Token,         /// A simple token
598     k_RegList,       /// A physical register list
599     k_RegPair        /// A pair of physical register
600   } Kind;
601 
602 public:
603   MipsOperand(KindTy K, MipsAsmParser &Parser)
604       : MCParsedAsmOperand(), Kind(K), AsmParser(Parser) {}
605 
606 private:
607   /// For diagnostics, and checking the assembler temporary
608   MipsAsmParser &AsmParser;
609 
610   struct Token {
611     const char *Data;
612     unsigned Length;
613   };
614 
615   struct PhysRegOp {
616     unsigned Num; /// Register Number
617   };
618 
619   struct RegIdxOp {
620     unsigned Index; /// Index into the register class
621     RegKind Kind;   /// Bitfield of the kinds it could possibly be
622     const MCRegisterInfo *RegInfo;
623   };
624 
625   struct ImmOp {
626     const MCExpr *Val;
627   };
628 
629   struct MemOp {
630     MipsOperand *Base;
631     const MCExpr *Off;
632   };
633 
634   struct RegListOp {
635     SmallVector<unsigned, 10> *List;
636   };
637 
638   union {
639     struct Token Tok;
640     struct PhysRegOp PhysReg;
641     struct RegIdxOp RegIdx;
642     struct ImmOp Imm;
643     struct MemOp Mem;
644     struct RegListOp RegList;
645   };
646 
647   SMLoc StartLoc, EndLoc;
648 
649   /// Internal constructor for register kinds
650   static std::unique_ptr<MipsOperand> CreateReg(unsigned Index, RegKind RegKind,
651                                                 const MCRegisterInfo *RegInfo,
652                                                 SMLoc S, SMLoc E,
653                                                 MipsAsmParser &Parser) {
654     auto Op = make_unique<MipsOperand>(k_RegisterIndex, Parser);
655     Op->RegIdx.Index = Index;
656     Op->RegIdx.RegInfo = RegInfo;
657     Op->RegIdx.Kind = RegKind;
658     Op->StartLoc = S;
659     Op->EndLoc = E;
660     return Op;
661   }
662 
663 public:
664   /// Coerce the register to GPR32 and return the real register for the current
665   /// target.
666   unsigned getGPR32Reg() const {
667     assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!");
668     AsmParser.warnIfRegIndexIsAT(RegIdx.Index, StartLoc);
669     unsigned ClassID = Mips::GPR32RegClassID;
670     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
671   }
672 
673   /// Coerce the register to GPR32 and return the real register for the current
674   /// target.
675   unsigned getGPRMM16Reg() const {
676     assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!");
677     unsigned ClassID = Mips::GPR32RegClassID;
678     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
679   }
680 
681   /// Coerce the register to GPR64 and return the real register for the current
682   /// target.
683   unsigned getGPR64Reg() const {
684     assert(isRegIdx() && (RegIdx.Kind & RegKind_GPR) && "Invalid access!");
685     unsigned ClassID = Mips::GPR64RegClassID;
686     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
687   }
688 
689 private:
690   /// Coerce the register to AFGR64 and return the real register for the current
691   /// target.
692   unsigned getAFGR64Reg() const {
693     assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!");
694     if (RegIdx.Index % 2 != 0)
695       AsmParser.Warning(StartLoc, "Float register should be even.");
696     return RegIdx.RegInfo->getRegClass(Mips::AFGR64RegClassID)
697         .getRegister(RegIdx.Index / 2);
698   }
699 
700   /// Coerce the register to FGR64 and return the real register for the current
701   /// target.
702   unsigned getFGR64Reg() const {
703     assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!");
704     return RegIdx.RegInfo->getRegClass(Mips::FGR64RegClassID)
705         .getRegister(RegIdx.Index);
706   }
707 
708   /// Coerce the register to FGR32 and return the real register for the current
709   /// target.
710   unsigned getFGR32Reg() const {
711     assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!");
712     return RegIdx.RegInfo->getRegClass(Mips::FGR32RegClassID)
713         .getRegister(RegIdx.Index);
714   }
715 
716   /// Coerce the register to FGRH32 and return the real register for the current
717   /// target.
718   unsigned getFGRH32Reg() const {
719     assert(isRegIdx() && (RegIdx.Kind & RegKind_FGR) && "Invalid access!");
720     return RegIdx.RegInfo->getRegClass(Mips::FGRH32RegClassID)
721         .getRegister(RegIdx.Index);
722   }
723 
724   /// Coerce the register to FCC and return the real register for the current
725   /// target.
726   unsigned getFCCReg() const {
727     assert(isRegIdx() && (RegIdx.Kind & RegKind_FCC) && "Invalid access!");
728     return RegIdx.RegInfo->getRegClass(Mips::FCCRegClassID)
729         .getRegister(RegIdx.Index);
730   }
731 
732   /// Coerce the register to MSA128 and return the real register for the current
733   /// target.
734   unsigned getMSA128Reg() const {
735     assert(isRegIdx() && (RegIdx.Kind & RegKind_MSA128) && "Invalid access!");
736     // It doesn't matter which of the MSA128[BHWD] classes we use. They are all
737     // identical
738     unsigned ClassID = Mips::MSA128BRegClassID;
739     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
740   }
741 
742   /// Coerce the register to MSACtrl and return the real register for the
743   /// current target.
744   unsigned getMSACtrlReg() const {
745     assert(isRegIdx() && (RegIdx.Kind & RegKind_MSACtrl) && "Invalid access!");
746     unsigned ClassID = Mips::MSACtrlRegClassID;
747     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
748   }
749 
750   /// Coerce the register to COP0 and return the real register for the
751   /// current target.
752   unsigned getCOP0Reg() const {
753     assert(isRegIdx() && (RegIdx.Kind & RegKind_COP0) && "Invalid access!");
754     unsigned ClassID = Mips::COP0RegClassID;
755     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
756   }
757 
758   /// Coerce the register to COP2 and return the real register for the
759   /// current target.
760   unsigned getCOP2Reg() const {
761     assert(isRegIdx() && (RegIdx.Kind & RegKind_COP2) && "Invalid access!");
762     unsigned ClassID = Mips::COP2RegClassID;
763     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
764   }
765 
766   /// Coerce the register to COP3 and return the real register for the
767   /// current target.
768   unsigned getCOP3Reg() const {
769     assert(isRegIdx() && (RegIdx.Kind & RegKind_COP3) && "Invalid access!");
770     unsigned ClassID = Mips::COP3RegClassID;
771     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
772   }
773 
774   /// Coerce the register to ACC64DSP and return the real register for the
775   /// current target.
776   unsigned getACC64DSPReg() const {
777     assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!");
778     unsigned ClassID = Mips::ACC64DSPRegClassID;
779     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
780   }
781 
782   /// Coerce the register to HI32DSP and return the real register for the
783   /// current target.
784   unsigned getHI32DSPReg() const {
785     assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!");
786     unsigned ClassID = Mips::HI32DSPRegClassID;
787     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
788   }
789 
790   /// Coerce the register to LO32DSP and return the real register for the
791   /// current target.
792   unsigned getLO32DSPReg() const {
793     assert(isRegIdx() && (RegIdx.Kind & RegKind_ACC) && "Invalid access!");
794     unsigned ClassID = Mips::LO32DSPRegClassID;
795     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
796   }
797 
798   /// Coerce the register to CCR and return the real register for the
799   /// current target.
800   unsigned getCCRReg() const {
801     assert(isRegIdx() && (RegIdx.Kind & RegKind_CCR) && "Invalid access!");
802     unsigned ClassID = Mips::CCRRegClassID;
803     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
804   }
805 
806   /// Coerce the register to HWRegs and return the real register for the
807   /// current target.
808   unsigned getHWRegsReg() const {
809     assert(isRegIdx() && (RegIdx.Kind & RegKind_HWRegs) && "Invalid access!");
810     unsigned ClassID = Mips::HWRegsRegClassID;
811     return RegIdx.RegInfo->getRegClass(ClassID).getRegister(RegIdx.Index);
812   }
813 
814 public:
815   void addExpr(MCInst &Inst, const MCExpr *Expr) const {
816     // Add as immediate when possible.  Null MCExpr = 0.
817     if (!Expr)
818       Inst.addOperand(MCOperand::createImm(0));
819     else if (const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(Expr))
820       Inst.addOperand(MCOperand::createImm(CE->getValue()));
821     else
822       Inst.addOperand(MCOperand::createExpr(Expr));
823   }
824 
825   void addRegOperands(MCInst &Inst, unsigned N) const {
826     llvm_unreachable("Use a custom parser instead");
827   }
828 
829   /// Render the operand to an MCInst as a GPR32
830   /// Asserts if the wrong number of operands are requested, or the operand
831   /// is not a k_RegisterIndex compatible with RegKind_GPR
832   void addGPR32AsmRegOperands(MCInst &Inst, unsigned N) const {
833     assert(N == 1 && "Invalid number of operands!");
834     Inst.addOperand(MCOperand::createReg(getGPR32Reg()));
835   }
836 
837   void addGPRMM16AsmRegOperands(MCInst &Inst, unsigned N) const {
838     assert(N == 1 && "Invalid number of operands!");
839     Inst.addOperand(MCOperand::createReg(getGPRMM16Reg()));
840   }
841 
842   void addGPRMM16AsmRegZeroOperands(MCInst &Inst, unsigned N) const {
843     assert(N == 1 && "Invalid number of operands!");
844     Inst.addOperand(MCOperand::createReg(getGPRMM16Reg()));
845   }
846 
847   void addGPRMM16AsmRegMovePOperands(MCInst &Inst, unsigned N) const {
848     assert(N == 1 && "Invalid number of operands!");
849     Inst.addOperand(MCOperand::createReg(getGPRMM16Reg()));
850   }
851 
852   /// Render the operand to an MCInst as a GPR64
853   /// Asserts if the wrong number of operands are requested, or the operand
854   /// is not a k_RegisterIndex compatible with RegKind_GPR
855   void addGPR64AsmRegOperands(MCInst &Inst, unsigned N) const {
856     assert(N == 1 && "Invalid number of operands!");
857     Inst.addOperand(MCOperand::createReg(getGPR64Reg()));
858   }
859 
860   void addAFGR64AsmRegOperands(MCInst &Inst, unsigned N) const {
861     assert(N == 1 && "Invalid number of operands!");
862     Inst.addOperand(MCOperand::createReg(getAFGR64Reg()));
863   }
864 
865   void addFGR64AsmRegOperands(MCInst &Inst, unsigned N) const {
866     assert(N == 1 && "Invalid number of operands!");
867     Inst.addOperand(MCOperand::createReg(getFGR64Reg()));
868   }
869 
870   void addFGR32AsmRegOperands(MCInst &Inst, unsigned N) const {
871     assert(N == 1 && "Invalid number of operands!");
872     Inst.addOperand(MCOperand::createReg(getFGR32Reg()));
873     // FIXME: We ought to do this for -integrated-as without -via-file-asm too.
874     if (!AsmParser.useOddSPReg() && RegIdx.Index & 1)
875       AsmParser.Error(StartLoc, "-mno-odd-spreg prohibits the use of odd FPU "
876                                 "registers");
877   }
878 
879   void addFGRH32AsmRegOperands(MCInst &Inst, unsigned N) const {
880     assert(N == 1 && "Invalid number of operands!");
881     Inst.addOperand(MCOperand::createReg(getFGRH32Reg()));
882   }
883 
884   void addFCCAsmRegOperands(MCInst &Inst, unsigned N) const {
885     assert(N == 1 && "Invalid number of operands!");
886     Inst.addOperand(MCOperand::createReg(getFCCReg()));
887   }
888 
889   void addMSA128AsmRegOperands(MCInst &Inst, unsigned N) const {
890     assert(N == 1 && "Invalid number of operands!");
891     Inst.addOperand(MCOperand::createReg(getMSA128Reg()));
892   }
893 
894   void addMSACtrlAsmRegOperands(MCInst &Inst, unsigned N) const {
895     assert(N == 1 && "Invalid number of operands!");
896     Inst.addOperand(MCOperand::createReg(getMSACtrlReg()));
897   }
898 
899   void addCOP0AsmRegOperands(MCInst &Inst, unsigned N) const {
900     assert(N == 1 && "Invalid number of operands!");
901     Inst.addOperand(MCOperand::createReg(getCOP0Reg()));
902   }
903 
904   void addCOP2AsmRegOperands(MCInst &Inst, unsigned N) const {
905     assert(N == 1 && "Invalid number of operands!");
906     Inst.addOperand(MCOperand::createReg(getCOP2Reg()));
907   }
908 
909   void addCOP3AsmRegOperands(MCInst &Inst, unsigned N) const {
910     assert(N == 1 && "Invalid number of operands!");
911     Inst.addOperand(MCOperand::createReg(getCOP3Reg()));
912   }
913 
914   void addACC64DSPAsmRegOperands(MCInst &Inst, unsigned N) const {
915     assert(N == 1 && "Invalid number of operands!");
916     Inst.addOperand(MCOperand::createReg(getACC64DSPReg()));
917   }
918 
919   void addHI32DSPAsmRegOperands(MCInst &Inst, unsigned N) const {
920     assert(N == 1 && "Invalid number of operands!");
921     Inst.addOperand(MCOperand::createReg(getHI32DSPReg()));
922   }
923 
924   void addLO32DSPAsmRegOperands(MCInst &Inst, unsigned N) const {
925     assert(N == 1 && "Invalid number of operands!");
926     Inst.addOperand(MCOperand::createReg(getLO32DSPReg()));
927   }
928 
929   void addCCRAsmRegOperands(MCInst &Inst, unsigned N) const {
930     assert(N == 1 && "Invalid number of operands!");
931     Inst.addOperand(MCOperand::createReg(getCCRReg()));
932   }
933 
934   void addHWRegsAsmRegOperands(MCInst &Inst, unsigned N) const {
935     assert(N == 1 && "Invalid number of operands!");
936     Inst.addOperand(MCOperand::createReg(getHWRegsReg()));
937   }
938 
939   template <unsigned Bits, int Offset = 0, int AdjustOffset = 0>
940   void addConstantUImmOperands(MCInst &Inst, unsigned N) const {
941     assert(N == 1 && "Invalid number of operands!");
942     uint64_t Imm = getConstantImm() - Offset;
943     Imm &= (1 << Bits) - 1;
944     Imm += Offset;
945     Imm += AdjustOffset;
946     Inst.addOperand(MCOperand::createImm(Imm));
947   }
948 
949   template <unsigned Bits>
950   void addSImmOperands(MCInst &Inst, unsigned N) const {
951     if (isImm() && !isConstantImm()) {
952       addExpr(Inst, getImm());
953       return;
954     }
955     addConstantSImmOperands<Bits, 0, 0>(Inst, N);
956   }
957 
958   template <unsigned Bits>
959   void addUImmOperands(MCInst &Inst, unsigned N) const {
960     if (isImm() && !isConstantImm()) {
961       addExpr(Inst, getImm());
962       return;
963     }
964     addConstantUImmOperands<Bits, 0, 0>(Inst, N);
965   }
966 
967   template <unsigned Bits, int Offset = 0, int AdjustOffset = 0>
968   void addConstantSImmOperands(MCInst &Inst, unsigned N) const {
969     assert(N == 1 && "Invalid number of operands!");
970     int64_t Imm = getConstantImm() - Offset;
971     Imm = SignExtend64<Bits>(Imm);
972     Imm += Offset;
973     Imm += AdjustOffset;
974     Inst.addOperand(MCOperand::createImm(Imm));
975   }
976 
977   void addImmOperands(MCInst &Inst, unsigned N) const {
978     assert(N == 1 && "Invalid number of operands!");
979     const MCExpr *Expr = getImm();
980     addExpr(Inst, Expr);
981   }
982 
983   void addMemOperands(MCInst &Inst, unsigned N) const {
984     assert(N == 2 && "Invalid number of operands!");
985 
986     Inst.addOperand(MCOperand::createReg(AsmParser.getABI().ArePtrs64bit()
987                                              ? getMemBase()->getGPR64Reg()
988                                              : getMemBase()->getGPR32Reg()));
989 
990     const MCExpr *Expr = getMemOff();
991     addExpr(Inst, Expr);
992   }
993 
994   void addMicroMipsMemOperands(MCInst &Inst, unsigned N) const {
995     assert(N == 2 && "Invalid number of operands!");
996 
997     Inst.addOperand(MCOperand::createReg(getMemBase()->getGPRMM16Reg()));
998 
999     const MCExpr *Expr = getMemOff();
1000     addExpr(Inst, Expr);
1001   }
1002 
1003   void addRegListOperands(MCInst &Inst, unsigned N) const {
1004     assert(N == 1 && "Invalid number of operands!");
1005 
1006     for (auto RegNo : getRegList())
1007       Inst.addOperand(MCOperand::createReg(RegNo));
1008   }
1009 
1010   void addRegPairOperands(MCInst &Inst, unsigned N) const {
1011     assert(N == 2 && "Invalid number of operands!");
1012     unsigned RegNo = getRegPair();
1013     Inst.addOperand(MCOperand::createReg(RegNo++));
1014     Inst.addOperand(MCOperand::createReg(RegNo));
1015   }
1016 
1017   void addMovePRegPairOperands(MCInst &Inst, unsigned N) const {
1018     assert(N == 2 && "Invalid number of operands!");
1019     for (auto RegNo : getRegList())
1020       Inst.addOperand(MCOperand::createReg(RegNo));
1021   }
1022 
1023   bool isReg() const override {
1024     // As a special case until we sort out the definition of div/divu, pretend
1025     // that $0/$zero are k_PhysRegister so that MCK_ZERO works correctly.
1026     if (isGPRAsmReg() && RegIdx.Index == 0)
1027       return true;
1028 
1029     return Kind == k_PhysRegister;
1030   }
1031   bool isRegIdx() const { return Kind == k_RegisterIndex; }
1032   bool isImm() const override { return Kind == k_Immediate; }
1033   bool isConstantImm() const {
1034     return isImm() && isa<MCConstantExpr>(getImm());
1035   }
1036   bool isConstantImmz() const {
1037     return isConstantImm() && getConstantImm() == 0;
1038   }
1039   template <unsigned Bits, int Offset = 0> bool isConstantUImm() const {
1040     return isConstantImm() && isUInt<Bits>(getConstantImm() - Offset);
1041   }
1042   template <unsigned Bits> bool isSImm() const {
1043     return isConstantImm() ? isInt<Bits>(getConstantImm()) : isImm();
1044   }
1045   template <unsigned Bits> bool isUImm() const {
1046     return isConstantImm() ? isUInt<Bits>(getConstantImm()) : isImm();
1047   }
1048   template <unsigned Bits> bool isAnyImm() const {
1049     return isConstantImm() ? (isInt<Bits>(getConstantImm()) ||
1050                               isUInt<Bits>(getConstantImm()))
1051                            : isImm();
1052   }
1053   template <unsigned Bits, int Offset = 0> bool isConstantSImm() const {
1054     return isConstantImm() && isInt<Bits>(getConstantImm() - Offset);
1055   }
1056   template <unsigned Bottom, unsigned Top> bool isConstantUImmRange() const {
1057     return isConstantImm() && getConstantImm() >= Bottom &&
1058            getConstantImm() <= Top;
1059   }
1060   bool isToken() const override {
1061     // Note: It's not possible to pretend that other operand kinds are tokens.
1062     // The matcher emitter checks tokens first.
1063     return Kind == k_Token;
1064   }
1065   bool isMem() const override { return Kind == k_Memory; }
1066   bool isConstantMemOff() const {
1067     return isMem() && isa<MCConstantExpr>(getMemOff());
1068   }
1069   template <unsigned Bits, unsigned ShiftAmount = 0>
1070   bool isMemWithSimmOffset() const {
1071     return isMem() && isConstantMemOff() &&
1072            isShiftedInt<Bits, ShiftAmount>(getConstantMemOff()) &&
1073            getMemBase()->isGPRAsmReg();
1074   }
1075   template <unsigned Bits> bool isMemWithSimmOffsetGPR() const {
1076     return isMem() && isConstantMemOff() && isInt<Bits>(getConstantMemOff()) &&
1077            getMemBase()->isGPRAsmReg();
1078   }
1079   bool isMemWithGRPMM16Base() const {
1080     return isMem() && getMemBase()->isMM16AsmReg();
1081   }
1082   template <unsigned Bits> bool isMemWithUimmOffsetSP() const {
1083     return isMem() && isConstantMemOff() && isUInt<Bits>(getConstantMemOff())
1084       && getMemBase()->isRegIdx() && (getMemBase()->getGPR32Reg() == Mips::SP);
1085   }
1086   template <unsigned Bits> bool isMemWithUimmWordAlignedOffsetSP() const {
1087     return isMem() && isConstantMemOff() && isUInt<Bits>(getConstantMemOff())
1088       && (getConstantMemOff() % 4 == 0) && getMemBase()->isRegIdx()
1089       && (getMemBase()->getGPR32Reg() == Mips::SP);
1090   }
1091   template <unsigned Bits, unsigned ShiftLeftAmount>
1092   bool isScaledUImm() const {
1093     return isConstantImm() &&
1094            isShiftedUInt<Bits, ShiftLeftAmount>(getConstantImm());
1095   }
1096   template <unsigned Bits, unsigned ShiftLeftAmount>
1097   bool isScaledSImm() const {
1098     return isConstantImm() &&
1099            isShiftedInt<Bits, ShiftLeftAmount>(getConstantImm());
1100   }
1101   bool isRegList16() const {
1102     if (!isRegList())
1103       return false;
1104 
1105     int Size = RegList.List->size();
1106     if (Size < 2 || Size > 5)
1107       return false;
1108 
1109     unsigned R0 = RegList.List->front();
1110     unsigned R1 = RegList.List->back();
1111     if (!((R0 == Mips::S0 && R1 == Mips::RA) ||
1112           (R0 == Mips::S0_64 && R1 == Mips::RA_64)))
1113       return false;
1114 
1115     int PrevReg = *RegList.List->begin();
1116     for (int i = 1; i < Size - 1; i++) {
1117       int Reg = (*(RegList.List))[i];
1118       if ( Reg != PrevReg + 1)
1119         return false;
1120       PrevReg = Reg;
1121     }
1122 
1123     return true;
1124   }
1125   bool isInvNum() const { return Kind == k_Immediate; }
1126   bool isLSAImm() const {
1127     if (!isConstantImm())
1128       return false;
1129     int64_t Val = getConstantImm();
1130     return 1 <= Val && Val <= 4;
1131   }
1132   bool isRegList() const { return Kind == k_RegList; }
1133   bool isMovePRegPair() const {
1134     if (Kind != k_RegList || RegList.List->size() != 2)
1135       return false;
1136 
1137     unsigned R0 = RegList.List->front();
1138     unsigned R1 = RegList.List->back();
1139 
1140     if ((R0 == Mips::A1 && R1 == Mips::A2) ||
1141         (R0 == Mips::A1 && R1 == Mips::A3) ||
1142         (R0 == Mips::A2 && R1 == Mips::A3) ||
1143         (R0 == Mips::A0 && R1 == Mips::S5) ||
1144         (R0 == Mips::A0 && R1 == Mips::S6) ||
1145         (R0 == Mips::A0 && R1 == Mips::A1) ||
1146         (R0 == Mips::A0 && R1 == Mips::A2) ||
1147         (R0 == Mips::A0 && R1 == Mips::A3))
1148       return true;
1149 
1150     return false;
1151   }
1152 
1153   StringRef getToken() const {
1154     assert(Kind == k_Token && "Invalid access!");
1155     return StringRef(Tok.Data, Tok.Length);
1156   }
1157   bool isRegPair() const { return Kind == k_RegPair; }
1158 
1159   unsigned getReg() const override {
1160     // As a special case until we sort out the definition of div/divu, pretend
1161     // that $0/$zero are k_PhysRegister so that MCK_ZERO works correctly.
1162     if (Kind == k_RegisterIndex && RegIdx.Index == 0 &&
1163         RegIdx.Kind & RegKind_GPR)
1164       return getGPR32Reg(); // FIXME: GPR64 too
1165 
1166     assert(Kind == k_PhysRegister && "Invalid access!");
1167     return PhysReg.Num;
1168   }
1169 
1170   const MCExpr *getImm() const {
1171     assert((Kind == k_Immediate) && "Invalid access!");
1172     return Imm.Val;
1173   }
1174 
1175   int64_t getConstantImm() const {
1176     const MCExpr *Val = getImm();
1177     return static_cast<const MCConstantExpr *>(Val)->getValue();
1178   }
1179 
1180   MipsOperand *getMemBase() const {
1181     assert((Kind == k_Memory) && "Invalid access!");
1182     return Mem.Base;
1183   }
1184 
1185   const MCExpr *getMemOff() const {
1186     assert((Kind == k_Memory) && "Invalid access!");
1187     return Mem.Off;
1188   }
1189 
1190   int64_t getConstantMemOff() const {
1191     return static_cast<const MCConstantExpr *>(getMemOff())->getValue();
1192   }
1193 
1194   const SmallVectorImpl<unsigned> &getRegList() const {
1195     assert((Kind == k_RegList) && "Invalid access!");
1196     return *(RegList.List);
1197   }
1198 
1199   unsigned getRegPair() const {
1200     assert((Kind == k_RegPair) && "Invalid access!");
1201     return RegIdx.Index;
1202   }
1203 
1204   static std::unique_ptr<MipsOperand> CreateToken(StringRef Str, SMLoc S,
1205                                                   MipsAsmParser &Parser) {
1206     auto Op = make_unique<MipsOperand>(k_Token, Parser);
1207     Op->Tok.Data = Str.data();
1208     Op->Tok.Length = Str.size();
1209     Op->StartLoc = S;
1210     Op->EndLoc = S;
1211     return Op;
1212   }
1213 
1214   /// Create a numeric register (e.g. $1). The exact register remains
1215   /// unresolved until an instruction successfully matches
1216   static std::unique_ptr<MipsOperand>
1217   createNumericReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S,
1218                    SMLoc E, MipsAsmParser &Parser) {
1219     DEBUG(dbgs() << "createNumericReg(" << Index << ", ...)\n");
1220     return CreateReg(Index, RegKind_Numeric, RegInfo, S, E, Parser);
1221   }
1222 
1223   /// Create a register that is definitely a GPR.
1224   /// This is typically only used for named registers such as $gp.
1225   static std::unique_ptr<MipsOperand>
1226   createGPRReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E,
1227                MipsAsmParser &Parser) {
1228     return CreateReg(Index, RegKind_GPR, RegInfo, S, E, Parser);
1229   }
1230 
1231   /// Create a register that is definitely a FGR.
1232   /// This is typically only used for named registers such as $f0.
1233   static std::unique_ptr<MipsOperand>
1234   createFGRReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E,
1235                MipsAsmParser &Parser) {
1236     return CreateReg(Index, RegKind_FGR, RegInfo, S, E, Parser);
1237   }
1238 
1239   /// Create a register that is definitely a HWReg.
1240   /// This is typically only used for named registers such as $hwr_cpunum.
1241   static std::unique_ptr<MipsOperand>
1242   createHWRegsReg(unsigned Index, const MCRegisterInfo *RegInfo,
1243                   SMLoc S, SMLoc E, MipsAsmParser &Parser) {
1244     return CreateReg(Index, RegKind_HWRegs, RegInfo, S, E, Parser);
1245   }
1246 
1247   /// Create a register that is definitely an FCC.
1248   /// This is typically only used for named registers such as $fcc0.
1249   static std::unique_ptr<MipsOperand>
1250   createFCCReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E,
1251                MipsAsmParser &Parser) {
1252     return CreateReg(Index, RegKind_FCC, RegInfo, S, E, Parser);
1253   }
1254 
1255   /// Create a register that is definitely an ACC.
1256   /// This is typically only used for named registers such as $ac0.
1257   static std::unique_ptr<MipsOperand>
1258   createACCReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S, SMLoc E,
1259                MipsAsmParser &Parser) {
1260     return CreateReg(Index, RegKind_ACC, RegInfo, S, E, Parser);
1261   }
1262 
1263   /// Create a register that is definitely an MSA128.
1264   /// This is typically only used for named registers such as $w0.
1265   static std::unique_ptr<MipsOperand>
1266   createMSA128Reg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S,
1267                   SMLoc E, MipsAsmParser &Parser) {
1268     return CreateReg(Index, RegKind_MSA128, RegInfo, S, E, Parser);
1269   }
1270 
1271   /// Create a register that is definitely an MSACtrl.
1272   /// This is typically only used for named registers such as $msaaccess.
1273   static std::unique_ptr<MipsOperand>
1274   createMSACtrlReg(unsigned Index, const MCRegisterInfo *RegInfo, SMLoc S,
1275                    SMLoc E, MipsAsmParser &Parser) {
1276     return CreateReg(Index, RegKind_MSACtrl, RegInfo, S, E, Parser);
1277   }
1278 
1279   static std::unique_ptr<MipsOperand>
1280   CreateImm(const MCExpr *Val, SMLoc S, SMLoc E, MipsAsmParser &Parser) {
1281     auto Op = make_unique<MipsOperand>(k_Immediate, Parser);
1282     Op->Imm.Val = Val;
1283     Op->StartLoc = S;
1284     Op->EndLoc = E;
1285     return Op;
1286   }
1287 
1288   static std::unique_ptr<MipsOperand>
1289   CreateMem(std::unique_ptr<MipsOperand> Base, const MCExpr *Off, SMLoc S,
1290             SMLoc E, MipsAsmParser &Parser) {
1291     auto Op = make_unique<MipsOperand>(k_Memory, Parser);
1292     Op->Mem.Base = Base.release();
1293     Op->Mem.Off = Off;
1294     Op->StartLoc = S;
1295     Op->EndLoc = E;
1296     return Op;
1297   }
1298 
1299   static std::unique_ptr<MipsOperand>
1300   CreateRegList(SmallVectorImpl<unsigned> &Regs, SMLoc StartLoc, SMLoc EndLoc,
1301                 MipsAsmParser &Parser) {
1302     assert (Regs.size() > 0 && "Empty list not allowed");
1303 
1304     auto Op = make_unique<MipsOperand>(k_RegList, Parser);
1305     Op->RegList.List = new SmallVector<unsigned, 10>(Regs.begin(), Regs.end());
1306     Op->StartLoc = StartLoc;
1307     Op->EndLoc = EndLoc;
1308     return Op;
1309   }
1310 
1311   static std::unique_ptr<MipsOperand>
1312   CreateRegPair(unsigned RegNo, SMLoc S, SMLoc E, MipsAsmParser &Parser) {
1313     auto Op = make_unique<MipsOperand>(k_RegPair, Parser);
1314     Op->RegIdx.Index = RegNo;
1315     Op->StartLoc = S;
1316     Op->EndLoc = E;
1317     return Op;
1318   }
1319 
1320   bool isGPRAsmReg() const {
1321     return isRegIdx() && RegIdx.Kind & RegKind_GPR && RegIdx.Index <= 31;
1322   }
1323   bool isMM16AsmReg() const {
1324     if (!(isRegIdx() && RegIdx.Kind))
1325       return false;
1326     return ((RegIdx.Index >= 2 && RegIdx.Index <= 7)
1327             || RegIdx.Index == 16 || RegIdx.Index == 17);
1328   }
1329   bool isMM16AsmRegZero() const {
1330     if (!(isRegIdx() && RegIdx.Kind))
1331       return false;
1332     return (RegIdx.Index == 0 ||
1333             (RegIdx.Index >= 2 && RegIdx.Index <= 7) ||
1334             RegIdx.Index == 17);
1335   }
1336   bool isMM16AsmRegMoveP() const {
1337     if (!(isRegIdx() && RegIdx.Kind))
1338       return false;
1339     return (RegIdx.Index == 0 || (RegIdx.Index >= 2 && RegIdx.Index <= 3) ||
1340       (RegIdx.Index >= 16 && RegIdx.Index <= 20));
1341   }
1342   bool isFGRAsmReg() const {
1343     // AFGR64 is $0-$15 but we handle this in getAFGR64()
1344     return isRegIdx() && RegIdx.Kind & RegKind_FGR && RegIdx.Index <= 31;
1345   }
1346   bool isHWRegsAsmReg() const {
1347     return isRegIdx() && RegIdx.Kind & RegKind_HWRegs && RegIdx.Index <= 31;
1348   }
1349   bool isCCRAsmReg() const {
1350     return isRegIdx() && RegIdx.Kind & RegKind_CCR && RegIdx.Index <= 31;
1351   }
1352   bool isFCCAsmReg() const {
1353     if (!(isRegIdx() && RegIdx.Kind & RegKind_FCC))
1354       return false;
1355     if (!AsmParser.hasEightFccRegisters())
1356       return RegIdx.Index == 0;
1357     return RegIdx.Index <= 7;
1358   }
1359   bool isACCAsmReg() const {
1360     return isRegIdx() && RegIdx.Kind & RegKind_ACC && RegIdx.Index <= 3;
1361   }
1362   bool isCOP0AsmReg() const {
1363     return isRegIdx() && RegIdx.Kind & RegKind_COP0 && RegIdx.Index <= 31;
1364   }
1365   bool isCOP2AsmReg() const {
1366     return isRegIdx() && RegIdx.Kind & RegKind_COP2 && RegIdx.Index <= 31;
1367   }
1368   bool isCOP3AsmReg() const {
1369     return isRegIdx() && RegIdx.Kind & RegKind_COP3 && RegIdx.Index <= 31;
1370   }
1371   bool isMSA128AsmReg() const {
1372     return isRegIdx() && RegIdx.Kind & RegKind_MSA128 && RegIdx.Index <= 31;
1373   }
1374   bool isMSACtrlAsmReg() const {
1375     return isRegIdx() && RegIdx.Kind & RegKind_MSACtrl && RegIdx.Index <= 7;
1376   }
1377 
1378   /// getStartLoc - Get the location of the first token of this operand.
1379   SMLoc getStartLoc() const override { return StartLoc; }
1380   /// getEndLoc - Get the location of the last token of this operand.
1381   SMLoc getEndLoc() const override { return EndLoc; }
1382 
1383   virtual ~MipsOperand() {
1384     switch (Kind) {
1385     case k_Immediate:
1386       break;
1387     case k_Memory:
1388       delete Mem.Base;
1389       break;
1390     case k_RegList:
1391       delete RegList.List;
1392     case k_PhysRegister:
1393     case k_RegisterIndex:
1394     case k_Token:
1395     case k_RegPair:
1396       break;
1397     }
1398   }
1399 
1400   void print(raw_ostream &OS) const override {
1401     switch (Kind) {
1402     case k_Immediate:
1403       OS << "Imm<";
1404       OS << *Imm.Val;
1405       OS << ">";
1406       break;
1407     case k_Memory:
1408       OS << "Mem<";
1409       Mem.Base->print(OS);
1410       OS << ", ";
1411       OS << *Mem.Off;
1412       OS << ">";
1413       break;
1414     case k_PhysRegister:
1415       OS << "PhysReg<" << PhysReg.Num << ">";
1416       break;
1417     case k_RegisterIndex:
1418       OS << "RegIdx<" << RegIdx.Index << ":" << RegIdx.Kind << ">";
1419       break;
1420     case k_Token:
1421       OS << Tok.Data;
1422       break;
1423     case k_RegList:
1424       OS << "RegList< ";
1425       for (auto Reg : (*RegList.List))
1426         OS << Reg << " ";
1427       OS <<  ">";
1428       break;
1429     case k_RegPair:
1430       OS << "RegPair<" << RegIdx.Index << "," << RegIdx.Index + 1 << ">";
1431       break;
1432     }
1433   }
1434 }; // class MipsOperand
1435 } // namespace
1436 
1437 namespace llvm {
1438 extern const MCInstrDesc MipsInsts[];
1439 }
1440 static const MCInstrDesc &getInstDesc(unsigned Opcode) {
1441   return MipsInsts[Opcode];
1442 }
1443 
1444 static bool hasShortDelaySlot(unsigned Opcode) {
1445   switch (Opcode) {
1446     case Mips::JALS_MM:
1447     case Mips::JALRS_MM:
1448     case Mips::JALRS16_MM:
1449     case Mips::BGEZALS_MM:
1450     case Mips::BLTZALS_MM:
1451       return true;
1452     default:
1453       return false;
1454   }
1455 }
1456 
1457 static const MCSymbol *getSingleMCSymbol(const MCExpr *Expr) {
1458   if (const MCSymbolRefExpr *SRExpr = dyn_cast<MCSymbolRefExpr>(Expr)) {
1459     return &SRExpr->getSymbol();
1460   }
1461 
1462   if (const MCBinaryExpr *BExpr = dyn_cast<MCBinaryExpr>(Expr)) {
1463     const MCSymbol *LHSSym = getSingleMCSymbol(BExpr->getLHS());
1464     const MCSymbol *RHSSym = getSingleMCSymbol(BExpr->getRHS());
1465 
1466     if (LHSSym)
1467       return LHSSym;
1468 
1469     if (RHSSym)
1470       return RHSSym;
1471 
1472     return nullptr;
1473   }
1474 
1475   if (const MCUnaryExpr *UExpr = dyn_cast<MCUnaryExpr>(Expr))
1476     return getSingleMCSymbol(UExpr->getSubExpr());
1477 
1478   return nullptr;
1479 }
1480 
1481 static unsigned countMCSymbolRefExpr(const MCExpr *Expr) {
1482   if (isa<MCSymbolRefExpr>(Expr))
1483     return 1;
1484 
1485   if (const MCBinaryExpr *BExpr = dyn_cast<MCBinaryExpr>(Expr))
1486     return countMCSymbolRefExpr(BExpr->getLHS()) +
1487            countMCSymbolRefExpr(BExpr->getRHS());
1488 
1489   if (const MCUnaryExpr *UExpr = dyn_cast<MCUnaryExpr>(Expr))
1490     return countMCSymbolRefExpr(UExpr->getSubExpr());
1491 
1492   return 0;
1493 }
1494 
1495 namespace {
1496 void emitRX(unsigned Opcode, unsigned Reg0, MCOperand Op1, SMLoc IDLoc,
1497             MCStreamer &Out, const MCSubtargetInfo *STI) {
1498   MCInst tmpInst;
1499   tmpInst.setOpcode(Opcode);
1500   tmpInst.addOperand(MCOperand::createReg(Reg0));
1501   tmpInst.addOperand(Op1);
1502   tmpInst.setLoc(IDLoc);
1503   Out.EmitInstruction(tmpInst, *STI);
1504 }
1505 
1506 void emitRI(unsigned Opcode, unsigned Reg0, int32_t Imm, SMLoc IDLoc,
1507             MCStreamer &Out, const MCSubtargetInfo *STI) {
1508   emitRX(Opcode, Reg0, MCOperand::createImm(Imm), IDLoc, Out, STI);
1509 }
1510 
1511 void emitRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, SMLoc IDLoc,
1512             MCStreamer &Out, const MCSubtargetInfo *STI) {
1513   emitRX(Opcode, Reg0, MCOperand::createReg(Reg1), IDLoc, Out, STI);
1514 }
1515 
1516 void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,
1517             MCStreamer &Out, const MCSubtargetInfo *STI) {
1518   MCInst tmpInst;
1519   tmpInst.setOpcode(Opcode);
1520   tmpInst.addOperand(MCOperand::createImm(Imm1));
1521   tmpInst.addOperand(MCOperand::createImm(Imm2));
1522   tmpInst.setLoc(IDLoc);
1523   Out.EmitInstruction(tmpInst, *STI);
1524 }
1525 
1526 void emitR(unsigned Opcode, unsigned Reg0, SMLoc IDLoc,
1527            MCStreamer &Out, const MCSubtargetInfo *STI) {
1528   MCInst tmpInst;
1529   tmpInst.setOpcode(Opcode);
1530   tmpInst.addOperand(MCOperand::createReg(Reg0));
1531   tmpInst.setLoc(IDLoc);
1532   Out.EmitInstruction(tmpInst, *STI);
1533 }
1534 
1535 void emitRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, MCOperand Op2,
1536              SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) {
1537   MCInst tmpInst;
1538   tmpInst.setOpcode(Opcode);
1539   tmpInst.addOperand(MCOperand::createReg(Reg0));
1540   tmpInst.addOperand(MCOperand::createReg(Reg1));
1541   tmpInst.addOperand(Op2);
1542   tmpInst.setLoc(IDLoc);
1543   Out.EmitInstruction(tmpInst, *STI);
1544 }
1545 
1546 void emitRRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2,
1547              SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) {
1548   emitRRX(Opcode, Reg0, Reg1, MCOperand::createReg(Reg2), IDLoc, Out, STI);
1549 }
1550 
1551 void emitRRI(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm,
1552              SMLoc IDLoc, MCStreamer &Out, const MCSubtargetInfo *STI) {
1553   emitRRX(Opcode, Reg0, Reg1, MCOperand::createImm(Imm), IDLoc, Out, STI);
1554 }
1555 
1556 void emitAppropriateDSLL(unsigned DstReg, unsigned SrcReg, int16_t ShiftAmount,
1557                          SMLoc IDLoc, MCStreamer &Out,
1558                          const MCSubtargetInfo *STI) {
1559   if (ShiftAmount >= 32) {
1560     emitRRI(Mips::DSLL32, DstReg, SrcReg, ShiftAmount - 32, IDLoc, Out, STI);
1561     return;
1562   }
1563 
1564   emitRRI(Mips::DSLL, DstReg, SrcReg, ShiftAmount, IDLoc, Out, STI);
1565 }
1566 } // end anonymous namespace.
1567 
1568 bool MipsAsmParser::processInstruction(MCInst &Inst, SMLoc IDLoc,
1569                                        MCStreamer &Out,
1570                                        const MCSubtargetInfo *STI) {
1571   const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode());
1572   bool ExpandedJalSym = false;
1573 
1574   Inst.setLoc(IDLoc);
1575 
1576   if (MCID.isBranch() || MCID.isCall()) {
1577     const unsigned Opcode = Inst.getOpcode();
1578     MCOperand Offset;
1579 
1580     switch (Opcode) {
1581     default:
1582       break;
1583     case Mips::BBIT0:
1584     case Mips::BBIT032:
1585     case Mips::BBIT1:
1586     case Mips::BBIT132:
1587       assert(hasCnMips() && "instruction only valid for octeon cpus");
1588       // Fall through
1589 
1590     case Mips::BEQ:
1591     case Mips::BNE:
1592     case Mips::BEQ_MM:
1593     case Mips::BNE_MM:
1594       assert(MCID.getNumOperands() == 3 && "unexpected number of operands");
1595       Offset = Inst.getOperand(2);
1596       if (!Offset.isImm())
1597         break; // We'll deal with this situation later on when applying fixups.
1598       if (!isIntN(inMicroMipsMode() ? 17 : 18, Offset.getImm()))
1599         return Error(IDLoc, "branch target out of range");
1600       if (OffsetToAlignment(Offset.getImm(),
1601                             1LL << (inMicroMipsMode() ? 1 : 2)))
1602         return Error(IDLoc, "branch to misaligned address");
1603       break;
1604     case Mips::BGEZ:
1605     case Mips::BGTZ:
1606     case Mips::BLEZ:
1607     case Mips::BLTZ:
1608     case Mips::BGEZAL:
1609     case Mips::BLTZAL:
1610     case Mips::BC1F:
1611     case Mips::BC1T:
1612     case Mips::BGEZ_MM:
1613     case Mips::BGTZ_MM:
1614     case Mips::BLEZ_MM:
1615     case Mips::BLTZ_MM:
1616     case Mips::BGEZAL_MM:
1617     case Mips::BLTZAL_MM:
1618     case Mips::BC1F_MM:
1619     case Mips::BC1T_MM:
1620       assert(MCID.getNumOperands() == 2 && "unexpected number of operands");
1621       Offset = Inst.getOperand(1);
1622       if (!Offset.isImm())
1623         break; // We'll deal with this situation later on when applying fixups.
1624       if (!isIntN(inMicroMipsMode() ? 17 : 18, Offset.getImm()))
1625         return Error(IDLoc, "branch target out of range");
1626       if (OffsetToAlignment(Offset.getImm(),
1627                             1LL << (inMicroMipsMode() ? 1 : 2)))
1628         return Error(IDLoc, "branch to misaligned address");
1629       break;
1630     case Mips::BEQZ16_MM:
1631     case Mips::BEQZC16_MMR6:
1632     case Mips::BNEZ16_MM:
1633     case Mips::BNEZC16_MMR6:
1634       assert(MCID.getNumOperands() == 2 && "unexpected number of operands");
1635       Offset = Inst.getOperand(1);
1636       if (!Offset.isImm())
1637         break; // We'll deal with this situation later on when applying fixups.
1638       if (!isInt<8>(Offset.getImm()))
1639         return Error(IDLoc, "branch target out of range");
1640       if (OffsetToAlignment(Offset.getImm(), 2LL))
1641         return Error(IDLoc, "branch to misaligned address");
1642       break;
1643     }
1644   }
1645 
1646   // SSNOP is deprecated on MIPS32r6/MIPS64r6
1647   // We still accept it but it is a normal nop.
1648   if (hasMips32r6() && Inst.getOpcode() == Mips::SSNOP) {
1649     std::string ISA = hasMips64r6() ? "MIPS64r6" : "MIPS32r6";
1650     Warning(IDLoc, "ssnop is deprecated for " + ISA + " and is equivalent to a "
1651                                                       "nop instruction");
1652   }
1653 
1654   if (hasCnMips()) {
1655     const unsigned Opcode = Inst.getOpcode();
1656     MCOperand Opnd;
1657     int Imm;
1658 
1659     switch (Opcode) {
1660       default:
1661         break;
1662 
1663       case Mips::BBIT0:
1664       case Mips::BBIT032:
1665       case Mips::BBIT1:
1666       case Mips::BBIT132:
1667         assert(MCID.getNumOperands() == 3 && "unexpected number of operands");
1668         // The offset is handled above
1669         Opnd = Inst.getOperand(1);
1670         if (!Opnd.isImm())
1671           return Error(IDLoc, "expected immediate operand kind");
1672         Imm = Opnd.getImm();
1673         if (Imm < 0 || Imm > (Opcode == Mips::BBIT0 ||
1674                               Opcode == Mips::BBIT1 ? 63 : 31))
1675           return Error(IDLoc, "immediate operand value out of range");
1676         if (Imm > 31) {
1677           Inst.setOpcode(Opcode == Mips::BBIT0 ? Mips::BBIT032
1678                                                : Mips::BBIT132);
1679           Inst.getOperand(1).setImm(Imm - 32);
1680         }
1681         break;
1682 
1683       case Mips::SEQi:
1684       case Mips::SNEi:
1685         assert(MCID.getNumOperands() == 3 && "unexpected number of operands");
1686         Opnd = Inst.getOperand(2);
1687         if (!Opnd.isImm())
1688           return Error(IDLoc, "expected immediate operand kind");
1689         Imm = Opnd.getImm();
1690         if (!isInt<10>(Imm))
1691           return Error(IDLoc, "immediate operand value out of range");
1692         break;
1693     }
1694   }
1695 
1696   // This expansion is not in a function called by tryExpandInstruction()
1697   // because the pseudo-instruction doesn't have a distinct opcode.
1698   if ((Inst.getOpcode() == Mips::JAL || Inst.getOpcode() == Mips::JAL_MM) &&
1699       inPicMode()) {
1700     warnIfNoMacro(IDLoc);
1701 
1702     const MCExpr *JalExpr = Inst.getOperand(0).getExpr();
1703 
1704     // We can do this expansion if there's only 1 symbol in the argument
1705     // expression.
1706     if (countMCSymbolRefExpr(JalExpr) > 1)
1707       return Error(IDLoc, "jal doesn't support multiple symbols in PIC mode");
1708 
1709     // FIXME: This is checking the expression can be handled by the later stages
1710     //        of the assembler. We ought to leave it to those later stages but
1711     //        we can't do that until we stop evaluateRelocExpr() rewriting the
1712     //        expressions into non-equivalent forms.
1713     const MCSymbol *JalSym = getSingleMCSymbol(JalExpr);
1714 
1715     // FIXME: Add support for label+offset operands (currently causes an error).
1716     // FIXME: Add support for forward-declared local symbols.
1717     // FIXME: Add expansion for when the LargeGOT option is enabled.
1718     if (JalSym->isInSection() || JalSym->isTemporary()) {
1719       if (isABI_O32()) {
1720         // If it's a local symbol and the O32 ABI is being used, we expand to:
1721         //  lw $25, 0($gp)
1722         //    R_(MICRO)MIPS_GOT16  label
1723         //  addiu $25, $25, 0
1724         //    R_(MICRO)MIPS_LO16   label
1725         //  jalr  $25
1726         const MCExpr *Got16RelocExpr = evaluateRelocExpr(JalExpr, "got");
1727         const MCExpr *Lo16RelocExpr = evaluateRelocExpr(JalExpr, "lo");
1728 
1729         emitRRX(Mips::LW, Mips::T9, Mips::GP,
1730                 MCOperand::createExpr(Got16RelocExpr), IDLoc, Out, STI);
1731         emitRRX(Mips::ADDiu, Mips::T9, Mips::T9,
1732                 MCOperand::createExpr(Lo16RelocExpr), IDLoc, Out, STI);
1733       } else if (isABI_N32() || isABI_N64()) {
1734         // If it's a local symbol and the N32/N64 ABIs are being used,
1735         // we expand to:
1736         //  lw/ld $25, 0($gp)
1737         //    R_(MICRO)MIPS_GOT_DISP  label
1738         //  jalr  $25
1739         const MCExpr *GotDispRelocExpr = evaluateRelocExpr(JalExpr, "got_disp");
1740 
1741         emitRRX(ABI.ArePtrs64bit() ? Mips::LD : Mips::LW, Mips::T9, Mips::GP,
1742                 MCOperand::createExpr(GotDispRelocExpr), IDLoc, Out, STI);
1743       }
1744     } else {
1745       // If it's an external/weak symbol, we expand to:
1746       //  lw/ld    $25, 0($gp)
1747       //    R_(MICRO)MIPS_CALL16  label
1748       //  jalr  $25
1749       const MCExpr *Call16RelocExpr = evaluateRelocExpr(JalExpr, "call16");
1750 
1751       emitRRX(ABI.ArePtrs64bit() ? Mips::LD : Mips::LW, Mips::T9, Mips::GP,
1752               MCOperand::createExpr(Call16RelocExpr), IDLoc, Out, STI);
1753     }
1754 
1755     MCInst JalrInst;
1756     if (IsCpRestoreSet && inMicroMipsMode())
1757       JalrInst.setOpcode(Mips::JALRS_MM);
1758     else
1759       JalrInst.setOpcode(inMicroMipsMode() ? Mips::JALR_MM : Mips::JALR);
1760     JalrInst.addOperand(MCOperand::createReg(Mips::RA));
1761     JalrInst.addOperand(MCOperand::createReg(Mips::T9));
1762 
1763     // FIXME: Add an R_(MICRO)MIPS_JALR relocation after the JALR.
1764     // This relocation is supposed to be an optimization hint for the linker
1765     // and is not necessary for correctness.
1766 
1767     Inst = JalrInst;
1768     ExpandedJalSym = true;
1769   }
1770 
1771   if (MCID.mayLoad() || MCID.mayStore()) {
1772     // Check the offset of memory operand, if it is a symbol
1773     // reference or immediate we may have to expand instructions.
1774     for (unsigned i = 0; i < MCID.getNumOperands(); i++) {
1775       const MCOperandInfo &OpInfo = MCID.OpInfo[i];
1776       if ((OpInfo.OperandType == MCOI::OPERAND_MEMORY) ||
1777           (OpInfo.OperandType == MCOI::OPERAND_UNKNOWN)) {
1778         MCOperand &Op = Inst.getOperand(i);
1779         if (Op.isImm()) {
1780           int MemOffset = Op.getImm();
1781           if (MemOffset < -32768 || MemOffset > 32767) {
1782             // Offset can't exceed 16bit value.
1783             expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad(), true);
1784             return false;
1785           }
1786         } else if (Op.isExpr()) {
1787           const MCExpr *Expr = Op.getExpr();
1788           if (Expr->getKind() == MCExpr::SymbolRef) {
1789             const MCSymbolRefExpr *SR =
1790                 static_cast<const MCSymbolRefExpr *>(Expr);
1791             if (SR->getKind() == MCSymbolRefExpr::VK_None) {
1792               // Expand symbol.
1793               expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad(), false);
1794               return false;
1795             }
1796           } else if (!isEvaluated(Expr)) {
1797             expandMemInst(Inst, IDLoc, Out, STI, MCID.mayLoad(), false);
1798             return false;
1799           }
1800         }
1801       }
1802     } // for
1803   }   // if load/store
1804 
1805   if (inMicroMipsMode()) {
1806     if (MCID.mayLoad()) {
1807       // Try to create 16-bit GP relative load instruction.
1808       for (unsigned i = 0; i < MCID.getNumOperands(); i++) {
1809         const MCOperandInfo &OpInfo = MCID.OpInfo[i];
1810         if ((OpInfo.OperandType == MCOI::OPERAND_MEMORY) ||
1811             (OpInfo.OperandType == MCOI::OPERAND_UNKNOWN)) {
1812           MCOperand &Op = Inst.getOperand(i);
1813           if (Op.isImm()) {
1814             int MemOffset = Op.getImm();
1815             MCOperand &DstReg = Inst.getOperand(0);
1816             MCOperand &BaseReg = Inst.getOperand(1);
1817             if (isInt<9>(MemOffset) && (MemOffset % 4 == 0) &&
1818                 getContext().getRegisterInfo()->getRegClass(
1819                   Mips::GPRMM16RegClassID).contains(DstReg.getReg()) &&
1820                 (BaseReg.getReg() == Mips::GP ||
1821                 BaseReg.getReg() == Mips::GP_64)) {
1822 
1823               emitRRI(Mips::LWGP_MM, DstReg.getReg(), Mips::GP, MemOffset,
1824                       IDLoc, Out, STI);
1825               return false;
1826             }
1827           }
1828         }
1829       } // for
1830     }   // if load
1831 
1832     // TODO: Handle this with the AsmOperandClass.PredicateMethod.
1833 
1834     MCOperand Opnd;
1835     int Imm;
1836 
1837     switch (Inst.getOpcode()) {
1838       default:
1839         break;
1840       case Mips::ADDIUSP_MM:
1841         Opnd = Inst.getOperand(0);
1842         if (!Opnd.isImm())
1843           return Error(IDLoc, "expected immediate operand kind");
1844         Imm = Opnd.getImm();
1845         if (Imm < -1032 || Imm > 1028 || (Imm < 8 && Imm > -12) ||
1846             Imm % 4 != 0)
1847           return Error(IDLoc, "immediate operand value out of range");
1848         break;
1849       case Mips::SLL16_MM:
1850       case Mips::SRL16_MM:
1851         Opnd = Inst.getOperand(2);
1852         if (!Opnd.isImm())
1853           return Error(IDLoc, "expected immediate operand kind");
1854         Imm = Opnd.getImm();
1855         if (Imm < 1 || Imm > 8)
1856           return Error(IDLoc, "immediate operand value out of range");
1857         break;
1858       case Mips::LI16_MM:
1859         Opnd = Inst.getOperand(1);
1860         if (!Opnd.isImm())
1861           return Error(IDLoc, "expected immediate operand kind");
1862         Imm = Opnd.getImm();
1863         if (Imm < -1 || Imm > 126)
1864           return Error(IDLoc, "immediate operand value out of range");
1865         break;
1866       case Mips::ADDIUR2_MM:
1867         Opnd = Inst.getOperand(2);
1868         if (!Opnd.isImm())
1869           return Error(IDLoc, "expected immediate operand kind");
1870         Imm = Opnd.getImm();
1871         if (!(Imm == 1 || Imm == -1 ||
1872               ((Imm % 4 == 0) && Imm < 28 && Imm > 0)))
1873           return Error(IDLoc, "immediate operand value out of range");
1874         break;
1875       case Mips::ANDI16_MM:
1876         Opnd = Inst.getOperand(2);
1877         if (!Opnd.isImm())
1878           return Error(IDLoc, "expected immediate operand kind");
1879         Imm = Opnd.getImm();
1880         if (!(Imm == 128 || (Imm >= 1 && Imm <= 4) || Imm == 7 || Imm == 8 ||
1881               Imm == 15 || Imm == 16 || Imm == 31 || Imm == 32 || Imm == 63 ||
1882               Imm == 64 || Imm == 255 || Imm == 32768 || Imm == 65535))
1883           return Error(IDLoc, "immediate operand value out of range");
1884         break;
1885       case Mips::LBU16_MM:
1886         Opnd = Inst.getOperand(2);
1887         if (!Opnd.isImm())
1888           return Error(IDLoc, "expected immediate operand kind");
1889         Imm = Opnd.getImm();
1890         if (Imm < -1 || Imm > 14)
1891           return Error(IDLoc, "immediate operand value out of range");
1892         break;
1893       case Mips::SB16_MM:
1894       case Mips::SB16_MMR6:
1895         Opnd = Inst.getOperand(2);
1896         if (!Opnd.isImm())
1897           return Error(IDLoc, "expected immediate operand kind");
1898         Imm = Opnd.getImm();
1899         if (Imm < 0 || Imm > 15)
1900           return Error(IDLoc, "immediate operand value out of range");
1901         break;
1902       case Mips::LHU16_MM:
1903       case Mips::SH16_MM:
1904       case Mips::SH16_MMR6:
1905         Opnd = Inst.getOperand(2);
1906         if (!Opnd.isImm())
1907           return Error(IDLoc, "expected immediate operand kind");
1908         Imm = Opnd.getImm();
1909         if (Imm < 0 || Imm > 30 || (Imm % 2 != 0))
1910           return Error(IDLoc, "immediate operand value out of range");
1911         break;
1912       case Mips::LW16_MM:
1913       case Mips::SW16_MM:
1914       case Mips::SW16_MMR6:
1915         Opnd = Inst.getOperand(2);
1916         if (!Opnd.isImm())
1917           return Error(IDLoc, "expected immediate operand kind");
1918         Imm = Opnd.getImm();
1919         if (Imm < 0 || Imm > 60 || (Imm % 4 != 0))
1920           return Error(IDLoc, "immediate operand value out of range");
1921         break;
1922       case Mips::ADDIUPC_MM:
1923         MCOperand Opnd = Inst.getOperand(1);
1924         if (!Opnd.isImm())
1925           return Error(IDLoc, "expected immediate operand kind");
1926         int Imm = Opnd.getImm();
1927         if ((Imm % 4 != 0) || !isInt<25>(Imm))
1928           return Error(IDLoc, "immediate operand value out of range");
1929         break;
1930     }
1931   }
1932 
1933   bool FillDelaySlot =
1934       MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder();
1935   if (FillDelaySlot)
1936     getTargetStreamer().emitDirectiveSetNoReorder();
1937 
1938   MacroExpanderResultTy ExpandResult =
1939       tryExpandInstruction(Inst, IDLoc, Out, STI);
1940   switch (ExpandResult) {
1941   case MER_NotAMacro:
1942     Out.EmitInstruction(Inst, *STI);
1943     break;
1944   case MER_Success:
1945     break;
1946   case MER_Fail:
1947     return true;
1948   }
1949 
1950   // If this instruction has a delay slot and .set reorder is active,
1951   // emit a NOP after it.
1952   if (FillDelaySlot) {
1953     createNop(hasShortDelaySlot(Inst.getOpcode()), IDLoc, Out, STI);
1954     getTargetStreamer().emitDirectiveSetReorder();
1955   }
1956 
1957   if ((Inst.getOpcode() == Mips::JalOneReg ||
1958        Inst.getOpcode() == Mips::JalTwoReg || ExpandedJalSym) &&
1959       isPicAndNotNxxAbi()) {
1960     if (IsCpRestoreSet) {
1961       // We need a NOP between the JALR and the LW:
1962       // If .set reorder has been used, we've already emitted a NOP.
1963       // If .set noreorder has been used, we need to emit a NOP at this point.
1964       if (!AssemblerOptions.back()->isReorder())
1965         createNop(hasShortDelaySlot(Inst.getOpcode()), IDLoc, Out, STI);
1966 
1967       // Load the $gp from the stack.
1968       createCpRestoreMemOp(true /*IsLoad*/, CpRestoreOffset /*StackOffset*/,
1969                            IDLoc, Out, STI);
1970     } else
1971       Warning(IDLoc, "no .cprestore used in PIC mode");
1972   }
1973 
1974   return false;
1975 }
1976 
1977 MipsAsmParser::MacroExpanderResultTy
1978 MipsAsmParser::tryExpandInstruction(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
1979                                     const MCSubtargetInfo *STI) {
1980   switch (Inst.getOpcode()) {
1981   default:
1982     return MER_NotAMacro;
1983   case Mips::LoadImm32:
1984     return expandLoadImm(Inst, true, IDLoc, Out, STI) ? MER_Fail : MER_Success;
1985   case Mips::LoadImm64:
1986     return expandLoadImm(Inst, false, IDLoc, Out, STI) ? MER_Fail : MER_Success;
1987   case Mips::LoadAddrImm32:
1988   case Mips::LoadAddrImm64:
1989     assert(Inst.getOperand(0).isReg() && "expected register operand kind");
1990     assert((Inst.getOperand(1).isImm() || Inst.getOperand(1).isExpr()) &&
1991            "expected immediate operand kind");
1992 
1993     return expandLoadAddress(Inst.getOperand(0).getReg(), Mips::NoRegister,
1994                              Inst.getOperand(1),
1995                              Inst.getOpcode() == Mips::LoadAddrImm32, IDLoc,
1996                              Out, STI)
1997                ? MER_Fail
1998                : MER_Success;
1999   case Mips::LoadAddrReg32:
2000   case Mips::LoadAddrReg64:
2001     assert(Inst.getOperand(0).isReg() && "expected register operand kind");
2002     assert(Inst.getOperand(1).isReg() && "expected register operand kind");
2003     assert((Inst.getOperand(2).isImm() || Inst.getOperand(2).isExpr()) &&
2004            "expected immediate operand kind");
2005 
2006     return expandLoadAddress(Inst.getOperand(0).getReg(),
2007                              Inst.getOperand(1).getReg(), Inst.getOperand(2),
2008                              Inst.getOpcode() == Mips::LoadAddrReg32, IDLoc,
2009                              Out, STI)
2010                ? MER_Fail
2011                : MER_Success;
2012   case Mips::B_MM_Pseudo:
2013   case Mips::B_MMR6_Pseudo:
2014     return expandUncondBranchMMPseudo(Inst, IDLoc, Out, STI) ? MER_Fail
2015                                                              : MER_Success;
2016   case Mips::SWM_MM:
2017   case Mips::LWM_MM:
2018     return expandLoadStoreMultiple(Inst, IDLoc, Out, STI) ? MER_Fail
2019                                                           : MER_Success;
2020   case Mips::JalOneReg:
2021   case Mips::JalTwoReg:
2022     return expandJalWithRegs(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2023   case Mips::BneImm:
2024   case Mips::BeqImm:
2025     return expandBranchImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2026   case Mips::BLT:
2027   case Mips::BLE:
2028   case Mips::BGE:
2029   case Mips::BGT:
2030   case Mips::BLTU:
2031   case Mips::BLEU:
2032   case Mips::BGEU:
2033   case Mips::BGTU:
2034   case Mips::BLTL:
2035   case Mips::BLEL:
2036   case Mips::BGEL:
2037   case Mips::BGTL:
2038   case Mips::BLTUL:
2039   case Mips::BLEUL:
2040   case Mips::BGEUL:
2041   case Mips::BGTUL:
2042   case Mips::BLTImmMacro:
2043   case Mips::BLEImmMacro:
2044   case Mips::BGEImmMacro:
2045   case Mips::BGTImmMacro:
2046   case Mips::BLTUImmMacro:
2047   case Mips::BLEUImmMacro:
2048   case Mips::BGEUImmMacro:
2049   case Mips::BGTUImmMacro:
2050   case Mips::BLTLImmMacro:
2051   case Mips::BLELImmMacro:
2052   case Mips::BGELImmMacro:
2053   case Mips::BGTLImmMacro:
2054   case Mips::BLTULImmMacro:
2055   case Mips::BLEULImmMacro:
2056   case Mips::BGEULImmMacro:
2057   case Mips::BGTULImmMacro:
2058     return expandCondBranches(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2059   case Mips::SDivMacro:
2060     return expandDiv(Inst, IDLoc, Out, STI, false, true) ? MER_Fail
2061                                                          : MER_Success;
2062   case Mips::DSDivMacro:
2063     return expandDiv(Inst, IDLoc, Out, STI, true, true) ? MER_Fail
2064                                                         : MER_Success;
2065   case Mips::UDivMacro:
2066     return expandDiv(Inst, IDLoc, Out, STI, false, false) ? MER_Fail
2067                                                           : MER_Success;
2068   case Mips::DUDivMacro:
2069     return expandDiv(Inst, IDLoc, Out, STI, true, false) ? MER_Fail
2070                                                          : MER_Success;
2071   case Mips::PseudoTRUNC_W_S:
2072     return expandTrunc(Inst, false, false, IDLoc, Out, STI) ? MER_Fail
2073                                                             : MER_Success;
2074   case Mips::PseudoTRUNC_W_D32:
2075     return expandTrunc(Inst, true, false, IDLoc, Out, STI) ? MER_Fail
2076                                                            : MER_Success;
2077   case Mips::PseudoTRUNC_W_D:
2078     return expandTrunc(Inst, true, true, IDLoc, Out, STI) ? MER_Fail
2079                                                           : MER_Success;
2080   case Mips::Ulh:
2081     return expandUlh(Inst, true, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2082   case Mips::Ulhu:
2083     return expandUlh(Inst, false, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2084   case Mips::Ulw:
2085     return expandUlw(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2086   case Mips::NORImm:
2087     return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2088   case Mips::ADDi:
2089   case Mips::ADDiu:
2090   case Mips::SLTi:
2091   case Mips::SLTiu:
2092     if ((Inst.getNumOperands() == 3) && Inst.getOperand(0).isReg() &&
2093         Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm()) {
2094       int64_t ImmValue = Inst.getOperand(2).getImm();
2095       if (isInt<16>(ImmValue))
2096         return MER_NotAMacro;
2097       return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail
2098                                                          : MER_Success;
2099     }
2100     return MER_NotAMacro;
2101   case Mips::ANDi:
2102   case Mips::ORi:
2103   case Mips::XORi:
2104     if ((Inst.getNumOperands() == 3) && Inst.getOperand(0).isReg() &&
2105         Inst.getOperand(1).isReg() && Inst.getOperand(2).isImm()) {
2106       int64_t ImmValue = Inst.getOperand(2).getImm();
2107       if (isUInt<16>(ImmValue))
2108         return MER_NotAMacro;
2109       return expandAliasImmediate(Inst, IDLoc, Out, STI) ? MER_Fail
2110                                                          : MER_Success;
2111     }
2112     return MER_NotAMacro;
2113   case Mips::ROL:
2114   case Mips::ROR:
2115     return expandRotation(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2116   case Mips::ROLImm:
2117   case Mips::RORImm:
2118     return expandRotationImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2119   case Mips::DROL:
2120   case Mips::DROR:
2121     return expandDRotation(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2122   case Mips::DROLImm:
2123   case Mips::DRORImm:
2124     return expandDRotationImm(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2125   case Mips::ABSMacro:
2126     return expandAbs(Inst, IDLoc, Out, STI) ? MER_Fail : MER_Success;
2127   }
2128 }
2129 
2130 bool MipsAsmParser::expandJalWithRegs(MCInst &Inst, SMLoc IDLoc,
2131                                       MCStreamer &Out,
2132                                       const MCSubtargetInfo *STI) {
2133   // Create a JALR instruction which is going to replace the pseudo-JAL.
2134   MCInst JalrInst;
2135   JalrInst.setLoc(IDLoc);
2136   const MCOperand FirstRegOp = Inst.getOperand(0);
2137   const unsigned Opcode = Inst.getOpcode();
2138 
2139   if (Opcode == Mips::JalOneReg) {
2140     // jal $rs => jalr $rs
2141     if (IsCpRestoreSet && inMicroMipsMode()) {
2142       JalrInst.setOpcode(Mips::JALRS16_MM);
2143       JalrInst.addOperand(FirstRegOp);
2144     } else if (inMicroMipsMode()) {
2145       JalrInst.setOpcode(hasMips32r6() ? Mips::JALRC16_MMR6 : Mips::JALR16_MM);
2146       JalrInst.addOperand(FirstRegOp);
2147     } else {
2148       JalrInst.setOpcode(Mips::JALR);
2149       JalrInst.addOperand(MCOperand::createReg(Mips::RA));
2150       JalrInst.addOperand(FirstRegOp);
2151     }
2152   } else if (Opcode == Mips::JalTwoReg) {
2153     // jal $rd, $rs => jalr $rd, $rs
2154     if (IsCpRestoreSet && inMicroMipsMode())
2155       JalrInst.setOpcode(Mips::JALRS_MM);
2156     else
2157       JalrInst.setOpcode(inMicroMipsMode() ? Mips::JALR_MM : Mips::JALR);
2158     JalrInst.addOperand(FirstRegOp);
2159     const MCOperand SecondRegOp = Inst.getOperand(1);
2160     JalrInst.addOperand(SecondRegOp);
2161   }
2162   Out.EmitInstruction(JalrInst, *STI);
2163 
2164   // If .set reorder is active and branch instruction has a delay slot,
2165   // emit a NOP after it.
2166   const MCInstrDesc &MCID = getInstDesc(JalrInst.getOpcode());
2167   if (MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder()) {
2168     createNop(hasShortDelaySlot(JalrInst.getOpcode()), IDLoc, Out, STI);
2169   }
2170 
2171   return false;
2172 }
2173 
2174 /// Can the value be represented by a unsigned N-bit value and a shift left?
2175 template <unsigned N> static bool isShiftedUIntAtAnyPosition(uint64_t x) {
2176   unsigned BitNum = findFirstSet(x);
2177 
2178   return (x == x >> BitNum << BitNum) && isUInt<N>(x >> BitNum);
2179 }
2180 
2181 /// Load (or add) an immediate into a register.
2182 ///
2183 /// @param ImmValue     The immediate to load.
2184 /// @param DstReg       The register that will hold the immediate.
2185 /// @param SrcReg       A register to add to the immediate or Mips::NoRegister
2186 ///                     for a simple initialization.
2187 /// @param Is32BitImm   Is ImmValue 32-bit or 64-bit?
2188 /// @param IsAddress    True if the immediate represents an address. False if it
2189 ///                     is an integer.
2190 /// @param IDLoc        Location of the immediate in the source file.
2191 /// @param Instructions The instructions emitted by this expansion.
2192 bool MipsAsmParser::loadImmediate(int64_t ImmValue, unsigned DstReg,
2193                                   unsigned SrcReg, bool Is32BitImm,
2194                                   bool IsAddress, SMLoc IDLoc, MCStreamer &Out,
2195                                   const MCSubtargetInfo *STI) {
2196   if (!Is32BitImm && !isGP64bit()) {
2197     Error(IDLoc, "instruction requires a 64-bit architecture");
2198     return true;
2199   }
2200 
2201   if (Is32BitImm) {
2202     if (isInt<32>(ImmValue) || isUInt<32>(ImmValue)) {
2203       // Sign extend up to 64-bit so that the predicates match the hardware
2204       // behaviour. In particular, isInt<16>(0xffff8000) and similar should be
2205       // true.
2206       ImmValue = SignExtend64<32>(ImmValue);
2207     } else {
2208       Error(IDLoc, "instruction requires a 32-bit immediate");
2209       return true;
2210     }
2211   }
2212 
2213   unsigned ZeroReg = IsAddress ? ABI.GetNullPtr() : ABI.GetZeroReg();
2214   unsigned AdduOp = !Is32BitImm ? Mips::DADDu : Mips::ADDu;
2215 
2216   bool UseSrcReg = false;
2217   if (SrcReg != Mips::NoRegister)
2218     UseSrcReg = true;
2219 
2220   unsigned TmpReg = DstReg;
2221   if (UseSrcReg &&
2222       getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, SrcReg)) {
2223     // At this point we need AT to perform the expansions and we exit if it is
2224     // not available.
2225     unsigned ATReg = getATReg(IDLoc);
2226     if (!ATReg)
2227       return true;
2228     TmpReg = ATReg;
2229   }
2230 
2231   if (isInt<16>(ImmValue)) {
2232     if (!UseSrcReg)
2233       SrcReg = ZeroReg;
2234 
2235     // This doesn't quite follow the usual ABI expectations for N32 but matches
2236     // traditional assembler behaviour. N32 would normally use addiu for both
2237     // integers and addresses.
2238     if (IsAddress && !Is32BitImm) {
2239       emitRRI(Mips::DADDiu, DstReg, SrcReg, ImmValue, IDLoc, Out, STI);
2240       return false;
2241     }
2242 
2243     emitRRI(Mips::ADDiu, DstReg, SrcReg, ImmValue, IDLoc, Out, STI);
2244     return false;
2245   }
2246 
2247   if (isUInt<16>(ImmValue)) {
2248     unsigned TmpReg = DstReg;
2249     if (SrcReg == DstReg) {
2250       TmpReg = getATReg(IDLoc);
2251       if (!TmpReg)
2252         return true;
2253     }
2254 
2255     emitRRI(Mips::ORi, TmpReg, ZeroReg, ImmValue, IDLoc, Out, STI);
2256     if (UseSrcReg)
2257       emitRRR(ABI.GetPtrAdduOp(), DstReg, TmpReg, SrcReg, IDLoc, Out, STI);
2258     return false;
2259   }
2260 
2261   if (isInt<32>(ImmValue) || isUInt<32>(ImmValue)) {
2262     warnIfNoMacro(IDLoc);
2263 
2264     uint16_t Bits31To16 = (ImmValue >> 16) & 0xffff;
2265     uint16_t Bits15To0 = ImmValue & 0xffff;
2266 
2267     if (!Is32BitImm && !isInt<32>(ImmValue)) {
2268       // Traditional behaviour seems to special case this particular value. It's
2269       // not clear why other masks are handled differently.
2270       if (ImmValue == 0xffffffff) {
2271         emitRI(Mips::LUi, TmpReg, 0xffff, IDLoc, Out, STI);
2272         emitRRI(Mips::DSRL32, TmpReg, TmpReg, 0, IDLoc, Out, STI);
2273         if (UseSrcReg)
2274           emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Out, STI);
2275         return false;
2276       }
2277 
2278       // Expand to an ORi instead of a LUi to avoid sign-extending into the
2279       // upper 32 bits.
2280       emitRRI(Mips::ORi, TmpReg, ZeroReg, Bits31To16, IDLoc, Out, STI);
2281       emitRRI(Mips::DSLL, TmpReg, TmpReg, 16, IDLoc, Out, STI);
2282       if (Bits15To0)
2283         emitRRI(Mips::ORi, TmpReg, TmpReg, Bits15To0, IDLoc, Out, STI);
2284       if (UseSrcReg)
2285         emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Out, STI);
2286       return false;
2287     }
2288 
2289     emitRI(Mips::LUi, TmpReg, Bits31To16, IDLoc, Out, STI);
2290     if (Bits15To0)
2291       emitRRI(Mips::ORi, TmpReg, TmpReg, Bits15To0, IDLoc, Out, STI);
2292     if (UseSrcReg)
2293       emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Out, STI);
2294     return false;
2295   }
2296 
2297   if (isShiftedUIntAtAnyPosition<16>(ImmValue)) {
2298     if (Is32BitImm) {
2299       Error(IDLoc, "instruction requires a 32-bit immediate");
2300       return true;
2301     }
2302 
2303     // Traditionally, these immediates are shifted as little as possible and as
2304     // such we align the most significant bit to bit 15 of our temporary.
2305     unsigned FirstSet = findFirstSet((uint64_t)ImmValue);
2306     unsigned LastSet = findLastSet((uint64_t)ImmValue);
2307     unsigned ShiftAmount = FirstSet - (15 - (LastSet - FirstSet));
2308     uint16_t Bits = (ImmValue >> ShiftAmount) & 0xffff;
2309     emitRRI(Mips::ORi, TmpReg, ZeroReg, Bits, IDLoc, Out, STI);
2310     emitRRI(Mips::DSLL, TmpReg, TmpReg, ShiftAmount, IDLoc, Out, STI);
2311 
2312     if (UseSrcReg)
2313       emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Out, STI);
2314 
2315     return false;
2316   }
2317 
2318   warnIfNoMacro(IDLoc);
2319 
2320   // The remaining case is packed with a sequence of dsll and ori with zeros
2321   // being omitted and any neighbouring dsll's being coalesced.
2322   // The highest 32-bit's are equivalent to a 32-bit immediate load.
2323 
2324   // Load bits 32-63 of ImmValue into bits 0-31 of the temporary register.
2325   if (loadImmediate(ImmValue >> 32, TmpReg, Mips::NoRegister, true, false,
2326                     IDLoc, Out, STI))
2327     return false;
2328 
2329   // Shift and accumulate into the register. If a 16-bit chunk is zero, then
2330   // skip it and defer the shift to the next chunk.
2331   unsigned ShiftCarriedForwards = 16;
2332   for (int BitNum = 16; BitNum >= 0; BitNum -= 16) {
2333     uint16_t ImmChunk = (ImmValue >> BitNum) & 0xffff;
2334 
2335     if (ImmChunk != 0) {
2336       emitAppropriateDSLL(TmpReg, TmpReg, ShiftCarriedForwards, IDLoc,
2337                           Out, STI);
2338       emitRRI(Mips::ORi, TmpReg, TmpReg, ImmChunk, IDLoc, Out, STI);
2339       ShiftCarriedForwards = 0;
2340     }
2341 
2342     ShiftCarriedForwards += 16;
2343   }
2344   ShiftCarriedForwards -= 16;
2345 
2346   // Finish any remaining shifts left by trailing zeros.
2347   if (ShiftCarriedForwards)
2348     emitAppropriateDSLL(TmpReg, TmpReg, ShiftCarriedForwards, IDLoc,
2349                         Out, STI);
2350 
2351   if (UseSrcReg)
2352     emitRRR(AdduOp, DstReg, TmpReg, SrcReg, IDLoc, Out, STI);
2353 
2354   return false;
2355 }
2356 
2357 bool MipsAsmParser::expandLoadImm(MCInst &Inst, bool Is32BitImm, SMLoc IDLoc,
2358                                   MCStreamer &Out, const MCSubtargetInfo *STI) {
2359   const MCOperand &ImmOp = Inst.getOperand(1);
2360   assert(ImmOp.isImm() && "expected immediate operand kind");
2361   const MCOperand &DstRegOp = Inst.getOperand(0);
2362   assert(DstRegOp.isReg() && "expected register operand kind");
2363 
2364   if (loadImmediate(ImmOp.getImm(), DstRegOp.getReg(), Mips::NoRegister,
2365                     Is32BitImm, false, IDLoc, Out, STI))
2366     return true;
2367 
2368   return false;
2369 }
2370 
2371 bool MipsAsmParser::expandLoadAddress(unsigned DstReg, unsigned BaseReg,
2372                                       const MCOperand &Offset,
2373                                       bool Is32BitAddress, SMLoc IDLoc,
2374                                       MCStreamer &Out,
2375                                       const MCSubtargetInfo *STI) {
2376   // la can't produce a usable address when addresses are 64-bit.
2377   if (Is32BitAddress && ABI.ArePtrs64bit()) {
2378     // FIXME: Demote this to a warning and continue as if we had 'dla' instead.
2379     //        We currently can't do this because we depend on the equality
2380     //        operator and N64 can end up with a GPR32/GPR64 mismatch.
2381     Error(IDLoc, "la used to load 64-bit address");
2382     // Continue as if we had 'dla' instead.
2383     Is32BitAddress = false;
2384   }
2385 
2386   // dla requires 64-bit addresses.
2387   if (!Is32BitAddress && !hasMips3()) {
2388     Error(IDLoc, "instruction requires a 64-bit architecture");
2389     return true;
2390   }
2391 
2392   if (!Offset.isImm())
2393     return loadAndAddSymbolAddress(Offset.getExpr(), DstReg, BaseReg,
2394                                    Is32BitAddress, IDLoc, Out, STI);
2395 
2396   if (!ABI.ArePtrs64bit()) {
2397     // Continue as if we had 'la' whether we had 'la' or 'dla'.
2398     Is32BitAddress = true;
2399   }
2400 
2401   return loadImmediate(Offset.getImm(), DstReg, BaseReg, Is32BitAddress, true,
2402                        IDLoc, Out, STI);
2403 }
2404 
2405 bool MipsAsmParser::loadAndAddSymbolAddress(const MCExpr *SymExpr,
2406                                             unsigned DstReg, unsigned SrcReg,
2407                                             bool Is32BitSym, SMLoc IDLoc,
2408                                             MCStreamer &Out,
2409                                             const MCSubtargetInfo *STI) {
2410   warnIfNoMacro(IDLoc);
2411 
2412   const MCExpr *Symbol = cast<MCExpr>(SymExpr);
2413   const MipsMCExpr *HiExpr = MipsMCExpr::create(
2414       MCSymbolRefExpr::VK_Mips_ABS_HI, Symbol, getContext());
2415   const MipsMCExpr *LoExpr = MipsMCExpr::create(
2416       MCSymbolRefExpr::VK_Mips_ABS_LO, Symbol, getContext());
2417 
2418   bool UseSrcReg = SrcReg != Mips::NoRegister;
2419 
2420   // This is the 64-bit symbol address expansion.
2421   if (ABI.ArePtrs64bit() && isGP64bit()) {
2422     // We always need AT for the 64-bit expansion.
2423     // If it is not available we exit.
2424     unsigned ATReg = getATReg(IDLoc);
2425     if (!ATReg)
2426       return true;
2427 
2428     const MipsMCExpr *HighestExpr = MipsMCExpr::create(
2429         MCSymbolRefExpr::VK_Mips_HIGHEST, Symbol, getContext());
2430     const MipsMCExpr *HigherExpr = MipsMCExpr::create(
2431         MCSymbolRefExpr::VK_Mips_HIGHER, Symbol, getContext());
2432 
2433     if (UseSrcReg &&
2434         getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg,
2435                                                                SrcReg)) {
2436       // If $rs is the same as $rd:
2437       // (d)la $rd, sym($rd) => lui    $at, %highest(sym)
2438       //                        daddiu $at, $at, %higher(sym)
2439       //                        dsll   $at, $at, 16
2440       //                        daddiu $at, $at, %hi(sym)
2441       //                        dsll   $at, $at, 16
2442       //                        daddiu $at, $at, %lo(sym)
2443       //                        daddu  $rd, $at, $rd
2444       emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HighestExpr), IDLoc, Out,
2445              STI);
2446       emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(HigherExpr),
2447               IDLoc, Out, STI);
2448       emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, Out, STI);
2449       emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(HiExpr), IDLoc,
2450               Out, STI);
2451       emitRRI(Mips::DSLL, ATReg, ATReg, 16, IDLoc, Out, STI);
2452       emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(LoExpr), IDLoc,
2453               Out, STI);
2454       emitRRR(Mips::DADDu, DstReg, ATReg, SrcReg, IDLoc, Out, STI);
2455 
2456       return false;
2457     }
2458 
2459     // Otherwise, if the $rs is different from $rd or if $rs isn't specified:
2460     // (d)la $rd, sym/sym($rs) => lui    $rd, %highest(sym)
2461     //                            lui    $at, %hi(sym)
2462     //                            daddiu $rd, $rd, %higher(sym)
2463     //                            daddiu $at, $at, %lo(sym)
2464     //                            dsll32 $rd, $rd, 0
2465     //                            daddu  $rd, $rd, $at
2466     //                            (daddu  $rd, $rd, $rs)
2467     emitRX(Mips::LUi, DstReg, MCOperand::createExpr(HighestExpr), IDLoc, Out,
2468            STI);
2469     emitRX(Mips::LUi, ATReg, MCOperand::createExpr(HiExpr), IDLoc, Out, STI);
2470     emitRRX(Mips::DADDiu, DstReg, DstReg, MCOperand::createExpr(HigherExpr),
2471             IDLoc, Out, STI);
2472     emitRRX(Mips::DADDiu, ATReg, ATReg, MCOperand::createExpr(LoExpr), IDLoc,
2473             Out, STI);
2474     emitRRI(Mips::DSLL32, DstReg, DstReg, 0, IDLoc, Out, STI);
2475     emitRRR(Mips::DADDu, DstReg, DstReg, ATReg, IDLoc, Out, STI);
2476     if (UseSrcReg)
2477       emitRRR(Mips::DADDu, DstReg, DstReg, SrcReg, IDLoc, Out, STI);
2478 
2479     return false;
2480   }
2481 
2482   // And now, the 32-bit symbol address expansion:
2483   // If $rs is the same as $rd:
2484   // (d)la $rd, sym($rd)     => lui   $at, %hi(sym)
2485   //                            ori   $at, $at, %lo(sym)
2486   //                            addu  $rd, $at, $rd
2487   // Otherwise, if the $rs is different from $rd or if $rs isn't specified:
2488   // (d)la $rd, sym/sym($rs) => lui   $rd, %hi(sym)
2489   //                            ori   $rd, $rd, %lo(sym)
2490   //                            (addu $rd, $rd, $rs)
2491   unsigned TmpReg = DstReg;
2492   if (UseSrcReg &&
2493       getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, SrcReg)) {
2494     // If $rs is the same as $rd, we need to use AT.
2495     // If it is not available we exit.
2496     unsigned ATReg = getATReg(IDLoc);
2497     if (!ATReg)
2498       return true;
2499     TmpReg = ATReg;
2500   }
2501 
2502   emitRX(Mips::LUi, TmpReg, MCOperand::createExpr(HiExpr), IDLoc, Out, STI);
2503   emitRRX(Mips::ADDiu, TmpReg, TmpReg, MCOperand::createExpr(LoExpr), IDLoc,
2504           Out, STI);
2505 
2506   if (UseSrcReg)
2507     emitRRR(Mips::ADDu, DstReg, TmpReg, SrcReg, IDLoc, Out, STI);
2508   else
2509     assert(
2510         getContext().getRegisterInfo()->isSuperOrSubRegisterEq(DstReg, TmpReg));
2511 
2512   return false;
2513 }
2514 
2515 bool MipsAsmParser::expandUncondBranchMMPseudo(MCInst &Inst, SMLoc IDLoc,
2516                                                MCStreamer &Out,
2517                                                const MCSubtargetInfo *STI) {
2518   assert(getInstDesc(Inst.getOpcode()).getNumOperands() == 1 &&
2519          "unexpected number of operands");
2520 
2521   MCOperand Offset = Inst.getOperand(0);
2522   if (Offset.isExpr()) {
2523     Inst.clear();
2524     Inst.setOpcode(Mips::BEQ_MM);
2525     Inst.addOperand(MCOperand::createReg(Mips::ZERO));
2526     Inst.addOperand(MCOperand::createReg(Mips::ZERO));
2527     Inst.addOperand(MCOperand::createExpr(Offset.getExpr()));
2528   } else {
2529     assert(Offset.isImm() && "expected immediate operand kind");
2530     if (isInt<11>(Offset.getImm())) {
2531       // If offset fits into 11 bits then this instruction becomes microMIPS
2532       // 16-bit unconditional branch instruction.
2533       if (inMicroMipsMode())
2534         Inst.setOpcode(hasMips32r6() ? Mips::BC16_MMR6 : Mips::B16_MM);
2535     } else {
2536       if (!isInt<17>(Offset.getImm()))
2537         Error(IDLoc, "branch target out of range");
2538       if (OffsetToAlignment(Offset.getImm(), 1LL << 1))
2539         Error(IDLoc, "branch to misaligned address");
2540       Inst.clear();
2541       Inst.setOpcode(Mips::BEQ_MM);
2542       Inst.addOperand(MCOperand::createReg(Mips::ZERO));
2543       Inst.addOperand(MCOperand::createReg(Mips::ZERO));
2544       Inst.addOperand(MCOperand::createImm(Offset.getImm()));
2545     }
2546   }
2547   Out.EmitInstruction(Inst, *STI);
2548 
2549   // If .set reorder is active and branch instruction has a delay slot,
2550   // emit a NOP after it.
2551   const MCInstrDesc &MCID = getInstDesc(Inst.getOpcode());
2552   if (MCID.hasDelaySlot() && AssemblerOptions.back()->isReorder())
2553     createNop(true, IDLoc, Out, STI);
2554 
2555   return false;
2556 }
2557 
2558 bool MipsAsmParser::expandBranchImm(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
2559                                     const MCSubtargetInfo *STI) {
2560   const MCOperand &DstRegOp = Inst.getOperand(0);
2561   assert(DstRegOp.isReg() && "expected register operand kind");
2562 
2563   const MCOperand &ImmOp = Inst.getOperand(1);
2564   assert(ImmOp.isImm() && "expected immediate operand kind");
2565 
2566   const MCOperand &MemOffsetOp = Inst.getOperand(2);
2567   assert((MemOffsetOp.isImm() || MemOffsetOp.isExpr()) &&
2568          "expected immediate or expression operand");
2569 
2570   unsigned OpCode = 0;
2571   switch(Inst.getOpcode()) {
2572     case Mips::BneImm:
2573       OpCode = Mips::BNE;
2574       break;
2575     case Mips::BeqImm:
2576       OpCode = Mips::BEQ;
2577       break;
2578     default:
2579       llvm_unreachable("Unknown immediate branch pseudo-instruction.");
2580       break;
2581   }
2582 
2583   int64_t ImmValue = ImmOp.getImm();
2584   if (ImmValue == 0)
2585     emitRRX(OpCode, DstRegOp.getReg(), Mips::ZERO, MemOffsetOp, IDLoc, Out,
2586             STI);
2587   else {
2588     warnIfNoMacro(IDLoc);
2589 
2590     unsigned ATReg = getATReg(IDLoc);
2591     if (!ATReg)
2592       return true;
2593 
2594     if (loadImmediate(ImmValue, ATReg, Mips::NoRegister, !isGP64bit(), true,
2595                       IDLoc, Out, STI))
2596       return true;
2597 
2598     emitRRX(OpCode, DstRegOp.getReg(), ATReg, MemOffsetOp, IDLoc, Out, STI);
2599   }
2600   return false;
2601 }
2602 
2603 void MipsAsmParser::expandMemInst(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
2604                                   const MCSubtargetInfo *STI, bool isLoad,
2605                                   bool isImmOpnd) {
2606   MCOperand HiOperand, LoOperand;
2607   unsigned TmpRegNum;
2608   // 1st operand is either the source or destination register.
2609   assert(Inst.getOperand(0).isReg() && "expected register operand kind");
2610   unsigned RegOpNum = Inst.getOperand(0).getReg();
2611   // 2nd operand is the base register.
2612   assert(Inst.getOperand(1).isReg() && "expected register operand kind");
2613   unsigned BaseRegNum = Inst.getOperand(1).getReg();
2614   // 3rd operand is either an immediate or expression.
2615   if (isImmOpnd) {
2616     assert(Inst.getOperand(2).isImm() && "expected immediate operand kind");
2617     unsigned ImmOffset = Inst.getOperand(2).getImm();
2618     unsigned LoOffset = ImmOffset & 0x0000ffff;
2619     unsigned HiOffset = (ImmOffset & 0xffff0000) >> 16;
2620     // If msb of LoOffset is 1(negative number) we must increment HiOffset.
2621     if (LoOffset & 0x8000)
2622       HiOffset++;
2623     LoOperand = MCOperand::createImm(LoOffset);
2624     HiOperand = MCOperand::createImm(HiOffset);
2625   } else {
2626     const MCExpr *ExprOffset = Inst.getOperand(2).getExpr();
2627     LoOperand = MCOperand::createExpr(evaluateRelocExpr(ExprOffset, "lo"));
2628     HiOperand = MCOperand::createExpr(evaluateRelocExpr(ExprOffset, "hi"));
2629   }
2630   // These are some of the types of expansions we perform here:
2631   // 1) lw $8, sym        => lui $8, %hi(sym)
2632   //                         lw $8, %lo(sym)($8)
2633   // 2) lw $8, offset($9) => lui $8, %hi(offset)
2634   //                         add $8, $8, $9
2635   //                         lw $8, %lo(offset)($9)
2636   // 3) lw $8, offset($8) => lui $at, %hi(offset)
2637   //                         add $at, $at, $8
2638   //                         lw $8, %lo(offset)($at)
2639   // 4) sw $8, sym        => lui $at, %hi(sym)
2640   //                         sw $8, %lo(sym)($at)
2641   // 5) sw $8, offset($8) => lui $at, %hi(offset)
2642   //                         add $at, $at, $8
2643   //                         sw $8, %lo(offset)($at)
2644   // 6) ldc1 $f0, sym     => lui $at, %hi(sym)
2645   //                         ldc1 $f0, %lo(sym)($at)
2646   //
2647   // For load instructions we can use the destination register as a temporary
2648   // if base and dst are different (examples 1 and 2) and if the base register
2649   // is general purpose otherwise we must use $at (example 6) and error if it's
2650   // not available. For stores we must use $at (examples 4 and 5) because we
2651   // must not clobber the source register setting up the offset.
2652   const MCInstrDesc &Desc = getInstDesc(Inst.getOpcode());
2653   int16_t RegClassOp0 = Desc.OpInfo[0].RegClass;
2654   unsigned RegClassIDOp0 =
2655       getContext().getRegisterInfo()->getRegClass(RegClassOp0).getID();
2656   bool IsGPR = (RegClassIDOp0 == Mips::GPR32RegClassID) ||
2657                (RegClassIDOp0 == Mips::GPR64RegClassID);
2658   if (isLoad && IsGPR && (BaseRegNum != RegOpNum))
2659     TmpRegNum = RegOpNum;
2660   else {
2661     // At this point we need AT to perform the expansions and we exit if it is
2662     // not available.
2663     TmpRegNum = getATReg(IDLoc);
2664     if (!TmpRegNum)
2665       return;
2666   }
2667 
2668   emitRX(Mips::LUi, TmpRegNum, HiOperand, IDLoc, Out, STI);
2669   // Add temp register to base.
2670   if (BaseRegNum != Mips::ZERO)
2671     emitRRR(Mips::ADDu, TmpRegNum, TmpRegNum, BaseRegNum, IDLoc, Out, STI);
2672   // And finally, create original instruction with low part
2673   // of offset and new base.
2674   emitRRX(Inst.getOpcode(), RegOpNum, TmpRegNum, LoOperand, IDLoc, Out, STI);
2675 }
2676 
2677 bool MipsAsmParser::expandLoadStoreMultiple(MCInst &Inst, SMLoc IDLoc,
2678                                             MCStreamer &Out,
2679                                             const MCSubtargetInfo *STI) {
2680   unsigned OpNum = Inst.getNumOperands();
2681   unsigned Opcode = Inst.getOpcode();
2682   unsigned NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM32_MM : Mips::LWM32_MM;
2683 
2684   assert (Inst.getOperand(OpNum - 1).isImm() &&
2685           Inst.getOperand(OpNum - 2).isReg() &&
2686           Inst.getOperand(OpNum - 3).isReg() && "Invalid instruction operand.");
2687 
2688   if (OpNum < 8 && Inst.getOperand(OpNum - 1).getImm() <= 60 &&
2689       Inst.getOperand(OpNum - 1).getImm() >= 0 &&
2690       (Inst.getOperand(OpNum - 2).getReg() == Mips::SP ||
2691        Inst.getOperand(OpNum - 2).getReg() == Mips::SP_64) &&
2692       (Inst.getOperand(OpNum - 3).getReg() == Mips::RA ||
2693        Inst.getOperand(OpNum - 3).getReg() == Mips::RA_64)) {
2694     // It can be implemented as SWM16 or LWM16 instruction.
2695     if (inMicroMipsMode() && hasMips32r6())
2696       NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM16_MMR6 : Mips::LWM16_MMR6;
2697     else
2698       NewOpcode = Opcode == Mips::SWM_MM ? Mips::SWM16_MM : Mips::LWM16_MM;
2699   }
2700 
2701   Inst.setOpcode(NewOpcode);
2702   Out.EmitInstruction(Inst, *STI);
2703   return false;
2704 }
2705 
2706 bool MipsAsmParser::expandCondBranches(MCInst &Inst, SMLoc IDLoc,
2707                                        MCStreamer &Out,
2708                                        const MCSubtargetInfo *STI) {
2709   bool EmittedNoMacroWarning = false;
2710   unsigned PseudoOpcode = Inst.getOpcode();
2711   unsigned SrcReg = Inst.getOperand(0).getReg();
2712   const MCOperand &TrgOp = Inst.getOperand(1);
2713   const MCExpr *OffsetExpr = Inst.getOperand(2).getExpr();
2714 
2715   unsigned ZeroSrcOpcode, ZeroTrgOpcode;
2716   bool ReverseOrderSLT, IsUnsigned, IsLikely, AcceptsEquality;
2717 
2718   unsigned TrgReg;
2719   if (TrgOp.isReg())
2720     TrgReg = TrgOp.getReg();
2721   else if (TrgOp.isImm()) {
2722     warnIfNoMacro(IDLoc);
2723     EmittedNoMacroWarning = true;
2724 
2725     TrgReg = getATReg(IDLoc);
2726     if (!TrgReg)
2727       return true;
2728 
2729     switch(PseudoOpcode) {
2730     default:
2731       llvm_unreachable("unknown opcode for branch pseudo-instruction");
2732     case Mips::BLTImmMacro:
2733       PseudoOpcode = Mips::BLT;
2734       break;
2735     case Mips::BLEImmMacro:
2736       PseudoOpcode = Mips::BLE;
2737       break;
2738     case Mips::BGEImmMacro:
2739       PseudoOpcode = Mips::BGE;
2740       break;
2741     case Mips::BGTImmMacro:
2742       PseudoOpcode = Mips::BGT;
2743       break;
2744     case Mips::BLTUImmMacro:
2745       PseudoOpcode = Mips::BLTU;
2746       break;
2747     case Mips::BLEUImmMacro:
2748       PseudoOpcode = Mips::BLEU;
2749       break;
2750     case Mips::BGEUImmMacro:
2751       PseudoOpcode = Mips::BGEU;
2752       break;
2753     case Mips::BGTUImmMacro:
2754       PseudoOpcode = Mips::BGTU;
2755       break;
2756     case Mips::BLTLImmMacro:
2757       PseudoOpcode = Mips::BLTL;
2758       break;
2759     case Mips::BLELImmMacro:
2760       PseudoOpcode = Mips::BLEL;
2761       break;
2762     case Mips::BGELImmMacro:
2763       PseudoOpcode = Mips::BGEL;
2764       break;
2765     case Mips::BGTLImmMacro:
2766       PseudoOpcode = Mips::BGTL;
2767       break;
2768     case Mips::BLTULImmMacro:
2769       PseudoOpcode = Mips::BLTUL;
2770       break;
2771     case Mips::BLEULImmMacro:
2772       PseudoOpcode = Mips::BLEUL;
2773       break;
2774     case Mips::BGEULImmMacro:
2775       PseudoOpcode = Mips::BGEUL;
2776       break;
2777     case Mips::BGTULImmMacro:
2778       PseudoOpcode = Mips::BGTUL;
2779       break;
2780     }
2781 
2782     if (loadImmediate(TrgOp.getImm(), TrgReg, Mips::NoRegister, !isGP64bit(),
2783                       false, IDLoc, Out, STI))
2784       return true;
2785   }
2786 
2787   switch (PseudoOpcode) {
2788   case Mips::BLT:
2789   case Mips::BLTU:
2790   case Mips::BLTL:
2791   case Mips::BLTUL:
2792     AcceptsEquality = false;
2793     ReverseOrderSLT = false;
2794     IsUnsigned = ((PseudoOpcode == Mips::BLTU) || (PseudoOpcode == Mips::BLTUL));
2795     IsLikely = ((PseudoOpcode == Mips::BLTL) || (PseudoOpcode == Mips::BLTUL));
2796     ZeroSrcOpcode = Mips::BGTZ;
2797     ZeroTrgOpcode = Mips::BLTZ;
2798     break;
2799   case Mips::BLE:
2800   case Mips::BLEU:
2801   case Mips::BLEL:
2802   case Mips::BLEUL:
2803     AcceptsEquality = true;
2804     ReverseOrderSLT = true;
2805     IsUnsigned = ((PseudoOpcode == Mips::BLEU) || (PseudoOpcode == Mips::BLEUL));
2806     IsLikely = ((PseudoOpcode == Mips::BLEL) || (PseudoOpcode == Mips::BLEUL));
2807     ZeroSrcOpcode = Mips::BGEZ;
2808     ZeroTrgOpcode = Mips::BLEZ;
2809     break;
2810   case Mips::BGE:
2811   case Mips::BGEU:
2812   case Mips::BGEL:
2813   case Mips::BGEUL:
2814     AcceptsEquality = true;
2815     ReverseOrderSLT = false;
2816     IsUnsigned = ((PseudoOpcode == Mips::BGEU) || (PseudoOpcode == Mips::BGEUL));
2817     IsLikely = ((PseudoOpcode == Mips::BGEL) || (PseudoOpcode == Mips::BGEUL));
2818     ZeroSrcOpcode = Mips::BLEZ;
2819     ZeroTrgOpcode = Mips::BGEZ;
2820     break;
2821   case Mips::BGT:
2822   case Mips::BGTU:
2823   case Mips::BGTL:
2824   case Mips::BGTUL:
2825     AcceptsEquality = false;
2826     ReverseOrderSLT = true;
2827     IsUnsigned = ((PseudoOpcode == Mips::BGTU) || (PseudoOpcode == Mips::BGTUL));
2828     IsLikely = ((PseudoOpcode == Mips::BGTL) || (PseudoOpcode == Mips::BGTUL));
2829     ZeroSrcOpcode = Mips::BLTZ;
2830     ZeroTrgOpcode = Mips::BGTZ;
2831     break;
2832   default:
2833     llvm_unreachable("unknown opcode for branch pseudo-instruction");
2834   }
2835 
2836   bool IsTrgRegZero = (TrgReg == Mips::ZERO);
2837   bool IsSrcRegZero = (SrcReg == Mips::ZERO);
2838   if (IsSrcRegZero && IsTrgRegZero) {
2839     // FIXME: All of these Opcode-specific if's are needed for compatibility
2840     // with GAS' behaviour. However, they may not generate the most efficient
2841     // code in some circumstances.
2842     if (PseudoOpcode == Mips::BLT) {
2843       emitRX(Mips::BLTZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), IDLoc,
2844              Out, STI);
2845       return false;
2846     }
2847     if (PseudoOpcode == Mips::BLE) {
2848       emitRX(Mips::BLEZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), IDLoc,
2849              Out, STI);
2850       Warning(IDLoc, "branch is always taken");
2851       return false;
2852     }
2853     if (PseudoOpcode == Mips::BGE) {
2854       emitRX(Mips::BGEZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), IDLoc,
2855              Out, STI);
2856       Warning(IDLoc, "branch is always taken");
2857       return false;
2858     }
2859     if (PseudoOpcode == Mips::BGT) {
2860       emitRX(Mips::BGTZ, Mips::ZERO, MCOperand::createExpr(OffsetExpr), IDLoc,
2861              Out, STI);
2862       return false;
2863     }
2864     if (PseudoOpcode == Mips::BGTU) {
2865       emitRRX(Mips::BNE, Mips::ZERO, Mips::ZERO,
2866               MCOperand::createExpr(OffsetExpr), IDLoc, Out, STI);
2867       return false;
2868     }
2869     if (AcceptsEquality) {
2870       // If both registers are $0 and the pseudo-branch accepts equality, it
2871       // will always be taken, so we emit an unconditional branch.
2872       emitRRX(Mips::BEQ, Mips::ZERO, Mips::ZERO,
2873               MCOperand::createExpr(OffsetExpr), IDLoc, Out, STI);
2874       Warning(IDLoc, "branch is always taken");
2875       return false;
2876     }
2877     // If both registers are $0 and the pseudo-branch does not accept
2878     // equality, it will never be taken, so we don't have to emit anything.
2879     return false;
2880   }
2881   if (IsSrcRegZero || IsTrgRegZero) {
2882     if ((IsSrcRegZero && PseudoOpcode == Mips::BGTU) ||
2883         (IsTrgRegZero && PseudoOpcode == Mips::BLTU)) {
2884       // If the $rs is $0 and the pseudo-branch is BGTU (0 > x) or
2885       // if the $rt is $0 and the pseudo-branch is BLTU (x < 0),
2886       // the pseudo-branch will never be taken, so we don't emit anything.
2887       // This only applies to unsigned pseudo-branches.
2888       return false;
2889     }
2890     if ((IsSrcRegZero && PseudoOpcode == Mips::BLEU) ||
2891         (IsTrgRegZero && PseudoOpcode == Mips::BGEU)) {
2892       // If the $rs is $0 and the pseudo-branch is BLEU (0 <= x) or
2893       // if the $rt is $0 and the pseudo-branch is BGEU (x >= 0),
2894       // the pseudo-branch will always be taken, so we emit an unconditional
2895       // branch.
2896       // This only applies to unsigned pseudo-branches.
2897       emitRRX(Mips::BEQ, Mips::ZERO, Mips::ZERO,
2898               MCOperand::createExpr(OffsetExpr), IDLoc, Out, STI);
2899       Warning(IDLoc, "branch is always taken");
2900       return false;
2901     }
2902     if (IsUnsigned) {
2903       // If the $rs is $0 and the pseudo-branch is BLTU (0 < x) or
2904       // if the $rt is $0 and the pseudo-branch is BGTU (x > 0),
2905       // the pseudo-branch will be taken only when the non-zero register is
2906       // different from 0, so we emit a BNEZ.
2907       //
2908       // If the $rs is $0 and the pseudo-branch is BGEU (0 >= x) or
2909       // if the $rt is $0 and the pseudo-branch is BLEU (x <= 0),
2910       // the pseudo-branch will be taken only when the non-zero register is
2911       // equal to 0, so we emit a BEQZ.
2912       //
2913       // Because only BLEU and BGEU branch on equality, we can use the
2914       // AcceptsEquality variable to decide when to emit the BEQZ.
2915       emitRRX(AcceptsEquality ? Mips::BEQ : Mips::BNE,
2916               IsSrcRegZero ? TrgReg : SrcReg, Mips::ZERO,
2917               MCOperand::createExpr(OffsetExpr), IDLoc, Out, STI);
2918       return false;
2919     }
2920     // If we have a signed pseudo-branch and one of the registers is $0,
2921     // we can use an appropriate compare-to-zero branch. We select which one
2922     // to use in the switch statement above.
2923     emitRX(IsSrcRegZero ? ZeroSrcOpcode : ZeroTrgOpcode,
2924            IsSrcRegZero ? TrgReg : SrcReg, MCOperand::createExpr(OffsetExpr),
2925            IDLoc, Out, STI);
2926     return false;
2927   }
2928 
2929   // If neither the SrcReg nor the TrgReg are $0, we need AT to perform the
2930   // expansions. If it is not available, we return.
2931   unsigned ATRegNum = getATReg(IDLoc);
2932   if (!ATRegNum)
2933     return true;
2934 
2935   if (!EmittedNoMacroWarning)
2936     warnIfNoMacro(IDLoc);
2937 
2938   // SLT fits well with 2 of our 4 pseudo-branches:
2939   //   BLT, where $rs < $rt, translates into "slt $at, $rs, $rt" and
2940   //   BGT, where $rs > $rt, translates into "slt $at, $rt, $rs".
2941   // If the result of the SLT is 1, we branch, and if it's 0, we don't.
2942   // This is accomplished by using a BNEZ with the result of the SLT.
2943   //
2944   // The other 2 pseudo-branches are opposites of the above 2 (BGE with BLT
2945   // and BLE with BGT), so we change the BNEZ into a a BEQZ.
2946   // Because only BGE and BLE branch on equality, we can use the
2947   // AcceptsEquality variable to decide when to emit the BEQZ.
2948   // Note that the order of the SLT arguments doesn't change between
2949   // opposites.
2950   //
2951   // The same applies to the unsigned variants, except that SLTu is used
2952   // instead of SLT.
2953   emitRRR(IsUnsigned ? Mips::SLTu : Mips::SLT, ATRegNum,
2954           ReverseOrderSLT ? TrgReg : SrcReg, ReverseOrderSLT ? SrcReg : TrgReg,
2955           IDLoc, Out, STI);
2956 
2957   emitRRX(IsLikely ? (AcceptsEquality ? Mips::BEQL : Mips::BNEL)
2958                    : (AcceptsEquality ? Mips::BEQ : Mips::BNE),
2959           ATRegNum, Mips::ZERO, MCOperand::createExpr(OffsetExpr), IDLoc,
2960           Out, STI);
2961   return false;
2962 }
2963 
2964 bool MipsAsmParser::expandDiv(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
2965                               const MCSubtargetInfo *STI, const bool IsMips64,
2966                               const bool Signed) {
2967   if (hasMips32r6()) {
2968     Error(IDLoc, "instruction not supported on mips32r6 or mips64r6");
2969     return false;
2970   }
2971 
2972   warnIfNoMacro(IDLoc);
2973 
2974   const MCOperand &RsRegOp = Inst.getOperand(0);
2975   assert(RsRegOp.isReg() && "expected register operand kind");
2976   unsigned RsReg = RsRegOp.getReg();
2977 
2978   const MCOperand &RtRegOp = Inst.getOperand(1);
2979   assert(RtRegOp.isReg() && "expected register operand kind");
2980   unsigned RtReg = RtRegOp.getReg();
2981   unsigned DivOp;
2982   unsigned ZeroReg;
2983 
2984   if (IsMips64) {
2985     DivOp = Signed ? Mips::DSDIV : Mips::DUDIV;
2986     ZeroReg = Mips::ZERO_64;
2987   } else {
2988     DivOp = Signed ? Mips::SDIV : Mips::UDIV;
2989     ZeroReg = Mips::ZERO;
2990   }
2991 
2992   bool UseTraps = useTraps();
2993 
2994   if (RsReg == Mips::ZERO || RsReg == Mips::ZERO_64) {
2995     if (RtReg == Mips::ZERO || RtReg == Mips::ZERO_64)
2996       Warning(IDLoc, "dividing zero by zero");
2997     if (IsMips64) {
2998       if (Signed && (RtReg == Mips::ZERO || RtReg == Mips::ZERO_64)) {
2999         if (UseTraps) {
3000           emitRRI(Mips::TEQ, RtReg, ZeroReg, 0x7, IDLoc, Out, STI);
3001           return false;
3002         }
3003 
3004         emitII(Mips::BREAK, 0x7, 0, IDLoc, Out, STI);
3005         return false;
3006       }
3007     } else {
3008       emitRR(DivOp, RsReg, RtReg, IDLoc, Out, STI);
3009       return false;
3010     }
3011   }
3012 
3013   if (RtReg == Mips::ZERO || RtReg == Mips::ZERO_64) {
3014     Warning(IDLoc, "division by zero");
3015     if (Signed) {
3016       if (UseTraps) {
3017         emitRRI(Mips::TEQ, RtReg, ZeroReg, 0x7, IDLoc, Out, STI);
3018         return false;
3019       }
3020 
3021       emitII(Mips::BREAK, 0x7, 0, IDLoc, Out, STI);
3022       return false;
3023     }
3024   }
3025 
3026   // FIXME: The values for these two BranchTarget variables may be different in
3027   // micromips. These magic numbers need to be removed.
3028   unsigned BranchTargetNoTraps;
3029   unsigned BranchTarget;
3030 
3031   if (UseTraps) {
3032     BranchTarget = IsMips64 ? 12 : 8;
3033     emitRRI(Mips::TEQ, RtReg, ZeroReg, 0x7, IDLoc, Out, STI);
3034   } else {
3035     BranchTarget = IsMips64 ? 20 : 16;
3036     BranchTargetNoTraps = 8;
3037     // Branch to the li instruction.
3038     emitRRI(Mips::BNE, RtReg, ZeroReg, BranchTargetNoTraps, IDLoc, Out, STI);
3039   }
3040 
3041   emitRR(DivOp, RsReg, RtReg, IDLoc, Out, STI);
3042 
3043   if (!UseTraps)
3044     emitII(Mips::BREAK, 0x7, 0, IDLoc, Out, STI);
3045 
3046   if (!Signed) {
3047     emitR(Mips::MFLO, RsReg, IDLoc, Out, STI);
3048     return false;
3049   }
3050 
3051   unsigned ATReg = getATReg(IDLoc);
3052   if (!ATReg)
3053     return true;
3054 
3055   emitRRI(Mips::ADDiu, ATReg, ZeroReg, -1, IDLoc, Out, STI);
3056   if (IsMips64) {
3057     // Branch to the mflo instruction.
3058     emitRRI(Mips::BNE, RtReg, ATReg, BranchTarget, IDLoc, Out, STI);
3059     emitRRI(Mips::ADDiu, ATReg, ZeroReg, 1, IDLoc, Out, STI);
3060     emitRRI(Mips::DSLL32, ATReg, ATReg, 0x1f, IDLoc, Out, STI);
3061   } else {
3062     // Branch to the mflo instruction.
3063     emitRRI(Mips::BNE, RtReg, ATReg, BranchTarget, IDLoc, Out, STI);
3064     emitRI(Mips::LUi, ATReg, (uint16_t)0x8000, IDLoc, Out, STI);
3065   }
3066 
3067   if (UseTraps)
3068     emitRRI(Mips::TEQ, RsReg, ATReg, 0x6, IDLoc, Out, STI);
3069   else {
3070     // Branch to the mflo instruction.
3071     emitRRI(Mips::BNE, RsReg, ATReg, BranchTargetNoTraps, IDLoc, Out, STI);
3072     emitRRI(Mips::SLL, ZeroReg, ZeroReg, 0, IDLoc, Out, STI);
3073     emitII(Mips::BREAK, 0x6, 0, IDLoc, Out, STI);
3074   }
3075   emitR(Mips::MFLO, RsReg, IDLoc, Out, STI);
3076   return false;
3077 }
3078 
3079 bool MipsAsmParser::expandTrunc(MCInst &Inst, bool IsDouble, bool Is64FPU,
3080                                 SMLoc IDLoc, MCStreamer &Out,
3081                                 const MCSubtargetInfo *STI) {
3082 
3083   assert(Inst.getNumOperands() == 3 && "Invalid operand count");
3084   assert(Inst.getOperand(0).isReg() && Inst.getOperand(1).isReg() &&
3085          Inst.getOperand(2).isReg() && "Invalid instruction operand.");
3086 
3087   unsigned FirstReg = Inst.getOperand(0).getReg();
3088   unsigned SecondReg = Inst.getOperand(1).getReg();
3089   unsigned ThirdReg = Inst.getOperand(2).getReg();
3090 
3091   if (hasMips1() && !hasMips2()) {
3092     unsigned ATReg = getATReg(IDLoc);
3093     if (!ATReg)
3094       return true;
3095     emitRR(Mips::CFC1, ThirdReg, Mips::RA, IDLoc, Out, STI);
3096     emitRR(Mips::CFC1, ThirdReg, Mips::RA, IDLoc, Out, STI);
3097     createNop(false, IDLoc, Out, STI);
3098     emitRRI(Mips::ORi, ATReg, ThirdReg, 0x3, IDLoc, Out, STI);
3099     emitRRI(Mips::XORi, ATReg, ATReg, 0x2, IDLoc, Out, STI);
3100     emitRR(Mips::CTC1, Mips::RA, ATReg, IDLoc, Out, STI);
3101     createNop(false, IDLoc, Out, STI);
3102     emitRR(IsDouble ? (Is64FPU ? Mips::CVT_W_D64 : Mips::CVT_W_D32)
3103                     : Mips::CVT_W_S,
3104            FirstReg, SecondReg, IDLoc, Out, STI);
3105     emitRR(Mips::CTC1, Mips::RA, ThirdReg, IDLoc, Out, STI);
3106     createNop(false, IDLoc, Out, STI);
3107     return false;
3108   }
3109 
3110   emitRR(IsDouble ? (Is64FPU ? Mips::TRUNC_W_D64 : Mips::TRUNC_W_D32)
3111                   : Mips::TRUNC_W_S,
3112          FirstReg, SecondReg, IDLoc, Out, STI);
3113 
3114   return false;
3115 }
3116 
3117 bool MipsAsmParser::expandUlh(MCInst &Inst, bool Signed, SMLoc IDLoc,
3118                               MCStreamer &Out, const MCSubtargetInfo *STI) {
3119   if (hasMips32r6() || hasMips64r6()) {
3120     Error(IDLoc, "instruction not supported on mips32r6 or mips64r6");
3121     return false;
3122   }
3123 
3124   warnIfNoMacro(IDLoc);
3125 
3126   const MCOperand &DstRegOp = Inst.getOperand(0);
3127   assert(DstRegOp.isReg() && "expected register operand kind");
3128 
3129   const MCOperand &SrcRegOp = Inst.getOperand(1);
3130   assert(SrcRegOp.isReg() && "expected register operand kind");
3131 
3132   const MCOperand &OffsetImmOp = Inst.getOperand(2);
3133   assert(OffsetImmOp.isImm() && "expected immediate operand kind");
3134 
3135   unsigned DstReg = DstRegOp.getReg();
3136   unsigned SrcReg = SrcRegOp.getReg();
3137   int64_t OffsetValue = OffsetImmOp.getImm();
3138 
3139   // NOTE: We always need AT for ULHU, as it is always used as the source
3140   // register for one of the LBu's.
3141   unsigned ATReg = getATReg(IDLoc);
3142   if (!ATReg)
3143     return true;
3144 
3145   // When the value of offset+1 does not fit in 16 bits, we have to load the
3146   // offset in AT, (D)ADDu the original source register (if there was one), and
3147   // then use AT as the source register for the 2 generated LBu's.
3148   bool LoadedOffsetInAT = false;
3149   if (!isInt<16>(OffsetValue + 1) || !isInt<16>(OffsetValue)) {
3150     LoadedOffsetInAT = true;
3151 
3152     if (loadImmediate(OffsetValue, ATReg, Mips::NoRegister, !ABI.ArePtrs64bit(),
3153                       true, IDLoc, Out, STI))
3154       return true;
3155 
3156     // NOTE: We do this (D)ADDu here instead of doing it in loadImmediate()
3157     // because it will make our output more similar to GAS'. For example,
3158     // generating an "ori $1, $zero, 32768" followed by an "addu $1, $1, $9",
3159     // instead of just an "ori $1, $9, 32768".
3160     // NOTE: If there is no source register specified in the ULHU, the parser
3161     // will interpret it as $0.
3162     if (SrcReg != Mips::ZERO && SrcReg != Mips::ZERO_64)
3163       createAddu(ATReg, ATReg, SrcReg, ABI.ArePtrs64bit(), Out, STI);
3164   }
3165 
3166   unsigned FirstLbuDstReg = LoadedOffsetInAT ? DstReg : ATReg;
3167   unsigned SecondLbuDstReg = LoadedOffsetInAT ? ATReg : DstReg;
3168   unsigned LbuSrcReg = LoadedOffsetInAT ? ATReg : SrcReg;
3169 
3170   int64_t FirstLbuOffset = 0, SecondLbuOffset = 0;
3171   if (isLittle()) {
3172     FirstLbuOffset = LoadedOffsetInAT ? 1 : (OffsetValue + 1);
3173     SecondLbuOffset = LoadedOffsetInAT ? 0 : OffsetValue;
3174   } else {
3175     FirstLbuOffset = LoadedOffsetInAT ? 0 : OffsetValue;
3176     SecondLbuOffset = LoadedOffsetInAT ? 1 : (OffsetValue + 1);
3177   }
3178 
3179   unsigned SllReg = LoadedOffsetInAT ? DstReg : ATReg;
3180 
3181   emitRRI(Signed ? Mips::LB : Mips::LBu, FirstLbuDstReg, LbuSrcReg,
3182           FirstLbuOffset, IDLoc, Out, STI);
3183 
3184   emitRRI(Mips::LBu, SecondLbuDstReg, LbuSrcReg, SecondLbuOffset, IDLoc, Out,
3185           STI);
3186 
3187   emitRRI(Mips::SLL, SllReg, SllReg, 8, IDLoc, Out, STI);
3188 
3189   emitRRR(Mips::OR, DstReg, DstReg, ATReg, IDLoc, Out, STI);
3190 
3191   return false;
3192 }
3193 
3194 bool MipsAsmParser::expandUlw(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
3195                               const MCSubtargetInfo *STI) {
3196   if (hasMips32r6() || hasMips64r6()) {
3197     Error(IDLoc, "instruction not supported on mips32r6 or mips64r6");
3198     return false;
3199   }
3200 
3201   const MCOperand &DstRegOp = Inst.getOperand(0);
3202   assert(DstRegOp.isReg() && "expected register operand kind");
3203 
3204   const MCOperand &SrcRegOp = Inst.getOperand(1);
3205   assert(SrcRegOp.isReg() && "expected register operand kind");
3206 
3207   const MCOperand &OffsetImmOp = Inst.getOperand(2);
3208   assert(OffsetImmOp.isImm() && "expected immediate operand kind");
3209 
3210   unsigned SrcReg = SrcRegOp.getReg();
3211   int64_t OffsetValue = OffsetImmOp.getImm();
3212   unsigned ATReg = 0;
3213 
3214   // When the value of offset+3 does not fit in 16 bits, we have to load the
3215   // offset in AT, (D)ADDu the original source register (if there was one), and
3216   // then use AT as the source register for the generated LWL and LWR.
3217   bool LoadedOffsetInAT = false;
3218   if (!isInt<16>(OffsetValue + 3) || !isInt<16>(OffsetValue)) {
3219     ATReg = getATReg(IDLoc);
3220     if (!ATReg)
3221       return true;
3222     LoadedOffsetInAT = true;
3223 
3224     warnIfNoMacro(IDLoc);
3225 
3226     if (loadImmediate(OffsetValue, ATReg, Mips::NoRegister, !ABI.ArePtrs64bit(),
3227                       true, IDLoc, Out, STI))
3228       return true;
3229 
3230     // NOTE: We do this (D)ADDu here instead of doing it in loadImmediate()
3231     // because it will make our output more similar to GAS'. For example,
3232     // generating an "ori $1, $zero, 32768" followed by an "addu $1, $1, $9",
3233     // instead of just an "ori $1, $9, 32768".
3234     // NOTE: If there is no source register specified in the ULW, the parser
3235     // will interpret it as $0.
3236     if (SrcReg != Mips::ZERO && SrcReg != Mips::ZERO_64)
3237       createAddu(ATReg, ATReg, SrcReg, ABI.ArePtrs64bit(), Out, STI);
3238   }
3239 
3240   unsigned FinalSrcReg = LoadedOffsetInAT ? ATReg : SrcReg;
3241   int64_t LeftLoadOffset = 0, RightLoadOffset  = 0;
3242   if (isLittle()) {
3243     LeftLoadOffset = LoadedOffsetInAT ? 3 : (OffsetValue + 3);
3244     RightLoadOffset  = LoadedOffsetInAT ? 0 : OffsetValue;
3245   } else {
3246     LeftLoadOffset = LoadedOffsetInAT ? 0 : OffsetValue;
3247     RightLoadOffset  = LoadedOffsetInAT ? 3 : (OffsetValue + 3);
3248   }
3249 
3250   emitRRI(Mips::LWL, DstRegOp.getReg(), FinalSrcReg, LeftLoadOffset, IDLoc, Out,
3251           STI);
3252 
3253   emitRRI(Mips::LWR, DstRegOp.getReg(), FinalSrcReg, RightLoadOffset, IDLoc,
3254           Out, STI);
3255 
3256   return false;
3257 }
3258 
3259 bool MipsAsmParser::expandAliasImmediate(MCInst &Inst, SMLoc IDLoc,
3260                                          MCStreamer &Out,
3261                                          const MCSubtargetInfo *STI) {
3262 
3263   assert (Inst.getNumOperands() == 3 && "Invalid operand count");
3264   assert (Inst.getOperand(0).isReg() &&
3265           Inst.getOperand(1).isReg() &&
3266           Inst.getOperand(2).isImm() && "Invalid instruction operand.");
3267 
3268   unsigned ATReg = Mips::NoRegister;
3269   unsigned FinalDstReg = Mips::NoRegister;
3270   unsigned DstReg = Inst.getOperand(0).getReg();
3271   unsigned SrcReg = Inst.getOperand(1).getReg();
3272   int64_t ImmValue = Inst.getOperand(2).getImm();
3273 
3274   bool Is32Bit = isInt<32>(ImmValue) || isUInt<32>(ImmValue);
3275 
3276   unsigned FinalOpcode = Inst.getOpcode();
3277 
3278   if (DstReg == SrcReg) {
3279     ATReg = getATReg(Inst.getLoc());
3280     if (!ATReg)
3281       return true;
3282     FinalDstReg = DstReg;
3283     DstReg = ATReg;
3284   }
3285 
3286   if (!loadImmediate(ImmValue, DstReg, Mips::NoRegister, Is32Bit, false, Inst.getLoc(), Out, STI)) {
3287     switch (FinalOpcode) {
3288     default:
3289       llvm_unreachable("unimplemented expansion");
3290     case (Mips::ADDi):
3291       FinalOpcode = Mips::ADD;
3292       break;
3293     case (Mips::ADDiu):
3294       FinalOpcode = Mips::ADDu;
3295       break;
3296     case (Mips::ANDi):
3297       FinalOpcode = Mips::AND;
3298       break;
3299     case (Mips::NORImm):
3300       FinalOpcode = Mips::NOR;
3301       break;
3302     case (Mips::ORi):
3303       FinalOpcode = Mips::OR;
3304       break;
3305     case (Mips::SLTi):
3306       FinalOpcode = Mips::SLT;
3307       break;
3308     case (Mips::SLTiu):
3309       FinalOpcode = Mips::SLTu;
3310       break;
3311     case (Mips::XORi):
3312       FinalOpcode = Mips::XOR;
3313       break;
3314     }
3315 
3316     if (FinalDstReg == Mips::NoRegister)
3317       emitRRR(FinalOpcode, DstReg, DstReg, SrcReg, IDLoc, Out, STI);
3318     else
3319       emitRRR(FinalOpcode, FinalDstReg, FinalDstReg, DstReg, IDLoc, Out, STI);
3320     return false;
3321   }
3322   return true;
3323 }
3324 
3325 bool MipsAsmParser::expandRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
3326                                    const MCSubtargetInfo *STI) {
3327   unsigned ATReg = Mips::NoRegister;
3328   unsigned DReg = Inst.getOperand(0).getReg();
3329   unsigned SReg = Inst.getOperand(1).getReg();
3330   unsigned TReg = Inst.getOperand(2).getReg();
3331   unsigned TmpReg = DReg;
3332 
3333   unsigned FirstShift = Mips::NOP;
3334   unsigned SecondShift = Mips::NOP;
3335 
3336   if (hasMips32r2()) {
3337 
3338     if (DReg == SReg) {
3339       TmpReg = getATReg(Inst.getLoc());
3340       if (!TmpReg)
3341         return true;
3342     }
3343 
3344     if (Inst.getOpcode() == Mips::ROL) {
3345       emitRRR(Mips::SUBu, TmpReg, Mips::ZERO, TReg, Inst.getLoc(), Out, STI);
3346       emitRRR(Mips::ROTRV, DReg, SReg, TmpReg, Inst.getLoc(), Out, STI);
3347       return false;
3348     }
3349 
3350     if (Inst.getOpcode() == Mips::ROR) {
3351       emitRRR(Mips::ROTRV, DReg, SReg, TReg, Inst.getLoc(), Out, STI);
3352       return false;
3353     }
3354 
3355     return true;
3356   }
3357 
3358   if (hasMips32()) {
3359 
3360     switch (Inst.getOpcode()) {
3361     default:
3362       llvm_unreachable("unexpected instruction opcode");
3363     case Mips::ROL:
3364       FirstShift = Mips::SRLV;
3365       SecondShift = Mips::SLLV;
3366       break;
3367     case Mips::ROR:
3368       FirstShift = Mips::SLLV;
3369       SecondShift = Mips::SRLV;
3370       break;
3371     }
3372 
3373     ATReg = getATReg(Inst.getLoc());
3374     if (!ATReg)
3375       return true;
3376 
3377     emitRRR(Mips::SUBu, ATReg, Mips::ZERO, TReg, Inst.getLoc(), Out, STI);
3378     emitRRR(FirstShift, ATReg, SReg, ATReg, Inst.getLoc(), Out, STI);
3379     emitRRR(SecondShift, DReg, SReg, TReg, Inst.getLoc(), Out, STI);
3380     emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), Out, STI);
3381 
3382     return false;
3383   }
3384 
3385   return true;
3386 }
3387 
3388 bool MipsAsmParser::expandRotationImm(MCInst &Inst, SMLoc IDLoc,
3389                                       MCStreamer &Out,
3390                                       const MCSubtargetInfo *STI) {
3391 
3392   unsigned ATReg = Mips::NoRegister;
3393   unsigned DReg = Inst.getOperand(0).getReg();
3394   unsigned SReg = Inst.getOperand(1).getReg();
3395   int64_t ImmValue = Inst.getOperand(2).getImm();
3396 
3397   unsigned FirstShift = Mips::NOP;
3398   unsigned SecondShift = Mips::NOP;
3399 
3400   if (hasMips32r2()) {
3401 
3402     if (Inst.getOpcode() == Mips::ROLImm) {
3403       uint64_t MaxShift = 32;
3404       uint64_t ShiftValue = ImmValue;
3405       if (ImmValue != 0)
3406         ShiftValue = MaxShift - ImmValue;
3407       emitRRI(Mips::ROTR, DReg, SReg, ShiftValue, Inst.getLoc(), Out, STI);
3408       return false;
3409     }
3410 
3411     if (Inst.getOpcode() == Mips::RORImm) {
3412       emitRRI(Mips::ROTR, DReg, SReg, ImmValue, Inst.getLoc(), Out, STI);
3413       return false;
3414     }
3415 
3416     return true;
3417   }
3418 
3419   if (hasMips32()) {
3420 
3421     if (ImmValue == 0) {
3422       emitRRI(Mips::SRL, DReg, SReg, 0, Inst.getLoc(), Out, STI);
3423       return false;
3424     }
3425 
3426     switch (Inst.getOpcode()) {
3427     default:
3428       llvm_unreachable("unexpected instruction opcode");
3429     case Mips::ROLImm:
3430       FirstShift = Mips::SLL;
3431       SecondShift = Mips::SRL;
3432       break;
3433     case Mips::RORImm:
3434       FirstShift = Mips::SRL;
3435       SecondShift = Mips::SLL;
3436       break;
3437     }
3438 
3439     ATReg = getATReg(Inst.getLoc());
3440     if (!ATReg)
3441       return true;
3442 
3443     emitRRI(FirstShift, ATReg, SReg, ImmValue, Inst.getLoc(), Out, STI);
3444     emitRRI(SecondShift, DReg, SReg, 32 - ImmValue, Inst.getLoc(), Out, STI);
3445     emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), Out, STI);
3446 
3447     return false;
3448   }
3449 
3450   return true;
3451 }
3452 
3453 bool MipsAsmParser::expandDRotation(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
3454                                     const MCSubtargetInfo *STI) {
3455 
3456   unsigned ATReg = Mips::NoRegister;
3457   unsigned DReg = Inst.getOperand(0).getReg();
3458   unsigned SReg = Inst.getOperand(1).getReg();
3459   unsigned TReg = Inst.getOperand(2).getReg();
3460   unsigned TmpReg = DReg;
3461 
3462   unsigned FirstShift = Mips::NOP;
3463   unsigned SecondShift = Mips::NOP;
3464 
3465   if (hasMips64r2()) {
3466 
3467     if (TmpReg == SReg) {
3468       TmpReg = getATReg(Inst.getLoc());
3469       if (!TmpReg)
3470         return true;
3471     }
3472 
3473     if (Inst.getOpcode() == Mips::DROL) {
3474       emitRRR(Mips::DSUBu, TmpReg, Mips::ZERO, TReg, Inst.getLoc(), Out, STI);
3475       emitRRR(Mips::DROTRV, DReg, SReg, TmpReg, Inst.getLoc(), Out, STI);
3476       return false;
3477     }
3478 
3479     if (Inst.getOpcode() == Mips::DROR) {
3480       emitRRR(Mips::DROTRV, DReg, SReg, TReg, Inst.getLoc(), Out, STI);
3481       return false;
3482     }
3483 
3484     return true;
3485   }
3486 
3487   if (hasMips64()) {
3488 
3489     switch (Inst.getOpcode()) {
3490     default:
3491       llvm_unreachable("unexpected instruction opcode");
3492     case Mips::DROL:
3493       FirstShift = Mips::DSRLV;
3494       SecondShift = Mips::DSLLV;
3495       break;
3496     case Mips::DROR:
3497       FirstShift = Mips::DSLLV;
3498       SecondShift = Mips::DSRLV;
3499       break;
3500     }
3501 
3502     ATReg = getATReg(Inst.getLoc());
3503     if (!ATReg)
3504       return true;
3505 
3506     emitRRR(Mips::DSUBu, ATReg, Mips::ZERO, TReg, Inst.getLoc(), Out, STI);
3507     emitRRR(FirstShift, ATReg, SReg, ATReg, Inst.getLoc(), Out, STI);
3508     emitRRR(SecondShift, DReg, SReg, TReg, Inst.getLoc(), Out, STI);
3509     emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), Out, STI);
3510 
3511     return false;
3512   }
3513 
3514   return true;
3515 }
3516 
3517 bool MipsAsmParser::expandDRotationImm(MCInst &Inst, SMLoc IDLoc,
3518                                        MCStreamer &Out,
3519                                        const MCSubtargetInfo *STI) {
3520 
3521   unsigned ATReg = Mips::NoRegister;
3522   unsigned DReg = Inst.getOperand(0).getReg();
3523   unsigned SReg = Inst.getOperand(1).getReg();
3524   int64_t ImmValue = Inst.getOperand(2).getImm() % 64;
3525 
3526   unsigned FirstShift = Mips::NOP;
3527   unsigned SecondShift = Mips::NOP;
3528 
3529   MCInst TmpInst;
3530 
3531   if (hasMips64r2()) {
3532 
3533     unsigned FinalOpcode = Mips::NOP;
3534     if (ImmValue == 0)
3535       FinalOpcode = Mips::DROTR;
3536     else if (ImmValue % 32 == 0)
3537       FinalOpcode = Mips::DROTR32;
3538     else if ((ImmValue >= 1) && (ImmValue <= 32)) {
3539       if (Inst.getOpcode() == Mips::DROLImm)
3540         FinalOpcode = Mips::DROTR32;
3541       else
3542         FinalOpcode = Mips::DROTR;
3543     } else if (ImmValue >= 33) {
3544       if (Inst.getOpcode() == Mips::DROLImm)
3545         FinalOpcode = Mips::DROTR;
3546       else
3547         FinalOpcode = Mips::DROTR32;
3548     }
3549 
3550     uint64_t ShiftValue = ImmValue % 32;
3551     if (Inst.getOpcode() == Mips::DROLImm)
3552       ShiftValue = (32 - ImmValue % 32) % 32;
3553 
3554     emitRRI(FinalOpcode, DReg, SReg, ShiftValue, Inst.getLoc(), Out, STI);
3555 
3556     return false;
3557   }
3558 
3559   if (hasMips64()) {
3560 
3561     if (ImmValue == 0) {
3562       emitRRI(Mips::DSRL, DReg, SReg, 0, Inst.getLoc(), Out, STI);
3563       return false;
3564     }
3565 
3566     switch (Inst.getOpcode()) {
3567     default:
3568       llvm_unreachable("unexpected instruction opcode");
3569     case Mips::DROLImm:
3570       if ((ImmValue >= 1) && (ImmValue <= 31)) {
3571         FirstShift = Mips::DSLL;
3572         SecondShift = Mips::DSRL32;
3573       }
3574       if (ImmValue == 32) {
3575         FirstShift = Mips::DSLL32;
3576         SecondShift = Mips::DSRL32;
3577       }
3578       if ((ImmValue >= 33) && (ImmValue <= 63)) {
3579         FirstShift = Mips::DSLL32;
3580         SecondShift = Mips::DSRL;
3581       }
3582       break;
3583     case Mips::DRORImm:
3584       if ((ImmValue >= 1) && (ImmValue <= 31)) {
3585         FirstShift = Mips::DSRL;
3586         SecondShift = Mips::DSLL32;
3587       }
3588       if (ImmValue == 32) {
3589         FirstShift = Mips::DSRL32;
3590         SecondShift = Mips::DSLL32;
3591       }
3592       if ((ImmValue >= 33) && (ImmValue <= 63)) {
3593         FirstShift = Mips::DSRL32;
3594         SecondShift = Mips::DSLL;
3595       }
3596       break;
3597     }
3598 
3599     ATReg = getATReg(Inst.getLoc());
3600     if (!ATReg)
3601       return true;
3602 
3603     emitRRI(FirstShift, ATReg, SReg, ImmValue % 32, Inst.getLoc(), Out, STI);
3604     emitRRI(SecondShift, DReg, SReg, (32 - ImmValue % 32) % 32, Inst.getLoc(), Out, STI);
3605     emitRRR(Mips::OR, DReg, DReg, ATReg, Inst.getLoc(), Out, STI);
3606 
3607     return false;
3608   }
3609 
3610   return true;
3611 }
3612 
3613 bool MipsAsmParser::expandAbs(MCInst &Inst, SMLoc IDLoc, MCStreamer &Out,
3614                               const MCSubtargetInfo *STI) {
3615 
3616   unsigned FirstRegOp = Inst.getOperand(0).getReg();
3617   unsigned SecondRegOp = Inst.getOperand(1).getReg();
3618 
3619   emitRI(Mips::BGEZ, SecondRegOp, 8, IDLoc, Out, STI);
3620   if (FirstRegOp != SecondRegOp)
3621     emitRRR(Mips::ADDu, FirstRegOp, SecondRegOp, Mips::ZERO, IDLoc, Out, STI);
3622   else
3623     createNop(false, IDLoc, Out, STI);
3624   emitRRR(Mips::SUB, FirstRegOp, Mips::ZERO, SecondRegOp, IDLoc, Out, STI);
3625 
3626   return false;
3627 }
3628 
3629 void MipsAsmParser::createNop(bool hasShortDelaySlot, SMLoc IDLoc,
3630                               MCStreamer &Out, const MCSubtargetInfo *STI) {
3631   if (hasShortDelaySlot)
3632     emitRR(Mips::MOVE16_MM, Mips::ZERO, Mips::ZERO, IDLoc, Out, STI);
3633   else
3634     emitRRI(Mips::SLL, Mips::ZERO, Mips::ZERO, 0, IDLoc, Out, STI);
3635 }
3636 
3637 void MipsAsmParser::createAddu(unsigned DstReg, unsigned SrcReg,
3638                                unsigned TrgReg, bool Is64Bit, MCStreamer &Out,
3639                                const MCSubtargetInfo *STI) {
3640   emitRRR(Is64Bit ? Mips::DADDu : Mips::ADDu, DstReg, SrcReg, TrgReg, SMLoc(),
3641           Out, STI);
3642 }
3643 
3644 void MipsAsmParser::createCpRestoreMemOp(bool IsLoad, int StackOffset,
3645                                          SMLoc IDLoc, MCStreamer &Out,
3646                                          const MCSubtargetInfo *STI) {
3647   // If the offset can not fit into 16 bits, we need to expand.
3648   if (!isInt<16>(StackOffset)) {
3649     MCInst MemInst;
3650     MemInst.setOpcode(IsLoad ? Mips::LW : Mips::SW);
3651     MemInst.addOperand(MCOperand::createReg(Mips::GP));
3652     MemInst.addOperand(MCOperand::createReg(Mips::SP));
3653     MemInst.addOperand(MCOperand::createImm(StackOffset));
3654     expandMemInst(MemInst, IDLoc, Out, STI, IsLoad, true /*HasImmOpnd*/);
3655     return;
3656   }
3657 
3658   emitRRI(IsLoad ? Mips::LW : Mips::SW, Mips::GP, Mips::SP, StackOffset, IDLoc,
3659           Out, STI);
3660 }
3661 
3662 unsigned MipsAsmParser::checkTargetMatchPredicate(MCInst &Inst) {
3663   // As described by the Mips32r2 spec, the registers Rd and Rs for
3664   // jalr.hb must be different.
3665   unsigned Opcode = Inst.getOpcode();
3666 
3667   if (Opcode == Mips::JALR_HB &&
3668       (Inst.getOperand(0).getReg() == Inst.getOperand(1).getReg()))
3669     return Match_RequiresDifferentSrcAndDst;
3670 
3671   return Match_Success;
3672 }
3673 
3674 static SMLoc RefineErrorLoc(const SMLoc Loc, const OperandVector &Operands,
3675                             uint64_t ErrorInfo) {
3676   if (ErrorInfo != ~0ULL && ErrorInfo < Operands.size()) {
3677     SMLoc ErrorLoc = Operands[ErrorInfo]->getStartLoc();
3678     if (ErrorLoc == SMLoc())
3679       return Loc;
3680     return ErrorLoc;
3681   }
3682   return Loc;
3683 }
3684 
3685 bool MipsAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode,
3686                                             OperandVector &Operands,
3687                                             MCStreamer &Out,
3688                                             uint64_t &ErrorInfo,
3689                                             bool MatchingInlineAsm) {
3690 
3691   MCInst Inst;
3692   unsigned MatchResult =
3693       MatchInstructionImpl(Operands, Inst, ErrorInfo, MatchingInlineAsm);
3694 
3695   switch (MatchResult) {
3696   case Match_Success: {
3697     if (processInstruction(Inst, IDLoc, Out, STI))
3698       return true;
3699     return false;
3700   }
3701   case Match_MissingFeature:
3702     Error(IDLoc, "instruction requires a CPU feature not currently enabled");
3703     return true;
3704   case Match_InvalidOperand: {
3705     SMLoc ErrorLoc = IDLoc;
3706     if (ErrorInfo != ~0ULL) {
3707       if (ErrorInfo >= Operands.size())
3708         return Error(IDLoc, "too few operands for instruction");
3709 
3710       ErrorLoc = Operands[ErrorInfo]->getStartLoc();
3711       if (ErrorLoc == SMLoc())
3712         ErrorLoc = IDLoc;
3713     }
3714 
3715     return Error(ErrorLoc, "invalid operand for instruction");
3716   }
3717   case Match_MnemonicFail:
3718     return Error(IDLoc, "invalid instruction");
3719   case Match_RequiresDifferentSrcAndDst:
3720     return Error(IDLoc, "source and destination must be different");
3721   case Match_Immz:
3722     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo), "expected '0'");
3723   case Match_UImm1_0:
3724     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3725                  "expected 1-bit unsigned immediate");
3726   case Match_UImm2_0:
3727     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3728                  "expected 2-bit unsigned immediate");
3729   case Match_UImm2_1:
3730     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3731                  "expected immediate in range 1 .. 4");
3732   case Match_UImm3_0:
3733     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3734                  "expected 3-bit unsigned immediate");
3735   case Match_UImm4_0:
3736     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3737                  "expected 4-bit unsigned immediate");
3738   case Match_SImm4_0:
3739     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3740                  "expected 4-bit signed immediate");
3741   case Match_UImm5_0:
3742     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3743                  "expected 5-bit unsigned immediate");
3744   case Match_SImm5_0:
3745     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3746                  "expected 5-bit signed immediate");
3747   case Match_UImm5_1:
3748     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3749                  "expected immediate in range 1 .. 32");
3750   case Match_UImm5_32:
3751     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3752                  "expected immediate in range 32 .. 63");
3753   case Match_UImm5_33:
3754     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3755                  "expected immediate in range 33 .. 64");
3756   case Match_UImm5_0_Report_UImm6:
3757     // This is used on UImm5 operands that have a corresponding UImm5_32
3758     // operand to avoid confusing the user.
3759     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3760                  "expected 6-bit unsigned immediate");
3761   case Match_UImm5_Lsl2:
3762     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3763                  "expected both 7-bit unsigned immediate and multiple of 4");
3764   case Match_UImmRange2_64:
3765     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3766                  "expected immediate in range 2 .. 64");
3767   case Match_UImm6_0:
3768     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3769                  "expected 6-bit unsigned immediate");
3770   case Match_UImm6_Lsl2:
3771     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3772                  "expected both 8-bit unsigned immediate and multiple of 4");
3773   case Match_SImm6_0:
3774     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3775                  "expected 6-bit signed immediate");
3776   case Match_UImm7_0:
3777     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3778                  "expected 7-bit unsigned immediate");
3779   case Match_UImm7_N1:
3780     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3781                  "expected immediate in range -1 .. 126");
3782   case Match_SImm7_Lsl2:
3783     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3784                  "expected both 9-bit signed immediate and multiple of 4");
3785   case Match_UImm8_0:
3786     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3787                  "expected 8-bit unsigned immediate");
3788   case Match_UImm10_0:
3789     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3790                  "expected 10-bit unsigned immediate");
3791   case Match_SImm10_0:
3792     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3793                  "expected 10-bit signed immediate");
3794   case Match_SImm11_0:
3795     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3796                  "expected 11-bit signed immediate");
3797   case Match_UImm16:
3798   case Match_UImm16_Relaxed:
3799     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3800                  "expected 16-bit unsigned immediate");
3801   case Match_SImm16:
3802   case Match_SImm16_Relaxed:
3803     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3804                  "expected 16-bit signed immediate");
3805   case Match_UImm20_0:
3806     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3807                  "expected 20-bit unsigned immediate");
3808   case Match_UImm26_0:
3809     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3810                  "expected 26-bit unsigned immediate");
3811   case Match_SImm32:
3812   case Match_SImm32_Relaxed:
3813     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3814                  "expected 32-bit signed immediate");
3815   case Match_MemSImm9:
3816     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3817                  "expected memory with 9-bit signed offset");
3818   case Match_MemGPSImm9:
3819     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3820                  "expected memory with $gp and 9-bit signed offset");
3821   case Match_MemSImm10:
3822     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3823                  "expected memory with 10-bit signed offset");
3824   case Match_MemSImm10Lsl1:
3825     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3826                  "expected memory with 11-bit signed offset and multiple of 2");
3827   case Match_MemSImm10Lsl2:
3828     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3829                  "expected memory with 12-bit signed offset and multiple of 4");
3830   case Match_MemSImm10Lsl3:
3831     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3832                  "expected memory with 13-bit signed offset and multiple of 8");
3833   case Match_MemSImm11:
3834     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3835                  "expected memory with 11-bit signed offset");
3836   case Match_MemSImm16:
3837     return Error(RefineErrorLoc(IDLoc, Operands, ErrorInfo),
3838                  "expected memory with 16-bit signed offset");
3839   }
3840 
3841   llvm_unreachable("Implement any new match types added!");
3842 }
3843 
3844 void MipsAsmParser::warnIfRegIndexIsAT(unsigned RegIndex, SMLoc Loc) {
3845   if (RegIndex != 0 && AssemblerOptions.back()->getATRegIndex() == RegIndex)
3846     Warning(Loc, "used $at (currently $" + Twine(RegIndex) +
3847                      ") without \".set noat\"");
3848 }
3849 
3850 void MipsAsmParser::warnIfNoMacro(SMLoc Loc) {
3851   if (!AssemblerOptions.back()->isMacro())
3852     Warning(Loc, "macro instruction expanded into multiple instructions");
3853 }
3854 
3855 void
3856 MipsAsmParser::printWarningWithFixIt(const Twine &Msg, const Twine &FixMsg,
3857                                      SMRange Range, bool ShowColors) {
3858   getSourceManager().PrintMessage(Range.Start, SourceMgr::DK_Warning, Msg,
3859                                   Range, SMFixIt(Range, FixMsg),
3860                                   ShowColors);
3861 }
3862 
3863 int MipsAsmParser::matchCPURegisterName(StringRef Name) {
3864   int CC;
3865 
3866   CC = StringSwitch<unsigned>(Name)
3867            .Case("zero", 0)
3868            .Case("at", 1)
3869            .Case("a0", 4)
3870            .Case("a1", 5)
3871            .Case("a2", 6)
3872            .Case("a3", 7)
3873            .Case("v0", 2)
3874            .Case("v1", 3)
3875            .Case("s0", 16)
3876            .Case("s1", 17)
3877            .Case("s2", 18)
3878            .Case("s3", 19)
3879            .Case("s4", 20)
3880            .Case("s5", 21)
3881            .Case("s6", 22)
3882            .Case("s7", 23)
3883            .Case("k0", 26)
3884            .Case("k1", 27)
3885            .Case("gp", 28)
3886            .Case("sp", 29)
3887            .Case("fp", 30)
3888            .Case("s8", 30)
3889            .Case("ra", 31)
3890            .Case("t0", 8)
3891            .Case("t1", 9)
3892            .Case("t2", 10)
3893            .Case("t3", 11)
3894            .Case("t4", 12)
3895            .Case("t5", 13)
3896            .Case("t6", 14)
3897            .Case("t7", 15)
3898            .Case("t8", 24)
3899            .Case("t9", 25)
3900            .Default(-1);
3901 
3902   if (!(isABI_N32() || isABI_N64()))
3903     return CC;
3904 
3905   if (12 <= CC && CC <= 15) {
3906     // Name is one of t4-t7
3907     AsmToken RegTok = getLexer().peekTok();
3908     SMRange RegRange = RegTok.getLocRange();
3909 
3910     StringRef FixedName = StringSwitch<StringRef>(Name)
3911                               .Case("t4", "t0")
3912                               .Case("t5", "t1")
3913                               .Case("t6", "t2")
3914                               .Case("t7", "t3")
3915                               .Default("");
3916     assert(FixedName != "" &&  "Register name is not one of t4-t7.");
3917 
3918     printWarningWithFixIt("register names $t4-$t7 are only available in O32.",
3919                           "Did you mean $" + FixedName + "?", RegRange);
3920   }
3921 
3922   // Although SGI documentation just cuts out t0-t3 for n32/n64,
3923   // GNU pushes the values of t0-t3 to override the o32/o64 values for t4-t7
3924   // We are supporting both cases, so for t0-t3 we'll just push them to t4-t7.
3925   if (8 <= CC && CC <= 11)
3926     CC += 4;
3927 
3928   if (CC == -1)
3929     CC = StringSwitch<unsigned>(Name)
3930              .Case("a4", 8)
3931              .Case("a5", 9)
3932              .Case("a6", 10)
3933              .Case("a7", 11)
3934              .Case("kt0", 26)
3935              .Case("kt1", 27)
3936              .Default(-1);
3937 
3938   return CC;
3939 }
3940 
3941 int MipsAsmParser::matchHWRegsRegisterName(StringRef Name) {
3942   int CC;
3943 
3944   CC = StringSwitch<unsigned>(Name)
3945             .Case("hwr_cpunum", 0)
3946             .Case("hwr_synci_step", 1)
3947             .Case("hwr_cc", 2)
3948             .Case("hwr_ccres", 3)
3949             .Case("hwr_ulr", 29)
3950             .Default(-1);
3951 
3952   return CC;
3953 }
3954 
3955 int MipsAsmParser::matchFPURegisterName(StringRef Name) {
3956 
3957   if (Name[0] == 'f') {
3958     StringRef NumString = Name.substr(1);
3959     unsigned IntVal;
3960     if (NumString.getAsInteger(10, IntVal))
3961       return -1;     // This is not an integer.
3962     if (IntVal > 31) // Maximum index for fpu register.
3963       return -1;
3964     return IntVal;
3965   }
3966   return -1;
3967 }
3968 
3969 int MipsAsmParser::matchFCCRegisterName(StringRef Name) {
3970 
3971   if (Name.startswith("fcc")) {
3972     StringRef NumString = Name.substr(3);
3973     unsigned IntVal;
3974     if (NumString.getAsInteger(10, IntVal))
3975       return -1;    // This is not an integer.
3976     if (IntVal > 7) // There are only 8 fcc registers.
3977       return -1;
3978     return IntVal;
3979   }
3980   return -1;
3981 }
3982 
3983 int MipsAsmParser::matchACRegisterName(StringRef Name) {
3984 
3985   if (Name.startswith("ac")) {
3986     StringRef NumString = Name.substr(2);
3987     unsigned IntVal;
3988     if (NumString.getAsInteger(10, IntVal))
3989       return -1;    // This is not an integer.
3990     if (IntVal > 3) // There are only 3 acc registers.
3991       return -1;
3992     return IntVal;
3993   }
3994   return -1;
3995 }
3996 
3997 int MipsAsmParser::matchMSA128RegisterName(StringRef Name) {
3998   unsigned IntVal;
3999 
4000   if (Name.front() != 'w' || Name.drop_front(1).getAsInteger(10, IntVal))
4001     return -1;
4002 
4003   if (IntVal > 31)
4004     return -1;
4005 
4006   return IntVal;
4007 }
4008 
4009 int MipsAsmParser::matchMSA128CtrlRegisterName(StringRef Name) {
4010   int CC;
4011 
4012   CC = StringSwitch<unsigned>(Name)
4013            .Case("msair", 0)
4014            .Case("msacsr", 1)
4015            .Case("msaaccess", 2)
4016            .Case("msasave", 3)
4017            .Case("msamodify", 4)
4018            .Case("msarequest", 5)
4019            .Case("msamap", 6)
4020            .Case("msaunmap", 7)
4021            .Default(-1);
4022 
4023   return CC;
4024 }
4025 
4026 unsigned MipsAsmParser::getATReg(SMLoc Loc) {
4027   unsigned ATIndex = AssemblerOptions.back()->getATRegIndex();
4028   if (ATIndex == 0) {
4029     reportParseError(Loc,
4030                      "pseudo-instruction requires $at, which is not available");
4031     return 0;
4032   }
4033   unsigned AT = getReg(
4034       (isGP64bit()) ? Mips::GPR64RegClassID : Mips::GPR32RegClassID, ATIndex);
4035   return AT;
4036 }
4037 
4038 unsigned MipsAsmParser::getReg(int RC, int RegNo) {
4039   return *(getContext().getRegisterInfo()->getRegClass(RC).begin() + RegNo);
4040 }
4041 
4042 unsigned MipsAsmParser::getGPR(int RegNo) {
4043   return getReg(isGP64bit() ? Mips::GPR64RegClassID : Mips::GPR32RegClassID,
4044                 RegNo);
4045 }
4046 
4047 int MipsAsmParser::matchRegisterByNumber(unsigned RegNum, unsigned RegClass) {
4048   if (RegNum >
4049       getContext().getRegisterInfo()->getRegClass(RegClass).getNumRegs() - 1)
4050     return -1;
4051 
4052   return getReg(RegClass, RegNum);
4053 }
4054 
4055 bool MipsAsmParser::parseOperand(OperandVector &Operands, StringRef Mnemonic) {
4056   MCAsmParser &Parser = getParser();
4057   DEBUG(dbgs() << "parseOperand\n");
4058 
4059   // Check if the current operand has a custom associated parser, if so, try to
4060   // custom parse the operand, or fallback to the general approach.
4061   OperandMatchResultTy ResTy = MatchOperandParserImpl(Operands, Mnemonic);
4062   if (ResTy == MatchOperand_Success)
4063     return false;
4064   // If there wasn't a custom match, try the generic matcher below. Otherwise,
4065   // there was a match, but an error occurred, in which case, just return that
4066   // the operand parsing failed.
4067   if (ResTy == MatchOperand_ParseFail)
4068     return true;
4069 
4070   DEBUG(dbgs() << ".. Generic Parser\n");
4071 
4072   switch (getLexer().getKind()) {
4073   default:
4074     Error(Parser.getTok().getLoc(), "unexpected token in operand");
4075     return true;
4076   case AsmToken::Dollar: {
4077     // Parse the register.
4078     SMLoc S = Parser.getTok().getLoc();
4079 
4080     // Almost all registers have been parsed by custom parsers. There is only
4081     // one exception to this. $zero (and it's alias $0) will reach this point
4082     // for div, divu, and similar instructions because it is not an operand
4083     // to the instruction definition but an explicit register. Special case
4084     // this situation for now.
4085     if (parseAnyRegister(Operands) != MatchOperand_NoMatch)
4086       return false;
4087 
4088     // Maybe it is a symbol reference.
4089     StringRef Identifier;
4090     if (Parser.parseIdentifier(Identifier))
4091       return true;
4092 
4093     SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4094     MCSymbol *Sym = getContext().getOrCreateSymbol("$" + Identifier);
4095     // Otherwise create a symbol reference.
4096     const MCExpr *Res =
4097         MCSymbolRefExpr::create(Sym, MCSymbolRefExpr::VK_None, getContext());
4098 
4099     Operands.push_back(MipsOperand::CreateImm(Res, S, E, *this));
4100     return false;
4101   }
4102   // Else drop to expression parsing.
4103   case AsmToken::LParen:
4104   case AsmToken::Minus:
4105   case AsmToken::Plus:
4106   case AsmToken::Integer:
4107   case AsmToken::Tilde:
4108   case AsmToken::String: {
4109     DEBUG(dbgs() << ".. generic integer\n");
4110     OperandMatchResultTy ResTy = parseImm(Operands);
4111     return ResTy != MatchOperand_Success;
4112   }
4113   case AsmToken::Percent: {
4114     // It is a symbol reference or constant expression.
4115     const MCExpr *IdVal;
4116     SMLoc S = Parser.getTok().getLoc(); // Start location of the operand.
4117     if (parseRelocOperand(IdVal))
4118       return true;
4119 
4120     SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4121 
4122     Operands.push_back(MipsOperand::CreateImm(IdVal, S, E, *this));
4123     return false;
4124   } // case AsmToken::Percent
4125   } // switch(getLexer().getKind())
4126   return true;
4127 }
4128 
4129 const MCExpr *MipsAsmParser::evaluateRelocExpr(const MCExpr *Expr,
4130                                                StringRef RelocStr) {
4131   const MCExpr *Res;
4132   // Check the type of the expression.
4133   if (const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(Expr)) {
4134     // It's a constant, evaluate reloc value.
4135     int16_t Val;
4136     switch (getVariantKind(RelocStr)) {
4137     case MCSymbolRefExpr::VK_Mips_ABS_LO:
4138       // Get the 1st 16-bits.
4139       Val = MCE->getValue() & 0xffff;
4140       break;
4141     case MCSymbolRefExpr::VK_Mips_ABS_HI:
4142     case MCSymbolRefExpr::VK_Mips_GOT:
4143       // Get the 2nd 16-bits. Also add 1 if bit 15 is 1, to compensate for low
4144       // 16 bits being negative.
4145       Val = ((MCE->getValue() + 0x8000) >> 16) & 0xffff;
4146       break;
4147     case MCSymbolRefExpr::VK_Mips_HIGHER:
4148       // Get the 3rd 16-bits.
4149       Val = ((MCE->getValue() + 0x80008000LL) >> 32) & 0xffff;
4150       break;
4151     case MCSymbolRefExpr::VK_Mips_HIGHEST:
4152       // Get the 4th 16-bits.
4153       Val = ((MCE->getValue() + 0x800080008000LL) >> 48) & 0xffff;
4154       break;
4155     default:
4156       report_fatal_error("unsupported reloc value");
4157     }
4158     return MCConstantExpr::create(Val, getContext());
4159   }
4160 
4161   if (const MCSymbolRefExpr *MSRE = dyn_cast<MCSymbolRefExpr>(Expr)) {
4162     // It's a symbol, create a symbolic expression from the symbol.
4163     const MCSymbol *Symbol = &MSRE->getSymbol();
4164     MCSymbolRefExpr::VariantKind VK = getVariantKind(RelocStr);
4165     Res = MCSymbolRefExpr::create(Symbol, VK, getContext());
4166     return Res;
4167   }
4168 
4169   if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) {
4170     MCSymbolRefExpr::VariantKind VK = getVariantKind(RelocStr);
4171 
4172     // Try to create target expression.
4173     if (MipsMCExpr::isSupportedBinaryExpr(VK, BE))
4174       return MipsMCExpr::create(VK, Expr, getContext());
4175 
4176     const MCExpr *LExp = evaluateRelocExpr(BE->getLHS(), RelocStr);
4177     const MCExpr *RExp = evaluateRelocExpr(BE->getRHS(), RelocStr);
4178     Res = MCBinaryExpr::create(BE->getOpcode(), LExp, RExp, getContext());
4179     return Res;
4180   }
4181 
4182   if (const MCUnaryExpr *UN = dyn_cast<MCUnaryExpr>(Expr)) {
4183     const MCExpr *UnExp = evaluateRelocExpr(UN->getSubExpr(), RelocStr);
4184     Res = MCUnaryExpr::create(UN->getOpcode(), UnExp, getContext());
4185     return Res;
4186   }
4187   // Just return the original expression.
4188   return Expr;
4189 }
4190 
4191 bool MipsAsmParser::isEvaluated(const MCExpr *Expr) {
4192 
4193   switch (Expr->getKind()) {
4194   case MCExpr::Constant:
4195     return true;
4196   case MCExpr::SymbolRef:
4197     return (cast<MCSymbolRefExpr>(Expr)->getKind() != MCSymbolRefExpr::VK_None);
4198   case MCExpr::Binary:
4199     if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(Expr)) {
4200       if (!isEvaluated(BE->getLHS()))
4201         return false;
4202       return isEvaluated(BE->getRHS());
4203     }
4204   case MCExpr::Unary:
4205     return isEvaluated(cast<MCUnaryExpr>(Expr)->getSubExpr());
4206   case MCExpr::Target:
4207     return true;
4208   }
4209   return false;
4210 }
4211 
4212 bool MipsAsmParser::parseRelocOperand(const MCExpr *&Res) {
4213   MCAsmParser &Parser = getParser();
4214   Parser.Lex();                          // Eat the % token.
4215   const AsmToken &Tok = Parser.getTok(); // Get next token, operation.
4216   if (Tok.isNot(AsmToken::Identifier))
4217     return true;
4218 
4219   std::string Str = Tok.getIdentifier();
4220 
4221   Parser.Lex(); // Eat the identifier.
4222   // Now make an expression from the rest of the operand.
4223   const MCExpr *IdVal;
4224   SMLoc EndLoc;
4225 
4226   if (getLexer().getKind() == AsmToken::LParen) {
4227     while (1) {
4228       Parser.Lex(); // Eat the '(' token.
4229       if (getLexer().getKind() == AsmToken::Percent) {
4230         Parser.Lex(); // Eat the % token.
4231         const AsmToken &nextTok = Parser.getTok();
4232         if (nextTok.isNot(AsmToken::Identifier))
4233           return true;
4234         Str += "(%";
4235         Str += nextTok.getIdentifier();
4236         Parser.Lex(); // Eat the identifier.
4237         if (getLexer().getKind() != AsmToken::LParen)
4238           return true;
4239       } else
4240         break;
4241     }
4242     if (getParser().parseParenExpression(IdVal, EndLoc))
4243       return true;
4244 
4245     while (getLexer().getKind() == AsmToken::RParen)
4246       Parser.Lex(); // Eat the ')' token.
4247 
4248   } else
4249     return true; // Parenthesis must follow the relocation operand.
4250 
4251   Res = evaluateRelocExpr(IdVal, Str);
4252   return false;
4253 }
4254 
4255 bool MipsAsmParser::ParseRegister(unsigned &RegNo, SMLoc &StartLoc,
4256                                   SMLoc &EndLoc) {
4257   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> Operands;
4258   OperandMatchResultTy ResTy = parseAnyRegister(Operands);
4259   if (ResTy == MatchOperand_Success) {
4260     assert(Operands.size() == 1);
4261     MipsOperand &Operand = static_cast<MipsOperand &>(*Operands.front());
4262     StartLoc = Operand.getStartLoc();
4263     EndLoc = Operand.getEndLoc();
4264 
4265     // AFAIK, we only support numeric registers and named GPR's in CFI
4266     // directives.
4267     // Don't worry about eating tokens before failing. Using an unrecognised
4268     // register is a parse error.
4269     if (Operand.isGPRAsmReg()) {
4270       // Resolve to GPR32 or GPR64 appropriately.
4271       RegNo = isGP64bit() ? Operand.getGPR64Reg() : Operand.getGPR32Reg();
4272     }
4273 
4274     return (RegNo == (unsigned)-1);
4275   }
4276 
4277   assert(Operands.size() == 0);
4278   return (RegNo == (unsigned)-1);
4279 }
4280 
4281 bool MipsAsmParser::parseMemOffset(const MCExpr *&Res, bool isParenExpr) {
4282   MCAsmParser &Parser = getParser();
4283   SMLoc S;
4284   bool Result = true;
4285   unsigned NumOfLParen = 0;
4286 
4287   while (getLexer().getKind() == AsmToken::LParen) {
4288     Parser.Lex();
4289     ++NumOfLParen;
4290   }
4291 
4292   switch (getLexer().getKind()) {
4293   default:
4294     return true;
4295   case AsmToken::Identifier:
4296   case AsmToken::LParen:
4297   case AsmToken::Integer:
4298   case AsmToken::Minus:
4299   case AsmToken::Plus:
4300     if (isParenExpr)
4301       Result = getParser().parseParenExprOfDepth(NumOfLParen, Res, S);
4302     else
4303       Result = (getParser().parseExpression(Res));
4304     while (getLexer().getKind() == AsmToken::RParen)
4305       Parser.Lex();
4306     break;
4307   case AsmToken::Percent:
4308     Result = parseRelocOperand(Res);
4309   }
4310   return Result;
4311 }
4312 
4313 MipsAsmParser::OperandMatchResultTy
4314 MipsAsmParser::parseMemOperand(OperandVector &Operands) {
4315   MCAsmParser &Parser = getParser();
4316   DEBUG(dbgs() << "parseMemOperand\n");
4317   const MCExpr *IdVal = nullptr;
4318   SMLoc S;
4319   bool isParenExpr = false;
4320   MipsAsmParser::OperandMatchResultTy Res = MatchOperand_NoMatch;
4321   // First operand is the offset.
4322   S = Parser.getTok().getLoc();
4323 
4324   if (getLexer().getKind() == AsmToken::LParen) {
4325     Parser.Lex();
4326     isParenExpr = true;
4327   }
4328 
4329   if (getLexer().getKind() != AsmToken::Dollar) {
4330     if (parseMemOffset(IdVal, isParenExpr))
4331       return MatchOperand_ParseFail;
4332 
4333     const AsmToken &Tok = Parser.getTok(); // Get the next token.
4334     if (Tok.isNot(AsmToken::LParen)) {
4335       MipsOperand &Mnemonic = static_cast<MipsOperand &>(*Operands[0]);
4336       if (Mnemonic.getToken() == "la" || Mnemonic.getToken() == "dla") {
4337         SMLoc E =
4338             SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4339         Operands.push_back(MipsOperand::CreateImm(IdVal, S, E, *this));
4340         return MatchOperand_Success;
4341       }
4342       if (Tok.is(AsmToken::EndOfStatement)) {
4343         SMLoc E =
4344             SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4345 
4346         // Zero register assumed, add a memory operand with ZERO as its base.
4347         // "Base" will be managed by k_Memory.
4348         auto Base = MipsOperand::createGPRReg(0, getContext().getRegisterInfo(),
4349                                               S, E, *this);
4350         Operands.push_back(
4351             MipsOperand::CreateMem(std::move(Base), IdVal, S, E, *this));
4352         return MatchOperand_Success;
4353       }
4354       Error(Parser.getTok().getLoc(), "'(' expected");
4355       return MatchOperand_ParseFail;
4356     }
4357 
4358     Parser.Lex(); // Eat the '(' token.
4359   }
4360 
4361   Res = parseAnyRegister(Operands);
4362   if (Res != MatchOperand_Success)
4363     return Res;
4364 
4365   if (Parser.getTok().isNot(AsmToken::RParen)) {
4366     Error(Parser.getTok().getLoc(), "')' expected");
4367     return MatchOperand_ParseFail;
4368   }
4369 
4370   SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4371 
4372   Parser.Lex(); // Eat the ')' token.
4373 
4374   if (!IdVal)
4375     IdVal = MCConstantExpr::create(0, getContext());
4376 
4377   // Replace the register operand with the memory operand.
4378   std::unique_ptr<MipsOperand> op(
4379       static_cast<MipsOperand *>(Operands.back().release()));
4380   // Remove the register from the operands.
4381   // "op" will be managed by k_Memory.
4382   Operands.pop_back();
4383   // Add the memory operand.
4384   if (const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(IdVal)) {
4385     int64_t Imm;
4386     if (IdVal->evaluateAsAbsolute(Imm))
4387       IdVal = MCConstantExpr::create(Imm, getContext());
4388     else if (BE->getLHS()->getKind() != MCExpr::SymbolRef)
4389       IdVal = MCBinaryExpr::create(BE->getOpcode(), BE->getRHS(), BE->getLHS(),
4390                                    getContext());
4391   }
4392 
4393   Operands.push_back(MipsOperand::CreateMem(std::move(op), IdVal, S, E, *this));
4394   return MatchOperand_Success;
4395 }
4396 
4397 bool MipsAsmParser::searchSymbolAlias(OperandVector &Operands) {
4398   MCAsmParser &Parser = getParser();
4399   MCSymbol *Sym = getContext().lookupSymbol(Parser.getTok().getIdentifier());
4400   if (Sym) {
4401     SMLoc S = Parser.getTok().getLoc();
4402     const MCExpr *Expr;
4403     if (Sym->isVariable())
4404       Expr = Sym->getVariableValue();
4405     else
4406       return false;
4407     if (Expr->getKind() == MCExpr::SymbolRef) {
4408       const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr);
4409       StringRef DefSymbol = Ref->getSymbol().getName();
4410       if (DefSymbol.startswith("$")) {
4411         OperandMatchResultTy ResTy =
4412             matchAnyRegisterNameWithoutDollar(Operands, DefSymbol.substr(1), S);
4413         if (ResTy == MatchOperand_Success) {
4414           Parser.Lex();
4415           return true;
4416         } else if (ResTy == MatchOperand_ParseFail)
4417           llvm_unreachable("Should never ParseFail");
4418         return false;
4419       }
4420     } else if (Expr->getKind() == MCExpr::Constant) {
4421       Parser.Lex();
4422       const MCConstantExpr *Const = static_cast<const MCConstantExpr *>(Expr);
4423       Operands.push_back(
4424           MipsOperand::CreateImm(Const, S, Parser.getTok().getLoc(), *this));
4425       return true;
4426     }
4427   }
4428   return false;
4429 }
4430 
4431 MipsAsmParser::OperandMatchResultTy
4432 MipsAsmParser::matchAnyRegisterNameWithoutDollar(OperandVector &Operands,
4433                                                  StringRef Identifier,
4434                                                  SMLoc S) {
4435   int Index = matchCPURegisterName(Identifier);
4436   if (Index != -1) {
4437     Operands.push_back(MipsOperand::createGPRReg(
4438         Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this));
4439     return MatchOperand_Success;
4440   }
4441 
4442   Index = matchHWRegsRegisterName(Identifier);
4443   if (Index != -1) {
4444     Operands.push_back(MipsOperand::createHWRegsReg(
4445         Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this));
4446     return MatchOperand_Success;
4447   }
4448 
4449   Index = matchFPURegisterName(Identifier);
4450   if (Index != -1) {
4451     Operands.push_back(MipsOperand::createFGRReg(
4452         Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this));
4453     return MatchOperand_Success;
4454   }
4455 
4456   Index = matchFCCRegisterName(Identifier);
4457   if (Index != -1) {
4458     Operands.push_back(MipsOperand::createFCCReg(
4459         Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this));
4460     return MatchOperand_Success;
4461   }
4462 
4463   Index = matchACRegisterName(Identifier);
4464   if (Index != -1) {
4465     Operands.push_back(MipsOperand::createACCReg(
4466         Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this));
4467     return MatchOperand_Success;
4468   }
4469 
4470   Index = matchMSA128RegisterName(Identifier);
4471   if (Index != -1) {
4472     Operands.push_back(MipsOperand::createMSA128Reg(
4473         Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this));
4474     return MatchOperand_Success;
4475   }
4476 
4477   Index = matchMSA128CtrlRegisterName(Identifier);
4478   if (Index != -1) {
4479     Operands.push_back(MipsOperand::createMSACtrlReg(
4480         Index, getContext().getRegisterInfo(), S, getLexer().getLoc(), *this));
4481     return MatchOperand_Success;
4482   }
4483 
4484   return MatchOperand_NoMatch;
4485 }
4486 
4487 MipsAsmParser::OperandMatchResultTy
4488 MipsAsmParser::matchAnyRegisterWithoutDollar(OperandVector &Operands, SMLoc S) {
4489   MCAsmParser &Parser = getParser();
4490   auto Token = Parser.getLexer().peekTok(false);
4491 
4492   if (Token.is(AsmToken::Identifier)) {
4493     DEBUG(dbgs() << ".. identifier\n");
4494     StringRef Identifier = Token.getIdentifier();
4495     OperandMatchResultTy ResTy =
4496         matchAnyRegisterNameWithoutDollar(Operands, Identifier, S);
4497     return ResTy;
4498   } else if (Token.is(AsmToken::Integer)) {
4499     DEBUG(dbgs() << ".. integer\n");
4500     Operands.push_back(MipsOperand::createNumericReg(
4501         Token.getIntVal(), getContext().getRegisterInfo(), S, Token.getLoc(),
4502         *this));
4503     return MatchOperand_Success;
4504   }
4505 
4506   DEBUG(dbgs() << Parser.getTok().getKind() << "\n");
4507 
4508   return MatchOperand_NoMatch;
4509 }
4510 
4511 MipsAsmParser::OperandMatchResultTy
4512 MipsAsmParser::parseAnyRegister(OperandVector &Operands) {
4513   MCAsmParser &Parser = getParser();
4514   DEBUG(dbgs() << "parseAnyRegister\n");
4515 
4516   auto Token = Parser.getTok();
4517 
4518   SMLoc S = Token.getLoc();
4519 
4520   if (Token.isNot(AsmToken::Dollar)) {
4521     DEBUG(dbgs() << ".. !$ -> try sym aliasing\n");
4522     if (Token.is(AsmToken::Identifier)) {
4523       if (searchSymbolAlias(Operands))
4524         return MatchOperand_Success;
4525     }
4526     DEBUG(dbgs() << ".. !symalias -> NoMatch\n");
4527     return MatchOperand_NoMatch;
4528   }
4529   DEBUG(dbgs() << ".. $\n");
4530 
4531   OperandMatchResultTy ResTy = matchAnyRegisterWithoutDollar(Operands, S);
4532   if (ResTy == MatchOperand_Success) {
4533     Parser.Lex(); // $
4534     Parser.Lex(); // identifier
4535   }
4536   return ResTy;
4537 }
4538 
4539 MipsAsmParser::OperandMatchResultTy
4540 MipsAsmParser::parseImm(OperandVector &Operands) {
4541   MCAsmParser &Parser = getParser();
4542   switch (getLexer().getKind()) {
4543   default:
4544     return MatchOperand_NoMatch;
4545   case AsmToken::LParen:
4546   case AsmToken::Minus:
4547   case AsmToken::Plus:
4548   case AsmToken::Integer:
4549   case AsmToken::Tilde:
4550   case AsmToken::String:
4551     break;
4552   }
4553 
4554   const MCExpr *IdVal;
4555   SMLoc S = Parser.getTok().getLoc();
4556   if (getParser().parseExpression(IdVal))
4557     return MatchOperand_ParseFail;
4558 
4559   SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4560   Operands.push_back(MipsOperand::CreateImm(IdVal, S, E, *this));
4561   return MatchOperand_Success;
4562 }
4563 
4564 MipsAsmParser::OperandMatchResultTy
4565 MipsAsmParser::parseJumpTarget(OperandVector &Operands) {
4566   MCAsmParser &Parser = getParser();
4567   DEBUG(dbgs() << "parseJumpTarget\n");
4568 
4569   SMLoc S = getLexer().getLoc();
4570 
4571   // Integers and expressions are acceptable
4572   OperandMatchResultTy ResTy = parseImm(Operands);
4573   if (ResTy != MatchOperand_NoMatch)
4574     return ResTy;
4575 
4576   // Registers are a valid target and have priority over symbols.
4577   ResTy = parseAnyRegister(Operands);
4578   if (ResTy != MatchOperand_NoMatch)
4579     return ResTy;
4580 
4581   const MCExpr *Expr = nullptr;
4582   if (Parser.parseExpression(Expr)) {
4583     // We have no way of knowing if a symbol was consumed so we must ParseFail
4584     return MatchOperand_ParseFail;
4585   }
4586   Operands.push_back(
4587       MipsOperand::CreateImm(Expr, S, getLexer().getLoc(), *this));
4588   return MatchOperand_Success;
4589 }
4590 
4591 MipsAsmParser::OperandMatchResultTy
4592 MipsAsmParser::parseInvNum(OperandVector &Operands) {
4593   MCAsmParser &Parser = getParser();
4594   const MCExpr *IdVal;
4595   // If the first token is '$' we may have register operand.
4596   if (Parser.getTok().is(AsmToken::Dollar))
4597     return MatchOperand_NoMatch;
4598   SMLoc S = Parser.getTok().getLoc();
4599   if (getParser().parseExpression(IdVal))
4600     return MatchOperand_ParseFail;
4601   const MCConstantExpr *MCE = dyn_cast<MCConstantExpr>(IdVal);
4602   assert(MCE && "Unexpected MCExpr type.");
4603   int64_t Val = MCE->getValue();
4604   SMLoc E = SMLoc::getFromPointer(Parser.getTok().getLoc().getPointer() - 1);
4605   Operands.push_back(MipsOperand::CreateImm(
4606       MCConstantExpr::create(0 - Val, getContext()), S, E, *this));
4607   return MatchOperand_Success;
4608 }
4609 
4610 MipsAsmParser::OperandMatchResultTy
4611 MipsAsmParser::parseLSAImm(OperandVector &Operands) {
4612   MCAsmParser &Parser = getParser();
4613   switch (getLexer().getKind()) {
4614   default:
4615     return MatchOperand_NoMatch;
4616   case AsmToken::LParen:
4617   case AsmToken::Plus:
4618   case AsmToken::Minus:
4619   case AsmToken::Integer:
4620     break;
4621   }
4622 
4623   const MCExpr *Expr;
4624   SMLoc S = Parser.getTok().getLoc();
4625 
4626   if (getParser().parseExpression(Expr))
4627     return MatchOperand_ParseFail;
4628 
4629   int64_t Val;
4630   if (!Expr->evaluateAsAbsolute(Val)) {
4631     Error(S, "expected immediate value");
4632     return MatchOperand_ParseFail;
4633   }
4634 
4635   // The LSA instruction allows a 2-bit unsigned immediate. For this reason
4636   // and because the CPU always adds one to the immediate field, the allowed
4637   // range becomes 1..4. We'll only check the range here and will deal
4638   // with the addition/subtraction when actually decoding/encoding
4639   // the instruction.
4640   if (Val < 1 || Val > 4) {
4641     Error(S, "immediate not in range (1..4)");
4642     return MatchOperand_ParseFail;
4643   }
4644 
4645   Operands.push_back(
4646       MipsOperand::CreateImm(Expr, S, Parser.getTok().getLoc(), *this));
4647   return MatchOperand_Success;
4648 }
4649 
4650 MipsAsmParser::OperandMatchResultTy
4651 MipsAsmParser::parseRegisterList(OperandVector &Operands) {
4652   MCAsmParser &Parser = getParser();
4653   SmallVector<unsigned, 10> Regs;
4654   unsigned RegNo;
4655   unsigned PrevReg = Mips::NoRegister;
4656   bool RegRange = false;
4657   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 8> TmpOperands;
4658 
4659   if (Parser.getTok().isNot(AsmToken::Dollar))
4660     return MatchOperand_ParseFail;
4661 
4662   SMLoc S = Parser.getTok().getLoc();
4663   while (parseAnyRegister(TmpOperands) == MatchOperand_Success) {
4664     SMLoc E = getLexer().getLoc();
4665     MipsOperand &Reg = static_cast<MipsOperand &>(*TmpOperands.back());
4666     RegNo = isGP64bit() ? Reg.getGPR64Reg() : Reg.getGPR32Reg();
4667     if (RegRange) {
4668       // Remove last register operand because registers from register range
4669       // should be inserted first.
4670       if ((isGP64bit() && RegNo == Mips::RA_64) ||
4671           (!isGP64bit() && RegNo == Mips::RA)) {
4672         Regs.push_back(RegNo);
4673       } else {
4674         unsigned TmpReg = PrevReg + 1;
4675         while (TmpReg <= RegNo) {
4676           if ((((TmpReg < Mips::S0) || (TmpReg > Mips::S7)) && !isGP64bit()) ||
4677               (((TmpReg < Mips::S0_64) || (TmpReg > Mips::S7_64)) &&
4678                isGP64bit())) {
4679             Error(E, "invalid register operand");
4680             return MatchOperand_ParseFail;
4681           }
4682 
4683           PrevReg = TmpReg;
4684           Regs.push_back(TmpReg++);
4685         }
4686       }
4687 
4688       RegRange = false;
4689     } else {
4690       if ((PrevReg == Mips::NoRegister) &&
4691           ((isGP64bit() && (RegNo != Mips::S0_64) && (RegNo != Mips::RA_64)) ||
4692           (!isGP64bit() && (RegNo != Mips::S0) && (RegNo != Mips::RA)))) {
4693         Error(E, "$16 or $31 expected");
4694         return MatchOperand_ParseFail;
4695       } else if (!(((RegNo == Mips::FP || RegNo == Mips::RA ||
4696                     (RegNo >= Mips::S0 && RegNo <= Mips::S7)) &&
4697                     !isGP64bit()) ||
4698                    ((RegNo == Mips::FP_64 || RegNo == Mips::RA_64 ||
4699                     (RegNo >= Mips::S0_64 && RegNo <= Mips::S7_64)) &&
4700                     isGP64bit()))) {
4701         Error(E, "invalid register operand");
4702         return MatchOperand_ParseFail;
4703       } else if ((PrevReg != Mips::NoRegister) && (RegNo != PrevReg + 1) &&
4704                  ((RegNo != Mips::FP && RegNo != Mips::RA && !isGP64bit()) ||
4705                   (RegNo != Mips::FP_64 && RegNo != Mips::RA_64 &&
4706                    isGP64bit()))) {
4707         Error(E, "consecutive register numbers expected");
4708         return MatchOperand_ParseFail;
4709       }
4710 
4711       Regs.push_back(RegNo);
4712     }
4713 
4714     if (Parser.getTok().is(AsmToken::Minus))
4715       RegRange = true;
4716 
4717     if (!Parser.getTok().isNot(AsmToken::Minus) &&
4718         !Parser.getTok().isNot(AsmToken::Comma)) {
4719       Error(E, "',' or '-' expected");
4720       return MatchOperand_ParseFail;
4721     }
4722 
4723     Lex(); // Consume comma or minus
4724     if (Parser.getTok().isNot(AsmToken::Dollar))
4725       break;
4726 
4727     PrevReg = RegNo;
4728   }
4729 
4730   SMLoc E = Parser.getTok().getLoc();
4731   Operands.push_back(MipsOperand::CreateRegList(Regs, S, E, *this));
4732   parseMemOperand(Operands);
4733   return MatchOperand_Success;
4734 }
4735 
4736 MipsAsmParser::OperandMatchResultTy
4737 MipsAsmParser::parseRegisterPair(OperandVector &Operands) {
4738   MCAsmParser &Parser = getParser();
4739 
4740   SMLoc S = Parser.getTok().getLoc();
4741   if (parseAnyRegister(Operands) != MatchOperand_Success)
4742     return MatchOperand_ParseFail;
4743 
4744   SMLoc E = Parser.getTok().getLoc();
4745   MipsOperand &Op = static_cast<MipsOperand &>(*Operands.back());
4746   unsigned Reg = Op.getGPR32Reg();
4747   Operands.pop_back();
4748   Operands.push_back(MipsOperand::CreateRegPair(Reg, S, E, *this));
4749   return MatchOperand_Success;
4750 }
4751 
4752 MipsAsmParser::OperandMatchResultTy
4753 MipsAsmParser::parseMovePRegPair(OperandVector &Operands) {
4754   MCAsmParser &Parser = getParser();
4755   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 8> TmpOperands;
4756   SmallVector<unsigned, 10> Regs;
4757 
4758   if (Parser.getTok().isNot(AsmToken::Dollar))
4759     return MatchOperand_ParseFail;
4760 
4761   SMLoc S = Parser.getTok().getLoc();
4762 
4763   if (parseAnyRegister(TmpOperands) != MatchOperand_Success)
4764     return MatchOperand_ParseFail;
4765 
4766   MipsOperand *Reg = &static_cast<MipsOperand &>(*TmpOperands.back());
4767   unsigned RegNo = isGP64bit() ? Reg->getGPR64Reg() : Reg->getGPR32Reg();
4768   Regs.push_back(RegNo);
4769 
4770   SMLoc E = Parser.getTok().getLoc();
4771   if (Parser.getTok().isNot(AsmToken::Comma)) {
4772     Error(E, "',' expected");
4773     return MatchOperand_ParseFail;
4774   }
4775 
4776   // Remove comma.
4777   Parser.Lex();
4778 
4779   if (parseAnyRegister(TmpOperands) != MatchOperand_Success)
4780     return MatchOperand_ParseFail;
4781 
4782   Reg = &static_cast<MipsOperand &>(*TmpOperands.back());
4783   RegNo = isGP64bit() ? Reg->getGPR64Reg() : Reg->getGPR32Reg();
4784   Regs.push_back(RegNo);
4785 
4786   Operands.push_back(MipsOperand::CreateRegList(Regs, S, E, *this));
4787 
4788   return MatchOperand_Success;
4789 }
4790 
4791 MCSymbolRefExpr::VariantKind MipsAsmParser::getVariantKind(StringRef Symbol) {
4792 
4793   MCSymbolRefExpr::VariantKind VK =
4794       StringSwitch<MCSymbolRefExpr::VariantKind>(Symbol)
4795           .Case("hi", MCSymbolRefExpr::VK_Mips_ABS_HI)
4796           .Case("lo", MCSymbolRefExpr::VK_Mips_ABS_LO)
4797           .Case("gp_rel", MCSymbolRefExpr::VK_Mips_GPREL)
4798           .Case("call16", MCSymbolRefExpr::VK_Mips_GOT_CALL)
4799           .Case("got", MCSymbolRefExpr::VK_Mips_GOT)
4800           .Case("tlsgd", MCSymbolRefExpr::VK_Mips_TLSGD)
4801           .Case("tlsldm", MCSymbolRefExpr::VK_Mips_TLSLDM)
4802           .Case("dtprel_hi", MCSymbolRefExpr::VK_Mips_DTPREL_HI)
4803           .Case("dtprel_lo", MCSymbolRefExpr::VK_Mips_DTPREL_LO)
4804           .Case("gottprel", MCSymbolRefExpr::VK_Mips_GOTTPREL)
4805           .Case("tprel_hi", MCSymbolRefExpr::VK_Mips_TPREL_HI)
4806           .Case("tprel_lo", MCSymbolRefExpr::VK_Mips_TPREL_LO)
4807           .Case("got_disp", MCSymbolRefExpr::VK_Mips_GOT_DISP)
4808           .Case("got_page", MCSymbolRefExpr::VK_Mips_GOT_PAGE)
4809           .Case("got_ofst", MCSymbolRefExpr::VK_Mips_GOT_OFST)
4810           .Case("hi(%neg(%gp_rel", MCSymbolRefExpr::VK_Mips_GPOFF_HI)
4811           .Case("lo(%neg(%gp_rel", MCSymbolRefExpr::VK_Mips_GPOFF_LO)
4812           .Case("got_hi", MCSymbolRefExpr::VK_Mips_GOT_HI16)
4813           .Case("got_lo", MCSymbolRefExpr::VK_Mips_GOT_LO16)
4814           .Case("call_hi", MCSymbolRefExpr::VK_Mips_CALL_HI16)
4815           .Case("call_lo", MCSymbolRefExpr::VK_Mips_CALL_LO16)
4816           .Case("higher", MCSymbolRefExpr::VK_Mips_HIGHER)
4817           .Case("highest", MCSymbolRefExpr::VK_Mips_HIGHEST)
4818           .Case("pcrel_hi", MCSymbolRefExpr::VK_Mips_PCREL_HI16)
4819           .Case("pcrel_lo", MCSymbolRefExpr::VK_Mips_PCREL_LO16)
4820           .Default(MCSymbolRefExpr::VK_None);
4821 
4822   assert(VK != MCSymbolRefExpr::VK_None);
4823 
4824   return VK;
4825 }
4826 
4827 /// Sometimes (i.e. load/stores) the operand may be followed immediately by
4828 /// either this.
4829 /// ::= '(', register, ')'
4830 /// handle it before we iterate so we don't get tripped up by the lack of
4831 /// a comma.
4832 bool MipsAsmParser::parseParenSuffix(StringRef Name, OperandVector &Operands) {
4833   MCAsmParser &Parser = getParser();
4834   if (getLexer().is(AsmToken::LParen)) {
4835     Operands.push_back(
4836         MipsOperand::CreateToken("(", getLexer().getLoc(), *this));
4837     Parser.Lex();
4838     if (parseOperand(Operands, Name)) {
4839       SMLoc Loc = getLexer().getLoc();
4840       Parser.eatToEndOfStatement();
4841       return Error(Loc, "unexpected token in argument list");
4842     }
4843     if (Parser.getTok().isNot(AsmToken::RParen)) {
4844       SMLoc Loc = getLexer().getLoc();
4845       Parser.eatToEndOfStatement();
4846       return Error(Loc, "unexpected token, expected ')'");
4847     }
4848     Operands.push_back(
4849         MipsOperand::CreateToken(")", getLexer().getLoc(), *this));
4850     Parser.Lex();
4851   }
4852   return false;
4853 }
4854 
4855 /// Sometimes (i.e. in MSA) the operand may be followed immediately by
4856 /// either one of these.
4857 /// ::= '[', register, ']'
4858 /// ::= '[', integer, ']'
4859 /// handle it before we iterate so we don't get tripped up by the lack of
4860 /// a comma.
4861 bool MipsAsmParser::parseBracketSuffix(StringRef Name,
4862                                        OperandVector &Operands) {
4863   MCAsmParser &Parser = getParser();
4864   if (getLexer().is(AsmToken::LBrac)) {
4865     Operands.push_back(
4866         MipsOperand::CreateToken("[", getLexer().getLoc(), *this));
4867     Parser.Lex();
4868     if (parseOperand(Operands, Name)) {
4869       SMLoc Loc = getLexer().getLoc();
4870       Parser.eatToEndOfStatement();
4871       return Error(Loc, "unexpected token in argument list");
4872     }
4873     if (Parser.getTok().isNot(AsmToken::RBrac)) {
4874       SMLoc Loc = getLexer().getLoc();
4875       Parser.eatToEndOfStatement();
4876       return Error(Loc, "unexpected token, expected ']'");
4877     }
4878     Operands.push_back(
4879         MipsOperand::CreateToken("]", getLexer().getLoc(), *this));
4880     Parser.Lex();
4881   }
4882   return false;
4883 }
4884 
4885 bool MipsAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name,
4886                                      SMLoc NameLoc, OperandVector &Operands) {
4887   MCAsmParser &Parser = getParser();
4888   DEBUG(dbgs() << "ParseInstruction\n");
4889 
4890   // We have reached first instruction, module directive are now forbidden.
4891   getTargetStreamer().forbidModuleDirective();
4892 
4893   // Check if we have valid mnemonic
4894   if (!mnemonicIsValid(Name, 0)) {
4895     Parser.eatToEndOfStatement();
4896     return Error(NameLoc, "unknown instruction");
4897   }
4898   // First operand in MCInst is instruction mnemonic.
4899   Operands.push_back(MipsOperand::CreateToken(Name, NameLoc, *this));
4900 
4901   // Read the remaining operands.
4902   if (getLexer().isNot(AsmToken::EndOfStatement)) {
4903     // Read the first operand.
4904     if (parseOperand(Operands, Name)) {
4905       SMLoc Loc = getLexer().getLoc();
4906       Parser.eatToEndOfStatement();
4907       return Error(Loc, "unexpected token in argument list");
4908     }
4909     if (getLexer().is(AsmToken::LBrac) && parseBracketSuffix(Name, Operands))
4910       return true;
4911     // AFAIK, parenthesis suffixes are never on the first operand
4912 
4913     while (getLexer().is(AsmToken::Comma)) {
4914       Parser.Lex(); // Eat the comma.
4915       // Parse and remember the operand.
4916       if (parseOperand(Operands, Name)) {
4917         SMLoc Loc = getLexer().getLoc();
4918         Parser.eatToEndOfStatement();
4919         return Error(Loc, "unexpected token in argument list");
4920       }
4921       // Parse bracket and parenthesis suffixes before we iterate
4922       if (getLexer().is(AsmToken::LBrac)) {
4923         if (parseBracketSuffix(Name, Operands))
4924           return true;
4925       } else if (getLexer().is(AsmToken::LParen) &&
4926                  parseParenSuffix(Name, Operands))
4927         return true;
4928     }
4929   }
4930   if (getLexer().isNot(AsmToken::EndOfStatement)) {
4931     SMLoc Loc = getLexer().getLoc();
4932     Parser.eatToEndOfStatement();
4933     return Error(Loc, "unexpected token in argument list");
4934   }
4935   Parser.Lex(); // Consume the EndOfStatement.
4936   return false;
4937 }
4938 
4939 bool MipsAsmParser::reportParseError(Twine ErrorMsg) {
4940   MCAsmParser &Parser = getParser();
4941   SMLoc Loc = getLexer().getLoc();
4942   Parser.eatToEndOfStatement();
4943   return Error(Loc, ErrorMsg);
4944 }
4945 
4946 bool MipsAsmParser::reportParseError(SMLoc Loc, Twine ErrorMsg) {
4947   return Error(Loc, ErrorMsg);
4948 }
4949 
4950 bool MipsAsmParser::parseSetNoAtDirective() {
4951   MCAsmParser &Parser = getParser();
4952   // Line should look like: ".set noat".
4953 
4954   // Set the $at register to $0.
4955   AssemblerOptions.back()->setATRegIndex(0);
4956 
4957   Parser.Lex(); // Eat "noat".
4958 
4959   // If this is not the end of the statement, report an error.
4960   if (getLexer().isNot(AsmToken::EndOfStatement)) {
4961     reportParseError("unexpected token, expected end of statement");
4962     return false;
4963   }
4964 
4965   getTargetStreamer().emitDirectiveSetNoAt();
4966   Parser.Lex(); // Consume the EndOfStatement.
4967   return false;
4968 }
4969 
4970 bool MipsAsmParser::parseSetAtDirective() {
4971   // Line can be: ".set at", which sets $at to $1
4972   //          or  ".set at=$reg", which sets $at to $reg.
4973   MCAsmParser &Parser = getParser();
4974   Parser.Lex(); // Eat "at".
4975 
4976   if (getLexer().is(AsmToken::EndOfStatement)) {
4977     // No register was specified, so we set $at to $1.
4978     AssemblerOptions.back()->setATRegIndex(1);
4979 
4980     getTargetStreamer().emitDirectiveSetAt();
4981     Parser.Lex(); // Consume the EndOfStatement.
4982     return false;
4983   }
4984 
4985   if (getLexer().isNot(AsmToken::Equal)) {
4986     reportParseError("unexpected token, expected equals sign");
4987     return false;
4988   }
4989   Parser.Lex(); // Eat "=".
4990 
4991   if (getLexer().isNot(AsmToken::Dollar)) {
4992     if (getLexer().is(AsmToken::EndOfStatement)) {
4993       reportParseError("no register specified");
4994       return false;
4995     } else {
4996       reportParseError("unexpected token, expected dollar sign '$'");
4997       return false;
4998     }
4999   }
5000   Parser.Lex(); // Eat "$".
5001 
5002   // Find out what "reg" is.
5003   unsigned AtRegNo;
5004   const AsmToken &Reg = Parser.getTok();
5005   if (Reg.is(AsmToken::Identifier)) {
5006     AtRegNo = matchCPURegisterName(Reg.getIdentifier());
5007   } else if (Reg.is(AsmToken::Integer)) {
5008     AtRegNo = Reg.getIntVal();
5009   } else {
5010     reportParseError("unexpected token, expected identifier or integer");
5011     return false;
5012   }
5013 
5014   // Check if $reg is a valid register. If it is, set $at to $reg.
5015   if (!AssemblerOptions.back()->setATRegIndex(AtRegNo)) {
5016     reportParseError("invalid register");
5017     return false;
5018   }
5019   Parser.Lex(); // Eat "reg".
5020 
5021   // If this is not the end of the statement, report an error.
5022   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5023     reportParseError("unexpected token, expected end of statement");
5024     return false;
5025   }
5026 
5027   getTargetStreamer().emitDirectiveSetAtWithArg(AtRegNo);
5028 
5029   Parser.Lex(); // Consume the EndOfStatement.
5030   return false;
5031 }
5032 
5033 bool MipsAsmParser::parseSetReorderDirective() {
5034   MCAsmParser &Parser = getParser();
5035   Parser.Lex();
5036   // If this is not the end of the statement, report an error.
5037   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5038     reportParseError("unexpected token, expected end of statement");
5039     return false;
5040   }
5041   AssemblerOptions.back()->setReorder();
5042   getTargetStreamer().emitDirectiveSetReorder();
5043   Parser.Lex(); // Consume the EndOfStatement.
5044   return false;
5045 }
5046 
5047 bool MipsAsmParser::parseSetNoReorderDirective() {
5048   MCAsmParser &Parser = getParser();
5049   Parser.Lex();
5050   // If this is not the end of the statement, report an error.
5051   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5052     reportParseError("unexpected token, expected end of statement");
5053     return false;
5054   }
5055   AssemblerOptions.back()->setNoReorder();
5056   getTargetStreamer().emitDirectiveSetNoReorder();
5057   Parser.Lex(); // Consume the EndOfStatement.
5058   return false;
5059 }
5060 
5061 bool MipsAsmParser::parseSetMacroDirective() {
5062   MCAsmParser &Parser = getParser();
5063   Parser.Lex();
5064   // If this is not the end of the statement, report an error.
5065   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5066     reportParseError("unexpected token, expected end of statement");
5067     return false;
5068   }
5069   AssemblerOptions.back()->setMacro();
5070   getTargetStreamer().emitDirectiveSetMacro();
5071   Parser.Lex(); // Consume the EndOfStatement.
5072   return false;
5073 }
5074 
5075 bool MipsAsmParser::parseSetNoMacroDirective() {
5076   MCAsmParser &Parser = getParser();
5077   Parser.Lex();
5078   // If this is not the end of the statement, report an error.
5079   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5080     reportParseError("unexpected token, expected end of statement");
5081     return false;
5082   }
5083   if (AssemblerOptions.back()->isReorder()) {
5084     reportParseError("`noreorder' must be set before `nomacro'");
5085     return false;
5086   }
5087   AssemblerOptions.back()->setNoMacro();
5088   getTargetStreamer().emitDirectiveSetNoMacro();
5089   Parser.Lex(); // Consume the EndOfStatement.
5090   return false;
5091 }
5092 
5093 bool MipsAsmParser::parseSetMsaDirective() {
5094   MCAsmParser &Parser = getParser();
5095   Parser.Lex();
5096 
5097   // If this is not the end of the statement, report an error.
5098   if (getLexer().isNot(AsmToken::EndOfStatement))
5099     return reportParseError("unexpected token, expected end of statement");
5100 
5101   setFeatureBits(Mips::FeatureMSA, "msa");
5102   getTargetStreamer().emitDirectiveSetMsa();
5103   return false;
5104 }
5105 
5106 bool MipsAsmParser::parseSetNoMsaDirective() {
5107   MCAsmParser &Parser = getParser();
5108   Parser.Lex();
5109 
5110   // If this is not the end of the statement, report an error.
5111   if (getLexer().isNot(AsmToken::EndOfStatement))
5112     return reportParseError("unexpected token, expected end of statement");
5113 
5114   clearFeatureBits(Mips::FeatureMSA, "msa");
5115   getTargetStreamer().emitDirectiveSetNoMsa();
5116   return false;
5117 }
5118 
5119 bool MipsAsmParser::parseSetNoDspDirective() {
5120   MCAsmParser &Parser = getParser();
5121   Parser.Lex(); // Eat "nodsp".
5122 
5123   // If this is not the end of the statement, report an error.
5124   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5125     reportParseError("unexpected token, expected end of statement");
5126     return false;
5127   }
5128 
5129   clearFeatureBits(Mips::FeatureDSP, "dsp");
5130   getTargetStreamer().emitDirectiveSetNoDsp();
5131   return false;
5132 }
5133 
5134 bool MipsAsmParser::parseSetMips16Directive() {
5135   MCAsmParser &Parser = getParser();
5136   Parser.Lex(); // Eat "mips16".
5137 
5138   // If this is not the end of the statement, report an error.
5139   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5140     reportParseError("unexpected token, expected end of statement");
5141     return false;
5142   }
5143 
5144   setFeatureBits(Mips::FeatureMips16, "mips16");
5145   getTargetStreamer().emitDirectiveSetMips16();
5146   Parser.Lex(); // Consume the EndOfStatement.
5147   return false;
5148 }
5149 
5150 bool MipsAsmParser::parseSetNoMips16Directive() {
5151   MCAsmParser &Parser = getParser();
5152   Parser.Lex(); // Eat "nomips16".
5153 
5154   // If this is not the end of the statement, report an error.
5155   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5156     reportParseError("unexpected token, expected end of statement");
5157     return false;
5158   }
5159 
5160   clearFeatureBits(Mips::FeatureMips16, "mips16");
5161   getTargetStreamer().emitDirectiveSetNoMips16();
5162   Parser.Lex(); // Consume the EndOfStatement.
5163   return false;
5164 }
5165 
5166 bool MipsAsmParser::parseSetFpDirective() {
5167   MCAsmParser &Parser = getParser();
5168   MipsABIFlagsSection::FpABIKind FpAbiVal;
5169   // Line can be: .set fp=32
5170   //              .set fp=xx
5171   //              .set fp=64
5172   Parser.Lex(); // Eat fp token
5173   AsmToken Tok = Parser.getTok();
5174   if (Tok.isNot(AsmToken::Equal)) {
5175     reportParseError("unexpected token, expected equals sign '='");
5176     return false;
5177   }
5178   Parser.Lex(); // Eat '=' token.
5179   Tok = Parser.getTok();
5180 
5181   if (!parseFpABIValue(FpAbiVal, ".set"))
5182     return false;
5183 
5184   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5185     reportParseError("unexpected token, expected end of statement");
5186     return false;
5187   }
5188   getTargetStreamer().emitDirectiveSetFp(FpAbiVal);
5189   Parser.Lex(); // Consume the EndOfStatement.
5190   return false;
5191 }
5192 
5193 bool MipsAsmParser::parseSetOddSPRegDirective() {
5194   MCAsmParser &Parser = getParser();
5195 
5196   Parser.Lex(); // Eat "oddspreg".
5197   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5198     reportParseError("unexpected token, expected end of statement");
5199     return false;
5200   }
5201 
5202   clearFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
5203   getTargetStreamer().emitDirectiveSetOddSPReg();
5204   return false;
5205 }
5206 
5207 bool MipsAsmParser::parseSetNoOddSPRegDirective() {
5208   MCAsmParser &Parser = getParser();
5209 
5210   Parser.Lex(); // Eat "nooddspreg".
5211   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5212     reportParseError("unexpected token, expected end of statement");
5213     return false;
5214   }
5215 
5216   setFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
5217   getTargetStreamer().emitDirectiveSetNoOddSPReg();
5218   return false;
5219 }
5220 
5221 bool MipsAsmParser::parseSetPopDirective() {
5222   MCAsmParser &Parser = getParser();
5223   SMLoc Loc = getLexer().getLoc();
5224 
5225   Parser.Lex();
5226   if (getLexer().isNot(AsmToken::EndOfStatement))
5227     return reportParseError("unexpected token, expected end of statement");
5228 
5229   // Always keep an element on the options "stack" to prevent the user
5230   // from changing the initial options. This is how we remember them.
5231   if (AssemblerOptions.size() == 2)
5232     return reportParseError(Loc, ".set pop with no .set push");
5233 
5234   MCSubtargetInfo &STI = copySTI();
5235   AssemblerOptions.pop_back();
5236   setAvailableFeatures(
5237       ComputeAvailableFeatures(AssemblerOptions.back()->getFeatures()));
5238   STI.setFeatureBits(AssemblerOptions.back()->getFeatures());
5239 
5240   getTargetStreamer().emitDirectiveSetPop();
5241   return false;
5242 }
5243 
5244 bool MipsAsmParser::parseSetPushDirective() {
5245   MCAsmParser &Parser = getParser();
5246   Parser.Lex();
5247   if (getLexer().isNot(AsmToken::EndOfStatement))
5248     return reportParseError("unexpected token, expected end of statement");
5249 
5250   // Create a copy of the current assembler options environment and push it.
5251   AssemblerOptions.push_back(
5252               make_unique<MipsAssemblerOptions>(AssemblerOptions.back().get()));
5253 
5254   getTargetStreamer().emitDirectiveSetPush();
5255   return false;
5256 }
5257 
5258 bool MipsAsmParser::parseSetSoftFloatDirective() {
5259   MCAsmParser &Parser = getParser();
5260   Parser.Lex();
5261   if (getLexer().isNot(AsmToken::EndOfStatement))
5262     return reportParseError("unexpected token, expected end of statement");
5263 
5264   setFeatureBits(Mips::FeatureSoftFloat, "soft-float");
5265   getTargetStreamer().emitDirectiveSetSoftFloat();
5266   return false;
5267 }
5268 
5269 bool MipsAsmParser::parseSetHardFloatDirective() {
5270   MCAsmParser &Parser = getParser();
5271   Parser.Lex();
5272   if (getLexer().isNot(AsmToken::EndOfStatement))
5273     return reportParseError("unexpected token, expected end of statement");
5274 
5275   clearFeatureBits(Mips::FeatureSoftFloat, "soft-float");
5276   getTargetStreamer().emitDirectiveSetHardFloat();
5277   return false;
5278 }
5279 
5280 bool MipsAsmParser::parseSetAssignment() {
5281   StringRef Name;
5282   const MCExpr *Value;
5283   MCAsmParser &Parser = getParser();
5284 
5285   if (Parser.parseIdentifier(Name))
5286     reportParseError("expected identifier after .set");
5287 
5288   if (getLexer().isNot(AsmToken::Comma))
5289     return reportParseError("unexpected token, expected comma");
5290   Lex(); // Eat comma
5291 
5292   if (Parser.parseExpression(Value))
5293     return reportParseError("expected valid expression after comma");
5294 
5295   MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
5296   Sym->setVariableValue(Value);
5297 
5298   return false;
5299 }
5300 
5301 bool MipsAsmParser::parseSetMips0Directive() {
5302   MCAsmParser &Parser = getParser();
5303   Parser.Lex();
5304   if (getLexer().isNot(AsmToken::EndOfStatement))
5305     return reportParseError("unexpected token, expected end of statement");
5306 
5307   // Reset assembler options to their initial values.
5308   MCSubtargetInfo &STI = copySTI();
5309   setAvailableFeatures(
5310       ComputeAvailableFeatures(AssemblerOptions.front()->getFeatures()));
5311   STI.setFeatureBits(AssemblerOptions.front()->getFeatures());
5312   AssemblerOptions.back()->setFeatures(AssemblerOptions.front()->getFeatures());
5313 
5314   getTargetStreamer().emitDirectiveSetMips0();
5315   return false;
5316 }
5317 
5318 bool MipsAsmParser::parseSetArchDirective() {
5319   MCAsmParser &Parser = getParser();
5320   Parser.Lex();
5321   if (getLexer().isNot(AsmToken::Equal))
5322     return reportParseError("unexpected token, expected equals sign");
5323 
5324   Parser.Lex();
5325   StringRef Arch;
5326   if (Parser.parseIdentifier(Arch))
5327     return reportParseError("expected arch identifier");
5328 
5329   StringRef ArchFeatureName =
5330       StringSwitch<StringRef>(Arch)
5331           .Case("mips1", "mips1")
5332           .Case("mips2", "mips2")
5333           .Case("mips3", "mips3")
5334           .Case("mips4", "mips4")
5335           .Case("mips5", "mips5")
5336           .Case("mips32", "mips32")
5337           .Case("mips32r2", "mips32r2")
5338           .Case("mips32r3", "mips32r3")
5339           .Case("mips32r5", "mips32r5")
5340           .Case("mips32r6", "mips32r6")
5341           .Case("mips64", "mips64")
5342           .Case("mips64r2", "mips64r2")
5343           .Case("mips64r3", "mips64r3")
5344           .Case("mips64r5", "mips64r5")
5345           .Case("mips64r6", "mips64r6")
5346           .Case("octeon", "cnmips")
5347           .Case("r4000", "mips3") // This is an implementation of Mips3.
5348           .Default("");
5349 
5350   if (ArchFeatureName.empty())
5351     return reportParseError("unsupported architecture");
5352 
5353   selectArch(ArchFeatureName);
5354   getTargetStreamer().emitDirectiveSetArch(Arch);
5355   return false;
5356 }
5357 
5358 bool MipsAsmParser::parseSetFeature(uint64_t Feature) {
5359   MCAsmParser &Parser = getParser();
5360   Parser.Lex();
5361   if (getLexer().isNot(AsmToken::EndOfStatement))
5362     return reportParseError("unexpected token, expected end of statement");
5363 
5364   switch (Feature) {
5365   default:
5366     llvm_unreachable("Unimplemented feature");
5367   case Mips::FeatureDSP:
5368     setFeatureBits(Mips::FeatureDSP, "dsp");
5369     getTargetStreamer().emitDirectiveSetDsp();
5370     break;
5371   case Mips::FeatureMicroMips:
5372     getTargetStreamer().emitDirectiveSetMicroMips();
5373     break;
5374   case Mips::FeatureMips1:
5375     selectArch("mips1");
5376     getTargetStreamer().emitDirectiveSetMips1();
5377     break;
5378   case Mips::FeatureMips2:
5379     selectArch("mips2");
5380     getTargetStreamer().emitDirectiveSetMips2();
5381     break;
5382   case Mips::FeatureMips3:
5383     selectArch("mips3");
5384     getTargetStreamer().emitDirectiveSetMips3();
5385     break;
5386   case Mips::FeatureMips4:
5387     selectArch("mips4");
5388     getTargetStreamer().emitDirectiveSetMips4();
5389     break;
5390   case Mips::FeatureMips5:
5391     selectArch("mips5");
5392     getTargetStreamer().emitDirectiveSetMips5();
5393     break;
5394   case Mips::FeatureMips32:
5395     selectArch("mips32");
5396     getTargetStreamer().emitDirectiveSetMips32();
5397     break;
5398   case Mips::FeatureMips32r2:
5399     selectArch("mips32r2");
5400     getTargetStreamer().emitDirectiveSetMips32R2();
5401     break;
5402   case Mips::FeatureMips32r3:
5403     selectArch("mips32r3");
5404     getTargetStreamer().emitDirectiveSetMips32R3();
5405     break;
5406   case Mips::FeatureMips32r5:
5407     selectArch("mips32r5");
5408     getTargetStreamer().emitDirectiveSetMips32R5();
5409     break;
5410   case Mips::FeatureMips32r6:
5411     selectArch("mips32r6");
5412     getTargetStreamer().emitDirectiveSetMips32R6();
5413     break;
5414   case Mips::FeatureMips64:
5415     selectArch("mips64");
5416     getTargetStreamer().emitDirectiveSetMips64();
5417     break;
5418   case Mips::FeatureMips64r2:
5419     selectArch("mips64r2");
5420     getTargetStreamer().emitDirectiveSetMips64R2();
5421     break;
5422   case Mips::FeatureMips64r3:
5423     selectArch("mips64r3");
5424     getTargetStreamer().emitDirectiveSetMips64R3();
5425     break;
5426   case Mips::FeatureMips64r5:
5427     selectArch("mips64r5");
5428     getTargetStreamer().emitDirectiveSetMips64R5();
5429     break;
5430   case Mips::FeatureMips64r6:
5431     selectArch("mips64r6");
5432     getTargetStreamer().emitDirectiveSetMips64R6();
5433     break;
5434   }
5435   return false;
5436 }
5437 
5438 bool MipsAsmParser::eatComma(StringRef ErrorStr) {
5439   MCAsmParser &Parser = getParser();
5440   if (getLexer().isNot(AsmToken::Comma)) {
5441     SMLoc Loc = getLexer().getLoc();
5442     Parser.eatToEndOfStatement();
5443     return Error(Loc, ErrorStr);
5444   }
5445 
5446   Parser.Lex(); // Eat the comma.
5447   return true;
5448 }
5449 
5450 // Used to determine if .cpload, .cprestore, and .cpsetup have any effect.
5451 // In this class, it is only used for .cprestore.
5452 // FIXME: Only keep track of IsPicEnabled in one place, instead of in both
5453 // MipsTargetELFStreamer and MipsAsmParser.
5454 bool MipsAsmParser::isPicAndNotNxxAbi() {
5455   return inPicMode() && !(isABI_N32() || isABI_N64());
5456 }
5457 
5458 bool MipsAsmParser::parseDirectiveCpLoad(SMLoc Loc) {
5459   if (AssemblerOptions.back()->isReorder())
5460     Warning(Loc, ".cpload should be inside a noreorder section");
5461 
5462   if (inMips16Mode()) {
5463     reportParseError(".cpload is not supported in Mips16 mode");
5464     return false;
5465   }
5466 
5467   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> Reg;
5468   OperandMatchResultTy ResTy = parseAnyRegister(Reg);
5469   if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) {
5470     reportParseError("expected register containing function address");
5471     return false;
5472   }
5473 
5474   MipsOperand &RegOpnd = static_cast<MipsOperand &>(*Reg[0]);
5475   if (!RegOpnd.isGPRAsmReg()) {
5476     reportParseError(RegOpnd.getStartLoc(), "invalid register");
5477     return false;
5478   }
5479 
5480   // If this is not the end of the statement, report an error.
5481   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5482     reportParseError("unexpected token, expected end of statement");
5483     return false;
5484   }
5485 
5486   getTargetStreamer().emitDirectiveCpLoad(RegOpnd.getGPR32Reg());
5487   return false;
5488 }
5489 
5490 bool MipsAsmParser::parseDirectiveCpRestore(SMLoc Loc) {
5491   MCAsmParser &Parser = getParser();
5492 
5493   // Note that .cprestore is ignored if used with the N32 and N64 ABIs or if it
5494   // is used in non-PIC mode.
5495 
5496   if (inMips16Mode()) {
5497     reportParseError(".cprestore is not supported in Mips16 mode");
5498     return false;
5499   }
5500 
5501   // Get the stack offset value.
5502   const MCExpr *StackOffset;
5503   int64_t StackOffsetVal;
5504   if (Parser.parseExpression(StackOffset)) {
5505     reportParseError("expected stack offset value");
5506     return false;
5507   }
5508 
5509   if (!StackOffset->evaluateAsAbsolute(StackOffsetVal)) {
5510     reportParseError("stack offset is not an absolute expression");
5511     return false;
5512   }
5513 
5514   if (StackOffsetVal < 0) {
5515     Warning(Loc, ".cprestore with negative stack offset has no effect");
5516     IsCpRestoreSet = false;
5517   } else {
5518     IsCpRestoreSet = true;
5519     CpRestoreOffset = StackOffsetVal;
5520   }
5521 
5522   // If this is not the end of the statement, report an error.
5523   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5524     reportParseError("unexpected token, expected end of statement");
5525     return false;
5526   }
5527 
5528   // Store the $gp on the stack.
5529   if (getStreamer().isIntegratedAssemblerRequired()) {
5530     const MCSubtargetInfo &STI = getSTI();
5531     createCpRestoreMemOp(false /*IsLoad*/, CpRestoreOffset /*StackOffset*/, Loc,
5532                          getStreamer(), &STI);
5533   }
5534 
5535   getTargetStreamer().emitDirectiveCpRestore(CpRestoreOffset);
5536   Parser.Lex(); // Consume the EndOfStatement.
5537   return false;
5538 }
5539 
5540 bool MipsAsmParser::parseDirectiveCPSetup() {
5541   MCAsmParser &Parser = getParser();
5542   unsigned FuncReg;
5543   unsigned Save;
5544   bool SaveIsReg = true;
5545 
5546   SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg;
5547   OperandMatchResultTy ResTy = parseAnyRegister(TmpReg);
5548   if (ResTy == MatchOperand_NoMatch) {
5549     reportParseError("expected register containing function address");
5550     Parser.eatToEndOfStatement();
5551     return false;
5552   }
5553 
5554   MipsOperand &FuncRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
5555   if (!FuncRegOpnd.isGPRAsmReg()) {
5556     reportParseError(FuncRegOpnd.getStartLoc(), "invalid register");
5557     Parser.eatToEndOfStatement();
5558     return false;
5559   }
5560 
5561   FuncReg = FuncRegOpnd.getGPR32Reg();
5562   TmpReg.clear();
5563 
5564   if (!eatComma("unexpected token, expected comma"))
5565     return true;
5566 
5567   ResTy = parseAnyRegister(TmpReg);
5568   if (ResTy == MatchOperand_NoMatch) {
5569     const MCExpr *OffsetExpr;
5570     int64_t OffsetVal;
5571     SMLoc ExprLoc = getLexer().getLoc();
5572 
5573     if (Parser.parseExpression(OffsetExpr) ||
5574         !OffsetExpr->evaluateAsAbsolute(OffsetVal)) {
5575       reportParseError(ExprLoc, "expected save register or stack offset");
5576       Parser.eatToEndOfStatement();
5577       return false;
5578     }
5579 
5580     Save = OffsetVal;
5581     SaveIsReg = false;
5582   } else {
5583     MipsOperand &SaveOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
5584     if (!SaveOpnd.isGPRAsmReg()) {
5585       reportParseError(SaveOpnd.getStartLoc(), "invalid register");
5586       Parser.eatToEndOfStatement();
5587       return false;
5588     }
5589     Save = SaveOpnd.getGPR32Reg();
5590   }
5591 
5592   if (!eatComma("unexpected token, expected comma"))
5593     return true;
5594 
5595   const MCExpr *Expr;
5596   if (Parser.parseExpression(Expr)) {
5597     reportParseError("expected expression");
5598     return false;
5599   }
5600 
5601   if (Expr->getKind() != MCExpr::SymbolRef) {
5602     reportParseError("expected symbol");
5603     return false;
5604   }
5605   const MCSymbolRefExpr *Ref = static_cast<const MCSymbolRefExpr *>(Expr);
5606 
5607   CpSaveLocation = Save;
5608   CpSaveLocationIsRegister = SaveIsReg;
5609 
5610   getTargetStreamer().emitDirectiveCpsetup(FuncReg, Save, Ref->getSymbol(),
5611                                            SaveIsReg);
5612   return false;
5613 }
5614 
5615 bool MipsAsmParser::parseDirectiveCPReturn() {
5616   getTargetStreamer().emitDirectiveCpreturn(CpSaveLocation,
5617                                             CpSaveLocationIsRegister);
5618   return false;
5619 }
5620 
5621 bool MipsAsmParser::parseDirectiveNaN() {
5622   MCAsmParser &Parser = getParser();
5623   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5624     const AsmToken &Tok = Parser.getTok();
5625 
5626     if (Tok.getString() == "2008") {
5627       Parser.Lex();
5628       getTargetStreamer().emitDirectiveNaN2008();
5629       return false;
5630     } else if (Tok.getString() == "legacy") {
5631       Parser.Lex();
5632       getTargetStreamer().emitDirectiveNaNLegacy();
5633       return false;
5634     }
5635   }
5636   // If we don't recognize the option passed to the .nan
5637   // directive (e.g. no option or unknown option), emit an error.
5638   reportParseError("invalid option in .nan directive");
5639   return false;
5640 }
5641 
5642 bool MipsAsmParser::parseDirectiveSet() {
5643   MCAsmParser &Parser = getParser();
5644   // Get the next token.
5645   const AsmToken &Tok = Parser.getTok();
5646 
5647   if (Tok.getString() == "noat") {
5648     return parseSetNoAtDirective();
5649   } else if (Tok.getString() == "at") {
5650     return parseSetAtDirective();
5651   } else if (Tok.getString() == "arch") {
5652     return parseSetArchDirective();
5653   } else if (Tok.getString() == "fp") {
5654     return parseSetFpDirective();
5655   } else if (Tok.getString() == "oddspreg") {
5656     return parseSetOddSPRegDirective();
5657   } else if (Tok.getString() == "nooddspreg") {
5658     return parseSetNoOddSPRegDirective();
5659   } else if (Tok.getString() == "pop") {
5660     return parseSetPopDirective();
5661   } else if (Tok.getString() == "push") {
5662     return parseSetPushDirective();
5663   } else if (Tok.getString() == "reorder") {
5664     return parseSetReorderDirective();
5665   } else if (Tok.getString() == "noreorder") {
5666     return parseSetNoReorderDirective();
5667   } else if (Tok.getString() == "macro") {
5668     return parseSetMacroDirective();
5669   } else if (Tok.getString() == "nomacro") {
5670     return parseSetNoMacroDirective();
5671   } else if (Tok.getString() == "mips16") {
5672     return parseSetMips16Directive();
5673   } else if (Tok.getString() == "nomips16") {
5674     return parseSetNoMips16Directive();
5675   } else if (Tok.getString() == "nomicromips") {
5676     getTargetStreamer().emitDirectiveSetNoMicroMips();
5677     Parser.eatToEndOfStatement();
5678     return false;
5679   } else if (Tok.getString() == "micromips") {
5680     return parseSetFeature(Mips::FeatureMicroMips);
5681   } else if (Tok.getString() == "mips0") {
5682     return parseSetMips0Directive();
5683   } else if (Tok.getString() == "mips1") {
5684     return parseSetFeature(Mips::FeatureMips1);
5685   } else if (Tok.getString() == "mips2") {
5686     return parseSetFeature(Mips::FeatureMips2);
5687   } else if (Tok.getString() == "mips3") {
5688     return parseSetFeature(Mips::FeatureMips3);
5689   } else if (Tok.getString() == "mips4") {
5690     return parseSetFeature(Mips::FeatureMips4);
5691   } else if (Tok.getString() == "mips5") {
5692     return parseSetFeature(Mips::FeatureMips5);
5693   } else if (Tok.getString() == "mips32") {
5694     return parseSetFeature(Mips::FeatureMips32);
5695   } else if (Tok.getString() == "mips32r2") {
5696     return parseSetFeature(Mips::FeatureMips32r2);
5697   } else if (Tok.getString() == "mips32r3") {
5698     return parseSetFeature(Mips::FeatureMips32r3);
5699   } else if (Tok.getString() == "mips32r5") {
5700     return parseSetFeature(Mips::FeatureMips32r5);
5701   } else if (Tok.getString() == "mips32r6") {
5702     return parseSetFeature(Mips::FeatureMips32r6);
5703   } else if (Tok.getString() == "mips64") {
5704     return parseSetFeature(Mips::FeatureMips64);
5705   } else if (Tok.getString() == "mips64r2") {
5706     return parseSetFeature(Mips::FeatureMips64r2);
5707   } else if (Tok.getString() == "mips64r3") {
5708     return parseSetFeature(Mips::FeatureMips64r3);
5709   } else if (Tok.getString() == "mips64r5") {
5710     return parseSetFeature(Mips::FeatureMips64r5);
5711   } else if (Tok.getString() == "mips64r6") {
5712     return parseSetFeature(Mips::FeatureMips64r6);
5713   } else if (Tok.getString() == "dsp") {
5714     return parseSetFeature(Mips::FeatureDSP);
5715   } else if (Tok.getString() == "nodsp") {
5716     return parseSetNoDspDirective();
5717   } else if (Tok.getString() == "msa") {
5718     return parseSetMsaDirective();
5719   } else if (Tok.getString() == "nomsa") {
5720     return parseSetNoMsaDirective();
5721   } else if (Tok.getString() == "softfloat") {
5722     return parseSetSoftFloatDirective();
5723   } else if (Tok.getString() == "hardfloat") {
5724     return parseSetHardFloatDirective();
5725   } else {
5726     // It is just an identifier, look for an assignment.
5727     parseSetAssignment();
5728     return false;
5729   }
5730 
5731   return true;
5732 }
5733 
5734 /// parseDataDirective
5735 ///  ::= .word [ expression (, expression)* ]
5736 bool MipsAsmParser::parseDataDirective(unsigned Size, SMLoc L) {
5737   MCAsmParser &Parser = getParser();
5738   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5739     for (;;) {
5740       const MCExpr *Value;
5741       if (getParser().parseExpression(Value))
5742         return true;
5743 
5744       getParser().getStreamer().EmitValue(Value, Size);
5745 
5746       if (getLexer().is(AsmToken::EndOfStatement))
5747         break;
5748 
5749       if (getLexer().isNot(AsmToken::Comma))
5750         return Error(L, "unexpected token, expected comma");
5751       Parser.Lex();
5752     }
5753   }
5754 
5755   Parser.Lex();
5756   return false;
5757 }
5758 
5759 /// parseDirectiveGpWord
5760 ///  ::= .gpword local_sym
5761 bool MipsAsmParser::parseDirectiveGpWord() {
5762   MCAsmParser &Parser = getParser();
5763   const MCExpr *Value;
5764   // EmitGPRel32Value requires an expression, so we are using base class
5765   // method to evaluate the expression.
5766   if (getParser().parseExpression(Value))
5767     return true;
5768   getParser().getStreamer().EmitGPRel32Value(Value);
5769 
5770   if (getLexer().isNot(AsmToken::EndOfStatement))
5771     return Error(getLexer().getLoc(),
5772                 "unexpected token, expected end of statement");
5773   Parser.Lex(); // Eat EndOfStatement token.
5774   return false;
5775 }
5776 
5777 /// parseDirectiveGpDWord
5778 ///  ::= .gpdword local_sym
5779 bool MipsAsmParser::parseDirectiveGpDWord() {
5780   MCAsmParser &Parser = getParser();
5781   const MCExpr *Value;
5782   // EmitGPRel64Value requires an expression, so we are using base class
5783   // method to evaluate the expression.
5784   if (getParser().parseExpression(Value))
5785     return true;
5786   getParser().getStreamer().EmitGPRel64Value(Value);
5787 
5788   if (getLexer().isNot(AsmToken::EndOfStatement))
5789     return Error(getLexer().getLoc(),
5790                 "unexpected token, expected end of statement");
5791   Parser.Lex(); // Eat EndOfStatement token.
5792   return false;
5793 }
5794 
5795 bool MipsAsmParser::parseDirectiveOption() {
5796   MCAsmParser &Parser = getParser();
5797   // Get the option token.
5798   AsmToken Tok = Parser.getTok();
5799   // At the moment only identifiers are supported.
5800   if (Tok.isNot(AsmToken::Identifier)) {
5801     Error(Parser.getTok().getLoc(), "unexpected token, expected identifier");
5802     Parser.eatToEndOfStatement();
5803     return false;
5804   }
5805 
5806   StringRef Option = Tok.getIdentifier();
5807 
5808   if (Option == "pic0") {
5809     // MipsAsmParser needs to know if the current PIC mode changes.
5810     IsPicEnabled = false;
5811 
5812     getTargetStreamer().emitDirectiveOptionPic0();
5813     Parser.Lex();
5814     if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
5815       Error(Parser.getTok().getLoc(),
5816             "unexpected token, expected end of statement");
5817       Parser.eatToEndOfStatement();
5818     }
5819     return false;
5820   }
5821 
5822   if (Option == "pic2") {
5823     // MipsAsmParser needs to know if the current PIC mode changes.
5824     IsPicEnabled = true;
5825 
5826     getTargetStreamer().emitDirectiveOptionPic2();
5827     Parser.Lex();
5828     if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
5829       Error(Parser.getTok().getLoc(),
5830             "unexpected token, expected end of statement");
5831       Parser.eatToEndOfStatement();
5832     }
5833     return false;
5834   }
5835 
5836   // Unknown option.
5837   Warning(Parser.getTok().getLoc(),
5838           "unknown option, expected 'pic0' or 'pic2'");
5839   Parser.eatToEndOfStatement();
5840   return false;
5841 }
5842 
5843 /// parseInsnDirective
5844 ///  ::= .insn
5845 bool MipsAsmParser::parseInsnDirective() {
5846   // If this is not the end of the statement, report an error.
5847   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5848     reportParseError("unexpected token, expected end of statement");
5849     return false;
5850   }
5851 
5852   // The actual label marking happens in
5853   // MipsELFStreamer::createPendingLabelRelocs().
5854   getTargetStreamer().emitDirectiveInsn();
5855 
5856   getParser().Lex(); // Eat EndOfStatement token.
5857   return false;
5858 }
5859 
5860 /// parseSSectionDirective
5861 ///  ::= .sbss
5862 ///  ::= .sdata
5863 bool MipsAsmParser::parseSSectionDirective(StringRef Section, unsigned Type) {
5864   // If this is not the end of the statement, report an error.
5865   if (getLexer().isNot(AsmToken::EndOfStatement)) {
5866     reportParseError("unexpected token, expected end of statement");
5867     return false;
5868   }
5869 
5870   MCSection *ELFSection = getContext().getELFSection(
5871       Section, Type, ELF::SHF_WRITE | ELF::SHF_ALLOC | ELF::SHF_MIPS_GPREL);
5872   getParser().getStreamer().SwitchSection(ELFSection);
5873 
5874   getParser().Lex(); // Eat EndOfStatement token.
5875   return false;
5876 }
5877 
5878 /// parseDirectiveModule
5879 ///  ::= .module oddspreg
5880 ///  ::= .module nooddspreg
5881 ///  ::= .module fp=value
5882 ///  ::= .module softfloat
5883 ///  ::= .module hardfloat
5884 bool MipsAsmParser::parseDirectiveModule() {
5885   MCAsmParser &Parser = getParser();
5886   MCAsmLexer &Lexer = getLexer();
5887   SMLoc L = Lexer.getLoc();
5888 
5889   if (!getTargetStreamer().isModuleDirectiveAllowed()) {
5890     // TODO : get a better message.
5891     reportParseError(".module directive must appear before any code");
5892     return false;
5893   }
5894 
5895   StringRef Option;
5896   if (Parser.parseIdentifier(Option)) {
5897     reportParseError("expected .module option identifier");
5898     return false;
5899   }
5900 
5901   if (Option == "oddspreg") {
5902     clearModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
5903 
5904     // Synchronize the abiflags information with the FeatureBits information we
5905     // changed above.
5906     getTargetStreamer().updateABIInfo(*this);
5907 
5908     // If printing assembly, use the recently updated abiflags information.
5909     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
5910     // emitted at the end).
5911     getTargetStreamer().emitDirectiveModuleOddSPReg();
5912 
5913     // If this is not the end of the statement, report an error.
5914     if (getLexer().isNot(AsmToken::EndOfStatement)) {
5915       reportParseError("unexpected token, expected end of statement");
5916       return false;
5917     }
5918 
5919     return false; // parseDirectiveModule has finished successfully.
5920   } else if (Option == "nooddspreg") {
5921     if (!isABI_O32()) {
5922       Error(L, "'.module nooddspreg' requires the O32 ABI");
5923       return false;
5924     }
5925 
5926     setModuleFeatureBits(Mips::FeatureNoOddSPReg, "nooddspreg");
5927 
5928     // Synchronize the abiflags information with the FeatureBits information we
5929     // changed above.
5930     getTargetStreamer().updateABIInfo(*this);
5931 
5932     // If printing assembly, use the recently updated abiflags information.
5933     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
5934     // emitted at the end).
5935     getTargetStreamer().emitDirectiveModuleOddSPReg();
5936 
5937     // If this is not the end of the statement, report an error.
5938     if (getLexer().isNot(AsmToken::EndOfStatement)) {
5939       reportParseError("unexpected token, expected end of statement");
5940       return false;
5941     }
5942 
5943     return false; // parseDirectiveModule has finished successfully.
5944   } else if (Option == "fp") {
5945     return parseDirectiveModuleFP();
5946   } else if (Option == "softfloat") {
5947     setModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float");
5948 
5949     // Synchronize the ABI Flags information with the FeatureBits information we
5950     // updated above.
5951     getTargetStreamer().updateABIInfo(*this);
5952 
5953     // If printing assembly, use the recently updated ABI Flags information.
5954     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
5955     // emitted later).
5956     getTargetStreamer().emitDirectiveModuleSoftFloat();
5957 
5958     // If this is not the end of the statement, report an error.
5959     if (getLexer().isNot(AsmToken::EndOfStatement)) {
5960       reportParseError("unexpected token, expected end of statement");
5961       return false;
5962     }
5963 
5964     return false; // parseDirectiveModule has finished successfully.
5965   } else if (Option == "hardfloat") {
5966     clearModuleFeatureBits(Mips::FeatureSoftFloat, "soft-float");
5967 
5968     // Synchronize the ABI Flags information with the FeatureBits information we
5969     // updated above.
5970     getTargetStreamer().updateABIInfo(*this);
5971 
5972     // If printing assembly, use the recently updated ABI Flags information.
5973     // If generating ELF, don't do anything (the .MIPS.abiflags section gets
5974     // emitted later).
5975     getTargetStreamer().emitDirectiveModuleHardFloat();
5976 
5977     // If this is not the end of the statement, report an error.
5978     if (getLexer().isNot(AsmToken::EndOfStatement)) {
5979       reportParseError("unexpected token, expected end of statement");
5980       return false;
5981     }
5982 
5983     return false; // parseDirectiveModule has finished successfully.
5984   } else {
5985     return Error(L, "'" + Twine(Option) + "' is not a valid .module option.");
5986   }
5987 }
5988 
5989 /// parseDirectiveModuleFP
5990 ///  ::= =32
5991 ///  ::= =xx
5992 ///  ::= =64
5993 bool MipsAsmParser::parseDirectiveModuleFP() {
5994   MCAsmParser &Parser = getParser();
5995   MCAsmLexer &Lexer = getLexer();
5996 
5997   if (Lexer.isNot(AsmToken::Equal)) {
5998     reportParseError("unexpected token, expected equals sign '='");
5999     return false;
6000   }
6001   Parser.Lex(); // Eat '=' token.
6002 
6003   MipsABIFlagsSection::FpABIKind FpABI;
6004   if (!parseFpABIValue(FpABI, ".module"))
6005     return false;
6006 
6007   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6008     reportParseError("unexpected token, expected end of statement");
6009     return false;
6010   }
6011 
6012   // Synchronize the abiflags information with the FeatureBits information we
6013   // changed above.
6014   getTargetStreamer().updateABIInfo(*this);
6015 
6016   // If printing assembly, use the recently updated abiflags information.
6017   // If generating ELF, don't do anything (the .MIPS.abiflags section gets
6018   // emitted at the end).
6019   getTargetStreamer().emitDirectiveModuleFP();
6020 
6021   Parser.Lex(); // Consume the EndOfStatement.
6022   return false;
6023 }
6024 
6025 bool MipsAsmParser::parseFpABIValue(MipsABIFlagsSection::FpABIKind &FpABI,
6026                                     StringRef Directive) {
6027   MCAsmParser &Parser = getParser();
6028   MCAsmLexer &Lexer = getLexer();
6029   bool ModuleLevelOptions = Directive == ".module";
6030 
6031   if (Lexer.is(AsmToken::Identifier)) {
6032     StringRef Value = Parser.getTok().getString();
6033     Parser.Lex();
6034 
6035     if (Value != "xx") {
6036       reportParseError("unsupported value, expected 'xx', '32' or '64'");
6037       return false;
6038     }
6039 
6040     if (!isABI_O32()) {
6041       reportParseError("'" + Directive + " fp=xx' requires the O32 ABI");
6042       return false;
6043     }
6044 
6045     FpABI = MipsABIFlagsSection::FpABIKind::XX;
6046     if (ModuleLevelOptions) {
6047       setModuleFeatureBits(Mips::FeatureFPXX, "fpxx");
6048       clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64");
6049     } else {
6050       setFeatureBits(Mips::FeatureFPXX, "fpxx");
6051       clearFeatureBits(Mips::FeatureFP64Bit, "fp64");
6052     }
6053     return true;
6054   }
6055 
6056   if (Lexer.is(AsmToken::Integer)) {
6057     unsigned Value = Parser.getTok().getIntVal();
6058     Parser.Lex();
6059 
6060     if (Value != 32 && Value != 64) {
6061       reportParseError("unsupported value, expected 'xx', '32' or '64'");
6062       return false;
6063     }
6064 
6065     if (Value == 32) {
6066       if (!isABI_O32()) {
6067         reportParseError("'" + Directive + " fp=32' requires the O32 ABI");
6068         return false;
6069       }
6070 
6071       FpABI = MipsABIFlagsSection::FpABIKind::S32;
6072       if (ModuleLevelOptions) {
6073         clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx");
6074         clearModuleFeatureBits(Mips::FeatureFP64Bit, "fp64");
6075       } else {
6076         clearFeatureBits(Mips::FeatureFPXX, "fpxx");
6077         clearFeatureBits(Mips::FeatureFP64Bit, "fp64");
6078       }
6079     } else {
6080       FpABI = MipsABIFlagsSection::FpABIKind::S64;
6081       if (ModuleLevelOptions) {
6082         clearModuleFeatureBits(Mips::FeatureFPXX, "fpxx");
6083         setModuleFeatureBits(Mips::FeatureFP64Bit, "fp64");
6084       } else {
6085         clearFeatureBits(Mips::FeatureFPXX, "fpxx");
6086         setFeatureBits(Mips::FeatureFP64Bit, "fp64");
6087       }
6088     }
6089 
6090     return true;
6091   }
6092 
6093   return false;
6094 }
6095 
6096 bool MipsAsmParser::ParseDirective(AsmToken DirectiveID) {
6097   MCAsmParser &Parser = getParser();
6098   StringRef IDVal = DirectiveID.getString();
6099 
6100   if (IDVal == ".cpload")
6101     return parseDirectiveCpLoad(DirectiveID.getLoc());
6102   if (IDVal == ".cprestore")
6103     return parseDirectiveCpRestore(DirectiveID.getLoc());
6104   if (IDVal == ".dword") {
6105     parseDataDirective(8, DirectiveID.getLoc());
6106     return false;
6107   }
6108   if (IDVal == ".ent") {
6109     StringRef SymbolName;
6110 
6111     if (Parser.parseIdentifier(SymbolName)) {
6112       reportParseError("expected identifier after .ent");
6113       return false;
6114     }
6115 
6116     // There's an undocumented extension that allows an integer to
6117     // follow the name of the procedure which AFAICS is ignored by GAS.
6118     // Example: .ent foo,2
6119     if (getLexer().isNot(AsmToken::EndOfStatement)) {
6120       if (getLexer().isNot(AsmToken::Comma)) {
6121         // Even though we accept this undocumented extension for compatibility
6122         // reasons, the additional integer argument does not actually change
6123         // the behaviour of the '.ent' directive, so we would like to discourage
6124         // its use. We do this by not referring to the extended version in
6125         // error messages which are not directly related to its use.
6126         reportParseError("unexpected token, expected end of statement");
6127         return false;
6128       }
6129       Parser.Lex(); // Eat the comma.
6130       const MCExpr *DummyNumber;
6131       int64_t DummyNumberVal;
6132       // If the user was explicitly trying to use the extended version,
6133       // we still give helpful extension-related error messages.
6134       if (Parser.parseExpression(DummyNumber)) {
6135         reportParseError("expected number after comma");
6136         return false;
6137       }
6138       if (!DummyNumber->evaluateAsAbsolute(DummyNumberVal)) {
6139         reportParseError("expected an absolute expression after comma");
6140         return false;
6141       }
6142     }
6143 
6144     // If this is not the end of the statement, report an error.
6145     if (getLexer().isNot(AsmToken::EndOfStatement)) {
6146       reportParseError("unexpected token, expected end of statement");
6147       return false;
6148     }
6149 
6150     MCSymbol *Sym = getContext().getOrCreateSymbol(SymbolName);
6151 
6152     getTargetStreamer().emitDirectiveEnt(*Sym);
6153     CurrentFn = Sym;
6154     IsCpRestoreSet = false;
6155     return false;
6156   }
6157 
6158   if (IDVal == ".end") {
6159     StringRef SymbolName;
6160 
6161     if (Parser.parseIdentifier(SymbolName)) {
6162       reportParseError("expected identifier after .end");
6163       return false;
6164     }
6165 
6166     if (getLexer().isNot(AsmToken::EndOfStatement)) {
6167       reportParseError("unexpected token, expected end of statement");
6168       return false;
6169     }
6170 
6171     if (CurrentFn == nullptr) {
6172       reportParseError(".end used without .ent");
6173       return false;
6174     }
6175 
6176     if ((SymbolName != CurrentFn->getName())) {
6177       reportParseError(".end symbol does not match .ent symbol");
6178       return false;
6179     }
6180 
6181     getTargetStreamer().emitDirectiveEnd(SymbolName);
6182     CurrentFn = nullptr;
6183     IsCpRestoreSet = false;
6184     return false;
6185   }
6186 
6187   if (IDVal == ".frame") {
6188     // .frame $stack_reg, frame_size_in_bytes, $return_reg
6189     SmallVector<std::unique_ptr<MCParsedAsmOperand>, 1> TmpReg;
6190     OperandMatchResultTy ResTy = parseAnyRegister(TmpReg);
6191     if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) {
6192       reportParseError("expected stack register");
6193       return false;
6194     }
6195 
6196     MipsOperand &StackRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
6197     if (!StackRegOpnd.isGPRAsmReg()) {
6198       reportParseError(StackRegOpnd.getStartLoc(),
6199                        "expected general purpose register");
6200       return false;
6201     }
6202     unsigned StackReg = StackRegOpnd.getGPR32Reg();
6203 
6204     if (Parser.getTok().is(AsmToken::Comma))
6205       Parser.Lex();
6206     else {
6207       reportParseError("unexpected token, expected comma");
6208       return false;
6209     }
6210 
6211     // Parse the frame size.
6212     const MCExpr *FrameSize;
6213     int64_t FrameSizeVal;
6214 
6215     if (Parser.parseExpression(FrameSize)) {
6216       reportParseError("expected frame size value");
6217       return false;
6218     }
6219 
6220     if (!FrameSize->evaluateAsAbsolute(FrameSizeVal)) {
6221       reportParseError("frame size not an absolute expression");
6222       return false;
6223     }
6224 
6225     if (Parser.getTok().is(AsmToken::Comma))
6226       Parser.Lex();
6227     else {
6228       reportParseError("unexpected token, expected comma");
6229       return false;
6230     }
6231 
6232     // Parse the return register.
6233     TmpReg.clear();
6234     ResTy = parseAnyRegister(TmpReg);
6235     if (ResTy == MatchOperand_NoMatch || ResTy == MatchOperand_ParseFail) {
6236       reportParseError("expected return register");
6237       return false;
6238     }
6239 
6240     MipsOperand &ReturnRegOpnd = static_cast<MipsOperand &>(*TmpReg[0]);
6241     if (!ReturnRegOpnd.isGPRAsmReg()) {
6242       reportParseError(ReturnRegOpnd.getStartLoc(),
6243                        "expected general purpose register");
6244       return false;
6245     }
6246 
6247     // If this is not the end of the statement, report an error.
6248     if (getLexer().isNot(AsmToken::EndOfStatement)) {
6249       reportParseError("unexpected token, expected end of statement");
6250       return false;
6251     }
6252 
6253     getTargetStreamer().emitFrame(StackReg, FrameSizeVal,
6254                                   ReturnRegOpnd.getGPR32Reg());
6255     IsCpRestoreSet = false;
6256     return false;
6257   }
6258 
6259   if (IDVal == ".set") {
6260     return parseDirectiveSet();
6261   }
6262 
6263   if (IDVal == ".mask" || IDVal == ".fmask") {
6264     // .mask bitmask, frame_offset
6265     // bitmask: One bit for each register used.
6266     // frame_offset: Offset from Canonical Frame Address ($sp on entry) where
6267     //               first register is expected to be saved.
6268     // Examples:
6269     //   .mask 0x80000000, -4
6270     //   .fmask 0x80000000, -4
6271     //
6272 
6273     // Parse the bitmask
6274     const MCExpr *BitMask;
6275     int64_t BitMaskVal;
6276 
6277     if (Parser.parseExpression(BitMask)) {
6278       reportParseError("expected bitmask value");
6279       return false;
6280     }
6281 
6282     if (!BitMask->evaluateAsAbsolute(BitMaskVal)) {
6283       reportParseError("bitmask not an absolute expression");
6284       return false;
6285     }
6286 
6287     if (Parser.getTok().is(AsmToken::Comma))
6288       Parser.Lex();
6289     else {
6290       reportParseError("unexpected token, expected comma");
6291       return false;
6292     }
6293 
6294     // Parse the frame_offset
6295     const MCExpr *FrameOffset;
6296     int64_t FrameOffsetVal;
6297 
6298     if (Parser.parseExpression(FrameOffset)) {
6299       reportParseError("expected frame offset value");
6300       return false;
6301     }
6302 
6303     if (!FrameOffset->evaluateAsAbsolute(FrameOffsetVal)) {
6304       reportParseError("frame offset not an absolute expression");
6305       return false;
6306     }
6307 
6308     // If this is not the end of the statement, report an error.
6309     if (getLexer().isNot(AsmToken::EndOfStatement)) {
6310       reportParseError("unexpected token, expected end of statement");
6311       return false;
6312     }
6313 
6314     if (IDVal == ".mask")
6315       getTargetStreamer().emitMask(BitMaskVal, FrameOffsetVal);
6316     else
6317       getTargetStreamer().emitFMask(BitMaskVal, FrameOffsetVal);
6318     return false;
6319   }
6320 
6321   if (IDVal == ".nan")
6322     return parseDirectiveNaN();
6323 
6324   if (IDVal == ".gpword") {
6325     parseDirectiveGpWord();
6326     return false;
6327   }
6328 
6329   if (IDVal == ".gpdword") {
6330     parseDirectiveGpDWord();
6331     return false;
6332   }
6333 
6334   if (IDVal == ".word") {
6335     parseDataDirective(4, DirectiveID.getLoc());
6336     return false;
6337   }
6338 
6339   if (IDVal == ".hword") {
6340     parseDataDirective(2, DirectiveID.getLoc());
6341     return false;
6342   }
6343 
6344   if (IDVal == ".option")
6345     return parseDirectiveOption();
6346 
6347   if (IDVal == ".abicalls") {
6348     getTargetStreamer().emitDirectiveAbiCalls();
6349     if (Parser.getTok().isNot(AsmToken::EndOfStatement)) {
6350       Error(Parser.getTok().getLoc(),
6351             "unexpected token, expected end of statement");
6352       // Clear line
6353       Parser.eatToEndOfStatement();
6354     }
6355     return false;
6356   }
6357 
6358   if (IDVal == ".cpsetup")
6359     return parseDirectiveCPSetup();
6360 
6361   if (IDVal == ".cpreturn")
6362     return parseDirectiveCPReturn();
6363 
6364   if (IDVal == ".module")
6365     return parseDirectiveModule();
6366 
6367   if (IDVal == ".llvm_internal_mips_reallow_module_directive")
6368     return parseInternalDirectiveReallowModule();
6369 
6370   if (IDVal == ".insn")
6371     return parseInsnDirective();
6372 
6373   if (IDVal == ".sbss")
6374     return parseSSectionDirective(IDVal, ELF::SHT_NOBITS);
6375   if (IDVal == ".sdata")
6376     return parseSSectionDirective(IDVal, ELF::SHT_PROGBITS);
6377 
6378   return true;
6379 }
6380 
6381 bool MipsAsmParser::parseInternalDirectiveReallowModule() {
6382   // If this is not the end of the statement, report an error.
6383   if (getLexer().isNot(AsmToken::EndOfStatement)) {
6384     reportParseError("unexpected token, expected end of statement");
6385     return false;
6386   }
6387 
6388   getTargetStreamer().reallowModuleDirective();
6389 
6390   getParser().Lex(); // Eat EndOfStatement token.
6391   return false;
6392 }
6393 
6394 extern "C" void LLVMInitializeMipsAsmParser() {
6395   RegisterMCAsmParser<MipsAsmParser> X(TheMipsTarget);
6396   RegisterMCAsmParser<MipsAsmParser> Y(TheMipselTarget);
6397   RegisterMCAsmParser<MipsAsmParser> A(TheMips64Target);
6398   RegisterMCAsmParser<MipsAsmParser> B(TheMips64elTarget);
6399 }
6400 
6401 #define GET_REGISTER_MATCHER
6402 #define GET_MATCHER_IMPLEMENTATION
6403 #include "MipsGenAsmMatcher.inc"
6404