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