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