[mips][msa] Added lsa instruction
[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 PseudoMSA<dag outs, dag ins, list<dag> pattern,
19                 InstrItinClass itin = IIPseudo>:
20   MipsPseudo<outs, ins, pattern, itin> {
21   let Predicates = [HasMSA];
22 }
23
24 class 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
37 class 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
50 class 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
63 class 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
76 class 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
87 class 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
98 class 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
109 class 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
122 class 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
135 class MSA_ELM_FMT<bits<10> major, bits<6> minor>: MSAInst {
136   let Inst{25-16} = major;
137   let Inst{5-0} = minor;
138 }
139
140 class 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
153 class 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
166 class 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
179 class 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
192 class 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
205 class 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
218 class 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
231 class 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
244 class 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
257 class 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
270 class 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
283 class 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
295 class 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
301 class 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
313 class MSA_VECS10_FMT<bits<5> major, bits<6> minor>: MSAInst {
314   let Inst{25-21} = major;
315   let Inst{5-0} = minor;
316 }
317
318 class SPECIAL_LSA_FMT: MSAInst {
319   let Inst{25-21} = 0b000000;
320   let Inst{10-8} = 0b000;
321   let Inst{5-0} = 0b000101;
322 }