xref: /aosp_15_r20/external/llvm/lib/Target/AArch64/InstPrinter/AArch64InstPrinter.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- AArch64InstPrinter.h - Convert AArch64 MCInst to assembly syntax --===//
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 // This class prints an AArch64 MCInst to a .s file.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_TARGET_AARCH64_INSTPRINTER_AARCH64INSTPRINTER_H
15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_TARGET_AARCH64_INSTPRINTER_AARCH64INSTPRINTER_H
16*9880d681SAndroid Build Coastguard Worker 
17*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/AArch64MCTargetDesc.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstPrinter.h"
19*9880d681SAndroid Build Coastguard Worker 
20*9880d681SAndroid Build Coastguard Worker namespace llvm {
21*9880d681SAndroid Build Coastguard Worker 
22*9880d681SAndroid Build Coastguard Worker class AArch64InstPrinter : public MCInstPrinter {
23*9880d681SAndroid Build Coastguard Worker public:
24*9880d681SAndroid Build Coastguard Worker   AArch64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
25*9880d681SAndroid Build Coastguard Worker                      const MCRegisterInfo &MRI);
26*9880d681SAndroid Build Coastguard Worker 
27*9880d681SAndroid Build Coastguard Worker   void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
28*9880d681SAndroid Build Coastguard Worker                  const MCSubtargetInfo &STI) override;
29*9880d681SAndroid Build Coastguard Worker   void printRegName(raw_ostream &OS, unsigned RegNo) const override;
30*9880d681SAndroid Build Coastguard Worker 
31*9880d681SAndroid Build Coastguard Worker   // Autogenerated by tblgen.
32*9880d681SAndroid Build Coastguard Worker   virtual void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI,
33*9880d681SAndroid Build Coastguard Worker                                 raw_ostream &O);
34*9880d681SAndroid Build Coastguard Worker   virtual bool printAliasInstr(const MCInst *MI, const MCSubtargetInfo &STI,
35*9880d681SAndroid Build Coastguard Worker                                raw_ostream &O);
36*9880d681SAndroid Build Coastguard Worker   virtual void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
37*9880d681SAndroid Build Coastguard Worker                                        unsigned PrintMethodIdx,
38*9880d681SAndroid Build Coastguard Worker                                        const MCSubtargetInfo &STI,
39*9880d681SAndroid Build Coastguard Worker                                        raw_ostream &O);
getRegName(unsigned RegNo)40*9880d681SAndroid Build Coastguard Worker   virtual StringRef getRegName(unsigned RegNo) const {
41*9880d681SAndroid Build Coastguard Worker     return getRegisterName(RegNo);
42*9880d681SAndroid Build Coastguard Worker   }
43*9880d681SAndroid Build Coastguard Worker   static const char *getRegisterName(unsigned RegNo,
44*9880d681SAndroid Build Coastguard Worker                                      unsigned AltIdx = AArch64::NoRegAltName);
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker protected:
47*9880d681SAndroid Build Coastguard Worker   bool printSysAlias(const MCInst *MI, const MCSubtargetInfo &STI,
48*9880d681SAndroid Build Coastguard Worker                      raw_ostream &O);
49*9880d681SAndroid Build Coastguard Worker   // Operand printers
50*9880d681SAndroid Build Coastguard Worker   void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
51*9880d681SAndroid Build Coastguard Worker                     raw_ostream &O);
52*9880d681SAndroid Build Coastguard Worker   void printImm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
53*9880d681SAndroid Build Coastguard Worker                 raw_ostream &O);
54*9880d681SAndroid Build Coastguard Worker   void printImmHex(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
55*9880d681SAndroid Build Coastguard Worker                    raw_ostream &O);
56*9880d681SAndroid Build Coastguard Worker   void printPostIncOperand(const MCInst *MI, unsigned OpNo, unsigned Imm,
57*9880d681SAndroid Build Coastguard Worker                            raw_ostream &O);
58*9880d681SAndroid Build Coastguard Worker   template <int Amount>
printPostIncOperand(const MCInst * MI,unsigned OpNo,const MCSubtargetInfo & STI,raw_ostream & O)59*9880d681SAndroid Build Coastguard Worker   void printPostIncOperand(const MCInst *MI, unsigned OpNo,
60*9880d681SAndroid Build Coastguard Worker                            const MCSubtargetInfo &STI, raw_ostream &O) {
61*9880d681SAndroid Build Coastguard Worker     printPostIncOperand(MI, OpNo, Amount, O);
62*9880d681SAndroid Build Coastguard Worker   }
63*9880d681SAndroid Build Coastguard Worker 
64*9880d681SAndroid Build Coastguard Worker   void printVRegOperand(const MCInst *MI, unsigned OpNo,
65*9880d681SAndroid Build Coastguard Worker                         const MCSubtargetInfo &STI, raw_ostream &O);
66*9880d681SAndroid Build Coastguard Worker   void printSysCROperand(const MCInst *MI, unsigned OpNo,
67*9880d681SAndroid Build Coastguard Worker                          const MCSubtargetInfo &STI, raw_ostream &O);
68*9880d681SAndroid Build Coastguard Worker   void printAddSubImm(const MCInst *MI, unsigned OpNum,
69*9880d681SAndroid Build Coastguard Worker                       const MCSubtargetInfo &STI, raw_ostream &O);
70*9880d681SAndroid Build Coastguard Worker   void printLogicalImm32(const MCInst *MI, unsigned OpNum,
71*9880d681SAndroid Build Coastguard Worker                          const MCSubtargetInfo &STI, raw_ostream &O);
72*9880d681SAndroid Build Coastguard Worker   void printLogicalImm64(const MCInst *MI, unsigned OpNum,
73*9880d681SAndroid Build Coastguard Worker                          const MCSubtargetInfo &STI, raw_ostream &O);
74*9880d681SAndroid Build Coastguard Worker   void printShifter(const MCInst *MI, unsigned OpNum,
75*9880d681SAndroid Build Coastguard Worker                     const MCSubtargetInfo &STI, raw_ostream &O);
76*9880d681SAndroid Build Coastguard Worker   void printShiftedRegister(const MCInst *MI, unsigned OpNum,
77*9880d681SAndroid Build Coastguard Worker                             const MCSubtargetInfo &STI, raw_ostream &O);
78*9880d681SAndroid Build Coastguard Worker   void printExtendedRegister(const MCInst *MI, unsigned OpNum,
79*9880d681SAndroid Build Coastguard Worker                              const MCSubtargetInfo &STI, raw_ostream &O);
80*9880d681SAndroid Build Coastguard Worker   void printArithExtend(const MCInst *MI, unsigned OpNum,
81*9880d681SAndroid Build Coastguard Worker                         const MCSubtargetInfo &STI, raw_ostream &O);
82*9880d681SAndroid Build Coastguard Worker 
83*9880d681SAndroid Build Coastguard Worker   void printMemExtend(const MCInst *MI, unsigned OpNum, raw_ostream &O,
84*9880d681SAndroid Build Coastguard Worker                       char SrcRegKind, unsigned Width);
85*9880d681SAndroid Build Coastguard Worker   template <char SrcRegKind, unsigned Width>
printMemExtend(const MCInst * MI,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)86*9880d681SAndroid Build Coastguard Worker   void printMemExtend(const MCInst *MI, unsigned OpNum,
87*9880d681SAndroid Build Coastguard Worker                       const MCSubtargetInfo &STI, raw_ostream &O) {
88*9880d681SAndroid Build Coastguard Worker     printMemExtend(MI, OpNum, O, SrcRegKind, Width);
89*9880d681SAndroid Build Coastguard Worker   }
90*9880d681SAndroid Build Coastguard Worker 
91*9880d681SAndroid Build Coastguard Worker   void printCondCode(const MCInst *MI, unsigned OpNum,
92*9880d681SAndroid Build Coastguard Worker                      const MCSubtargetInfo &STI, raw_ostream &O);
93*9880d681SAndroid Build Coastguard Worker   void printInverseCondCode(const MCInst *MI, unsigned OpNum,
94*9880d681SAndroid Build Coastguard Worker                             const MCSubtargetInfo &STI, raw_ostream &O);
95*9880d681SAndroid Build Coastguard Worker   void printAlignedLabel(const MCInst *MI, unsigned OpNum,
96*9880d681SAndroid Build Coastguard Worker                          const MCSubtargetInfo &STI, raw_ostream &O);
97*9880d681SAndroid Build Coastguard Worker   void printUImm12Offset(const MCInst *MI, unsigned OpNum, unsigned Scale,
98*9880d681SAndroid Build Coastguard Worker                          raw_ostream &O);
99*9880d681SAndroid Build Coastguard Worker   void printAMIndexedWB(const MCInst *MI, unsigned OpNum, unsigned Scale,
100*9880d681SAndroid Build Coastguard Worker                         raw_ostream &O);
101*9880d681SAndroid Build Coastguard Worker 
102*9880d681SAndroid Build Coastguard Worker   template <int Scale>
printUImm12Offset(const MCInst * MI,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)103*9880d681SAndroid Build Coastguard Worker   void printUImm12Offset(const MCInst *MI, unsigned OpNum,
104*9880d681SAndroid Build Coastguard Worker                          const MCSubtargetInfo &STI, raw_ostream &O) {
105*9880d681SAndroid Build Coastguard Worker     printUImm12Offset(MI, OpNum, Scale, O);
106*9880d681SAndroid Build Coastguard Worker   }
107*9880d681SAndroid Build Coastguard Worker 
108*9880d681SAndroid Build Coastguard Worker   template <int BitWidth>
printAMIndexedWB(const MCInst * MI,unsigned OpNum,const MCSubtargetInfo & STI,raw_ostream & O)109*9880d681SAndroid Build Coastguard Worker   void printAMIndexedWB(const MCInst *MI, unsigned OpNum,
110*9880d681SAndroid Build Coastguard Worker                         const MCSubtargetInfo &STI, raw_ostream &O) {
111*9880d681SAndroid Build Coastguard Worker     printAMIndexedWB(MI, OpNum, BitWidth / 8, O);
112*9880d681SAndroid Build Coastguard Worker   }
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker   void printAMNoIndex(const MCInst *MI, unsigned OpNum,
115*9880d681SAndroid Build Coastguard Worker                       const MCSubtargetInfo &STI, raw_ostream &O);
116*9880d681SAndroid Build Coastguard Worker 
117*9880d681SAndroid Build Coastguard Worker   template <int Scale>
118*9880d681SAndroid Build Coastguard Worker   void printImmScale(const MCInst *MI, unsigned OpNum,
119*9880d681SAndroid Build Coastguard Worker                      const MCSubtargetInfo &STI, raw_ostream &O);
120*9880d681SAndroid Build Coastguard Worker 
121*9880d681SAndroid Build Coastguard Worker   void printPrefetchOp(const MCInst *MI, unsigned OpNum,
122*9880d681SAndroid Build Coastguard Worker                        const MCSubtargetInfo &STI, raw_ostream &O);
123*9880d681SAndroid Build Coastguard Worker 
124*9880d681SAndroid Build Coastguard Worker   void printPSBHintOp(const MCInst *MI, unsigned OpNum,
125*9880d681SAndroid Build Coastguard Worker                       const MCSubtargetInfo &STI, raw_ostream &O);
126*9880d681SAndroid Build Coastguard Worker 
127*9880d681SAndroid Build Coastguard Worker   void printFPImmOperand(const MCInst *MI, unsigned OpNum,
128*9880d681SAndroid Build Coastguard Worker                          const MCSubtargetInfo &STI, raw_ostream &O);
129*9880d681SAndroid Build Coastguard Worker 
130*9880d681SAndroid Build Coastguard Worker   void printVectorList(const MCInst *MI, unsigned OpNum,
131*9880d681SAndroid Build Coastguard Worker                        const MCSubtargetInfo &STI, raw_ostream &O,
132*9880d681SAndroid Build Coastguard Worker                        StringRef LayoutSuffix);
133*9880d681SAndroid Build Coastguard Worker 
134*9880d681SAndroid Build Coastguard Worker   /// Print a list of vector registers where the type suffix is implicit
135*9880d681SAndroid Build Coastguard Worker   /// (i.e. attached to the instruction rather than the registers).
136*9880d681SAndroid Build Coastguard Worker   void printImplicitlyTypedVectorList(const MCInst *MI, unsigned OpNum,
137*9880d681SAndroid Build Coastguard Worker                                       const MCSubtargetInfo &STI,
138*9880d681SAndroid Build Coastguard Worker                                       raw_ostream &O);
139*9880d681SAndroid Build Coastguard Worker 
140*9880d681SAndroid Build Coastguard Worker   template <unsigned NumLanes, char LaneKind>
141*9880d681SAndroid Build Coastguard Worker   void printTypedVectorList(const MCInst *MI, unsigned OpNum,
142*9880d681SAndroid Build Coastguard Worker                             const MCSubtargetInfo &STI, raw_ostream &O);
143*9880d681SAndroid Build Coastguard Worker 
144*9880d681SAndroid Build Coastguard Worker   void printVectorIndex(const MCInst *MI, unsigned OpNum,
145*9880d681SAndroid Build Coastguard Worker                         const MCSubtargetInfo &STI, raw_ostream &O);
146*9880d681SAndroid Build Coastguard Worker   void printAdrpLabel(const MCInst *MI, unsigned OpNum,
147*9880d681SAndroid Build Coastguard Worker                       const MCSubtargetInfo &STI, raw_ostream &O);
148*9880d681SAndroid Build Coastguard Worker   void printBarrierOption(const MCInst *MI, unsigned OpNum,
149*9880d681SAndroid Build Coastguard Worker                           const MCSubtargetInfo &STI, raw_ostream &O);
150*9880d681SAndroid Build Coastguard Worker   void printMSRSystemRegister(const MCInst *MI, unsigned OpNum,
151*9880d681SAndroid Build Coastguard Worker                               const MCSubtargetInfo &STI, raw_ostream &O);
152*9880d681SAndroid Build Coastguard Worker   void printMRSSystemRegister(const MCInst *MI, unsigned OpNum,
153*9880d681SAndroid Build Coastguard Worker                               const MCSubtargetInfo &STI, raw_ostream &O);
154*9880d681SAndroid Build Coastguard Worker   void printSystemPStateField(const MCInst *MI, unsigned OpNum,
155*9880d681SAndroid Build Coastguard Worker                               const MCSubtargetInfo &STI, raw_ostream &O);
156*9880d681SAndroid Build Coastguard Worker   void printSIMDType10Operand(const MCInst *MI, unsigned OpNum,
157*9880d681SAndroid Build Coastguard Worker                               const MCSubtargetInfo &STI, raw_ostream &O);
158*9880d681SAndroid Build Coastguard Worker   template<unsigned size>
159*9880d681SAndroid Build Coastguard Worker   void printGPRSeqPairsClassOperand(const MCInst *MI, unsigned OpNum,
160*9880d681SAndroid Build Coastguard Worker                                     const MCSubtargetInfo &STI,
161*9880d681SAndroid Build Coastguard Worker                                     raw_ostream &O);
162*9880d681SAndroid Build Coastguard Worker };
163*9880d681SAndroid Build Coastguard Worker 
164*9880d681SAndroid Build Coastguard Worker class AArch64AppleInstPrinter : public AArch64InstPrinter {
165*9880d681SAndroid Build Coastguard Worker public:
166*9880d681SAndroid Build Coastguard Worker   AArch64AppleInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
167*9880d681SAndroid Build Coastguard Worker                           const MCRegisterInfo &MRI);
168*9880d681SAndroid Build Coastguard Worker 
169*9880d681SAndroid Build Coastguard Worker   void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
170*9880d681SAndroid Build Coastguard Worker                  const MCSubtargetInfo &STI) override;
171*9880d681SAndroid Build Coastguard Worker 
172*9880d681SAndroid Build Coastguard Worker   void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI,
173*9880d681SAndroid Build Coastguard Worker                         raw_ostream &O) override;
174*9880d681SAndroid Build Coastguard Worker   bool printAliasInstr(const MCInst *MI, const MCSubtargetInfo &STI,
175*9880d681SAndroid Build Coastguard Worker                        raw_ostream &O) override;
176*9880d681SAndroid Build Coastguard Worker   void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
177*9880d681SAndroid Build Coastguard Worker                                unsigned PrintMethodIdx,
178*9880d681SAndroid Build Coastguard Worker                                const MCSubtargetInfo &STI,
179*9880d681SAndroid Build Coastguard Worker                                raw_ostream &O) override;
getRegName(unsigned RegNo)180*9880d681SAndroid Build Coastguard Worker   StringRef getRegName(unsigned RegNo) const override {
181*9880d681SAndroid Build Coastguard Worker     return getRegisterName(RegNo);
182*9880d681SAndroid Build Coastguard Worker   }
183*9880d681SAndroid Build Coastguard Worker   static const char *getRegisterName(unsigned RegNo,
184*9880d681SAndroid Build Coastguard Worker                                      unsigned AltIdx = AArch64::NoRegAltName);
185*9880d681SAndroid Build Coastguard Worker };
186*9880d681SAndroid Build Coastguard Worker }
187*9880d681SAndroid Build Coastguard Worker 
188*9880d681SAndroid Build Coastguard Worker #endif
189