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