1 //===-- XCoreInstrFormats.td - XCore Instruction Formats ---*- tablegen -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 //===----------------------------------------------------------------------===//
11 // Instruction format superclass
12 //===----------------------------------------------------------------------===//
13 class InstXCore<int sz, dag outs, dag ins, string asmstr, list<dag> pattern>
17 let Namespace = "XCore";
18 dag OutOperandList = outs;
19 dag InOperandList = ins;
20 let AsmString = asmstr;
21 let Pattern = pattern;
23 field bits<32> SoftFail = 0;
26 // XCore pseudo instructions format
27 class PseudoInstXCore<dag outs, dag ins, string asmstr, list<dag> pattern>
28 : InstXCore<0, outs, ins, asmstr, pattern> {
32 //===----------------------------------------------------------------------===//
33 // Instruction formats
34 //===----------------------------------------------------------------------===//
36 class _F3R<bits<5> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
37 : InstXCore<2, outs, ins, asmstr, pattern> {
38 let Inst{15-11} = opc;
39 let DecoderMethod = "Decode3RInstruction";
42 // 3R with first operand as an immediate. Used for TSETR where the first
43 // operand is treated as an immediate since it refers to a register number in
45 class _F3RImm<bits<5> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
46 : _F3R<opc, outs, ins, asmstr, pattern> {
47 let DecoderMethod = "Decode3RImmInstruction";
50 class _FL3R<bits<9> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
51 : InstXCore<4, outs, ins, asmstr, pattern> {
52 let Inst{31-27} = opc{8-4};
53 let Inst{26-20} = 0b1111110;
54 let Inst{19-16} = opc{3-0};
56 let Inst{15-11} = 0b11111;
57 let DecoderMethod = "DecodeL3RInstruction";
60 // L3R with first operand as both a source and a destination.
61 class _FL3RSrcDst<bits<9> opc, dag outs, dag ins, string asmstr,
62 list<dag> pattern> : _FL3R<opc, outs, ins, asmstr, pattern> {
63 let DecoderMethod = "DecodeL3RSrcDstInstruction";
66 class _F2RUS<bits<5> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
67 : InstXCore<2, outs, ins, asmstr, pattern> {
68 let Inst{15-11} = opc;
69 let DecoderMethod = "Decode2RUSInstruction";
72 // 2RUS with bitp operand
73 class _F2RUSBitp<bits<5> opc, dag outs, dag ins, string asmstr,
75 : _F2RUS<opc, outs, ins, asmstr, pattern> {
76 let DecoderMethod = "Decode2RUSBitpInstruction";
79 class _FL2RUS<bits<9> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
80 : InstXCore<4, outs, ins, asmstr, pattern> {
81 let Inst{31-27} = opc{8-4};
82 let Inst{26-20} = 0b1111110;
83 let Inst{19-16} = opc{3-0};
85 let Inst{15-11} = 0b11111;
86 let DecoderMethod = "DecodeL2RUSInstruction";
89 // L2RUS with bitp operand
90 class _FL2RUSBitp<bits<9> opc, dag outs, dag ins, string asmstr,
92 : _FL2RUS<opc, outs, ins, asmstr, pattern> {
93 let DecoderMethod = "DecodeL2RUSBitpInstruction";
96 class _FRU6<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
97 : InstXCore<2, outs, ins, asmstr, pattern> {
101 let Inst{15-10} = opc;
106 class _FLRU6<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
107 : InstXCore<4, outs, ins, asmstr, pattern> {
111 let Inst{31-26} = opc;
113 let Inst{21-16} = b{5-0};
114 let Inst{15-10} = 0b111100;
115 let Inst{9-0} = b{15-6};
118 class _FU6<bits<10> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
119 : InstXCore<2, outs, ins, asmstr, pattern> {
122 let Inst{15-6} = opc;
126 class _FLU6<bits<10> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
127 : InstXCore<4, outs, ins, asmstr, pattern> {
130 let Inst{31-22} = opc;
131 let Inst{21-16} = a{5-0};
132 let Inst{15-10} = 0b111100;
133 let Inst{9-0} = a{15-6};
136 class _FU10<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
137 : InstXCore<2, outs, ins, asmstr, pattern> {
140 let Inst{15-10} = opc;
144 class _FLU10<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
145 : InstXCore<4, outs, ins, asmstr, pattern> {
148 let Inst{31-26} = opc;
149 let Inst{25-16} = a{9-0};
150 let Inst{15-10} = 0b111100;
151 let Inst{9-0} = a{19-10};
154 class _F2R<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
155 : InstXCore<2, outs, ins, asmstr, pattern> {
156 let Inst{15-11} = opc{5-1};
157 let Inst{4} = opc{0};
158 let DecoderMethod = "Decode2RInstruction";
161 // 2R with first operand as an immediate. Used for TSETMR where the first
162 // operand is treated as an immediate since it refers to a register number in
164 class _F2RImm<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
165 : _F2R<opc, outs, ins, asmstr, pattern> {
166 let DecoderMethod = "Decode2RImmInstruction";
169 // 2R with first operand as both a source and a destination.
170 class _F2RSrcDst<bits<6> opc, dag outs, dag ins, string asmstr,
171 list<dag> pattern> : _F2R<opc, outs, ins, asmstr, pattern> {
172 let DecoderMethod = "Decode2RSrcDstInstruction";
175 // Same as 2R with last two operands swapped
176 class _FR2R<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
177 : _F2R<opc, outs, ins, asmstr, pattern> {
178 let DecoderMethod = "DecodeR2RInstruction";
181 class _FRUS<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
182 : InstXCore<2, outs, ins, asmstr, pattern> {
183 let Inst{15-11} = opc{5-1};
184 let Inst{4} = opc{0};
185 let DecoderMethod = "DecodeRUSInstruction";
188 // RUS with bitp operand
189 class _FRUSBitp<bits<6> opc, dag outs, dag ins, string asmstr,
191 : _FRUS<opc, outs, ins, asmstr, pattern> {
192 let DecoderMethod = "DecodeRUSBitpInstruction";
195 // RUS with first operand as both a source and a destination and a bitp second
197 class _FRUSSrcDstBitp<bits<6> opc, dag outs, dag ins, string asmstr,
199 : _FRUS<opc, outs, ins, asmstr, pattern> {
200 let DecoderMethod = "DecodeRUSSrcDstBitpInstruction";
203 class _FL2R<bits<10> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
204 : InstXCore<4, outs, ins, asmstr, pattern> {
205 let Inst{31-27} = opc{9-5};
206 let Inst{26-20} = 0b1111110;
207 let Inst{19-16} = opc{4-1};
209 let Inst{15-11} = 0b11111;
210 let Inst{4} = opc{0};
211 let DecoderMethod = "DecodeL2RInstruction";
214 // Same as L2R with last two operands swapped
215 class _FLR2R<bits<10> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
216 : _FL2R<opc, outs, ins, asmstr, pattern> {
217 let DecoderMethod = "DecodeLR2RInstruction";
220 class _F1R<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
221 : InstXCore<2, outs, ins, asmstr, pattern> {
224 let Inst{15-11} = opc{5-1};
225 let Inst{10-5} = 0b111111;
226 let Inst{4} = opc{0};
230 class _F0R<bits<10> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
231 : InstXCore<2, outs, ins, asmstr, pattern> {
232 let Inst{15-11} = opc{9-5};
233 let Inst{10-5} = 0b111111;
234 let Inst{4-0} = opc{4-0};
237 class _FL4R<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
238 : InstXCore<4, outs, ins, asmstr, pattern> {
241 let Inst{31-27} = opc{5-1};
242 let Inst{26-21} = 0b111111;
243 let Inst{20} = opc{0};
245 let Inst{15-11} = 0b11111;
248 // L4R with 4th operand as both a source and a destination.
249 class _FL4RSrcDst<bits<6> opc, dag outs, dag ins, string asmstr,
251 : _FL4R<opc, outs, ins, asmstr, pattern> {
252 let DecoderMethod = "DecodeL4RSrcDstInstruction";
255 // L4R with 1st and 4th operand as both a source and a destination.
256 class _FL4RSrcDstSrcDst<bits<6> opc, dag outs, dag ins, string asmstr,
258 : _FL4R<opc, outs, ins, asmstr, pattern> {
259 let DecoderMethod = "DecodeL4RSrcDstSrcDstInstruction";
262 class _FL5R<bits<6> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
263 : InstXCore<4, outs, ins, asmstr, pattern> {
264 let Inst{31-27} = opc{5-1};
265 let Inst{20} = opc{0};
266 let Inst{15-11} = 0b11111;
268 let DecoderMethod = "DecodeL5RInstruction";
271 class _FL6R<bits<5> opc, dag outs, dag ins, string asmstr, list<dag> pattern>
272 : InstXCore<4, outs, ins, asmstr, pattern> {
273 let Inst{31-27} = opc;
274 let Inst{15-11} = 0b11111;
276 let DecoderMethod = "DecodeL6RInstruction";