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
19namespace llvm {
20
21class ARMInstPrinter : public MCInstPrinter {
22public:
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, MCRegister Reg) const override;
31
32 // Autogenerated by tblgen.
33 std::pair<const char *, uint64_t> getMnemonic(const MCInst *MI) override;
34 void printInstruction(const MCInst *MI, uint64_t Address,
35 const MCSubtargetInfo &STI, raw_ostream &O);
36 virtual bool printAliasInstr(const MCInst *MI, uint64_t Address,
37 const MCSubtargetInfo &STI, raw_ostream &O);
38 virtual void printCustomAliasOperand(const MCInst *MI, uint64_t Address,
39 unsigned OpIdx, unsigned PrintMethodIdx,
40 const MCSubtargetInfo &STI,
41 raw_ostream &O);
42 static const char *getRegisterName(MCRegister Reg,
43 unsigned AltIdx = ARM::NoRegAltName);
44
45 void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
46 raw_ostream &O);
47 void printOperand(const MCInst *MI, uint64_t Address, unsigned OpNum,
48 const MCSubtargetInfo &STI, raw_ostream &O);
49
50 void printSORegRegOperand(const MCInst *MI, unsigned OpNum,
51 const MCSubtargetInfo &STI, raw_ostream &O);
52 void printSORegImmOperand(const MCInst *MI, unsigned OpNum,
53 const MCSubtargetInfo &STI, raw_ostream &O);
54
55 void printAddrModeTBB(const MCInst *MI, unsigned OpNum,
56 const MCSubtargetInfo &STI, raw_ostream &O);
57 void printAddrModeTBH(const MCInst *MI, unsigned OpNum,
58 const MCSubtargetInfo &STI, raw_ostream &O);
59 void printAddrMode2Operand(const MCInst *MI, unsigned OpNum,
60 const MCSubtargetInfo &STI, raw_ostream &O);
61 void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum,
62 const MCSubtargetInfo &STI, raw_ostream &O);
63 void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
64 const MCSubtargetInfo &STI, raw_ostream &O);
65 void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
66 const MCSubtargetInfo &STI, raw_ostream &O);
67 template <bool AlwaysPrintImm0>
68 void printAddrMode3Operand(const MCInst *MI, unsigned OpNum,
69 const MCSubtargetInfo &STI, raw_ostream &O);
70 void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
71 const MCSubtargetInfo &STI, raw_ostream &O);
72 void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
73 bool AlwaysPrintImm0);
74 void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
75 const MCSubtargetInfo &STI, raw_ostream &O);
76 void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
77 const MCSubtargetInfo &STI, raw_ostream &O);
78 void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
79 const MCSubtargetInfo &STI, raw_ostream &O);
80
81 void printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
82 const MCSubtargetInfo &STI, raw_ostream &O);
83 template <bool AlwaysPrintImm0>
84 void printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
85 const MCSubtargetInfo &STI, raw_ostream &O);
86 template <bool AlwaysPrintImm0>
87 void printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum,
88 const MCSubtargetInfo &STI, raw_ostream &O);
89 void printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
90 const MCSubtargetInfo &STI, raw_ostream &O);
91 void printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
92 const MCSubtargetInfo &STI, raw_ostream &O);
93 void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
94 const MCSubtargetInfo &STI, raw_ostream &O);
95
96 void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
97 const MCSubtargetInfo &STI,
98 raw_ostream &O);
99 void printMemBOption(const MCInst *MI, unsigned OpNum,
100 const MCSubtargetInfo &STI, raw_ostream &O);
101 void printInstSyncBOption(const MCInst *MI, unsigned OpNum,
102 const MCSubtargetInfo &STI, raw_ostream &O);
103 void printTraceSyncBOption(const MCInst *MI, unsigned OpNum,
104 const MCSubtargetInfo &STI, raw_ostream &O);
105 void printShiftImmOperand(const MCInst *MI, unsigned OpNum,
106 const MCSubtargetInfo &STI, raw_ostream &O);
107 void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
108 const MCSubtargetInfo &STI, raw_ostream &O);
109 void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
110 const MCSubtargetInfo &STI, raw_ostream &O);
111
112 template <unsigned scale>
113 void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
114 const MCSubtargetInfo &STI, raw_ostream &O);
115 template <unsigned scale>
116 void printAdrLabelOperand(const MCInst *MI, uint64_t /*Address*/,
117 unsigned OpNum, const MCSubtargetInfo &STI,
118 raw_ostream &O) {
119 printAdrLabelOperand<scale>(MI, OpNum, STI, O);
120 }
121 void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
122 const MCSubtargetInfo &STI, raw_ostream &O);
123 void printThumbSRImm(const MCInst *MI, unsigned OpNum,
124 const MCSubtargetInfo &STI, raw_ostream &O);
125 void printThumbITMask(const MCInst *MI, unsigned OpNum,
126 const MCSubtargetInfo &STI, raw_ostream &O);
127 void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
128 const MCSubtargetInfo &STI, raw_ostream &O);
129 void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
130 const MCSubtargetInfo &STI,
131 raw_ostream &O, unsigned Scale);
132 void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
133 const MCSubtargetInfo &STI,
134 raw_ostream &O);
135 void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
136 const MCSubtargetInfo &STI,
137 raw_ostream &O);
138 void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
139 const MCSubtargetInfo &STI,
140 raw_ostream &O);
141 void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
142 const MCSubtargetInfo &STI, raw_ostream &O);
143
144 void printT2SOOperand(const MCInst *MI, unsigned OpNum,
145 const MCSubtargetInfo &STI, raw_ostream &O);
146 template <bool AlwaysPrintImm0>
147 void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
148 const MCSubtargetInfo &STI, raw_ostream &O);
149 template <bool AlwaysPrintImm0>
150 void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
151 const MCSubtargetInfo &STI, raw_ostream &O);
152 template <bool AlwaysPrintImm0>
153 void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
154 const MCSubtargetInfo &STI, raw_ostream &O);
155 void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
156 const MCSubtargetInfo &STI,
157 raw_ostream &O);
158 void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
159 const MCSubtargetInfo &STI,
160 raw_ostream &O);
161 void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
162 const MCSubtargetInfo &STI,
163 raw_ostream &O);
164 void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
165 const MCSubtargetInfo &STI, raw_ostream &O);
166
167 void printSetendOperand(const MCInst *MI, unsigned OpNum,
168 const MCSubtargetInfo &STI, raw_ostream &O);
169 void printCPSIMod(const MCInst *MI, unsigned OpNum,
170 const MCSubtargetInfo &STI, raw_ostream &O);
171 void printCPSIFlag(const MCInst *MI, unsigned OpNum,
172 const MCSubtargetInfo &STI, raw_ostream &O);
173 void printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
174 const MCSubtargetInfo &STI, raw_ostream &O);
175 void printBankedRegOperand(const MCInst *MI, unsigned OpNum,
176 const MCSubtargetInfo &STI, raw_ostream &O);
177 void printPredicateOperand(const MCInst *MI, unsigned OpNum,
178 const MCSubtargetInfo &STI, raw_ostream &O);
179 void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
180 const MCSubtargetInfo &STI,
181 raw_ostream &O);
182 void printMandatoryRestrictedPredicateOperand(const MCInst *MI,
183 unsigned OpNum,
184 const MCSubtargetInfo &STI,
185 raw_ostream &O);
186 void printMandatoryInvertedPredicateOperand(const MCInst *MI, unsigned OpNum,
187 const MCSubtargetInfo &STI,
188 raw_ostream &O);
189 void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
190 const MCSubtargetInfo &STI, raw_ostream &O);
191 void printRegisterList(const MCInst *MI, unsigned OpNum,
192 const MCSubtargetInfo &STI, raw_ostream &O);
193 void printNoHashImmediate(const MCInst *MI, unsigned OpNum,
194 const MCSubtargetInfo &STI, raw_ostream &O);
195 void printPImmediate(const MCInst *MI, unsigned OpNum,
196 const MCSubtargetInfo &STI, raw_ostream &O);
197 void printCImmediate(const MCInst *MI, unsigned OpNum,
198 const MCSubtargetInfo &STI, raw_ostream &O);
199 void printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
200 const MCSubtargetInfo &STI, raw_ostream &O);
201 void printFPImmOperand(const MCInst *MI, unsigned OpNum,
202 const MCSubtargetInfo &STI, raw_ostream &O);
203 void printVMOVModImmOperand(const MCInst *MI, unsigned OpNum,
204 const MCSubtargetInfo &STI, raw_ostream &O);
205 void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
206 const MCSubtargetInfo &STI, raw_ostream &O);
207 void printRotImmOperand(const MCInst *MI, unsigned OpNum,
208 const MCSubtargetInfo &STI, raw_ostream &O);
209 void printModImmOperand(const MCInst *MI, unsigned OpNum,
210 const MCSubtargetInfo &STI, raw_ostream &O);
211 void printGPRPairOperand(const MCInst *MI, unsigned OpNum,
212 const MCSubtargetInfo &STI, raw_ostream &O);
213
214 void printPCLabel(const MCInst *MI, unsigned OpNum,
215 const MCSubtargetInfo &STI, raw_ostream &O);
216 void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
217 const MCSubtargetInfo &STI, raw_ostream &O);
218 void printThumbLdrLabelOperand(const MCInst *MI, uint64_t /*Address*/,
219 unsigned OpNum, const MCSubtargetInfo &STI,
220 raw_ostream &O) {
221 printThumbLdrLabelOperand(MI, OpNum, STI, O);
222 }
223 void printFBits16(const MCInst *MI, unsigned OpNum,
224 const MCSubtargetInfo &STI, raw_ostream &O);
225 void printFBits32(const MCInst *MI, unsigned OpNum,
226 const MCSubtargetInfo &STI, raw_ostream &O);
227 void printVectorIndex(const MCInst *MI, unsigned OpNum,
228 const MCSubtargetInfo &STI, raw_ostream &O);
229 void printVectorListOne(const MCInst *MI, unsigned OpNum,
230 const MCSubtargetInfo &STI, raw_ostream &O);
231 void printVectorListTwo(const MCInst *MI, unsigned OpNum,
232 const MCSubtargetInfo &STI, raw_ostream &O);
233 void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
234 const MCSubtargetInfo &STI, raw_ostream &O);
235 void printVectorListThree(const MCInst *MI, unsigned OpNum,
236 const MCSubtargetInfo &STI, raw_ostream &O);
237 void printVectorListFour(const MCInst *MI, unsigned OpNum,
238 const MCSubtargetInfo &STI, raw_ostream &O);
239 void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
240 const MCSubtargetInfo &STI, raw_ostream &O);
241 void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
242 const MCSubtargetInfo &STI, raw_ostream &O);
243 void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum,
244 const MCSubtargetInfo &STI, raw_ostream &O);
245 void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum,
246 const MCSubtargetInfo &STI, raw_ostream &O);
247 void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum,
248 const MCSubtargetInfo &STI,
249 raw_ostream &O);
250 void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum,
251 const MCSubtargetInfo &STI,
252 raw_ostream &O);
253 void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum,
254 const MCSubtargetInfo &STI,
255 raw_ostream &O);
256 void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum,
257 const MCSubtargetInfo &STI, raw_ostream &O);
258 void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
259 const MCSubtargetInfo &STI, raw_ostream &O);
260 template<unsigned NumRegs>
261 void printMVEVectorList(const MCInst *MI, unsigned OpNum,
262 const MCSubtargetInfo &STI, raw_ostream &O);
263 template<int64_t Angle, int64_t Remainder>
264 void printComplexRotationOp(const MCInst *MI, unsigned OpNum,
265 const MCSubtargetInfo &STI, raw_ostream &O);
266 // MVE
267 void printVPTPredicateOperand(const MCInst *MI, unsigned OpNum,
268 const MCSubtargetInfo &STI,
269 raw_ostream &O);
270 void printVPTMask(const MCInst *MI, unsigned OpNum,
271 const MCSubtargetInfo &STI, raw_ostream &O);
272 template<int shift>
273 void printMveAddrModeRQOperand(const MCInst *MI, unsigned OpNum,
274 const MCSubtargetInfo &STI, raw_ostream &O);
275 void printMveSaturateOp(const MCInst *MI, unsigned OpNum,
276 const MCSubtargetInfo &STI, raw_ostream &O);
277private:
278 unsigned DefaultAltIdx = ARM::NoRegAltName;
279};
280
281} // end namespace llvm
282
283#endif // LLVM_LIB_TARGET_ARM_MCTARGETDESC_ARMINSTPRINTER_H
284