MipsMSAInstrFormats.td revision 52244da7f2b3def646900520668b859343b84a33
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
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
18class PseudoMSA<dag outs, dag ins, list<dag> pattern,
19                InstrItinClass itin = IIPseudo>:
20  MipsPseudo<outs, ins, pattern, itin> {
21  let Predicates = [HasMSA];
22}
23
24class MSA_BIT_B_FMT<bits<3> major, bits<6> minor>: MSAInst {
25  bits<5> ws;
26  bits<5> wd;
27  bits<3> m;
28
29  let Inst{25-23} = major;
30  let Inst{22-19} = 0b1110;
31  let Inst{18-16} = m;
32  let Inst{15-11} = ws;
33  let Inst{10-6} = wd;
34  let Inst{5-0} = minor;
35}
36
37class MSA_BIT_H_FMT<bits<3> major, bits<6> minor>: MSAInst {
38  bits<5> ws;
39  bits<5> wd;
40  bits<4> m;
41
42  let Inst{25-23} = major;
43  let Inst{22-20} = 0b110;
44  let Inst{19-16} = m;
45  let Inst{15-11} = ws;
46  let Inst{10-6} = wd;
47  let Inst{5-0} = minor;
48}
49
50class MSA_BIT_W_FMT<bits<3> major, bits<6> minor>: MSAInst {
51  bits<5> ws;
52  bits<5> wd;
53  bits<5> m;
54
55  let Inst{25-23} = major;
56  let Inst{22-21} = 0b10;
57  let Inst{20-16} = m;
58  let Inst{15-11} = ws;
59  let Inst{10-6} = wd;
60  let Inst{5-0} = minor;
61}
62
63class MSA_BIT_D_FMT<bits<3> major, bits<6> minor>: MSAInst {
64  bits<5> ws;
65  bits<5> wd;
66  bits<6> m;
67
68  let Inst{25-23} = major;
69  let Inst{22} = 0b0;
70  let Inst{21-16} = m;
71  let Inst{15-11} = ws;
72  let Inst{10-6} = wd;
73  let Inst{5-0} = minor;
74}
75
76class MSA_2R_FILL_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst {
77  bits<5> rs;
78  bits<5> wd;
79
80  let Inst{25-18} = major;
81  let Inst{17-16} = df;
82  let Inst{15-11} = rs;
83  let Inst{10-6} = wd;
84  let Inst{5-0} = minor;
85}
86
87class MSA_2R_FMT<bits<8> major, bits<2> df, bits<6> minor>: MSAInst {
88  bits<5> ws;
89  bits<5> wd;
90
91  let Inst{25-18} = major;
92  let Inst{17-16} = df;
93  let Inst{15-11} = ws;
94  let Inst{10-6} = wd;
95  let Inst{5-0} = minor;
96}
97
98class MSA_2RF_FMT<bits<9> major, bits<1> df, bits<6> minor>: MSAInst {
99  bits<5> ws;
100  bits<5> wd;
101
102  let Inst{25-17} = major;
103  let Inst{16} = df;
104  let Inst{15-11} = ws;
105  let Inst{10-6} = wd;
106  let Inst{5-0} = minor;
107}
108
109class MSA_3R_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
110  bits<5> wt;
111  bits<5> ws;
112  bits<5> wd;
113
114  let Inst{25-23} = major;
115  let Inst{22-21} = df;
116  let Inst{20-16} = wt;
117  let Inst{15-11} = ws;
118  let Inst{10-6} = wd;
119  let Inst{5-0} = minor;
120}
121
122class MSA_3RF_FMT<bits<4> major, bits<1> df, bits<6> minor>: MSAInst {
123  bits<5> wt;
124  bits<5> ws;
125  bits<5> wd;
126
127  let Inst{25-22} = major;
128  let Inst{21} = df;
129  let Inst{20-16} = wt;
130  let Inst{15-11} = ws;
131  let Inst{10-6} = wd;
132  let Inst{5-0} = minor;
133}
134
135class MSA_ELM_FMT<bits<10> major, bits<6> minor>: MSAInst {
136  let Inst{25-16} = major;
137  let Inst{5-0} = minor;
138}
139
140class MSA_ELM_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
141  bits<4> n;
142  bits<5> ws;
143  bits<5> wd;
144
145  let Inst{25-22} = major;
146  let Inst{21-20} = 0b00;
147  let Inst{19-16} = n{3-0};
148  let Inst{15-11} = ws;
149  let Inst{10-6} = wd;
150  let Inst{5-0} = minor;
151}
152
153class MSA_ELM_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
154  bits<4> n;
155  bits<5> ws;
156  bits<5> wd;
157
158  let Inst{25-22} = major;
159  let Inst{21-19} = 0b100;
160  let Inst{18-16} = n{2-0};
161  let Inst{15-11} = ws;
162  let Inst{10-6} = wd;
163  let Inst{5-0} = minor;
164}
165
166class MSA_ELM_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
167  bits<4> n;
168  bits<5> ws;
169  bits<5> wd;
170
171  let Inst{25-22} = major;
172  let Inst{21-18} = 0b1100;
173  let Inst{17-16} = n{1-0};
174  let Inst{15-11} = ws;
175  let Inst{10-6} = wd;
176  let Inst{5-0} = minor;
177}
178
179class MSA_ELM_D_FMT<bits<4> major, bits<6> minor>: MSAInst {
180  bits<4> n;
181  bits<5> ws;
182  bits<5> wd;
183
184  let Inst{25-22} = major;
185  let Inst{21-17} = 0b11100;
186  let Inst{16} = n{0};
187  let Inst{15-11} = ws;
188  let Inst{10-6} = wd;
189  let Inst{5-0} = minor;
190}
191
192class MSA_ELM_COPY_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
193  bits<4> n;
194  bits<5> ws;
195  bits<5> rd;
196
197  let Inst{25-22} = major;
198  let Inst{21-20} = 0b00;
199  let Inst{19-16} = n{3-0};
200  let Inst{15-11} = ws;
201  let Inst{10-6} = rd;
202  let Inst{5-0} = minor;
203}
204
205class MSA_ELM_COPY_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
206  bits<4> n;
207  bits<5> ws;
208  bits<5> rd;
209
210  let Inst{25-22} = major;
211  let Inst{21-19} = 0b100;
212  let Inst{18-16} = n{2-0};
213  let Inst{15-11} = ws;
214  let Inst{10-6} = rd;
215  let Inst{5-0} = minor;
216}
217
218class MSA_ELM_COPY_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
219  bits<4> n;
220  bits<5> ws;
221  bits<5> rd;
222
223  let Inst{25-22} = major;
224  let Inst{21-18} = 0b1100;
225  let Inst{17-16} = n{1-0};
226  let Inst{15-11} = ws;
227  let Inst{10-6} = rd;
228  let Inst{5-0} = minor;
229}
230
231class MSA_ELM_INSERT_B_FMT<bits<4> major, bits<6> minor>: MSAInst {
232  bits<6> n;
233  bits<5> rs;
234  bits<5> wd;
235
236  let Inst{25-22} = major;
237  let Inst{21-20} = 0b00;
238  let Inst{19-16} = n{3-0};
239  let Inst{15-11} = rs;
240  let Inst{10-6} = wd;
241  let Inst{5-0} = minor;
242}
243
244class MSA_ELM_INSERT_H_FMT<bits<4> major, bits<6> minor>: MSAInst {
245  bits<6> n;
246  bits<5> rs;
247  bits<5> wd;
248
249  let Inst{25-22} = major;
250  let Inst{21-19} = 0b100;
251  let Inst{18-16} = n{2-0};
252  let Inst{15-11} = rs;
253  let Inst{10-6} = wd;
254  let Inst{5-0} = minor;
255}
256
257class MSA_ELM_INSERT_W_FMT<bits<4> major, bits<6> minor>: MSAInst {
258  bits<6> n;
259  bits<5> rs;
260  bits<5> wd;
261
262  let Inst{25-22} = major;
263  let Inst{21-18} = 0b1100;
264  let Inst{17-16} = n{1-0};
265  let Inst{15-11} = rs;
266  let Inst{10-6} = wd;
267  let Inst{5-0} = minor;
268}
269
270class MSA_I5_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
271  bits<5> imm;
272  bits<5> ws;
273  bits<5> wd;
274
275  let Inst{25-23} = major;
276  let Inst{22-21} = df;
277  let Inst{20-16} = imm;
278  let Inst{15-11} = ws;
279  let Inst{10-6} = wd;
280  let Inst{5-0} = minor;
281}
282
283class MSA_I8_FMT<bits<2> major, bits<6> minor>: MSAInst {
284  bits<8> u8;
285  bits<5> ws;
286  bits<5> wd;
287
288  let Inst{25-24} = major;
289  let Inst{23-16} = u8;
290  let Inst{15-11} = ws;
291  let Inst{10-6} = wd;
292  let Inst{5-0} = minor;
293}
294
295class MSA_I10_FMT<bits<3> major, bits<2> df, bits<6> minor>: MSAInst {
296  let Inst{25-23} = major;
297  let Inst{22-21} = df;
298  let Inst{5-0} = minor;
299}
300
301class MSA_VEC_FMT<bits<5> major, bits<6> minor>: MSAInst {
302  bits<5> wt;
303  bits<5> ws;
304  bits<5> wd;
305
306  let Inst{25-21} = major;
307  let Inst{20-16} = wt;
308  let Inst{15-11} = ws;
309  let Inst{10-6} = wd;
310  let Inst{5-0} = minor;
311}
312
313class MSA_VECS10_FMT<bits<5> major, bits<6> minor>: MSAInst {
314  let Inst{25-21} = major;
315  let Inst{5-0} = minor;
316}
317
318class SPECIAL_LSA_FMT: MSAInst {
319  let Inst{25-21} = 0b000000;
320  let Inst{10-8} = 0b000;
321  let Inst{5-0} = 0b000101;
322}
323