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