]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/llvm/lib/Target/AArch64/InstPrinter/AArch64InstPrinter.h
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / llvm / lib / Target / AArch64 / InstPrinter / AArch64InstPrinter.h
1 //===-- AArch64InstPrinter.h - Convert AArch64 MCInst to assembly syntax --===//
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 AArch64 MCInst to a .s file.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef LLVM_AARCH64INSTPRINTER_H
15 #define LLVM_AARCH64INSTPRINTER_H
16
17 #include "MCTargetDesc/AArch64MCTargetDesc.h"
18 #include "Utils/AArch64BaseInfo.h"
19 #include "llvm/MC/MCInstPrinter.h"
20 #include "llvm/MC/MCSubtargetInfo.h"
21
22 namespace llvm {
23
24 class MCOperand;
25
26 class AArch64InstPrinter : public MCInstPrinter {
27 public:
28   AArch64InstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
29                      const MCRegisterInfo &MRI, const MCSubtargetInfo &STI);
30
31   // Autogenerated by tblgen
32   void printInstruction(const MCInst *MI, raw_ostream &O);
33   bool printAliasInstr(const MCInst *MI, raw_ostream &O);
34   static const char *getRegisterName(unsigned RegNo);
35   static const char *getInstructionName(unsigned Opcode);
36
37   void printRegName(raw_ostream &O, unsigned RegNum) const;
38
39   template<unsigned MemSize, unsigned RmSize>
40   void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum,
41                                  raw_ostream &O) {
42     printAddrRegExtendOperand(MI, OpNum, O, MemSize, RmSize);
43   }
44
45
46   void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum,
47                                  raw_ostream &O, unsigned MemSize,
48                                  unsigned RmSize);
49
50   void printAddSubImmLSL0Operand(const MCInst *MI,
51                                  unsigned OpNum, raw_ostream &O);
52   void printAddSubImmLSL12Operand(const MCInst *MI,
53                                   unsigned OpNum, raw_ostream &O);
54
55   void printBareImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
56
57   template<unsigned RegWidth>
58   void printBFILSBOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
59   void printBFIWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
60   void printBFXWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
61
62
63   void printCondCodeOperand(const MCInst *MI, unsigned OpNum,
64                             raw_ostream &O);
65
66   void printCRxOperand(const MCInst *MI, unsigned OpNum,
67                        raw_ostream &O);
68
69   void printCVTFixedPosOperand(const MCInst *MI, unsigned OpNum,
70                                raw_ostream &O);
71
72   void printFPImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o);
73
74   void printFPZeroOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o);
75
76   template<int MemScale>
77   void printOffsetUImm12Operand(const MCInst *MI,
78                                   unsigned OpNum, raw_ostream &o) {
79     printOffsetUImm12Operand(MI, OpNum, o, MemScale);
80   }
81
82   void printOffsetUImm12Operand(const MCInst *MI, unsigned OpNum,
83                                   raw_ostream &o, int MemScale);
84
85   template<unsigned field_width, unsigned scale>
86   void printLabelOperand(const MCInst *MI, unsigned OpNum,
87                          raw_ostream &O);
88
89   template<unsigned RegWidth>
90   void printLogicalImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
91
92   template<typename SomeNamedImmMapper>
93   void printNamedImmOperand(const MCInst *MI, unsigned OpNum,
94                             raw_ostream &O) {
95     printNamedImmOperand(SomeNamedImmMapper(), MI, OpNum, O);
96   }
97
98   void printNamedImmOperand(const NamedImmMapper &Mapper,
99                             const MCInst *MI, unsigned OpNum,
100                             raw_ostream &O);
101
102   void printSysRegOperand(const A64SysReg::SysRegMapper &Mapper,
103                           const MCInst *MI, unsigned OpNum,
104                           raw_ostream &O);
105
106   void printMRSOperand(const MCInst *MI, unsigned OpNum,
107                        raw_ostream &O) {
108     printSysRegOperand(A64SysReg::MRSMapper(), MI, OpNum, O);
109   }
110
111   void printMSROperand(const MCInst *MI, unsigned OpNum,
112                        raw_ostream &O) {
113     printSysRegOperand(A64SysReg::MSRMapper(), MI, OpNum, O);
114   }
115
116   void printShiftOperand(const char *name, const MCInst *MI,
117                          unsigned OpIdx, raw_ostream &O);
118
119   void printLSLOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
120
121   void printLSROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
122     printShiftOperand("lsr", MI, OpNum, O);
123   }
124   void printASROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
125     printShiftOperand("asr", MI, OpNum, O);
126   }
127   void printROROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
128     printShiftOperand("ror", MI, OpNum, O);
129   }
130
131   template<A64SE::ShiftExtSpecifiers Shift>
132   void printShiftOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
133     printShiftOperand(MI, OpNum, O, Shift);
134   }
135
136   void printShiftOperand(const MCInst *MI, unsigned OpNum,
137                          raw_ostream &O, A64SE::ShiftExtSpecifiers Sh);
138
139
140   void printMoveWideImmOperand(const  MCInst *MI, unsigned OpNum,
141                                raw_ostream &O);
142
143   template<int MemSize> void
144   printSImm7ScaledOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
145
146   void printOffsetSImm9Operand(const MCInst *MI, unsigned OpNum,
147                                raw_ostream &O);
148
149   void printPRFMOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
150
151   template<A64SE::ShiftExtSpecifiers EXT>
152   void printRegExtendOperand(const MCInst *MI, unsigned OpNum,
153                              raw_ostream &O) {
154     printRegExtendOperand(MI, OpNum, O, EXT);
155   }
156
157   void printRegExtendOperand(const MCInst *MI, unsigned OpNum,
158                              raw_ostream &O, A64SE::ShiftExtSpecifiers Ext);
159
160   void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
161   virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot);
162
163   bool isStackReg(unsigned RegNo) {
164     return RegNo == AArch64::XSP || RegNo == AArch64::WSP;
165   }
166
167
168 };
169
170 }
171
172 #endif