blob: f550b68cae3fd856c5a1555c414a0f877beb41a1 [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===- ARMInstPrinter.h - Convert ARM MCInst to assembly syntax -*- C++ -*-===//
Chris Lattnera2907782009-10-19 19:56:26 +00002//
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
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H
15#define LLVM_LIB_TARGET_ARM_INSTPRINTER_ARMINSTPRINTER_H
Chris Lattnera2907782009-10-19 19:56:26 +000016
17#include "llvm/MC/MCInstPrinter.h"
18
19namespace llvm {
Bill Wendling00f0cdd2011-03-21 04:13:46 +000020
Chris Lattnera2907782009-10-19 19:56:26 +000021class ARMInstPrinter : public MCInstPrinter {
22public:
Craig Topper54bfde72012-04-02 06:09:36 +000023 ARMInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
Eric Christopher7099d512015-03-30 21:52:28 +000024 const MCRegisterInfo &MRI);
Chris Lattnera2907782009-10-19 19:56:26 +000025
Akira Hatanakab46d0232015-03-27 20:36:02 +000026 void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot,
27 const MCSubtargetInfo &STI) override;
Craig Topper6bc27bf2014-03-10 02:09:33 +000028 void printRegName(raw_ostream &OS, unsigned RegNo) const override;
Chris Lattnerf20f7982010-10-28 21:37:33 +000029
Chris Lattnera2907782009-10-19 19:56:26 +000030 // Autogenerated by tblgen.
Akira Hatanakaee974752015-03-27 23:41:42 +000031 void printInstruction(const MCInst *MI, const MCSubtargetInfo &STI,
32 raw_ostream &O);
Chris Lattnera2907782009-10-19 19:56:26 +000033 static const char *getRegisterName(unsigned RegNo);
34
Akira Hatanakaee974752015-03-27 23:41:42 +000035 void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
36 raw_ostream &O);
Jim Grosbach4e51d0b2010-09-17 21:25:10 +000037
Akira Hatanakaee974752015-03-27 23:41:42 +000038 void printSORegRegOperand(const MCInst *MI, unsigned OpNum,
39 const MCSubtargetInfo &STI, raw_ostream &O);
40 void printSORegImmOperand(const MCInst *MI, unsigned OpNum,
41 const MCSubtargetInfo &STI, raw_ostream &O);
Bruno Cardoso Lopesab830502011-03-31 23:26:08 +000042
Akira Hatanakaee974752015-03-27 23:41:42 +000043 void printAddrModeTBB(const MCInst *MI, unsigned OpNum,
44 const MCSubtargetInfo &STI, raw_ostream &O);
45 void printAddrModeTBH(const MCInst *MI, unsigned OpNum,
46 const MCSubtargetInfo &STI, raw_ostream &O);
47 void printAddrMode2Operand(const MCInst *MI, unsigned OpNum,
48 const MCSubtargetInfo &STI, raw_ostream &O);
49 void printAM2PostIndexOp(const MCInst *MI, unsigned OpNum,
50 const MCSubtargetInfo &STI, raw_ostream &O);
Bruno Cardoso Lopesab830502011-03-31 23:26:08 +000051 void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +000052 const MCSubtargetInfo &STI, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000053 void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +000054 const MCSubtargetInfo &STI, raw_ostream &O);
Quentin Colombetc3132202013-04-12 18:47:25 +000055 template <bool AlwaysPrintImm0>
Akira Hatanakaee974752015-03-27 23:41:42 +000056 void printAddrMode3Operand(const MCInst *MI, unsigned OpNum,
57 const MCSubtargetInfo &STI, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000058 void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +000059 const MCSubtargetInfo &STI, raw_ostream &O);
Quentin Colombetc3132202013-04-12 18:47:25 +000060 void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
61 bool AlwaysPrintImm0);
Jim Grosbachd3595712011-08-03 23:50:40 +000062 void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +000063 const MCSubtargetInfo &STI, raw_ostream &O);
64 void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
65 const MCSubtargetInfo &STI, raw_ostream &O);
Owen Andersonce519032011-08-04 18:24:14 +000066 void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +000067 const MCSubtargetInfo &STI, raw_ostream &O);
Bruno Cardoso Lopesbda36322011-04-04 17:18:19 +000068
Akira Hatanakaee974752015-03-27 23:41:42 +000069 void printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
70 const MCSubtargetInfo &STI, raw_ostream &O);
Quentin Colombetc3132202013-04-12 18:47:25 +000071 template <bool AlwaysPrintImm0>
Akira Hatanakaee974752015-03-27 23:41:42 +000072 void printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
73 const MCSubtargetInfo &STI, raw_ostream &O);
Oliver Stannard65b85382016-01-25 10:26:26 +000074 template <bool AlwaysPrintImm0>
75 void printAddrMode5FP16Operand(const MCInst *MI, unsigned OpNum,
76 const MCSubtargetInfo &STI, raw_ostream &O);
Akira Hatanakaee974752015-03-27 23:41:42 +000077 void printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
78 const MCSubtargetInfo &STI, raw_ostream &O);
79 void printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
80 const MCSubtargetInfo &STI, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +000081 void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +000082 const MCSubtargetInfo &STI, raw_ostream &O);
Johnny Chen9a3e2392010-03-10 18:59:38 +000083
Chris Lattner76c564b2010-04-04 04:47:45 +000084 void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +000085 const MCSubtargetInfo &STI,
Chris Lattner76c564b2010-04-04 04:47:45 +000086 raw_ostream &O);
Akira Hatanakaee974752015-03-27 23:41:42 +000087 void printMemBOption(const MCInst *MI, unsigned OpNum,
88 const MCSubtargetInfo &STI, raw_ostream &O);
89 void printInstSyncBOption(const MCInst *MI, unsigned OpNum,
90 const MCSubtargetInfo &STI, raw_ostream &O);
91 void printShiftImmOperand(const MCInst *MI, unsigned OpNum,
92 const MCSubtargetInfo &STI, raw_ostream &O);
93 void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
94 const MCSubtargetInfo &STI, raw_ostream &O);
95 void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
96 const MCSubtargetInfo &STI, raw_ostream &O);
Evan Chengb1852592009-11-19 06:57:41 +000097
Mihai Popad36cbaa2013-07-03 09:21:44 +000098 template <unsigned scale>
Akira Hatanakaee974752015-03-27 23:41:42 +000099 void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
100 const MCSubtargetInfo &STI, raw_ostream &O);
101 void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
102 const MCSubtargetInfo &STI, raw_ostream &O);
103 void printThumbSRImm(const MCInst *MI, unsigned OpNum,
104 const MCSubtargetInfo &STI, raw_ostream &O);
105 void printThumbITMask(const MCInst *MI, unsigned OpNum,
106 const MCSubtargetInfo &STI, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000107 void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000108 const MCSubtargetInfo &STI, raw_ostream &O);
Bill Wendling092a7bd2010-12-14 03:36:38 +0000109 void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000110 const MCSubtargetInfo &STI,
Bill Wendling092a7bd2010-12-14 03:36:38 +0000111 raw_ostream &O, unsigned Scale);
112 void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000113 const MCSubtargetInfo &STI,
Bill Wendling092a7bd2010-12-14 03:36:38 +0000114 raw_ostream &O);
115 void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000116 const MCSubtargetInfo &STI,
Bill Wendling092a7bd2010-12-14 03:36:38 +0000117 raw_ostream &O);
118 void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000119 const MCSubtargetInfo &STI,
Bill Wendling092a7bd2010-12-14 03:36:38 +0000120 raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000121 void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000122 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbach4e51d0b2010-09-17 21:25:10 +0000123
Akira Hatanakaee974752015-03-27 23:41:42 +0000124 void printT2SOOperand(const MCInst *MI, unsigned OpNum,
125 const MCSubtargetInfo &STI, raw_ostream &O);
Akira Hatanakacfa1f612015-03-27 23:24:22 +0000126 template <bool AlwaysPrintImm0>
Jim Grosbache6fe1a02010-10-25 20:00:01 +0000127 void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000128 const MCSubtargetInfo &STI, raw_ostream &O);
Akira Hatanakacfa1f612015-03-27 23:24:22 +0000129 template <bool AlwaysPrintImm0>
Chris Lattner76c564b2010-04-04 04:47:45 +0000130 void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000131 const MCSubtargetInfo &STI, raw_ostream &O);
Akira Hatanakacfa1f612015-03-27 23:24:22 +0000132 template <bool AlwaysPrintImm0>
Chris Lattner76c564b2010-04-04 04:47:45 +0000133 void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000134 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbacha05627e2011-09-09 18:37:27 +0000135 void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000136 const MCSubtargetInfo &STI,
Akira Hatanakacfa1f612015-03-27 23:24:22 +0000137 raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000138 void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000139 const MCSubtargetInfo &STI,
Chris Lattner76c564b2010-04-04 04:47:45 +0000140 raw_ostream &O);
141 void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000142 const MCSubtargetInfo &STI,
Chris Lattner76c564b2010-04-04 04:47:45 +0000143 raw_ostream &O);
144 void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000145 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbach4e51d0b2010-09-17 21:25:10 +0000146
Akira Hatanakaee974752015-03-27 23:41:42 +0000147 void printSetendOperand(const MCInst *MI, unsigned OpNum,
148 const MCSubtargetInfo &STI, raw_ostream &O);
149 void printCPSIMod(const MCInst *MI, unsigned OpNum,
150 const MCSubtargetInfo &STI, raw_ostream &O);
151 void printCPSIFlag(const MCInst *MI, unsigned OpNum,
152 const MCSubtargetInfo &STI, raw_ostream &O);
153 void printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
154 const MCSubtargetInfo &STI, raw_ostream &O);
155 void printBankedRegOperand(const MCInst *MI, unsigned OpNum,
156 const MCSubtargetInfo &STI, raw_ostream &O);
157 void printPredicateOperand(const MCInst *MI, unsigned OpNum,
158 const MCSubtargetInfo &STI, raw_ostream &O);
Chris Lattner76c564b2010-04-04 04:47:45 +0000159 void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000160 const MCSubtargetInfo &STI,
Chris Lattner76c564b2010-04-04 04:47:45 +0000161 raw_ostream &O);
162 void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000163 const MCSubtargetInfo &STI, raw_ostream &O);
164 void printRegisterList(const MCInst *MI, unsigned OpNum,
165 const MCSubtargetInfo &STI, raw_ostream &O);
166 void printNoHashImmediate(const MCInst *MI, unsigned OpNum,
167 const MCSubtargetInfo &STI, raw_ostream &O);
168 void printPImmediate(const MCInst *MI, unsigned OpNum,
169 const MCSubtargetInfo &STI, raw_ostream &O);
170 void printCImmediate(const MCInst *MI, unsigned OpNum,
171 const MCSubtargetInfo &STI, raw_ostream &O);
172 void printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
173 const MCSubtargetInfo &STI, raw_ostream &O);
174 void printFPImmOperand(const MCInst *MI, unsigned OpNum,
175 const MCSubtargetInfo &STI, raw_ostream &O);
176 void printNEONModImmOperand(const MCInst *MI, unsigned OpNum,
177 const MCSubtargetInfo &STI, raw_ostream &O);
178 void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
179 const MCSubtargetInfo &STI, raw_ostream &O);
180 void printRotImmOperand(const MCInst *MI, unsigned OpNum,
181 const MCSubtargetInfo &STI, raw_ostream &O);
182 void printModImmOperand(const MCInst *MI, unsigned OpNum,
183 const MCSubtargetInfo &STI, raw_ostream &O);
184 void printGPRPairOperand(const MCInst *MI, unsigned OpNum,
185 const MCSubtargetInfo &STI, raw_ostream &O);
Chris Lattneradd57492009-10-19 22:23:04 +0000186
Akira Hatanakaee974752015-03-27 23:41:42 +0000187 void printPCLabel(const MCInst *MI, unsigned OpNum,
188 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbach4739f2e2012-10-30 01:04:51 +0000189 void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000190 const MCSubtargetInfo &STI, raw_ostream &O);
191 void printFBits16(const MCInst *MI, unsigned OpNum,
192 const MCSubtargetInfo &STI, raw_ostream &O);
193 void printFBits32(const MCInst *MI, unsigned OpNum,
194 const MCSubtargetInfo &STI, raw_ostream &O);
195 void printVectorIndex(const MCInst *MI, unsigned OpNum,
196 const MCSubtargetInfo &STI, raw_ostream &O);
197 void printVectorListOne(const MCInst *MI, unsigned OpNum,
198 const MCSubtargetInfo &STI, raw_ostream &O);
199 void printVectorListTwo(const MCInst *MI, unsigned OpNum,
200 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbach13a292c2012-03-06 22:01:44 +0000201 void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000202 const MCSubtargetInfo &STI, raw_ostream &O);
203 void printVectorListThree(const MCInst *MI, unsigned OpNum,
204 const MCSubtargetInfo &STI, raw_ostream &O);
205 void printVectorListFour(const MCInst *MI, unsigned OpNum,
206 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbachcd6f5e72011-11-30 01:09:44 +0000207 void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000208 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbach3ecf9762011-11-30 18:21:25 +0000209 void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000210 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbachb78403c2012-01-24 23:47:04 +0000211 void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000212 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbach086cbfa2012-01-25 00:01:08 +0000213 void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000214 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbachc5af54e2011-12-21 00:38:54 +0000215 void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000216 const MCSubtargetInfo &STI,
Jim Grosbachc5af54e2011-12-21 00:38:54 +0000217 raw_ostream &O);
Jim Grosbachb78403c2012-01-24 23:47:04 +0000218 void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000219 const MCSubtargetInfo &STI,
Jim Grosbachb78403c2012-01-24 23:47:04 +0000220 raw_ostream &O);
Jim Grosbach086cbfa2012-01-25 00:01:08 +0000221 void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000222 const MCSubtargetInfo &STI,
Jim Grosbach086cbfa2012-01-25 00:01:08 +0000223 raw_ostream &O);
Jim Grosbachac2af3f2012-01-23 23:20:46 +0000224 void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000225 const MCSubtargetInfo &STI, raw_ostream &O);
Jim Grosbached561fc2012-01-24 00:43:17 +0000226 void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
Akira Hatanakaee974752015-03-27 23:41:42 +0000227 const MCSubtargetInfo &STI, raw_ostream &O);
Chris Lattnera2907782009-10-19 19:56:26 +0000228};
Jim Grosbach4e51d0b2010-09-17 21:25:10 +0000229
Chris Lattnera76eab42010-11-14 19:40:38 +0000230} // end namespace llvm
Chris Lattnera2907782009-10-19 19:56:26 +0000231
232#endif