1// LoongArchLSXInstrFormats.td - LoongArch LSX Instr Formats -*- tablegen -*-=//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9//===----------------------------------------------------------------------===//
10//  Describe LoongArch LSX instructions format
11//
12//  opcode       - operation code.
13//  vd/rd/cd     - destination register operand.
14//  {r/v}{j/k}   - source register operand.
15//  immN         - immediate data operand.
16//
17//===----------------------------------------------------------------------===//
18
19// 1RI13-type
20// <opcode | I13 | vd>
21class Fmt1RI13_VI<bits<32> op, dag outs, dag ins, string opnstr,
22                  list<dag> pattern = []>
23    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
24  bits<13> imm13;
25  bits<5> vd;
26
27  let Inst{31-0} = op;
28  let Inst{17-5} = imm13;
29  let Inst{4-0} = vd;
30}
31
32// 2R-type
33// <opcode | vj | vd>
34class Fmt2R_VV<bits<32> op, dag outs, dag ins, string opnstr,
35               list<dag> pattern = []>
36    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
37  bits<5> vj;
38  bits<5> vd;
39
40  let Inst{31-0} = op;
41  let Inst{9-5} = vj;
42  let Inst{4-0} = vd;
43}
44
45// <opcode | rj | vd>
46class Fmt2R_VR<bits<32> op, dag outs, dag ins, string opnstr,
47               list<dag> pattern = []>
48    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
49  bits<5> rj;
50  bits<5> vd;
51
52  let Inst{31-0} = op;
53  let Inst{9-5} = rj;
54  let Inst{4-0} = vd;
55}
56
57// <opcode | vj | cd>
58class Fmt2R_CV<bits<32> op, dag outs, dag ins, string opnstr,
59               list<dag> pattern = []>
60    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
61  bits<5> vj;
62  bits<3> cd;
63
64  let Inst{31-0} = op;
65  let Inst{9-5} = vj;
66  let Inst{2-0} = cd;
67}
68
69// 2RI1-type
70// <opcode | I1 | vj | vd>
71class Fmt2RI1_VVI<bits<32> op, dag outs, dag ins, string opnstr,
72                  list<dag> pattern = []>
73    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
74  bits<1> imm1;
75  bits<5> vj;
76  bits<5> vd;
77
78  let Inst{31-0} = op;
79  let Inst{10} = imm1;
80  let Inst{9-5} = vj;
81  let Inst{4-0} = vd;
82}
83
84// <opcode | I1 | rj | vd>
85class Fmt2RI1_VRI<bits<32> op, dag outs, dag ins, string opnstr,
86                  list<dag> pattern = []>
87    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
88  bits<1> imm1;
89  bits<5> rj;
90  bits<5> vd;
91
92  let Inst{31-0} = op;
93  let Inst{10} = imm1;
94  let Inst{9-5} = rj;
95  let Inst{4-0} = vd;
96}
97
98// <opcode | I1 | vj | rd>
99class Fmt2RI1_RVI<bits<32> op, dag outs, dag ins, string opnstr,
100                  list<dag> pattern = []>
101    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
102  bits<1> imm1;
103  bits<5> vj;
104  bits<5> rd;
105
106  let Inst{31-0} = op;
107  let Inst{10} = imm1;
108  let Inst{9-5} = vj;
109  let Inst{4-0} = rd;
110}
111
112// 2RI2-type
113// <opcode | I2 | vj | vd>
114class Fmt2RI2_VVI<bits<32> op, dag outs, dag ins, string opnstr,
115                  list<dag> pattern = []>
116    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
117  bits<2> imm2;
118  bits<5> vj;
119  bits<5> vd;
120
121  let Inst{31-0} = op;
122  let Inst{11-10} = imm2;
123  let Inst{9-5} = vj;
124  let Inst{4-0} = vd;
125}
126
127// <opcode | I2 | rj | vd>
128class Fmt2RI2_VRI<bits<32> op, dag outs, dag ins, string opnstr,
129                  list<dag> pattern = []>
130    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
131  bits<2> imm2;
132  bits<5> rj;
133  bits<5> vd;
134
135  let Inst{31-0} = op;
136  let Inst{11-10} = imm2;
137  let Inst{9-5} = rj;
138  let Inst{4-0} = vd;
139}
140
141// <opcode | I2 | vj | rd>
142class Fmt2RI2_RVI<bits<32> op, dag outs, dag ins, string opnstr,
143                  list<dag> pattern = []>
144    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
145  bits<2> imm2;
146  bits<5> vj;
147  bits<5> rd;
148
149  let Inst{31-0} = op;
150  let Inst{11-10} = imm2;
151  let Inst{9-5} = vj;
152  let Inst{4-0} = rd;
153}
154
155// 2RI3-type
156// <opcode | I3 | vj | vd>
157class Fmt2RI3_VVI<bits<32> op, dag outs, dag ins, string opnstr,
158                  list<dag> pattern = []>
159    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
160  bits<3> imm3;
161  bits<5> vj;
162  bits<5> vd;
163
164  let Inst{31-0} = op;
165  let Inst{12-10} = imm3;
166  let Inst{9-5} = vj;
167  let Inst{4-0} = vd;
168}
169
170// <opcode | I3 | rj | vd>
171class Fmt2RI3_VRI<bits<32> op, dag outs, dag ins, string opnstr,
172                  list<dag> pattern = []>
173    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
174  bits<3> imm3;
175  bits<5> rj;
176  bits<5> vd;
177
178  let Inst{31-0} = op;
179  let Inst{12-10} = imm3;
180  let Inst{9-5} = rj;
181  let Inst{4-0} = vd;
182}
183
184// <opcode | I3 | vj | rd>
185class Fmt2RI3_RVI<bits<32> op, dag outs, dag ins, string opnstr,
186                  list<dag> pattern = []>
187    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
188  bits<3> imm3;
189  bits<5> vj;
190  bits<5> rd;
191
192  let Inst{31-0} = op;
193  let Inst{12-10} = imm3;
194  let Inst{9-5} = vj;
195  let Inst{4-0} = rd;
196}
197
198// 2RI4-type
199// <opcode | I4 | vj | vd>
200class Fmt2RI4_VVI<bits<32> op, dag outs, dag ins, string opnstr,
201                  list<dag> pattern = []>
202    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
203  bits<4> imm4;
204  bits<5> vj;
205  bits<5> vd;
206
207  let Inst{31-0} = op;
208  let Inst{13-10} = imm4;
209  let Inst{9-5} = vj;
210  let Inst{4-0} = vd;
211}
212
213// <opcode | I4 | rj | vd>
214class Fmt2RI4_VRI<bits<32> op, dag outs, dag ins, string opnstr,
215                  list<dag> pattern = []>
216    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
217  bits<4> imm4;
218  bits<5> rj;
219  bits<5> vd;
220
221  let Inst{31-0} = op;
222  let Inst{13-10} = imm4;
223  let Inst{9-5} = rj;
224  let Inst{4-0} = vd;
225}
226
227// <opcode | I4 | vj | rd>
228class Fmt2RI4_RVI<bits<32> op, dag outs, dag ins, string opnstr,
229                  list<dag> pattern = []>
230    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
231  bits<4> imm4;
232  bits<5> vj;
233  bits<5> rd;
234
235  let Inst{31-0} = op;
236  let Inst{13-10} = imm4;
237  let Inst{9-5} = vj;
238  let Inst{4-0} = rd;
239}
240
241// 2RI5-type
242// <opcode | I5 | vj | vd>
243class Fmt2RI5_VVI<bits<32> op, dag outs, dag ins, string opnstr,
244                  list<dag> pattern = []>
245    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
246  bits<5> imm5;
247  bits<5> vj;
248  bits<5> vd;
249
250  let Inst{31-0} = op;
251  let Inst{14-10} = imm5;
252  let Inst{9-5} = vj;
253  let Inst{4-0} = vd;
254}
255
256// 2RI6-type
257// <opcode | I6 | vj | vd>
258class Fmt2RI6_VVI<bits<32> op, dag outs, dag ins, string opnstr,
259                  list<dag> pattern = []>
260    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
261  bits<6> imm6;
262  bits<5> vj;
263  bits<5> vd;
264
265  let Inst{31-0} = op;
266  let Inst{15-10} = imm6;
267  let Inst{9-5} = vj;
268  let Inst{4-0} = vd;
269}
270
271// 2RI7-type
272// <opcode | I7 | vj | vd>
273class Fmt2RI7_VVI<bits<32> op, dag outs, dag ins, string opnstr,
274                  list<dag> pattern = []>
275    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
276  bits<7> imm7;
277  bits<5> vj;
278  bits<5> vd;
279
280  let Inst{31-0} = op;
281  let Inst{16-10} = imm7;
282  let Inst{9-5} = vj;
283  let Inst{4-0} = vd;
284}
285
286// 2RI8-type
287// <opcode | I8 | vj | vd>
288class Fmt2RI8_VVI<bits<32> op, dag outs, dag ins, string opnstr,
289                  list<dag> pattern = []>
290    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
291  bits<8> imm8;
292  bits<5> vj;
293  bits<5> vd;
294
295  let Inst{31-0} = op;
296  let Inst{17-10} = imm8;
297  let Inst{9-5} = vj;
298  let Inst{4-0} = vd;
299}
300
301// 2RI8I1-type
302// <opcode | I1 | I8 | vj | vd>
303class Fmt2RI8I1_VRII<bits<32> op, dag outs, dag ins, string opnstr,
304                     list<dag> pattern = []>
305    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
306  bits<1> imm1;
307  bits<8> imm8;
308  bits<5> rj;
309  bits<5> vd;
310
311  let Inst{31-0} = op;
312  let Inst{18} = imm1;
313  let Inst{17-10} = imm8;
314  let Inst{9-5} = rj;
315  let Inst{4-0} = vd;
316}
317
318// 2RI8I2-type
319// <opcode | I2 | I8 | vj | vd>
320class Fmt2RI8I2_VRII<bits<32> op, dag outs, dag ins, string opnstr,
321                     list<dag> pattern = []>
322    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
323  bits<2> imm2;
324  bits<8> imm8;
325  bits<5> rj;
326  bits<5> vd;
327
328  let Inst{31-0} = op;
329  let Inst{19-18} = imm2;
330  let Inst{17-10} = imm8;
331  let Inst{9-5} = rj;
332  let Inst{4-0} = vd;
333}
334
335// 2RI8I3-type
336// <opcode | I3 | I8 | vj | vd>
337class Fmt2RI8I3_VRII<bits<32> op, dag outs, dag ins, string opnstr,
338                     list<dag> pattern = []>
339    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
340  bits<3> imm3;
341  bits<8> imm8;
342  bits<5> rj;
343  bits<5> vd;
344
345  let Inst{31-0} = op;
346  let Inst{20-18} = imm3;
347  let Inst{17-10} = imm8;
348  let Inst{9-5} = rj;
349  let Inst{4-0} = vd;
350}
351
352// 2RI8I4-type
353// <opcode | I4 | I8 | vj | vd>
354class Fmt2RI8I4_VRII<bits<32> op, dag outs, dag ins, string opnstr,
355                     list<dag> pattern = []>
356    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
357  bits<4> imm4;
358  bits<8> imm8;
359  bits<5> rj;
360  bits<5> vd;
361
362  let Inst{31-0} = op;
363  let Inst{21-18} = imm4;
364  let Inst{17-10} = imm8;
365  let Inst{9-5} = rj;
366  let Inst{4-0} = vd;
367}
368// 2RI9-type
369// <opcode | I9 | rj | vd>
370class Fmt2RI9_VRI<bits<32> op, dag outs, dag ins, string opnstr,
371                  list<dag> pattern = []>
372    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
373  bits<9> imm9;
374  bits<5> rj;
375  bits<5> vd;
376
377  let Inst{31-0} = op;
378  let Inst{18-10} = imm9;
379  let Inst{9-5} = rj;
380  let Inst{4-0} = vd;
381}
382
383// 2RI10-type
384// <opcode | I10 | rj | vd>
385class Fmt2RI10_VRI<bits<32> op, dag outs, dag ins, string opnstr,
386                  list<dag> pattern = []>
387    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
388  bits<10> imm10;
389  bits<5> rj;
390  bits<5> vd;
391
392  let Inst{31-0} = op;
393  let Inst{19-10} = imm10;
394  let Inst{9-5} = rj;
395  let Inst{4-0} = vd;
396}
397
398// 2RI11-type
399// <opcode | I11 | rj | vd>
400class Fmt2RI11_VRI<bits<32> op, dag outs, dag ins, string opnstr,
401                  list<dag> pattern = []>
402    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
403  bits<11> imm11;
404  bits<5> rj;
405  bits<5> vd;
406
407  let Inst{31-0} = op;
408  let Inst{20-10} = imm11;
409  let Inst{9-5} = rj;
410  let Inst{4-0} = vd;
411}
412
413// 2RI12-type
414// <opcode | I12 | rj | vd>
415class Fmt2RI12_VRI<bits<32> op, dag outs, dag ins, string opnstr,
416                  list<dag> pattern = []>
417    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
418  bits<12> imm12;
419  bits<5> rj;
420  bits<5> vd;
421
422  let Inst{31-0} = op;
423  let Inst{21-10} = imm12;
424  let Inst{9-5} = rj;
425  let Inst{4-0} = vd;
426}
427
428// 3R-type
429// <opcode | vk | vj | vd>
430class Fmt3R_VVV<bits<32> op, dag outs, dag ins, string opnstr,
431                list<dag> pattern = []>
432    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
433  bits<5> vk;
434  bits<5> vj;
435  bits<5> vd;
436
437  let Inst{31-0} = op;
438  let Inst{14-10} = vk;
439  let Inst{9-5} = vj;
440  let Inst{4-0} = vd;
441}
442
443// <opcode | rk | vj | vd>
444class Fmt3R_VVR<bits<32> op, dag outs, dag ins, string opnstr,
445                list<dag> pattern = []>
446    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
447  bits<5> rk;
448  bits<5> vj;
449  bits<5> vd;
450
451  let Inst{31-0} = op;
452  let Inst{14-10} = rk;
453  let Inst{9-5} = vj;
454  let Inst{4-0} = vd;
455}
456
457// <opcode | rk | rj | vd>
458class Fmt3R_VRR<bits<32> op, dag outs, dag ins, string opnstr,
459                list<dag> pattern = []>
460    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
461  bits<5> rk;
462  bits<5> rj;
463  bits<5> vd;
464
465  let Inst{31-0} = op;
466  let Inst{14-10} = rk;
467  let Inst{9-5} = rj;
468  let Inst{4-0} = vd;
469}
470
471// 4R-type
472// <opcode | va | vk | vj | vd>
473class Fmt4R_VVVV<bits<32> op, dag outs, dag ins, string opnstr,
474                 list<dag> pattern = []>
475    : LAInst<outs, ins, deriveInsnMnemonic<NAME>.ret, opnstr, pattern> {
476  bits<5> va;
477  bits<5> vk;
478  bits<5> vj;
479  bits<5> vd;
480
481  let Inst{31-0} = op;
482  let Inst{19-15} = va;
483  let Inst{14-10} = vk;
484  let Inst{9-5} = vj;
485  let Inst{4-0} = vd;
486}
487