• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax -*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This class prints an ARM MCInst to a .s file.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H
14 #define LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H
15 
16 #include "MCTargetDesc/ARMMCTargetDesc.h"
17 #include "llvm/MC/MCInstPrinter.h"
18 
19 namespace llvm {
20 
21 class ARMInstPrinter : public MCInstPrinter {
22 public:
23   ARMInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
24                  const MCRegisterInfo &MRI);
25 
26   bool applyTargetSpecificCLOption(StringRef Opt) override;
27 
28   void printInst(const MCInst *MI, uint64_t Address, StringRef Annot,
29                  const MCSubtargetInfo &STI, raw_ostream &O) override;
30   void printRegName(raw_ostream &OS, unsigned RegNo) const override;
31 
32   // Autogenerated by tblgen.
33   void printInstruction(const MCInst *MI, uint64_t Address,
34                         const MCSubtargetInfo &STI, raw_ostream &O);
35   virtual bool printAliasInstr(const MCInst *MI, const MCSubtargetInfo &STI,
36                                raw_ostream &O);
37   virtual void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
38                                        unsigned PrintMethodIdx,
39                                        const MCSubtargetInfo &STI,
40                                        raw_ostream &O);
41   static const char *getRegisterName(unsigned RegNo,
42                                      unsigned AltIdx = ARM::NoRegAltName);
43 
44   void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
45                     raw_ostream &O);
46 
47   void printSORegRegOperand(const MCInst *MI, unsigned OpNum,
48                             const MCSubtargetInfo &STI, raw_ostream &O);
49   void printSORegImmOperand(const MCInst *MI, unsigned OpNum,
50                             const MCSubtargetInfo &STI, raw_ostream &O);
51 
52   void printAddrModeTBB(const MCInst *MI, unsigned OpNum,
53                         const MCSubtargetInfo &STI, raw_ostream &O);
54   void printAddrModeTBH(const MCInst *MI, unsigned OpNum,
55                         const MCSubtargetInfo &STI, raw_ostream &O);
56   void printAddrMode2Operand(const MCInst *MI, unsigned OpNum,
57                              const MCSubtargetInfo &STI, raw_ostream &O);
58   void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum,
59                            const MCSubtargetInfo &STI, raw_ostream &O);
60   void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
61                                   const MCSubtargetInfo &STI, raw_ostream &O);
62   void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
63                                    const MCSubtargetInfo &STI, raw_ostream &O);
64   template <bool AlwaysPrintImm0>
65   void printAddrMode3Operand(const MCInst *MI, unsigned OpNum,
66                              const MCSubtargetInfo &STI, raw_ostream &O);
67   void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
68                                    const MCSubtargetInfo &STI, raw_ostream &O);
69   void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
70                                   bool AlwaysPrintImm0);
71   void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
72                                const MCSubtargetInfo &STI, raw_ostream &O);
73   void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
74                               const MCSubtargetInfo &STI, raw_ostream &O);
75   void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
76                                  const MCSubtargetInfo &STI, raw_ostream &O);
77 
78   void printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
79                              const MCSubtargetInfo &STI, raw_ostream &O);
80   template <bool AlwaysPrintImm0>
81   void printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
82                              const MCSubtargetInfo &STI, raw_ostream &O);
83   template <bool AlwaysPrintImm0>
84   void printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum,
85                                  const MCSubtargetInfo &STI, raw_ostream &O);
86   void printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
87                              const MCSubtargetInfo &STI, raw_ostream &O);
88   void printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
89                              const MCSubtargetInfo &STI, raw_ostream &O);
90   void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
91                                    const MCSubtargetInfo &STI, raw_ostream &O);
92 
93   void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
94                                       const MCSubtargetInfo &STI,
95                                       raw_ostream &O);
96   void printMemBOption(const MCInst *MI, unsigned OpNum,
97                        const MCSubtargetInfo &STI, raw_ostream &O);
98   void printInstSyncBOption(const MCInst *MI, unsigned OpNum,
99                             const MCSubtargetInfo &STI, raw_ostream &O);
100   void printTraceSyncBOption(const MCInst *MI, unsigned OpNum,
101                              const MCSubtargetInfo &STI, raw_ostream &O);
102   void printShiftImmOperand(const MCInst *MI, unsigned OpNum,
103                             const MCSubtargetInfo &STI, raw_ostream &O);
104   void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
105                            const MCSubtargetInfo &STI, raw_ostream &O);
106   void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
107                            const MCSubtargetInfo &STI, raw_ostream &O);
108 
109   template <unsigned scale>
110   void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
111                             const MCSubtargetInfo &STI, raw_ostream &O);
112   void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
113                               const MCSubtargetInfo &STI, raw_ostream &O);
114   void printThumbSRImm(const MCInst *MI, unsigned OpNum,
115                        const MCSubtargetInfo &STI, raw_ostream &O);
116   void printThumbITMask(const MCInst *MI, unsigned OpNum,
117                         const MCSubtargetInfo &STI, raw_ostream &O);
118   void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
119                                    const MCSubtargetInfo &STI, raw_ostream &O);
120   void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
121                                       const MCSubtargetInfo &STI,
122                                       raw_ostream &O, unsigned Scale);
123   void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
124                                        const MCSubtargetInfo &STI,
125                                        raw_ostream &O);
126   void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
127                                        const MCSubtargetInfo &STI,
128                                        raw_ostream &O);
129   void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
130                                        const MCSubtargetInfo &STI,
131                                        raw_ostream &O);
132   void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
133                                    const MCSubtargetInfo &STI, raw_ostream &O);
134 
135   void printT2SOOperand(const MCInst *MI, unsigned OpNum,
136                         const MCSubtargetInfo &STI, raw_ostream &O);
137   template <bool AlwaysPrintImm0>
138   void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
139                                  const MCSubtargetInfo &STI, raw_ostream &O);
140   template <bool AlwaysPrintImm0>
141   void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
142                                   const MCSubtargetInfo &STI, raw_ostream &O);
143   template <bool AlwaysPrintImm0>
144   void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
145                                     const MCSubtargetInfo &STI, raw_ostream &O);
146   void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
147                                          const MCSubtargetInfo &STI,
148                                          raw_ostream &O);
149   void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
150                                         const MCSubtargetInfo &STI,
151                                         raw_ostream &O);
152   void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
153                                           const MCSubtargetInfo &STI,
154                                           raw_ostream &O);
155   void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
156                                    const MCSubtargetInfo &STI, raw_ostream &O);
157 
158   void printSetendOperand(const MCInst *MI, unsigned OpNum,
159                           const MCSubtargetInfo &STI, raw_ostream &O);
160   void printCPSIMod(const MCInst *MI, unsigned OpNum,
161                     const MCSubtargetInfo &STI, raw_ostream &O);
162   void printCPSIFlag(const MCInst *MI, unsigned OpNum,
163                      const MCSubtargetInfo &STI, raw_ostream &O);
164   void printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
165                            const MCSubtargetInfo &STI, raw_ostream &O);
166   void printBankedRegOperand(const MCInst *MI, unsigned OpNum,
167                              const MCSubtargetInfo &STI, raw_ostream &O);
168   void printPredicateOperand(const MCInst *MI, unsigned OpNum,
169                              const MCSubtargetInfo &STI, raw_ostream &O);
170   void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
171                                       const MCSubtargetInfo &STI,
172                                       raw_ostream &O);
173   void printMandatoryRestrictedPredicateOperand(const MCInst *MI,
174                                                 unsigned OpNum,
175                                                 const MCSubtargetInfo &STI,
176                                                 raw_ostream &O);
177   void printMandatoryInvertedPredicateOperand(const MCInst *MI, unsigned OpNum,
178                                       const MCSubtargetInfo &STI,
179                                       raw_ostream &O);
180   void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
181                                 const MCSubtargetInfo &STI, raw_ostream &O);
182   void printRegisterList(const MCInst *MI, unsigned OpNum,
183                          const MCSubtargetInfo &STI, raw_ostream &O);
184   void printNoHashImmediate(const MCInst *MI, unsigned OpNum,
185                             const MCSubtargetInfo &STI, raw_ostream &O);
186   void printPImmediate(const MCInst *MI, unsigned OpNum,
187                        const MCSubtargetInfo &STI, raw_ostream &O);
188   void printCImmediate(const MCInst *MI, unsigned OpNum,
189                        const MCSubtargetInfo &STI, raw_ostream &O);
190   void printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
191                             const MCSubtargetInfo &STI, raw_ostream &O);
192   void printFPImmOperand(const MCInst *MI, unsigned OpNum,
193                          const MCSubtargetInfo &STI, raw_ostream &O);
194   void printVMOVModImmOperand(const MCInst *MI, unsigned OpNum,
195                               const MCSubtargetInfo &STI, raw_ostream &O);
196   void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
197                               const MCSubtargetInfo &STI, raw_ostream &O);
198   void printRotImmOperand(const MCInst *MI, unsigned OpNum,
199                           const MCSubtargetInfo &STI, raw_ostream &O);
200   void printModImmOperand(const MCInst *MI, unsigned OpNum,
201                           const MCSubtargetInfo &STI, raw_ostream &O);
202   void printGPRPairOperand(const MCInst *MI, unsigned OpNum,
203                            const MCSubtargetInfo &STI, raw_ostream &O);
204 
205   void printPCLabel(const MCInst *MI, unsigned OpNum,
206                     const MCSubtargetInfo &STI, raw_ostream &O);
207   void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
208                                  const MCSubtargetInfo &STI, raw_ostream &O);
209   void printFBits16(const MCInst *MI, unsigned OpNum,
210                     const MCSubtargetInfo &STI, raw_ostream &O);
211   void printFBits32(const MCInst *MI, unsigned OpNum,
212                     const MCSubtargetInfo &STI, raw_ostream &O);
213   void printVectorIndex(const MCInst *MI, unsigned OpNum,
214                         const MCSubtargetInfo &STI, raw_ostream &O);
215   void printVectorListOne(const MCInst *MI, unsigned OpNum,
216                           const MCSubtargetInfo &STI, raw_ostream &O);
217   void printVectorListTwo(const MCInst *MI, unsigned OpNum,
218                           const MCSubtargetInfo &STI, raw_ostream &O);
219   void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
220                                 const MCSubtargetInfo &STI, raw_ostream &O);
221   void printVectorListThree(const MCInst *MI, unsigned OpNum,
222                             const MCSubtargetInfo &STI, raw_ostream &O);
223   void printVectorListFour(const MCInst *MI, unsigned OpNum,
224                            const MCSubtargetInfo &STI, raw_ostream &O);
225   void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
226                                   const MCSubtargetInfo &STI, raw_ostream &O);
227   void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
228                                   const MCSubtargetInfo &STI, raw_ostream &O);
229   void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum,
230                                     const MCSubtargetInfo &STI, raw_ostream &O);
231   void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum,
232                                    const MCSubtargetInfo &STI, raw_ostream &O);
233   void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum,
234                                         const MCSubtargetInfo &STI,
235                                         raw_ostream &O);
236   void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum,
237                                           const MCSubtargetInfo &STI,
238                                           raw_ostream &O);
239   void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum,
240                                          const MCSubtargetInfo &STI,
241                                          raw_ostream &O);
242   void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum,
243                                   const MCSubtargetInfo &STI, raw_ostream &O);
244   void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
245                                  const MCSubtargetInfo &STI, raw_ostream &O);
246   template<unsigned NumRegs>
247   void printMVEVectorList(const MCInst *MI, unsigned OpNum,
248                           const MCSubtargetInfo &STI, raw_ostream &O);
249   template<int64_t Angle, int64_t Remainder>
250   void printComplexRotationOp(const MCInst *MI, unsigned OpNum,
251                               const MCSubtargetInfo &STI, raw_ostream &O);
252   // MVE
253   void printVPTPredicateOperand(const MCInst *MI, unsigned OpNum,
254                                 const MCSubtargetInfo &STI,
255                                 raw_ostream &O);
256   void printVPTMask(const MCInst *MI, unsigned OpNum,
257                     const MCSubtargetInfo &STI, raw_ostream &O);
258   template<int shift>
259   void printMveAddrModeRQOperand(const MCInst *MI, unsigned OpNum,
260                                  const MCSubtargetInfo &STI, raw_ostream &O);
261   void printMveAddrModeQOperand(const MCInst *MI, unsigned OpNum,
262                                 const MCSubtargetInfo &STI, raw_ostream &O);
263   void printExpandedImmOperand(const MCInst *MI, unsigned OpNum,
264                                const MCSubtargetInfo &STI, raw_ostream &O);
265   void printMveSaturateOp(const MCInst *MI, unsigned OpNum,
266                          const MCSubtargetInfo &STI, raw_ostream &O);
267 private:
268   unsigned DefaultAltIdx = ARM::NoRegAltName;
269 };
270 
271 } // end namespace llvm
272 
273 #endif // LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H
274