109467b48Spatrick //===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===//
209467b48Spatrick //
309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information.
509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
609467b48Spatrick //
709467b48Spatrick //===----------------------------------------------------------------------===//
809467b48Spatrick 
909467b48Spatrick #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
1009467b48Spatrick #define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
1109467b48Spatrick 
1209467b48Spatrick #include "MCTargetDesc/MipsABIFlagsSection.h"
1309467b48Spatrick #include "MCTargetDesc/MipsABIInfo.h"
1409467b48Spatrick #include "llvm/ADT/STLExtras.h"
1509467b48Spatrick #include "llvm/MC/MCELFStreamer.h"
1609467b48Spatrick #include "llvm/MC/MCRegisterInfo.h"
1709467b48Spatrick #include "llvm/MC/MCStreamer.h"
1809467b48Spatrick 
1909467b48Spatrick namespace llvm {
2009467b48Spatrick 
2173471bf0Spatrick class formatted_raw_ostream;
2273471bf0Spatrick 
2309467b48Spatrick class MipsTargetStreamer : public MCTargetStreamer {
2409467b48Spatrick public:
2509467b48Spatrick   MipsTargetStreamer(MCStreamer &S);
2609467b48Spatrick 
setPic(bool Value)2709467b48Spatrick   virtual void setPic(bool Value) {}
2809467b48Spatrick 
2909467b48Spatrick   virtual void emitDirectiveSetMicroMips();
3009467b48Spatrick   virtual void emitDirectiveSetNoMicroMips();
3109467b48Spatrick   virtual void setUsesMicroMips();
3209467b48Spatrick   virtual void emitDirectiveSetMips16();
3309467b48Spatrick   virtual void emitDirectiveSetNoMips16();
3409467b48Spatrick 
3509467b48Spatrick   virtual void emitDirectiveSetReorder();
3609467b48Spatrick   virtual void emitDirectiveSetNoReorder();
3709467b48Spatrick   virtual void emitDirectiveSetMacro();
3809467b48Spatrick   virtual void emitDirectiveSetNoMacro();
3909467b48Spatrick   virtual void emitDirectiveSetMsa();
4009467b48Spatrick   virtual void emitDirectiveSetNoMsa();
4109467b48Spatrick   virtual void emitDirectiveSetMt();
4209467b48Spatrick   virtual void emitDirectiveSetNoMt();
4309467b48Spatrick   virtual void emitDirectiveSetCRC();
4409467b48Spatrick   virtual void emitDirectiveSetNoCRC();
4509467b48Spatrick   virtual void emitDirectiveSetVirt();
4609467b48Spatrick   virtual void emitDirectiveSetNoVirt();
4709467b48Spatrick   virtual void emitDirectiveSetGINV();
4809467b48Spatrick   virtual void emitDirectiveSetNoGINV();
4909467b48Spatrick   virtual void emitDirectiveSetAt();
5009467b48Spatrick   virtual void emitDirectiveSetAtWithArg(unsigned RegNo);
5109467b48Spatrick   virtual void emitDirectiveSetNoAt();
5209467b48Spatrick   virtual void emitDirectiveEnd(StringRef Name);
5309467b48Spatrick 
5409467b48Spatrick   virtual void emitDirectiveEnt(const MCSymbol &Symbol);
5509467b48Spatrick   virtual void emitDirectiveAbiCalls();
5609467b48Spatrick   virtual void emitDirectiveNaN2008();
5709467b48Spatrick   virtual void emitDirectiveNaNLegacy();
5809467b48Spatrick   virtual void emitDirectiveOptionPic0();
5909467b48Spatrick   virtual void emitDirectiveOptionPic2();
6009467b48Spatrick   virtual void emitDirectiveInsn();
6109467b48Spatrick   virtual void emitFrame(unsigned StackReg, unsigned StackSize,
6209467b48Spatrick                          unsigned ReturnReg);
6309467b48Spatrick   virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
6409467b48Spatrick   virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
6509467b48Spatrick 
6609467b48Spatrick   virtual void emitDirectiveSetArch(StringRef Arch);
6709467b48Spatrick   virtual void emitDirectiveSetMips0();
6809467b48Spatrick   virtual void emitDirectiveSetMips1();
6909467b48Spatrick   virtual void emitDirectiveSetMips2();
7009467b48Spatrick   virtual void emitDirectiveSetMips3();
7109467b48Spatrick   virtual void emitDirectiveSetMips4();
7209467b48Spatrick   virtual void emitDirectiveSetMips5();
7309467b48Spatrick   virtual void emitDirectiveSetMips32();
7409467b48Spatrick   virtual void emitDirectiveSetMips32R2();
7509467b48Spatrick   virtual void emitDirectiveSetMips32R3();
7609467b48Spatrick   virtual void emitDirectiveSetMips32R5();
7709467b48Spatrick   virtual void emitDirectiveSetMips32R6();
7809467b48Spatrick   virtual void emitDirectiveSetMips64();
7909467b48Spatrick   virtual void emitDirectiveSetMips64R2();
8009467b48Spatrick   virtual void emitDirectiveSetMips64R3();
8109467b48Spatrick   virtual void emitDirectiveSetMips64R5();
8209467b48Spatrick   virtual void emitDirectiveSetMips64R6();
8309467b48Spatrick   virtual void emitDirectiveSetDsp();
8409467b48Spatrick   virtual void emitDirectiveSetDspr2();
8509467b48Spatrick   virtual void emitDirectiveSetNoDsp();
86097a140dSpatrick   virtual void emitDirectiveSetMips3D();
87097a140dSpatrick   virtual void emitDirectiveSetNoMips3D();
8809467b48Spatrick   virtual void emitDirectiveSetPop();
8909467b48Spatrick   virtual void emitDirectiveSetPush();
9009467b48Spatrick   virtual void emitDirectiveSetSoftFloat();
9109467b48Spatrick   virtual void emitDirectiveSetHardFloat();
9209467b48Spatrick 
9309467b48Spatrick   // PIC support
94097a140dSpatrick   virtual void emitDirectiveCpAdd(unsigned RegNo);
9509467b48Spatrick   virtual void emitDirectiveCpLoad(unsigned RegNo);
9609467b48Spatrick   virtual void emitDirectiveCpLocal(unsigned RegNo);
9709467b48Spatrick   virtual bool emitDirectiveCpRestore(int Offset,
9809467b48Spatrick                                       function_ref<unsigned()> GetATReg,
9909467b48Spatrick                                       SMLoc IDLoc, const MCSubtargetInfo *STI);
10009467b48Spatrick   virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
10109467b48Spatrick                                     const MCSymbol &Sym, bool IsReg);
10209467b48Spatrick   virtual void emitDirectiveCpreturn(unsigned SaveLocation,
10309467b48Spatrick                                      bool SaveLocationIsRegister);
10409467b48Spatrick 
10509467b48Spatrick   // FP abiflags directives
10609467b48Spatrick   virtual void emitDirectiveModuleFP();
10709467b48Spatrick   virtual void emitDirectiveModuleOddSPReg();
10809467b48Spatrick   virtual void emitDirectiveModuleSoftFloat();
10909467b48Spatrick   virtual void emitDirectiveModuleHardFloat();
11009467b48Spatrick   virtual void emitDirectiveModuleMT();
11109467b48Spatrick   virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value);
11209467b48Spatrick   virtual void emitDirectiveSetOddSPReg();
11309467b48Spatrick   virtual void emitDirectiveSetNoOddSPReg();
11409467b48Spatrick   virtual void emitDirectiveModuleCRC();
11509467b48Spatrick   virtual void emitDirectiveModuleNoCRC();
11609467b48Spatrick   virtual void emitDirectiveModuleVirt();
11709467b48Spatrick   virtual void emitDirectiveModuleNoVirt();
11809467b48Spatrick   virtual void emitDirectiveModuleGINV();
11909467b48Spatrick   virtual void emitDirectiveModuleNoGINV();
12009467b48Spatrick 
12109467b48Spatrick   void emitR(unsigned Opcode, unsigned Reg0, SMLoc IDLoc,
12209467b48Spatrick              const MCSubtargetInfo *STI);
12309467b48Spatrick   void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,
12409467b48Spatrick               const MCSubtargetInfo *STI);
12509467b48Spatrick   void emitRX(unsigned Opcode, unsigned Reg0, MCOperand Op1, SMLoc IDLoc,
12609467b48Spatrick               const MCSubtargetInfo *STI);
12709467b48Spatrick   void emitRI(unsigned Opcode, unsigned Reg0, int32_t Imm, SMLoc IDLoc,
12809467b48Spatrick               const MCSubtargetInfo *STI);
12909467b48Spatrick   void emitRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, SMLoc IDLoc,
13009467b48Spatrick               const MCSubtargetInfo *STI);
13109467b48Spatrick   void emitRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, MCOperand Op2,
13209467b48Spatrick                SMLoc IDLoc, const MCSubtargetInfo *STI);
13309467b48Spatrick   void emitRRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2,
13409467b48Spatrick                SMLoc IDLoc, const MCSubtargetInfo *STI);
13509467b48Spatrick   void emitRRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2,
13609467b48Spatrick                 MCOperand Op3, SMLoc IDLoc, const MCSubtargetInfo *STI);
13709467b48Spatrick   void emitRRI(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm,
13809467b48Spatrick                SMLoc IDLoc, const MCSubtargetInfo *STI);
13909467b48Spatrick   void emitRRIII(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm0,
14009467b48Spatrick                  int16_t Imm1, int16_t Imm2, SMLoc IDLoc,
14109467b48Spatrick                  const MCSubtargetInfo *STI);
14209467b48Spatrick   void emitAddu(unsigned DstReg, unsigned SrcReg, unsigned TrgReg, bool Is64Bit,
14309467b48Spatrick                 const MCSubtargetInfo *STI);
14409467b48Spatrick   void emitDSLL(unsigned DstReg, unsigned SrcReg, int16_t ShiftAmount,
14509467b48Spatrick                 SMLoc IDLoc, const MCSubtargetInfo *STI);
14609467b48Spatrick   void emitEmptyDelaySlot(bool hasShortDelaySlot, SMLoc IDLoc,
14709467b48Spatrick                           const MCSubtargetInfo *STI);
14809467b48Spatrick   void emitNop(SMLoc IDLoc, const MCSubtargetInfo *STI);
14909467b48Spatrick 
15009467b48Spatrick   /// Emit a store instruction with an offset. If the offset is out of range
15109467b48Spatrick   /// then it will be synthesized using the assembler temporary.
15209467b48Spatrick   ///
15309467b48Spatrick   /// GetATReg() is a callback that can be used to obtain the current assembler
15409467b48Spatrick   /// temporary and is only called when the assembler temporary is required. It
15509467b48Spatrick   /// must handle the case where no assembler temporary is available (typically
15609467b48Spatrick   /// by reporting an error).
15709467b48Spatrick   void emitStoreWithImmOffset(unsigned Opcode, unsigned SrcReg,
15809467b48Spatrick                               unsigned BaseReg, int64_t Offset,
15909467b48Spatrick                               function_ref<unsigned()> GetATReg, SMLoc IDLoc,
16009467b48Spatrick                               const MCSubtargetInfo *STI);
16109467b48Spatrick   void emitLoadWithImmOffset(unsigned Opcode, unsigned DstReg, unsigned BaseReg,
16209467b48Spatrick                              int64_t Offset, unsigned TmpReg, SMLoc IDLoc,
16309467b48Spatrick                              const MCSubtargetInfo *STI);
16409467b48Spatrick   void emitGPRestore(int Offset, SMLoc IDLoc, const MCSubtargetInfo *STI);
16509467b48Spatrick 
forbidModuleDirective()16609467b48Spatrick   void forbidModuleDirective() { ModuleDirectiveAllowed = false; }
reallowModuleDirective()16709467b48Spatrick   void reallowModuleDirective() { ModuleDirectiveAllowed = true; }
isModuleDirectiveAllowed()16809467b48Spatrick   bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; }
16909467b48Spatrick 
17009467b48Spatrick   // This method enables template classes to set internal abi flags
17109467b48Spatrick   // structure values.
17209467b48Spatrick   template <class PredicateLibrary>
updateABIInfo(const PredicateLibrary & P)17309467b48Spatrick   void updateABIInfo(const PredicateLibrary &P) {
17409467b48Spatrick     ABI = P.getABI();
17509467b48Spatrick     ABIFlagsSection.setAllFromPredicates(P);
17609467b48Spatrick   }
17709467b48Spatrick 
getABIFlagsSection()17809467b48Spatrick   MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; }
getABI()17909467b48Spatrick   const MipsABIInfo &getABI() const {
180*d415bd75Srobert     assert(ABI && "ABI hasn't been set!");
18109467b48Spatrick     return *ABI;
18209467b48Spatrick   }
18309467b48Spatrick 
18409467b48Spatrick protected:
185*d415bd75Srobert   std::optional<MipsABIInfo> ABI;
18609467b48Spatrick   MipsABIFlagsSection ABIFlagsSection;
18709467b48Spatrick 
18809467b48Spatrick   bool GPRInfoSet;
18909467b48Spatrick   unsigned GPRBitMask;
19009467b48Spatrick   int GPROffset;
19109467b48Spatrick 
19209467b48Spatrick   bool FPRInfoSet;
19309467b48Spatrick   unsigned FPRBitMask;
19409467b48Spatrick   int FPROffset;
19509467b48Spatrick 
19609467b48Spatrick   bool FrameInfoSet;
19709467b48Spatrick   int FrameOffset;
19809467b48Spatrick   unsigned FrameReg;
19909467b48Spatrick   unsigned GPReg;
20009467b48Spatrick   unsigned ReturnReg;
20109467b48Spatrick 
20209467b48Spatrick private:
20309467b48Spatrick   bool ModuleDirectiveAllowed;
20409467b48Spatrick };
20509467b48Spatrick 
20609467b48Spatrick // This part is for ascii assembly output
20709467b48Spatrick class MipsTargetAsmStreamer : public MipsTargetStreamer {
20809467b48Spatrick   formatted_raw_ostream &OS;
20909467b48Spatrick 
21009467b48Spatrick public:
21109467b48Spatrick   MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
21209467b48Spatrick   void emitDirectiveSetMicroMips() override;
21309467b48Spatrick   void emitDirectiveSetNoMicroMips() override;
21409467b48Spatrick   void emitDirectiveSetMips16() override;
21509467b48Spatrick   void emitDirectiveSetNoMips16() override;
21609467b48Spatrick 
21709467b48Spatrick   void emitDirectiveSetReorder() override;
21809467b48Spatrick   void emitDirectiveSetNoReorder() override;
21909467b48Spatrick   void emitDirectiveSetMacro() override;
22009467b48Spatrick   void emitDirectiveSetNoMacro() override;
22109467b48Spatrick   void emitDirectiveSetMsa() override;
22209467b48Spatrick   void emitDirectiveSetNoMsa() override;
22309467b48Spatrick   void emitDirectiveSetMt() override;
22409467b48Spatrick   void emitDirectiveSetNoMt() override;
22509467b48Spatrick   void emitDirectiveSetCRC() override;
22609467b48Spatrick   void emitDirectiveSetNoCRC() override;
22709467b48Spatrick   void emitDirectiveSetVirt() override;
22809467b48Spatrick   void emitDirectiveSetNoVirt() override;
22909467b48Spatrick   void emitDirectiveSetGINV() override;
23009467b48Spatrick   void emitDirectiveSetNoGINV() override;
23109467b48Spatrick   void emitDirectiveSetAt() override;
23209467b48Spatrick   void emitDirectiveSetAtWithArg(unsigned RegNo) override;
23309467b48Spatrick   void emitDirectiveSetNoAt() override;
23409467b48Spatrick   void emitDirectiveEnd(StringRef Name) override;
23509467b48Spatrick 
23609467b48Spatrick   void emitDirectiveEnt(const MCSymbol &Symbol) override;
23709467b48Spatrick   void emitDirectiveAbiCalls() override;
23809467b48Spatrick   void emitDirectiveNaN2008() override;
23909467b48Spatrick   void emitDirectiveNaNLegacy() override;
24009467b48Spatrick   void emitDirectiveOptionPic0() override;
24109467b48Spatrick   void emitDirectiveOptionPic2() override;
24209467b48Spatrick   void emitDirectiveInsn() override;
24309467b48Spatrick   void emitFrame(unsigned StackReg, unsigned StackSize,
24409467b48Spatrick                  unsigned ReturnReg) override;
24509467b48Spatrick   void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
24609467b48Spatrick   void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
24709467b48Spatrick 
24809467b48Spatrick   void emitDirectiveSetArch(StringRef Arch) override;
24909467b48Spatrick   void emitDirectiveSetMips0() override;
25009467b48Spatrick   void emitDirectiveSetMips1() override;
25109467b48Spatrick   void emitDirectiveSetMips2() override;
25209467b48Spatrick   void emitDirectiveSetMips3() override;
25309467b48Spatrick   void emitDirectiveSetMips4() override;
25409467b48Spatrick   void emitDirectiveSetMips5() override;
25509467b48Spatrick   void emitDirectiveSetMips32() override;
25609467b48Spatrick   void emitDirectiveSetMips32R2() override;
25709467b48Spatrick   void emitDirectiveSetMips32R3() override;
25809467b48Spatrick   void emitDirectiveSetMips32R5() override;
25909467b48Spatrick   void emitDirectiveSetMips32R6() override;
26009467b48Spatrick   void emitDirectiveSetMips64() override;
26109467b48Spatrick   void emitDirectiveSetMips64R2() override;
26209467b48Spatrick   void emitDirectiveSetMips64R3() override;
26309467b48Spatrick   void emitDirectiveSetMips64R5() override;
26409467b48Spatrick   void emitDirectiveSetMips64R6() override;
26509467b48Spatrick   void emitDirectiveSetDsp() override;
26609467b48Spatrick   void emitDirectiveSetDspr2() override;
26709467b48Spatrick   void emitDirectiveSetNoDsp() override;
268097a140dSpatrick   void emitDirectiveSetMips3D() override;
269097a140dSpatrick   void emitDirectiveSetNoMips3D() override;
27009467b48Spatrick   void emitDirectiveSetPop() override;
27109467b48Spatrick   void emitDirectiveSetPush() override;
27209467b48Spatrick   void emitDirectiveSetSoftFloat() override;
27309467b48Spatrick   void emitDirectiveSetHardFloat() override;
27409467b48Spatrick 
27509467b48Spatrick   // PIC support
276097a140dSpatrick   void emitDirectiveCpAdd(unsigned RegNo) override;
27709467b48Spatrick   void emitDirectiveCpLoad(unsigned RegNo) override;
27809467b48Spatrick   void emitDirectiveCpLocal(unsigned RegNo) override;
27909467b48Spatrick 
28009467b48Spatrick   /// Emit a .cprestore directive.  If the offset is out of range then it will
28109467b48Spatrick   /// be synthesized using the assembler temporary.
28209467b48Spatrick   ///
28309467b48Spatrick   /// GetATReg() is a callback that can be used to obtain the current assembler
28409467b48Spatrick   /// temporary and is only called when the assembler temporary is required. It
28509467b48Spatrick   /// must handle the case where no assembler temporary is available (typically
28609467b48Spatrick   /// by reporting an error).
28709467b48Spatrick   bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,
28809467b48Spatrick                               SMLoc IDLoc, const MCSubtargetInfo *STI) override;
28909467b48Spatrick   void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
29009467b48Spatrick                             const MCSymbol &Sym, bool IsReg) override;
29109467b48Spatrick   void emitDirectiveCpreturn(unsigned SaveLocation,
29209467b48Spatrick                              bool SaveLocationIsRegister) override;
29309467b48Spatrick 
29409467b48Spatrick   // FP abiflags directives
29509467b48Spatrick   void emitDirectiveModuleFP() override;
29609467b48Spatrick   void emitDirectiveModuleOddSPReg() override;
29709467b48Spatrick   void emitDirectiveModuleSoftFloat() override;
29809467b48Spatrick   void emitDirectiveModuleHardFloat() override;
29909467b48Spatrick   void emitDirectiveModuleMT() override;
30009467b48Spatrick   void emitDirectiveModuleCRC() override;
30109467b48Spatrick   void emitDirectiveModuleNoCRC() override;
30209467b48Spatrick   void emitDirectiveModuleVirt() override;
30309467b48Spatrick   void emitDirectiveModuleNoVirt() override;
30409467b48Spatrick   void emitDirectiveModuleGINV() override;
30509467b48Spatrick   void emitDirectiveModuleNoGINV() override;
30609467b48Spatrick   void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;
30709467b48Spatrick   void emitDirectiveSetOddSPReg() override;
30809467b48Spatrick   void emitDirectiveSetNoOddSPReg() override;
30909467b48Spatrick };
31009467b48Spatrick 
31109467b48Spatrick // This part is for ELF object output
31209467b48Spatrick class MipsTargetELFStreamer : public MipsTargetStreamer {
31309467b48Spatrick   bool MicroMipsEnabled;
31409467b48Spatrick   const MCSubtargetInfo &STI;
31509467b48Spatrick   bool Pic;
31609467b48Spatrick 
31709467b48Spatrick public:
isMicroMipsEnabled()31809467b48Spatrick   bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
31909467b48Spatrick   MCELFStreamer &getStreamer();
32009467b48Spatrick   MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
32109467b48Spatrick 
setPic(bool Value)32209467b48Spatrick   void setPic(bool Value) override { Pic = Value; }
32309467b48Spatrick 
32409467b48Spatrick   void emitLabel(MCSymbol *Symbol) override;
32509467b48Spatrick   void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
32609467b48Spatrick   void finish() override;
32709467b48Spatrick 
32809467b48Spatrick   void emitDirectiveSetMicroMips() override;
32909467b48Spatrick   void emitDirectiveSetNoMicroMips() override;
33009467b48Spatrick   void setUsesMicroMips() override;
33109467b48Spatrick   void emitDirectiveSetMips16() override;
33209467b48Spatrick 
33309467b48Spatrick   void emitDirectiveSetNoReorder() override;
33409467b48Spatrick   void emitDirectiveEnd(StringRef Name) override;
33509467b48Spatrick 
33609467b48Spatrick   void emitDirectiveEnt(const MCSymbol &Symbol) override;
33709467b48Spatrick   void emitDirectiveAbiCalls() override;
33809467b48Spatrick   void emitDirectiveNaN2008() override;
33909467b48Spatrick   void emitDirectiveNaNLegacy() override;
34009467b48Spatrick   void emitDirectiveOptionPic0() override;
34109467b48Spatrick   void emitDirectiveOptionPic2() override;
34209467b48Spatrick   void emitDirectiveInsn() override;
34309467b48Spatrick   void emitFrame(unsigned StackReg, unsigned StackSize,
34409467b48Spatrick                  unsigned ReturnReg) override;
34509467b48Spatrick   void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
34609467b48Spatrick   void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
34709467b48Spatrick 
34809467b48Spatrick   // PIC support
349097a140dSpatrick   void emitDirectiveCpAdd(unsigned RegNo) override;
35009467b48Spatrick   void emitDirectiveCpLoad(unsigned RegNo) override;
35109467b48Spatrick   void emitDirectiveCpLocal(unsigned RegNo) override;
35209467b48Spatrick   bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,
35309467b48Spatrick                               SMLoc IDLoc, const MCSubtargetInfo *STI) override;
35409467b48Spatrick   void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
35509467b48Spatrick                             const MCSymbol &Sym, bool IsReg) override;
35609467b48Spatrick   void emitDirectiveCpreturn(unsigned SaveLocation,
35709467b48Spatrick                              bool SaveLocationIsRegister) override;
35809467b48Spatrick 
35909467b48Spatrick   void emitMipsAbiFlags();
36009467b48Spatrick };
36109467b48Spatrick }
36209467b48Spatrick #endif
363