llvm/test/Object/ar-error.test: Don't check the message "No such file or directory".
[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/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   void printCustomAliasOperand(const MCInst *MI, unsigned OpIdx,
35                                unsigned PrintMethodIdx, raw_ostream &O);
36   static const char *getRegisterName(unsigned RegNo);
37   static const char *getInstructionName(unsigned Opcode);
38
39   void printRegName(raw_ostream &O, unsigned RegNum) const override;
40
41   template<unsigned MemSize, unsigned RmSize>
42   void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum,
43                                  raw_ostream &O) {
44     printAddrRegExtendOperand(MI, OpNum, O, MemSize, RmSize);
45   }
46
47
48   void printAddrRegExtendOperand(const MCInst *MI, unsigned OpNum,
49                                  raw_ostream &O, unsigned MemSize,
50                                  unsigned RmSize);
51
52   void printAddSubImmLSL0Operand(const MCInst *MI,
53                                  unsigned OpNum, raw_ostream &O);
54   void printAddSubImmLSL12Operand(const MCInst *MI,
55                                   unsigned OpNum, raw_ostream &O);
56
57   void printBareImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
58
59   template<unsigned RegWidth>
60   void printBFILSBOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
61   void printBFIWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
62   void printBFXWidthOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
63
64
65   void printCondCodeOperand(const MCInst *MI, unsigned OpNum,
66                             raw_ostream &O);
67   void printInverseCondCodeOperand(const MCInst *MI, unsigned OpNum,
68                                    raw_ostream &O);
69
70   void printCRxOperand(const MCInst *MI, unsigned OpNum,
71                        raw_ostream &O);
72
73   void printCVTFixedPosOperand(const MCInst *MI, unsigned OpNum,
74                                raw_ostream &O);
75
76   void printFPImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o);
77
78   void printFPZeroOperand(const MCInst *MI, unsigned OpNum, raw_ostream &o);
79
80   template<int MemScale>
81   void printOffsetUImm12Operand(const MCInst *MI,
82                                   unsigned OpNum, raw_ostream &o) {
83     printOffsetUImm12Operand(MI, OpNum, o, MemScale);
84   }
85
86   void printOffsetUImm12Operand(const MCInst *MI, unsigned OpNum,
87                                   raw_ostream &o, int MemScale);
88
89   template<unsigned field_width, unsigned scale>
90   void printLabelOperand(const MCInst *MI, unsigned OpNum,
91                          raw_ostream &O);
92
93   template<unsigned RegWidth>
94   void printLogicalImmOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
95
96   template<typename SomeNamedImmMapper>
97   void printNamedImmOperand(const MCInst *MI, unsigned OpNum,
98                             raw_ostream &O) {
99     printNamedImmOperand(SomeNamedImmMapper(), MI, OpNum, O);
100   }
101
102   void printNamedImmOperand(const NamedImmMapper &Mapper,
103                             const MCInst *MI, unsigned OpNum,
104                             raw_ostream &O);
105
106   void printSysRegOperand(const A64SysReg::SysRegMapper &Mapper,
107                           const MCInst *MI, unsigned OpNum,
108                           raw_ostream &O);
109
110   void printMRSOperand(const MCInst *MI, unsigned OpNum,
111                        raw_ostream &O) {
112     printSysRegOperand(A64SysReg::MRSMapper(), MI, OpNum, O);
113   }
114
115   void printMSROperand(const MCInst *MI, unsigned OpNum,
116                        raw_ostream &O) {
117     printSysRegOperand(A64SysReg::MSRMapper(), MI, OpNum, O);
118   }
119
120   void printShiftOperand(const char *name, const MCInst *MI,
121                          unsigned OpIdx, raw_ostream &O);
122
123   void printLSLOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
124
125   void printLSROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
126     printShiftOperand("lsr", MI, OpNum, O);
127   }
128   void printASROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
129     printShiftOperand("asr", MI, OpNum, O);
130   }
131   void printROROperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
132     printShiftOperand("ror", MI, OpNum, O);
133   }
134
135   template<A64SE::ShiftExtSpecifiers Shift>
136   void printShiftOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O) {
137     printShiftOperand(MI, OpNum, O, Shift);
138   }
139
140   void printShiftOperand(const MCInst *MI, unsigned OpNum,
141                          raw_ostream &O, A64SE::ShiftExtSpecifiers Sh);
142
143
144   void printMoveWideImmOperand(const  MCInst *MI, unsigned OpNum,
145                                raw_ostream &O);
146
147   template<int MemSize> void
148   printSImm7ScaledOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
149
150   void printOffsetSImm9Operand(const MCInst *MI, unsigned OpNum,
151                                raw_ostream &O);
152
153   void printPRFMOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
154
155   template<A64SE::ShiftExtSpecifiers EXT>
156   void printRegExtendOperand(const MCInst *MI, unsigned OpNum,
157                              raw_ostream &O) {
158     printRegExtendOperand(MI, OpNum, O, EXT);
159   }
160
161   void printRegExtendOperand(const MCInst *MI, unsigned OpNum,
162                              raw_ostream &O, A64SE::ShiftExtSpecifiers Ext);
163
164   void printVPRRegister(const MCInst *MI, unsigned OpNo, raw_ostream &O);
165   void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
166   void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot) override;
167
168   bool isStackReg(unsigned RegNo) {
169     return RegNo == AArch64::XSP || RegNo == AArch64::WSP;
170   }
171
172   template <A64SE::ShiftExtSpecifiers Ext, bool IsHalf>
173   void printNeonMovImmShiftOperand(const MCInst *MI, unsigned OpNum,
174                                    raw_ostream &O);
175   void printNeonUImm0Operand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
176   void printUImmHexOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
177   void printUImmBareOperand(const MCInst *MI, unsigned OpNum, raw_ostream &O);
178   void printNeonUImm64MaskOperand(const MCInst *MI, unsigned OpNum,
179                                   raw_ostream &O);
180
181   template <A64Layout::VectorLayout Layout, unsigned Count>
182   void printVectorList(const MCInst *MI, unsigned OpNum, raw_ostream &O);
183 };
184 }
185
186 #endif