xref: /aosp_15_r20/external/llvm/lib/Target/Mips/MipsAsmPrinter.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Mips Assembly printer class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker #include "Mips16HardFloatInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "MipsMCInstLower.h"
19*9880d681SAndroid Build Coastguard Worker #include "MipsMachineFunction.h"
20*9880d681SAndroid Build Coastguard Worker #include "MipsSubtarget.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/AsmPrinter.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Compiler.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/Target/TargetMachine.h"
24*9880d681SAndroid Build Coastguard Worker 
25*9880d681SAndroid Build Coastguard Worker namespace llvm {
26*9880d681SAndroid Build Coastguard Worker class MCStreamer;
27*9880d681SAndroid Build Coastguard Worker class MachineInstr;
28*9880d681SAndroid Build Coastguard Worker class MachineBasicBlock;
29*9880d681SAndroid Build Coastguard Worker class MipsTargetStreamer;
30*9880d681SAndroid Build Coastguard Worker class Module;
31*9880d681SAndroid Build Coastguard Worker class raw_ostream;
32*9880d681SAndroid Build Coastguard Worker 
33*9880d681SAndroid Build Coastguard Worker class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
34*9880d681SAndroid Build Coastguard Worker   MipsTargetStreamer &getTargetStreamer() const;
35*9880d681SAndroid Build Coastguard Worker 
36*9880d681SAndroid Build Coastguard Worker   void EmitInstrWithMacroNoAT(const MachineInstr *MI);
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker private:
39*9880d681SAndroid Build Coastguard Worker   // tblgen'erated function.
40*9880d681SAndroid Build Coastguard Worker   bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
41*9880d681SAndroid Build Coastguard Worker                                    const MachineInstr *MI);
42*9880d681SAndroid Build Coastguard Worker 
43*9880d681SAndroid Build Coastguard Worker   // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
44*9880d681SAndroid Build Coastguard Worker   // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
45*9880d681SAndroid Build Coastguard Worker   // for the target.
46*9880d681SAndroid Build Coastguard Worker   void emitPseudoIndirectBranch(MCStreamer &OutStreamer,
47*9880d681SAndroid Build Coastguard Worker                                 const MachineInstr *MI);
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker   // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
50*9880d681SAndroid Build Coastguard Worker   bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
51*9880d681SAndroid Build Coastguard Worker 
52*9880d681SAndroid Build Coastguard Worker   /// MCP - Keep a pointer to constantpool entries of the current
53*9880d681SAndroid Build Coastguard Worker   /// MachineFunction.
54*9880d681SAndroid Build Coastguard Worker   const MachineConstantPool *MCP;
55*9880d681SAndroid Build Coastguard Worker 
56*9880d681SAndroid Build Coastguard Worker   /// InConstantPool - Maintain state when emitting a sequence of constant
57*9880d681SAndroid Build Coastguard Worker   /// pool entries so we can properly mark them as data regions.
58*9880d681SAndroid Build Coastguard Worker   bool InConstantPool;
59*9880d681SAndroid Build Coastguard Worker 
60*9880d681SAndroid Build Coastguard Worker   std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *>
61*9880d681SAndroid Build Coastguard Worker   StubsNeeded;
62*9880d681SAndroid Build Coastguard Worker 
63*9880d681SAndroid Build Coastguard Worker   void emitInlineAsmStart() const override;
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker   void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
66*9880d681SAndroid Build Coastguard Worker                         const MCSubtargetInfo *EndInfo) const override;
67*9880d681SAndroid Build Coastguard Worker 
68*9880d681SAndroid Build Coastguard Worker   void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol);
69*9880d681SAndroid Build Coastguard Worker 
70*9880d681SAndroid Build Coastguard Worker   void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg);
71*9880d681SAndroid Build Coastguard Worker 
72*9880d681SAndroid Build Coastguard Worker   void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
73*9880d681SAndroid Build Coastguard Worker                        unsigned Reg1, unsigned Reg2);
74*9880d681SAndroid Build Coastguard Worker 
75*9880d681SAndroid Build Coastguard Worker   void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
76*9880d681SAndroid Build Coastguard Worker                           unsigned Reg1, unsigned Reg2, unsigned Reg3);
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker   void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc,
79*9880d681SAndroid Build Coastguard Worker                         unsigned Reg1, unsigned Reg2, unsigned FPReg1,
80*9880d681SAndroid Build Coastguard Worker                         unsigned FPReg2, bool LE);
81*9880d681SAndroid Build Coastguard Worker 
82*9880d681SAndroid Build Coastguard Worker   void EmitSwapFPIntParams(const MCSubtargetInfo &STI,
83*9880d681SAndroid Build Coastguard Worker                            Mips16HardFloatInfo::FPParamVariant, bool LE,
84*9880d681SAndroid Build Coastguard Worker                            bool ToFP);
85*9880d681SAndroid Build Coastguard Worker 
86*9880d681SAndroid Build Coastguard Worker   void EmitSwapFPIntRetval(const MCSubtargetInfo &STI,
87*9880d681SAndroid Build Coastguard Worker                            Mips16HardFloatInfo::FPReturnVariant, bool LE);
88*9880d681SAndroid Build Coastguard Worker 
89*9880d681SAndroid Build Coastguard Worker   void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker   void NaClAlignIndirectJumpTargets(MachineFunction &MF);
92*9880d681SAndroid Build Coastguard Worker 
93*9880d681SAndroid Build Coastguard Worker   bool isLongBranchPseudo(int Opcode) const;
94*9880d681SAndroid Build Coastguard Worker 
95*9880d681SAndroid Build Coastguard Worker public:
96*9880d681SAndroid Build Coastguard Worker 
97*9880d681SAndroid Build Coastguard Worker   const MipsSubtarget *Subtarget;
98*9880d681SAndroid Build Coastguard Worker   const MipsFunctionInfo *MipsFI;
99*9880d681SAndroid Build Coastguard Worker   MipsMCInstLower MCInstLowering;
100*9880d681SAndroid Build Coastguard Worker 
MipsAsmPrinter(TargetMachine & TM,std::unique_ptr<MCStreamer> Streamer)101*9880d681SAndroid Build Coastguard Worker   explicit MipsAsmPrinter(TargetMachine &TM,
102*9880d681SAndroid Build Coastguard Worker                           std::unique_ptr<MCStreamer> Streamer)
103*9880d681SAndroid Build Coastguard Worker       : AsmPrinter(TM, std::move(Streamer)), MCP(nullptr),
104*9880d681SAndroid Build Coastguard Worker         InConstantPool(false), MCInstLowering(*this) {}
105*9880d681SAndroid Build Coastguard Worker 
getPassName()106*9880d681SAndroid Build Coastguard Worker   const char *getPassName() const override {
107*9880d681SAndroid Build Coastguard Worker     return "Mips Assembly Printer";
108*9880d681SAndroid Build Coastguard Worker   }
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker   bool runOnMachineFunction(MachineFunction &MF) override;
111*9880d681SAndroid Build Coastguard Worker 
EmitConstantPool()112*9880d681SAndroid Build Coastguard Worker   void EmitConstantPool() override {
113*9880d681SAndroid Build Coastguard Worker     bool UsingConstantPools =
114*9880d681SAndroid Build Coastguard Worker       (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
115*9880d681SAndroid Build Coastguard Worker     if (!UsingConstantPools)
116*9880d681SAndroid Build Coastguard Worker       AsmPrinter::EmitConstantPool();
117*9880d681SAndroid Build Coastguard Worker     // we emit constant pools customly!
118*9880d681SAndroid Build Coastguard Worker   }
119*9880d681SAndroid Build Coastguard Worker 
120*9880d681SAndroid Build Coastguard Worker   void EmitInstruction(const MachineInstr *MI) override;
121*9880d681SAndroid Build Coastguard Worker   void printSavedRegsBitmask();
122*9880d681SAndroid Build Coastguard Worker   void emitFrameDirective();
123*9880d681SAndroid Build Coastguard Worker   const char *getCurrentABIString() const;
124*9880d681SAndroid Build Coastguard Worker   void EmitFunctionEntryLabel() override;
125*9880d681SAndroid Build Coastguard Worker   void EmitFunctionBodyStart() override;
126*9880d681SAndroid Build Coastguard Worker   void EmitFunctionBodyEnd() override;
127*9880d681SAndroid Build Coastguard Worker   void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override;
128*9880d681SAndroid Build Coastguard Worker   bool isBlockOnlyReachableByFallthrough(
129*9880d681SAndroid Build Coastguard Worker                                    const MachineBasicBlock* MBB) const override;
130*9880d681SAndroid Build Coastguard Worker   bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
131*9880d681SAndroid Build Coastguard Worker                        unsigned AsmVariant, const char *ExtraCode,
132*9880d681SAndroid Build Coastguard Worker                        raw_ostream &O) override;
133*9880d681SAndroid Build Coastguard Worker   bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
134*9880d681SAndroid Build Coastguard Worker                              unsigned AsmVariant, const char *ExtraCode,
135*9880d681SAndroid Build Coastguard Worker                              raw_ostream &O) override;
136*9880d681SAndroid Build Coastguard Worker   void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
137*9880d681SAndroid Build Coastguard Worker   void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
138*9880d681SAndroid Build Coastguard Worker   void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
139*9880d681SAndroid Build Coastguard Worker   void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
140*9880d681SAndroid Build Coastguard Worker                        const char *Modifier = nullptr);
141*9880d681SAndroid Build Coastguard Worker   void printRegisterList(const MachineInstr *MI, int opNum, raw_ostream &O);
142*9880d681SAndroid Build Coastguard Worker   void EmitStartOfAsmFile(Module &M) override;
143*9880d681SAndroid Build Coastguard Worker   void EmitEndOfAsmFile(Module &M) override;
144*9880d681SAndroid Build Coastguard Worker   void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
145*9880d681SAndroid Build Coastguard Worker };
146*9880d681SAndroid Build Coastguard Worker }
147*9880d681SAndroid Build Coastguard Worker 
148*9880d681SAndroid Build Coastguard Worker #endif
149*9880d681SAndroid Build Coastguard Worker 
150