Adds bogus conditional branch after all relaxed loads
[oota-llvm.git] / lib / Target / ARM / InstPrinter / ARMInstPrinter.h
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   static const char *getRegisterName(unsigned RegNo);
34
35   void printOperand(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI,
36                     raw_ostream &O);
37
38   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);
42
43   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);
51   void printAM2PreOrOffsetIndexOp(const MCInst *MI, unsigned OpNum,
52                                   const MCSubtargetInfo &STI, raw_ostream &O);
53   void printAddrMode2OffsetOperand(const MCInst *MI, unsigned OpNum,
54                                    const MCSubtargetInfo &STI, raw_ostream &O);
55   template <bool AlwaysPrintImm0>
56   void printAddrMode3Operand(const MCInst *MI, unsigned OpNum,
57                              const MCSubtargetInfo &STI, raw_ostream &O);
58   void printAddrMode3OffsetOperand(const MCInst *MI, unsigned OpNum,
59                                    const MCSubtargetInfo &STI, raw_ostream &O);
60   void printAM3PreOrOffsetIndexOp(const MCInst *MI, unsigned Op, raw_ostream &O,
61                                   bool AlwaysPrintImm0);
62   void printPostIdxImm8Operand(const MCInst *MI, unsigned OpNum,
63                                const MCSubtargetInfo &STI, raw_ostream &O);
64   void printPostIdxRegOperand(const MCInst *MI, unsigned OpNum,
65                               const MCSubtargetInfo &STI, raw_ostream &O);
66   void printPostIdxImm8s4Operand(const MCInst *MI, unsigned OpNum,
67                                  const MCSubtargetInfo &STI, raw_ostream &O);
68
69   void printLdStmModeOperand(const MCInst *MI, unsigned OpNum,
70                              const MCSubtargetInfo &STI, raw_ostream &O);
71   template <bool AlwaysPrintImm0>
72   void printAddrMode5Operand(const MCInst *MI, unsigned OpNum,
73                              const MCSubtargetInfo &STI, raw_ostream &O);
74   void printAddrMode6Operand(const MCInst *MI, unsigned OpNum,
75                              const MCSubtargetInfo &STI, raw_ostream &O);
76   void printAddrMode7Operand(const MCInst *MI, unsigned OpNum,
77                              const MCSubtargetInfo &STI, raw_ostream &O);
78   void printAddrMode6OffsetOperand(const MCInst *MI, unsigned OpNum,
79                                    const MCSubtargetInfo &STI, raw_ostream &O);
80
81   void printBitfieldInvMaskImmOperand(const MCInst *MI, unsigned OpNum,
82                                       const MCSubtargetInfo &STI,
83                                       raw_ostream &O);
84   void printMemBOption(const MCInst *MI, unsigned OpNum,
85                        const MCSubtargetInfo &STI, raw_ostream &O);
86   void printInstSyncBOption(const MCInst *MI, unsigned OpNum,
87                             const MCSubtargetInfo &STI, raw_ostream &O);
88   void printShiftImmOperand(const MCInst *MI, unsigned OpNum,
89                             const MCSubtargetInfo &STI, raw_ostream &O);
90   void printPKHLSLShiftImm(const MCInst *MI, unsigned OpNum,
91                            const MCSubtargetInfo &STI, raw_ostream &O);
92   void printPKHASRShiftImm(const MCInst *MI, unsigned OpNum,
93                            const MCSubtargetInfo &STI, raw_ostream &O);
94
95   template <unsigned scale>
96   void printAdrLabelOperand(const MCInst *MI, unsigned OpNum,
97                             const MCSubtargetInfo &STI, raw_ostream &O);
98   void printThumbS4ImmOperand(const MCInst *MI, unsigned OpNum,
99                               const MCSubtargetInfo &STI, raw_ostream &O);
100   void printThumbSRImm(const MCInst *MI, unsigned OpNum,
101                        const MCSubtargetInfo &STI, raw_ostream &O);
102   void printThumbITMask(const MCInst *MI, unsigned OpNum,
103                         const MCSubtargetInfo &STI, raw_ostream &O);
104   void printThumbAddrModeRROperand(const MCInst *MI, unsigned OpNum,
105                                    const MCSubtargetInfo &STI, raw_ostream &O);
106   void printThumbAddrModeImm5SOperand(const MCInst *MI, unsigned OpNum,
107                                       const MCSubtargetInfo &STI,
108                                       raw_ostream &O, unsigned Scale);
109   void printThumbAddrModeImm5S1Operand(const MCInst *MI, unsigned OpNum,
110                                        const MCSubtargetInfo &STI,
111                                        raw_ostream &O);
112   void printThumbAddrModeImm5S2Operand(const MCInst *MI, unsigned OpNum,
113                                        const MCSubtargetInfo &STI,
114                                        raw_ostream &O);
115   void printThumbAddrModeImm5S4Operand(const MCInst *MI, unsigned OpNum,
116                                        const MCSubtargetInfo &STI,
117                                        raw_ostream &O);
118   void printThumbAddrModeSPOperand(const MCInst *MI, unsigned OpNum,
119                                    const MCSubtargetInfo &STI, raw_ostream &O);
120
121   void printT2SOOperand(const MCInst *MI, unsigned OpNum,
122                         const MCSubtargetInfo &STI, raw_ostream &O);
123   template <bool AlwaysPrintImm0>
124   void printAddrModeImm12Operand(const MCInst *MI, unsigned OpNum,
125                                  const MCSubtargetInfo &STI, raw_ostream &O);
126   template <bool AlwaysPrintImm0>
127   void printT2AddrModeImm8Operand(const MCInst *MI, unsigned OpNum,
128                                   const MCSubtargetInfo &STI, raw_ostream &O);
129   template <bool AlwaysPrintImm0>
130   void printT2AddrModeImm8s4Operand(const MCInst *MI, unsigned OpNum,
131                                     const MCSubtargetInfo &STI, raw_ostream &O);
132   void printT2AddrModeImm0_1020s4Operand(const MCInst *MI, unsigned OpNum,
133                                          const MCSubtargetInfo &STI,
134                                          raw_ostream &O);
135   void printT2AddrModeImm8OffsetOperand(const MCInst *MI, unsigned OpNum,
136                                         const MCSubtargetInfo &STI,
137                                         raw_ostream &O);
138   void printT2AddrModeImm8s4OffsetOperand(const MCInst *MI, unsigned OpNum,
139                                           const MCSubtargetInfo &STI,
140                                           raw_ostream &O);
141   void printT2AddrModeSoRegOperand(const MCInst *MI, unsigned OpNum,
142                                    const MCSubtargetInfo &STI, raw_ostream &O);
143
144   void printSetendOperand(const MCInst *MI, unsigned OpNum,
145                           const MCSubtargetInfo &STI, raw_ostream &O);
146   void printCPSIMod(const MCInst *MI, unsigned OpNum,
147                     const MCSubtargetInfo &STI, raw_ostream &O);
148   void printCPSIFlag(const MCInst *MI, unsigned OpNum,
149                      const MCSubtargetInfo &STI, raw_ostream &O);
150   void printMSRMaskOperand(const MCInst *MI, unsigned OpNum,
151                            const MCSubtargetInfo &STI, raw_ostream &O);
152   void printBankedRegOperand(const MCInst *MI, unsigned OpNum,
153                              const MCSubtargetInfo &STI, raw_ostream &O);
154   void printPredicateOperand(const MCInst *MI, unsigned OpNum,
155                              const MCSubtargetInfo &STI, raw_ostream &O);
156   void printMandatoryPredicateOperand(const MCInst *MI, unsigned OpNum,
157                                       const MCSubtargetInfo &STI,
158                                       raw_ostream &O);
159   void printSBitModifierOperand(const MCInst *MI, unsigned OpNum,
160                                 const MCSubtargetInfo &STI, raw_ostream &O);
161   void printRegisterList(const MCInst *MI, unsigned OpNum,
162                          const MCSubtargetInfo &STI, raw_ostream &O);
163   void printNoHashImmediate(const MCInst *MI, unsigned OpNum,
164                             const MCSubtargetInfo &STI, raw_ostream &O);
165   void printPImmediate(const MCInst *MI, unsigned OpNum,
166                        const MCSubtargetInfo &STI, raw_ostream &O);
167   void printCImmediate(const MCInst *MI, unsigned OpNum,
168                        const MCSubtargetInfo &STI, raw_ostream &O);
169   void printCoprocOptionImm(const MCInst *MI, unsigned OpNum,
170                             const MCSubtargetInfo &STI, raw_ostream &O);
171   void printFPImmOperand(const MCInst *MI, unsigned OpNum,
172                          const MCSubtargetInfo &STI, raw_ostream &O);
173   void printNEONModImmOperand(const MCInst *MI, unsigned OpNum,
174                               const MCSubtargetInfo &STI, raw_ostream &O);
175   void printImmPlusOneOperand(const MCInst *MI, unsigned OpNum,
176                               const MCSubtargetInfo &STI, raw_ostream &O);
177   void printRotImmOperand(const MCInst *MI, unsigned OpNum,
178                           const MCSubtargetInfo &STI, raw_ostream &O);
179   void printModImmOperand(const MCInst *MI, unsigned OpNum,
180                           const MCSubtargetInfo &STI, raw_ostream &O);
181   void printGPRPairOperand(const MCInst *MI, unsigned OpNum,
182                            const MCSubtargetInfo &STI, raw_ostream &O);
183
184   void printPCLabel(const MCInst *MI, unsigned OpNum,
185                     const MCSubtargetInfo &STI, raw_ostream &O);
186   void printThumbLdrLabelOperand(const MCInst *MI, unsigned OpNum,
187                                  const MCSubtargetInfo &STI, raw_ostream &O);
188   void printFBits16(const MCInst *MI, unsigned OpNum,
189                     const MCSubtargetInfo &STI, raw_ostream &O);
190   void printFBits32(const MCInst *MI, unsigned OpNum,
191                     const MCSubtargetInfo &STI, raw_ostream &O);
192   void printVectorIndex(const MCInst *MI, unsigned OpNum,
193                         const MCSubtargetInfo &STI, raw_ostream &O);
194   void printVectorListOne(const MCInst *MI, unsigned OpNum,
195                           const MCSubtargetInfo &STI, raw_ostream &O);
196   void printVectorListTwo(const MCInst *MI, unsigned OpNum,
197                           const MCSubtargetInfo &STI, raw_ostream &O);
198   void printVectorListTwoSpaced(const MCInst *MI, unsigned OpNum,
199                                 const MCSubtargetInfo &STI, raw_ostream &O);
200   void printVectorListThree(const MCInst *MI, unsigned OpNum,
201                             const MCSubtargetInfo &STI, raw_ostream &O);
202   void printVectorListFour(const MCInst *MI, unsigned OpNum,
203                            const MCSubtargetInfo &STI, raw_ostream &O);
204   void printVectorListOneAllLanes(const MCInst *MI, unsigned OpNum,
205                                   const MCSubtargetInfo &STI, raw_ostream &O);
206   void printVectorListTwoAllLanes(const MCInst *MI, unsigned OpNum,
207                                   const MCSubtargetInfo &STI, raw_ostream &O);
208   void printVectorListThreeAllLanes(const MCInst *MI, unsigned OpNum,
209                                     const MCSubtargetInfo &STI, raw_ostream &O);
210   void printVectorListFourAllLanes(const MCInst *MI, unsigned OpNum,
211                                    const MCSubtargetInfo &STI, raw_ostream &O);
212   void printVectorListTwoSpacedAllLanes(const MCInst *MI, unsigned OpNum,
213                                         const MCSubtargetInfo &STI,
214                                         raw_ostream &O);
215   void printVectorListThreeSpacedAllLanes(const MCInst *MI, unsigned OpNum,
216                                           const MCSubtargetInfo &STI,
217                                           raw_ostream &O);
218   void printVectorListFourSpacedAllLanes(const MCInst *MI, unsigned OpNum,
219                                          const MCSubtargetInfo &STI,
220                                          raw_ostream &O);
221   void printVectorListThreeSpaced(const MCInst *MI, unsigned OpNum,
222                                   const MCSubtargetInfo &STI, raw_ostream &O);
223   void printVectorListFourSpaced(const MCInst *MI, unsigned OpNum,
224                                  const MCSubtargetInfo &STI, raw_ostream &O);
225 };
226
227 } // end namespace llvm
228
229 #endif