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