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