[mips][msa] Add copy_{u,s}.d.
[oota-llvm.git] / lib / Target / Mips / MipsMSAInstrFormats.td
1 //===- 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
10 def HasMSA : Predicate<"Subtarget.hasMSA()">,
11              AssemblerPredicate<"FeatureMSA">;
12
13 class MSAInst : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther> {
14   let Predicates = [HasMSA];
15   let Inst{31-26} = 0b011110;
16 }
17
18 class MSA64Inst : MSAInst {
19   let Predicates = [HasMSA, HasMips64];
20 }
21
22 class MSACBranch : MSAInst {
23   let Inst{31-26} = 0b010001;
24 }
25
26 class MSASpecial : MSAInst {
27   let Inst{31-26} = 0b000000;
28 }
29
30 class MSAPseudo<dag outs, dag ins, list<dag> pattern,
31                 InstrItinClass itin = IIPseudo>:
32   MipsPseudo<outs, ins, pattern, itin> {
33   let Predicates = [HasMSA];
34 }
35
36 class MSA_BIT_B_FMT<bits<3> major, bits<6> minor>: MSAInst {
37   bits<5> ws;
38   bits<5> wd;
39   bits<3> m;
40
41   let Inst{25-23} = major;
42   let Inst{22-19} = 0b1110;
43   let Inst{18-16} = m;
44   let Inst{15-11} = ws;
45   let Inst{10-6} = wd;
46   let Inst{5-0} = minor;
47 }
48
49 class MSA_BIT_H_FMT<bits<3> major, bits<6> minor>: MSAInst {
50   bits<5> ws;
51   bits<5> wd;
52   bits<4> m;
53
54   let Inst{25-23} = major;
55   let Inst{22-20} = 0b110;
56   let Inst{19-16} = m;
57   let Inst{15-11} = ws;
58   let Inst{10-6} = wd;
59   let Inst{5-0} = minor;
60 }
61
62 class MSA_BIT_W_FMT<bits<3> major, bits<6> minor>: MSAInst {
63   bits<5> ws;
64   bits<5> wd;
65   bits<5> m;
66
67   let Inst{25-23} = major;
68   let Inst{22-21} = 0b10;
69   let Inst{20-16} = m;
70   let Inst{15-11} = ws;
71   let Inst{10-6} = wd;
72   let Inst{5-0} = minor;
73 }
74
75 class MSA_BIT_D_FMT<bits<3> major, bits<6> minor>: MSAInst {
76   bits<5> ws;
77   bits<5> wd;
78   bits<6> m;
79
80   let Inst{25-23} = major;
81   let Inst{22} = 0b0;
82   let Inst{21-16} = m;
83   let Inst{15-11} = ws;
84   let Inst{10-6} = wd;
85   let Inst{5-0} = minor;
86 }
87
88 class MSA_2R_FILL_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst {
89   bits<5> rs;
90   bits<5> wd;
91
92   let Inst{25-18} = major;
93   let Inst{17-16} = df;
94   let Inst{15-11} = rs;
95   let Inst{10-6} = wd;
96   let Inst{5-0} = minor;
97 }
98
99 class MSA_2R_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst {
100   bits<5> ws;
101   bits<5> wd;
102
103   let Inst{25-18} = major;
104   let Inst{17-16} = df;
105   let Inst{15-11} = ws;
106   let Inst{10-6} = wd;
107   let Inst{5-0} = minor;
108 }
109
110 class MSA_2RF_FMT<bits<9> major, bits<1> df, bits<6> minor>: MSAInst {
111   bits<5> ws;
112   bits<5> wd;
113
114   let Inst{25-17} = major;
115   let Inst{16} = df;
116   let Inst{15-11} = ws;
117   let Inst{10-6} = wd;
118   let Inst{5-0} = minor;
119 }
120
121 class MSA_3R_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
122   bits<5> wt;
123   bits<5> ws;
124   bits<5> wd;
125
126   let Inst{25-23} = major;
127   let Inst{22-21} = df;
128   let Inst{20-16} = wt;
129   let Inst{15-11} = ws;
130   let Inst{10-6} = wd;
131   let Inst{5-0} = minor;
132 }
133
134 class MSA_3RF_FMT<bits<4> major, bits<1> df, bits<6> minor>: MSAInst {
135   bits<5> wt;
136   bits<5> ws;
137   bits<5> wd;
138
139   let Inst{25-22} = major;
140   let Inst{21} = df;
141   let Inst{20-16} = wt;
142   let Inst{15-11} = ws;
143   let Inst{10-6} = wd;
144   let Inst{5-0} = minor;
145 }
146
147 class MSA_3R_INDEX_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
148   bits<5> rt;
149   bits<5> ws;
150   bits<5> wd;
151
152   let Inst{25-23} = major;
153   let Inst{22-21} = df;
154   let Inst{20-16} = rt;
155   let Inst{15-11} = ws;
156   let Inst{10-6} = wd;
157   let Inst{5-0} = minor;
158 }
159
160 class MSA_ELM_FMT<bits<10> major, bits<6> minor>: MSAInst {
161   bits<5> ws;
162   bits<5> wd;
163
164   let Inst{25-16} = major;
165   let Inst{15-11} = ws;
166   let Inst{10-6} = wd;
167   let Inst{5-0} = minor;
168 }
169
170 class MSA_ELM_CFCMSA_FMT<bits<10> major, bits<6> minor>: MSAInst {
171   bits<5> rd;
172   bits<5> cs;
173
174   let Inst{25-16} = major;
175   let Inst{15-11} = cs;
176   let Inst{10-6} = rd;
177   let Inst{5-0} = minor;
178 }
179
180 class MSA_ELM_CTCMSA_FMT<bits<10> major, bits<6> minor>: MSAInst {
181   bits<5> rs;
182   bits<5> cd;
183
184   let Inst{25-16} = major;
185   let Inst{15-11} = rs;
186   let Inst{10-6} = cd;
187   let Inst{5-0} = minor;
188 }
189
190 class MSA_ELM_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
191   bits<4> n;
192   bits<5> ws;
193   bits<5> wd;
194
195   let Inst{25-22} = major;
196   let Inst{21-20} = 0b00;
197   let Inst{19-16} = n{3-0};
198   let Inst{15-11} = ws;
199   let Inst{10-6} = wd;
200   let Inst{5-0} = minor;
201 }
202
203 class MSA_ELM_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
204   bits<4> n;
205   bits<5> ws;
206   bits<5> wd;
207
208   let Inst{25-22} = major;
209   let Inst{21-19} = 0b100;
210   let Inst{18-16} = n{2-0};
211   let Inst{15-11} = ws;
212   let Inst{10-6} = wd;
213   let Inst{5-0} = minor;
214 }
215
216 class MSA_ELM_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
217   bits<4> n;
218   bits<5> ws;
219   bits<5> wd;
220
221   let Inst{25-22} = major;
222   let Inst{21-18} = 0b1100;
223   let Inst{17-16} = n{1-0};
224   let Inst{15-11} = ws;
225   let Inst{10-6} = wd;
226   let Inst{5-0} = minor;
227 }
228
229 class MSA_ELM_D_FMT<bits<4> major, bits<6> minor>: MSAInst {
230   bits<4> n;
231   bits<5> ws;
232   bits<5> wd;
233
234   let Inst{25-22} = major;
235   let Inst{21-17} = 0b11100;
236   let Inst{16} = n{0};
237   let Inst{15-11} = ws;
238   let Inst{10-6} = wd;
239   let Inst{5-0} = minor;
240 }
241
242 class MSA_ELM_COPY_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
243   bits<4> n;
244   bits<5> ws;
245   bits<5> rd;
246
247   let Inst{25-22} = major;
248   let Inst{21-20} = 0b00;
249   let Inst{19-16} = n{3-0};
250   let Inst{15-11} = ws;
251   let Inst{10-6} = rd;
252   let Inst{5-0} = minor;
253 }
254
255 class MSA_ELM_COPY_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
256   bits<4> n;
257   bits<5> ws;
258   bits<5> rd;
259
260   let Inst{25-22} = major;
261   let Inst{21-19} = 0b100;
262   let Inst{18-16} = n{2-0};
263   let Inst{15-11} = ws;
264   let Inst{10-6} = rd;
265   let Inst{5-0} = minor;
266 }
267
268 class MSA_ELM_COPY_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
269   bits<4> n;
270   bits<5> ws;
271   bits<5> rd;
272
273   let Inst{25-22} = major;
274   let Inst{21-18} = 0b1100;
275   let Inst{17-16} = n{1-0};
276   let Inst{15-11} = ws;
277   let Inst{10-6} = rd;
278   let Inst{5-0} = minor;
279 }
280
281 class MSA_ELM_COPY_D_FMT<bits<4> major, bits<6> minor>: MSA64Inst {
282   bits<4> n;
283   bits<5> ws;
284   bits<5> rd;
285
286   let Inst{25-22} = major;
287   let Inst{21-17} = 0b11100;
288   let Inst{16} = n{0};
289   let Inst{15-11} = ws;
290   let Inst{10-6} = rd;
291   let Inst{5-0} = minor;
292 }
293
294 class MSA_ELM_INSERT_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
295   bits<6> n;
296   bits<5> rs;
297   bits<5> wd;
298
299   let Inst{25-22} = major;
300   let Inst{21-20} = 0b00;
301   let Inst{19-16} = n{3-0};
302   let Inst{15-11} = rs;
303   let Inst{10-6} = wd;
304   let Inst{5-0} = minor;
305 }
306
307 class MSA_ELM_INSERT_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
308   bits<6> n;
309   bits<5> rs;
310   bits<5> wd;
311
312   let Inst{25-22} = major;
313   let Inst{21-19} = 0b100;
314   let Inst{18-16} = n{2-0};
315   let Inst{15-11} = rs;
316   let Inst{10-6} = wd;
317   let Inst{5-0} = minor;
318 }
319
320 class MSA_ELM_INSERT_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
321   bits<6> n;
322   bits<5> rs;
323   bits<5> wd;
324
325   let Inst{25-22} = major;
326   let Inst{21-18} = 0b1100;
327   let Inst{17-16} = n{1-0};
328   let Inst{15-11} = rs;
329   let Inst{10-6} = wd;
330   let Inst{5-0} = minor;
331 }
332
333 class MSA_I5_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
334   bits<5> imm;
335   bits<5> ws;
336   bits<5> wd;
337
338   let Inst{25-23} = major;
339   let Inst{22-21} = df;
340   let Inst{20-16} = imm;
341   let Inst{15-11} = ws;
342   let Inst{10-6} = wd;
343   let Inst{5-0} = minor;
344 }
345
346 class MSA_I8_FMT<bits<2> major, bits<6> minor>: MSAInst {
347   bits<8> u8;
348   bits<5> ws;
349   bits<5> wd;
350
351   let Inst{25-24} = major;
352   let Inst{23-16} = u8;
353   let Inst{15-11} = ws;
354   let Inst{10-6} = wd;
355   let Inst{5-0} = minor;
356 }
357
358 class MSA_I10_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
359   bits<10> s10;
360   bits<5> wd;
361
362   let Inst{25-23} = major;
363   let Inst{22-21} = df;
364   let Inst{20-11} = s10;
365   let Inst{10-6} = wd;
366   let Inst{5-0} = minor;
367 }
368
369 class MSA_MI10_FMT<bits<2> df, bits<4> minor>: MSAInst {
370   bits<21> addr;
371   bits<5> wd;
372
373   let Inst{25-16} = addr{9-0};
374   let Inst{15-11} = addr{20-16};
375   let Inst{10-6} = wd;
376   let Inst{5-2} = minor;
377   let Inst{1-0} = df;
378 }
379
380 class MSA_VEC_FMT<bits<5> major, bits<6> minor>: MSAInst {
381   bits<5> wt;
382   bits<5> ws;
383   bits<5> wd;
384
385   let Inst{25-21} = major;
386   let Inst{20-16} = wt;
387   let Inst{15-11} = ws;
388   let Inst{10-6} = wd;
389   let Inst{5-0} = minor;
390 }
391
392 class MSA_CBRANCH_FMT<bits<3> major, bits<2> df>: MSACBranch {
393   bits<16> offset;
394   bits<5> wt;
395
396   let Inst{25-23} = major;
397   let Inst{22-21} = df;
398   let Inst{20-16} = wt;
399   let Inst{15-0} = offset;
400 }
401
402 class MSA_CBRANCH_V_FMT<bits<5> major>: MSACBranch {
403   bits<16> offset;
404   bits<5> wt;
405
406   let Inst{25-21} = major;
407   let Inst{20-16} = wt;
408   let Inst{15-0} = offset;
409 }
410
411 class SPECIAL_LSA_FMT<bits<6> minor>: MSASpecial {
412   bits<5> rs;
413   bits<5> rt;
414   bits<5> rd;
415   bits<2> sa;
416
417   let Inst{25-21} = rs;
418   let Inst{20-16} = rt;
419   let Inst{15-11} = rd;
420   let Inst{10-8} = 0b000;
421   let Inst{7-6} = sa;
422   let Inst{5-0} = minor;
423 }