blob: 27f0bde766c8b7760788538e8c8502d557405623 [file] [log] [blame]
Jack Carter3a2c2d42013-08-13 20:54:07 +00001//===- MipsMSAInstrFormats.td - Mips Instruction Formats ---*- tablegen -*-===//
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
10def HasMSA : Predicate<"Subtarget.hasMSA()">,
11 AssemblerPredicate<"FeatureMSA">;
12
13class MSAInst : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther> {
14 let Predicates = [HasMSA];
15 let Inst{31-26} = 0b011110;
16}
17
Matheus Almeidaeb68d9d2013-10-22 09:43:32 +000018class MSACBranch : MSAInst {
19 let Inst{31-26} = 0b010001;
20}
21
Matheus Almeidabe8681b2013-10-23 13:20:07 +000022class MSASpecial : MSAInst {
23 let Inst{31-26} = 0b000000;
24}
25
Daniel Sandersf93e8152013-11-20 14:32:28 +000026class MSAPseudo<dag outs, dag ins, list<dag> pattern,
Jack Carter3a2c2d42013-08-13 20:54:07 +000027 InstrItinClass itin = IIPseudo>:
28 MipsPseudo<outs, ins, pattern, itin> {
29 let Predicates = [HasMSA];
30}
31
Jack Carterbabdcc82013-08-15 12:24:57 +000032class MSA_BIT_B_FMT<bits<3> major, bits<6> minor>: MSAInst {
Matheus Almeida21021882013-10-14 13:07:39 +000033 bits<5> ws;
34 bits<5> wd;
35 bits<3> m;
36
Jack Carterbabdcc82013-08-15 12:24:57 +000037 let Inst{25-23} = major;
38 let Inst{22-19} = 0b1110;
Matheus Almeida21021882013-10-14 13:07:39 +000039 let Inst{18-16} = m;
40 let Inst{15-11} = ws;
41 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +000042 let Inst{5-0} = minor;
43}
44
45class MSA_BIT_H_FMT<bits<3> major, bits<6> minor>: MSAInst {
Matheus Almeida21021882013-10-14 13:07:39 +000046 bits<5> ws;
47 bits<5> wd;
48 bits<4> m;
49
Jack Carterbabdcc82013-08-15 12:24:57 +000050 let Inst{25-23} = major;
51 let Inst{22-20} = 0b110;
Matheus Almeida21021882013-10-14 13:07:39 +000052 let Inst{19-16} = m;
53 let Inst{15-11} = ws;
54 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +000055 let Inst{5-0} = minor;
56}
57
58class MSA_BIT_W_FMT<bits<3> major, bits<6> minor>: MSAInst {
Matheus Almeida21021882013-10-14 13:07:39 +000059 bits<5> ws;
60 bits<5> wd;
61 bits<5> m;
62
Jack Carterbabdcc82013-08-15 12:24:57 +000063 let Inst{25-23} = major;
64 let Inst{22-21} = 0b10;
Matheus Almeida21021882013-10-14 13:07:39 +000065 let Inst{20-16} = m;
66 let Inst{15-11} = ws;
67 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +000068 let Inst{5-0} = minor;
69}
70
71class MSA_BIT_D_FMT<bits<3> major, bits<6> minor>: MSAInst {
Matheus Almeida21021882013-10-14 13:07:39 +000072 bits<5> ws;
73 bits<5> wd;
74 bits<6> m;
75
Jack Carterbabdcc82013-08-15 12:24:57 +000076 let Inst{25-23} = major;
77 let Inst{22} = 0b0;
Matheus Almeida21021882013-10-14 13:07:39 +000078 let Inst{21-16} = m;
79 let Inst{15-11} = ws;
80 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +000081 let Inst{5-0} = minor;
82}
83
Jack Carter6eed9cc2013-09-30 17:43:04 +000084class MSA_2R_FILL_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst {
85 bits<5> rs;
86 bits<5> wd;
87
88 let Inst{25-18} = major;
89 let Inst{17-16} = df;
90 let Inst{15-11} = rs;
91 let Inst{10-6} = wd;
92 let Inst{5-0} = minor;
93}
94
Jack Carterbabdcc82013-08-15 12:24:57 +000095class MSA_2R_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst {
Jack Carter92e6e0f2013-09-30 17:52:33 +000096 bits<5> ws;
97 bits<5> wd;
98
Jack Carterbabdcc82013-08-15 12:24:57 +000099 let Inst{25-18} = major;
100 let Inst{17-16} = df;
Jack Carter92e6e0f2013-09-30 17:52:33 +0000101 let Inst{15-11} = ws;
102 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000103 let Inst{5-0} = minor;
104}
105
106class MSA_2RF_FMT<bits<9> major, bits<1> df, bits<6> minor>: MSAInst {
Jack Carter5dc8ac92013-09-25 23:50:44 +0000107 bits<5> ws;
108 bits<5> wd;
109
Jack Carterbabdcc82013-08-15 12:24:57 +0000110 let Inst{25-17} = major;
111 let Inst{16} = df;
Jack Carter5dc8ac92013-09-25 23:50:44 +0000112 let Inst{15-11} = ws;
113 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000114 let Inst{5-0} = minor;
115}
116
Jack Carter3a2c2d42013-08-13 20:54:07 +0000117class MSA_3R_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
Jack Carter3eb663b2013-09-26 00:09:46 +0000118 bits<5> wt;
119 bits<5> ws;
120 bits<5> wd;
121
Jack Carter3a2c2d42013-08-13 20:54:07 +0000122 let Inst{25-23} = major;
123 let Inst{22-21} = df;
Jack Carter3eb663b2013-09-26 00:09:46 +0000124 let Inst{20-16} = wt;
125 let Inst{15-11} = ws;
126 let Inst{10-6} = wd;
Jack Carter3a2c2d42013-08-13 20:54:07 +0000127 let Inst{5-0} = minor;
128}
129
Jack Carterbabdcc82013-08-15 12:24:57 +0000130class MSA_3RF_FMT<bits<4> major, bits<1> df, bits<6> minor>: MSAInst {
Jack Cartercb8b40b2013-09-26 21:31:43 +0000131 bits<5> wt;
132 bits<5> ws;
133 bits<5> wd;
134
Jack Carterbabdcc82013-08-15 12:24:57 +0000135 let Inst{25-22} = major;
136 let Inst{21} = df;
Jack Cartercb8b40b2013-09-26 21:31:43 +0000137 let Inst{20-16} = wt;
138 let Inst{15-11} = ws;
139 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000140 let Inst{5-0} = minor;
141}
142
Matheus Almeida70fbf772013-10-21 11:47:56 +0000143class MSA_3R_INDEX_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
144 bits<5> rt;
145 bits<5> ws;
146 bits<5> wd;
147
148 let Inst{25-23} = major;
149 let Inst{22-21} = df;
150 let Inst{20-16} = rt;
151 let Inst{15-11} = ws;
152 let Inst{10-6} = wd;
153 let Inst{5-0} = minor;
154}
155
Daniel Sandersf9aa1d12013-08-28 10:26:24 +0000156class MSA_ELM_FMT<bits<10> major, bits<6> minor>: MSAInst {
Matheus Almeida83d797d2013-10-21 12:43:54 +0000157 bits<5> ws;
158 bits<5> wd;
159
Daniel Sandersf9aa1d12013-08-28 10:26:24 +0000160 let Inst{25-16} = major;
Matheus Almeida83d797d2013-10-21 12:43:54 +0000161 let Inst{15-11} = ws;
162 let Inst{10-6} = wd;
Daniel Sandersf9aa1d12013-08-28 10:26:24 +0000163 let Inst{5-0} = minor;
164}
165
Matheus Almeidaa591fdc2013-10-21 12:26:50 +0000166class MSA_ELM_CFCMSA_FMT<bits<10> major, bits<6> minor>: MSAInst {
167 bits<5> rd;
168 bits<5> cs;
169
170 let Inst{25-16} = major;
171 let Inst{15-11} = cs;
172 let Inst{10-6} = rd;
173 let Inst{5-0} = minor;
174}
175
176class MSA_ELM_CTCMSA_FMT<bits<10> major, bits<6> minor>: MSAInst {
177 bits<5> rs;
178 bits<5> cd;
179
180 let Inst{25-16} = major;
181 let Inst{15-11} = rs;
182 let Inst{10-6} = cd;
183 let Inst{5-0} = minor;
184}
185
Jack Carterbabdcc82013-08-15 12:24:57 +0000186class MSA_ELM_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000187 bits<4> n;
188 bits<5> ws;
189 bits<5> wd;
190
Jack Carterbabdcc82013-08-15 12:24:57 +0000191 let Inst{25-22} = major;
192 let Inst{21-20} = 0b00;
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000193 let Inst{19-16} = n{3-0};
194 let Inst{15-11} = ws;
195 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000196 let Inst{5-0} = minor;
197}
198
199class MSA_ELM_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000200 bits<4> n;
201 bits<5> ws;
202 bits<5> wd;
203
Jack Carterbabdcc82013-08-15 12:24:57 +0000204 let Inst{25-22} = major;
205 let Inst{21-19} = 0b100;
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000206 let Inst{18-16} = n{2-0};
207 let Inst{15-11} = ws;
208 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000209 let Inst{5-0} = minor;
210}
211
212class MSA_ELM_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000213 bits<4> n;
214 bits<5> ws;
215 bits<5> wd;
216
Jack Carterbabdcc82013-08-15 12:24:57 +0000217 let Inst{25-22} = major;
218 let Inst{21-18} = 0b1100;
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000219 let Inst{17-16} = n{1-0};
220 let Inst{15-11} = ws;
221 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000222 let Inst{5-0} = minor;
223}
224
225class MSA_ELM_D_FMT<bits<4> major, bits<6> minor>: MSAInst {
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000226 bits<4> n;
227 bits<5> ws;
228 bits<5> wd;
229
Jack Carterbabdcc82013-08-15 12:24:57 +0000230 let Inst{25-22} = major;
231 let Inst{21-17} = 0b11100;
Matheus Almeidabc189eb2013-10-14 12:22:43 +0000232 let Inst{16} = n{0};
233 let Inst{15-11} = ws;
234 let Inst{10-6} = wd;
235 let Inst{5-0} = minor;
236}
237
238class MSA_ELM_COPY_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
239 bits<4> n;
240 bits<5> ws;
241 bits<5> rd;
242
243 let Inst{25-22} = major;
244 let Inst{21-20} = 0b00;
245 let Inst{19-16} = n{3-0};
246 let Inst{15-11} = ws;
247 let Inst{10-6} = rd;
248 let Inst{5-0} = minor;
249}
250
251class MSA_ELM_COPY_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
252 bits<4> n;
253 bits<5> ws;
254 bits<5> rd;
255
256 let Inst{25-22} = major;
257 let Inst{21-19} = 0b100;
258 let Inst{18-16} = n{2-0};
259 let Inst{15-11} = ws;
260 let Inst{10-6} = rd;
261 let Inst{5-0} = minor;
262}
263
264class MSA_ELM_COPY_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
265 bits<4> n;
266 bits<5> ws;
267 bits<5> rd;
268
269 let Inst{25-22} = major;
270 let Inst{21-18} = 0b1100;
271 let Inst{17-16} = n{1-0};
272 let Inst{15-11} = ws;
273 let Inst{10-6} = rd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000274 let Inst{5-0} = minor;
275}
276
Matheus Almeidab74293d2013-10-14 11:49:30 +0000277class MSA_ELM_INSERT_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
278 bits<6> n;
279 bits<5> rs;
280 bits<5> wd;
281
282 let Inst{25-22} = major;
283 let Inst{21-20} = 0b00;
284 let Inst{19-16} = n{3-0};
285 let Inst{15-11} = rs;
286 let Inst{10-6} = wd;
287 let Inst{5-0} = minor;
288}
289
290class MSA_ELM_INSERT_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
291 bits<6> n;
292 bits<5> rs;
293 bits<5> wd;
294
295 let Inst{25-22} = major;
296 let Inst{21-19} = 0b100;
297 let Inst{18-16} = n{2-0};
298 let Inst{15-11} = rs;
299 let Inst{10-6} = wd;
300 let Inst{5-0} = minor;
301}
302
303class MSA_ELM_INSERT_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
304 bits<6> n;
305 bits<5> rs;
306 bits<5> wd;
307
308 let Inst{25-22} = major;
309 let Inst{21-18} = 0b1100;
310 let Inst{17-16} = n{1-0};
311 let Inst{15-11} = rs;
312 let Inst{10-6} = wd;
313 let Inst{5-0} = minor;
314}
315
Jack Carter3a2c2d42013-08-13 20:54:07 +0000316class MSA_I5_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
Jack Carterc3b25682013-09-30 17:58:07 +0000317 bits<5> imm;
318 bits<5> ws;
319 bits<5> wd;
320
Jack Carter3a2c2d42013-08-13 20:54:07 +0000321 let Inst{25-23} = major;
322 let Inst{22-21} = df;
Jack Carterc3b25682013-09-30 17:58:07 +0000323 let Inst{20-16} = imm;
324 let Inst{15-11} = ws;
325 let Inst{10-6} = wd;
Jack Carter3a2c2d42013-08-13 20:54:07 +0000326 let Inst{5-0} = minor;
327}
Jack Carterbabdcc82013-08-15 12:24:57 +0000328
329class MSA_I8_FMT<bits<2> major, bits<6> minor>: MSAInst {
Jack Carter8ff70e32013-09-30 18:05:18 +0000330 bits<8> u8;
331 bits<5> ws;
332 bits<5> wd;
333
Jack Carterbabdcc82013-08-15 12:24:57 +0000334 let Inst{25-24} = major;
Jack Carter8ff70e32013-09-30 18:05:18 +0000335 let Inst{23-16} = u8;
336 let Inst{15-11} = ws;
337 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000338 let Inst{5-0} = minor;
339}
340
341class MSA_I10_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
Matheus Almeida8ddad152013-10-21 12:56:20 +0000342 bits<10> s10;
343 bits<5> wd;
344
Jack Carterbabdcc82013-08-15 12:24:57 +0000345 let Inst{25-23} = major;
346 let Inst{22-21} = df;
Matheus Almeida8ddad152013-10-21 12:56:20 +0000347 let Inst{20-11} = s10;
348 let Inst{10-6} = wd;
Jack Carterbabdcc82013-08-15 12:24:57 +0000349 let Inst{5-0} = minor;
350}
Daniel Sanders869bdad2013-08-20 08:38:21 +0000351
Matheus Almeidafe0bf9f2013-10-21 13:07:13 +0000352class MSA_MI10_FMT<bits<2> df, bits<4> minor>: MSAInst {
353 bits<21> addr;
354 bits<5> wd;
355
356 let Inst{25-16} = addr{9-0};
357 let Inst{15-11} = addr{20-16};
358 let Inst{10-6} = wd;
359 let Inst{5-2} = minor;
360 let Inst{1-0} = df;
361}
362
Daniel Sanders869bdad2013-08-20 08:38:21 +0000363class MSA_VEC_FMT<bits<5> major, bits<6> minor>: MSAInst {
Matheus Almeida5be0cd82013-10-14 12:57:18 +0000364 bits<5> wt;
365 bits<5> ws;
366 bits<5> wd;
367
Daniel Sanders869bdad2013-08-20 08:38:21 +0000368 let Inst{25-21} = major;
Matheus Almeida5be0cd82013-10-14 12:57:18 +0000369 let Inst{20-16} = wt;
370 let Inst{15-11} = ws;
371 let Inst{10-6} = wd;
Daniel Sanders869bdad2013-08-20 08:38:21 +0000372 let Inst{5-0} = minor;
373}
Daniel Sandersce09d072013-08-28 12:14:50 +0000374
Matheus Almeidaeb68d9d2013-10-22 09:43:32 +0000375class MSA_CBRANCH_FMT<bits<3> major, bits<2> df>: MSACBranch {
376 bits<16> offset;
377 bits<5> wt;
378
379 let Inst{25-23} = major;
380 let Inst{22-21} = df;
381 let Inst{20-16} = wt;
382 let Inst{15-0} = offset;
383}
384
385class MSA_CBRANCH_V_FMT<bits<5> major>: MSACBranch {
386 bits<16> offset;
387 bits<5> wt;
388
Daniel Sandersce09d072013-08-28 12:14:50 +0000389 let Inst{25-21} = major;
Matheus Almeidaeb68d9d2013-10-22 09:43:32 +0000390 let Inst{20-16} = wt;
391 let Inst{15-0} = offset;
Daniel Sandersce09d072013-08-28 12:14:50 +0000392}
Daniel Sandersa4eaf592013-10-17 13:38:20 +0000393
Matheus Almeidabe8681b2013-10-23 13:20:07 +0000394class SPECIAL_LSA_FMT<bits<6> minor>: MSASpecial {
395 bits<5> rs;
396 bits<5> rt;
397 bits<5> rd;
398 bits<2> sa;
399
400 let Inst{25-21} = rs;
401 let Inst{20-16} = rt;
402 let Inst{15-11} = rd;
Daniel Sandersa4eaf592013-10-17 13:38:20 +0000403 let Inst{10-8} = 0b000;
Matheus Almeidabe8681b2013-10-23 13:20:07 +0000404 let Inst{7-6} = sa;
405 let Inst{5-0} = minor;
Daniel Sandersa4eaf592013-10-17 13:38:20 +0000406}