1 //===- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax -*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This class prints an ARM MCInst to a .s file.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H
15 #define LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H
16 
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   void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
27                  const MCSubtargetInfo &STI) override;
28   void printRegName(raw_ostream &OS, unsigned RegNo) const override;
29 
30   // Autogenerated by tblgen.
31   void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI,
32                         raw_ostream &O);
33   virtual bool printAliasInstr(const MCInst *MI, const MCSubtargetInfo &STI,
34                                raw_ostream &O);
35   virtual void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
36                                        unsigned PrintMethodIdx,
37                                        const MCSubtargetInfo &STI,
38                                        raw_ostream &O);
39   static const char *getRegisterName(unsigned RegNo);
40 
41   void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
42                     raw_ostream &O);
43 
44   void printSORegRegOperand(const MCInst *MI, unsigned OpNum,
45                             const MCSubtargetInfo &STI, raw_ostream &O);
46   void printSORegImmOperand(const MCInst *MI, unsigned OpNum,
47                             const MCSubtargetInfo &STI, raw_ostream &O);
48 
49   void printAddrModeTBB(const MCInst *MI, unsigned OpNum,
50                         const MCSubtargetInfo &STI, raw_ostream &O);
51   void printAddrModeTBH(const MCInst *MI, unsigned OpNum,
52                         const MCSubtargetInfo &STI, raw_ostream &O);
53   void printAddrMode2Operand(const MCInst *MI, unsigned OpNum,
54                              const MCSubtargetInfo &STI, raw_ostream &O);
55   void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum,
56                            const MCSubtargetInfo &STI, raw_ostream &O);
57   void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
58                                   const MCSubtargetInfo &STI, raw_ostream &O);
59   void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
60                                    const MCSubtargetInfo &STI, raw_ostream &O);
61   template <bool AlwaysPrintImm0>
62   void printAddrMode3Operand(const MCInst *MI, unsigned OpNum,
63                              const MCSubtargetInfo &STI, raw_ostream &O);
64   void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
65                                    const MCSubtargetInfo &STI, raw_ostream &O);
66   void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
67                                   bool AlwaysPrintImm0);
68   void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
69                                const MCSubtargetInfo &STI, raw_ostream &O);
70   void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
71                               const MCSubtargetInfo &STI, raw_ostream &O);
72   void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
73                                  const MCSubtargetInfo &STI, raw_ostream &O);
74 
75   void printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
76                              const MCSubtargetInfo &STI, raw_ostream &O);
77   template <bool AlwaysPrintImm0>
78   void printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
79                              const MCSubtargetInfo &STI, raw_ostream &O);
80   template <bool AlwaysPrintImm0>
81   void printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum,
82                                  const MCSubtargetInfo &STI, raw_ostream &O);
83   void printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
84                              const MCSubtargetInfo &STI, raw_ostream &O);
85   void printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
86                              const MCSubtargetInfo &STI, raw_ostream &O);
87   void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
88                                    const MCSubtargetInfo &STI, raw_ostream &O);
89 
90   void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
91                                       const MCSubtargetInfo &STI,
92                                       raw_ostream &O);
93   void printMemBOption(const MCInst *MI, unsigned OpNum,
94                        const MCSubtargetInfo &STI, raw_ostream &O);
95   void printInstSyncBOption(const MCInst *MI, unsigned OpNum,
96                             const MCSubtargetInfo &STI, raw_ostream &O);
97   void printTraceSyncBOption(const MCInst *MI, unsigned OpNum,
98                              const MCSubtargetInfo &STI, raw_ostream &O);
99   void printShiftImmOperand(const MCInst *MI, unsigned OpNum,
100                             const MCSubtargetInfo &STI, raw_ostream &O);
101   void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
102                            const MCSubtargetInfo &STI, raw_ostream &O);
103   void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
104                            const MCSubtargetInfo &STI, raw_ostream &O);
105 
106   template <unsigned scale>
107   void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
108                             const MCSubtargetInfo &STI, raw_ostream &O);
109   void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
110                               const MCSubtargetInfo &STI, raw_ostream &O);
111   void printThumbSRImm(const MCInst *MI, unsigned OpNum,
112                        const MCSubtargetInfo &STI, raw_ostream &O);
113   void printThumbITMask(const MCInst *MI, unsigned OpNum,
114                         const MCSubtargetInfo &STI, raw_ostream &O);
115   void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
116                                    const MCSubtargetInfo &STI, raw_ostream &O);
117   void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
118                                       const MCSubtargetInfo &STI,
119                                       raw_ostream &O, unsigned Scale);
120   void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
121                                        const MCSubtargetInfo &STI,
122                                        raw_ostream &O);
123   void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
124                                        const MCSubtargetInfo &STI,
125                                        raw_ostream &O);
126   void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
127                                        const MCSubtargetInfo &STI,
128                                        raw_ostream &O);
129   void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
130                                    const MCSubtargetInfo &STI, raw_ostream &O);
131 
132   void printT2SOOperand(const MCInst *MI, unsigned OpNum,
133                         const MCSubtargetInfo &STI, raw_ostream &O);
134   template <bool AlwaysPrintImm0>
135   void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
136                                  const MCSubtargetInfo &STI, raw_ostream &O);
137   template <bool AlwaysPrintImm0>
138   void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
139                                   const MCSubtargetInfo &STI, raw_ostream &O);
140   template <bool AlwaysPrintImm0>
141   void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
142                                     const MCSubtargetInfo &STI, raw_ostream &O);
143   void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
144                                          const MCSubtargetInfo &STI,
145                                          raw_ostream &O);
146   void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
147                                         const MCSubtargetInfo &STI,
148                                         raw_ostream &O);
149   void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
150                                           const MCSubtargetInfo &STI,
151                                           raw_ostream &O);
152   void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
153                                    const MCSubtargetInfo &STI, raw_ostream &O);
154 
155   void printSetendOperand(const MCInst *MI, unsigned OpNum,
156                           const MCSubtargetInfo &STI, raw_ostream &O);
157   void printCPSIMod(const MCInst *MI, unsigned OpNum,
158                     const MCSubtargetInfo &STI, raw_ostream &O);
159   void printCPSIFlag(const MCInst *MI, unsigned OpNum,
160                      const MCSubtargetInfo &STI, raw_ostream &O);
161   void printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
162                            const MCSubtargetInfo &STI, raw_ostream &O);
163   void printBankedRegOperand(const MCInst *MI, unsigned OpNum,
164                              const MCSubtargetInfo &STI, raw_ostream &O);
165   void printPredicateOperand(const MCInst *MI, unsigned OpNum,
166                              const MCSubtargetInfo &STI, raw_ostream &O);
167   void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
168                                       const MCSubtargetInfo &STI,
169                                       raw_ostream &O);
170   void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
171                                 const MCSubtargetInfo &STI, raw_ostream &O);
172   void printRegisterList(const MCInst *MI, unsigned OpNum,
173                          const MCSubtargetInfo &STI, raw_ostream &O);
174   void printNoHashImmediate(const MCInst *MI, unsigned OpNum,
175                             const MCSubtargetInfo &STI, raw_ostream &O);
176   void printPImmediate(const MCInst *MI, unsigned OpNum,
177                        const MCSubtargetInfo &STI, raw_ostream &O);
178   void printCImmediate(const MCInst *MI, unsigned OpNum,
179                        const MCSubtargetInfo &STI, raw_ostream &O);
180   void printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
181                             const MCSubtargetInfo &STI, raw_ostream &O);
182   void printFPImmOperand(const MCInst *MI, unsigned OpNum,
183                          const MCSubtargetInfo &STI, raw_ostream &O);
184   void printNEONModImmOperand(const MCInst *MI, unsigned OpNum,
185                               const MCSubtargetInfo &STI, raw_ostream &O);
186   void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
187                               const MCSubtargetInfo &STI, raw_ostream &O);
188   void printRotImmOperand(const MCInst *MI, unsigned OpNum,
189                           const MCSubtargetInfo &STI, raw_ostream &O);
190   void printModImmOperand(const MCInst *MI, unsigned OpNum,
191                           const MCSubtargetInfo &STI, raw_ostream &O);
192   void printGPRPairOperand(const MCInst *MI, unsigned OpNum,
193                            const MCSubtargetInfo &STI, raw_ostream &O);
194 
195   void printPCLabel(const MCInst *MI, unsigned OpNum,
196                     const MCSubtargetInfo &STI, raw_ostream &O);
197   void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
198                                  const MCSubtargetInfo &STI, raw_ostream &O);
199   void printFBits16(const MCInst *MI, unsigned OpNum,
200                     const MCSubtargetInfo &STI, raw_ostream &O);
201   void printFBits32(const MCInst *MI, unsigned OpNum,
202                     const MCSubtargetInfo &STI, raw_ostream &O);
203   void printVectorIndex(const MCInst *MI, unsigned OpNum,
204                         const MCSubtargetInfo &STI, raw_ostream &O);
205   void printVectorListOne(const MCInst *MI, unsigned OpNum,
206                           const MCSubtargetInfo &STI, raw_ostream &O);
207   void printVectorListTwo(const MCInst *MI, unsigned OpNum,
208                           const MCSubtargetInfo &STI, raw_ostream &O);
209   void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
210                                 const MCSubtargetInfo &STI, raw_ostream &O);
211   void printVectorListThree(const MCInst *MI, unsigned OpNum,
212                             const MCSubtargetInfo &STI, raw_ostream &O);
213   void printVectorListFour(const MCInst *MI, unsigned OpNum,
214                            const MCSubtargetInfo &STI, raw_ostream &O);
215   void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
216                                   const MCSubtargetInfo &STI, raw_ostream &O);
217   void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
218                                   const MCSubtargetInfo &STI, raw_ostream &O);
219   void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum,
220                                     const MCSubtargetInfo &STI, raw_ostream &O);
221   void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum,
222                                    const MCSubtargetInfo &STI, raw_ostream &O);
223   void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum,
224                                         const MCSubtargetInfo &STI,
225                                         raw_ostream &O);
226   void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum,
227                                           const MCSubtargetInfo &STI,
228                                           raw_ostream &O);
229   void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum,
230                                          const MCSubtargetInfo &STI,
231                                          raw_ostream &O);
232   void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum,
233                                   const MCSubtargetInfo &STI, raw_ostream &O);
234   void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
235                                  const MCSubtargetInfo &STI, raw_ostream &O);
236   template<int64_t Angle, int64_t Remainder>
237   void printComplexRotationOp(const MCInst *MI, unsigned OpNum,
238                               const MCSubtargetInfo &STI, raw_ostream &O);
239 };
240 
241 } // end namespace llvm
242 
243 #endif // LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H
244