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