xref: /freebsd/contrib/llvm-project/llvm/lib/Target/Mips/MicroMipsDSPInstrFormats.td (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
1*0b57cec5SDimitry Andric//===-- MicroMipsDSPInstrFormats.td - Instruction Formats --*- tablegen -*-===//
2*0b57cec5SDimitry Andric//
3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*0b57cec5SDimitry Andric//
7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
8*0b57cec5SDimitry Andric
9*0b57cec5SDimitry Andricclass MMDSPInst<string opstr = "">
10*0b57cec5SDimitry Andric    : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther> {
11*0b57cec5SDimitry Andric  let ASEPredicate = [HasDSP];
12*0b57cec5SDimitry Andric  let EncodingPredicates = [InMicroMips];
13*0b57cec5SDimitry Andric  string BaseOpcode = opstr;
14*0b57cec5SDimitry Andric  string Arch = "mmdsp";
15*0b57cec5SDimitry Andric  let DecoderNamespace = "MicroMips";
16*0b57cec5SDimitry Andric}
17*0b57cec5SDimitry Andric
18*0b57cec5SDimitry Andricclass MMDSPInstAlias<string Asm, dag Result, bit Emit = 0b1>
19*0b57cec5SDimitry Andric    : InstAlias<Asm, Result, Emit>, PredicateControl {
20*0b57cec5SDimitry Andric  let ASEPredicate = [HasDSP];
21*0b57cec5SDimitry Andric  let AdditionalPredicates = [InMicroMips];
22*0b57cec5SDimitry Andric}
23*0b57cec5SDimitry Andric
24*0b57cec5SDimitry Andricclass POOL32A_3R_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
25*0b57cec5SDimitry Andric  bits<5> rd;
26*0b57cec5SDimitry Andric  bits<5> rs;
27*0b57cec5SDimitry Andric  bits<5> rt;
28*0b57cec5SDimitry Andric
29*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
30*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
31*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
32*0b57cec5SDimitry Andric  let Inst{15-11} = rd;
33*0b57cec5SDimitry Andric  let Inst{10-0}  = op;
34*0b57cec5SDimitry Andric}
35*0b57cec5SDimitry Andric
36*0b57cec5SDimitry Andricclass POOL32A_2R_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
37*0b57cec5SDimitry Andric  bits<5> rt;
38*0b57cec5SDimitry Andric  bits<5> rs;
39*0b57cec5SDimitry Andric
40*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
41*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
42*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
43*0b57cec5SDimitry Andric  let Inst{15-6}  = op;
44*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
45*0b57cec5SDimitry Andric}
46*0b57cec5SDimitry Andric
47*0b57cec5SDimitry Andricclass POOL32A_2RAC_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
48*0b57cec5SDimitry Andric  bits<5> rt;
49*0b57cec5SDimitry Andric  bits<5> rs;
50*0b57cec5SDimitry Andric  bits<2> ac;
51*0b57cec5SDimitry Andric
52*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
53*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
54*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
55*0b57cec5SDimitry Andric  let Inst{15-14} = ac;
56*0b57cec5SDimitry Andric  let Inst{13-6}  = op;
57*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
58*0b57cec5SDimitry Andric}
59*0b57cec5SDimitry Andric
60*0b57cec5SDimitry Andricclass POOL32A_3RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
61*0b57cec5SDimitry Andric  bits<5> rd;
62*0b57cec5SDimitry Andric  bits<5> rs;
63*0b57cec5SDimitry Andric  bits<5> rt;
64*0b57cec5SDimitry Andric
65*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
66*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
67*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
68*0b57cec5SDimitry Andric  let Inst{15-11} = rd;
69*0b57cec5SDimitry Andric  let Inst{10}    = 0b0;
70*0b57cec5SDimitry Andric  let Inst{9-0}   = op;
71*0b57cec5SDimitry Andric}
72*0b57cec5SDimitry Andric
73*0b57cec5SDimitry Andricclass POOL32A_2RSA4_FMT<string opstr, bits<12> op> : MMDSPInst<opstr> {
74*0b57cec5SDimitry Andric  bits<5> rt;
75*0b57cec5SDimitry Andric  bits<5> rs;
76*0b57cec5SDimitry Andric  bits<4> sa;
77*0b57cec5SDimitry Andric
78*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
79*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
80*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
81*0b57cec5SDimitry Andric  let Inst{15-12} = sa;
82*0b57cec5SDimitry Andric  let Inst{11-0}  = op;
83*0b57cec5SDimitry Andric}
84*0b57cec5SDimitry Andric
85*0b57cec5SDimitry Andricclass POOL32A_2RSA3_FMT<string opstr, bits<7> op> : MMDSPInst<opstr> {
86*0b57cec5SDimitry Andric  bits<5> rt;
87*0b57cec5SDimitry Andric  bits<5> rs;
88*0b57cec5SDimitry Andric  bits<3> sa;
89*0b57cec5SDimitry Andric
90*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
91*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
92*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
93*0b57cec5SDimitry Andric  let Inst{15-13} = sa;
94*0b57cec5SDimitry Andric  let Inst{12-6}  = op;
95*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
96*0b57cec5SDimitry Andric}
97*0b57cec5SDimitry Andric
98*0b57cec5SDimitry Andricclass POOL32A_2RSA5B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
99*0b57cec5SDimitry Andric  bits<5> rt;
100*0b57cec5SDimitry Andric  bits<5> rs;
101*0b57cec5SDimitry Andric  bits<5> sa;
102*0b57cec5SDimitry Andric
103*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
104*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
105*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
106*0b57cec5SDimitry Andric  let Inst{15-11} = sa;
107*0b57cec5SDimitry Andric  let Inst{10}    = 0b0;
108*0b57cec5SDimitry Andric  let Inst{9-0}   = op;
109*0b57cec5SDimitry Andric}
110*0b57cec5SDimitry Andric
111*0b57cec5SDimitry Andricclass POOL32A_2RSA4B0_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
112*0b57cec5SDimitry Andric  bits<5> rt;
113*0b57cec5SDimitry Andric  bits<5> rs;
114*0b57cec5SDimitry Andric  bits<4> sa;
115*0b57cec5SDimitry Andric
116*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
117*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
118*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
119*0b57cec5SDimitry Andric  let Inst{15-12} = sa;
120*0b57cec5SDimitry Andric  let Inst{11}    = 0b0;
121*0b57cec5SDimitry Andric  let Inst{10-0}  = op;
122*0b57cec5SDimitry Andric}
123*0b57cec5SDimitry Andric
124*0b57cec5SDimitry Andricclass POOL32A_2RSA4OP6_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> {
125*0b57cec5SDimitry Andric  bits<5> rt;
126*0b57cec5SDimitry Andric  bits<5> rs;
127*0b57cec5SDimitry Andric  bits<4> sa;
128*0b57cec5SDimitry Andric
129*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
130*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
131*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
132*0b57cec5SDimitry Andric  let Inst{15-12} = sa;
133*0b57cec5SDimitry Andric  let Inst{11-6}  = op;
134*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
135*0b57cec5SDimitry Andric}
136*0b57cec5SDimitry Andric
137*0b57cec5SDimitry Andricclass POOL32A_1RIMM5AC_FMT<string opstr, bits<8> funct> : MMDSPInst<opstr> {
138*0b57cec5SDimitry Andric  bits<5> rt;
139*0b57cec5SDimitry Andric  bits<5> imm;
140*0b57cec5SDimitry Andric  bits<2> ac;
141*0b57cec5SDimitry Andric
142*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
143*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
144*0b57cec5SDimitry Andric  let Inst{20-16} = imm;
145*0b57cec5SDimitry Andric  let Inst{15-14} = ac;
146*0b57cec5SDimitry Andric  let Inst{13-6}  = funct;
147*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
148*0b57cec5SDimitry Andric}
149*0b57cec5SDimitry Andric
150*0b57cec5SDimitry Andricclass POOL32A_2RSA5_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
151*0b57cec5SDimitry Andric  bits<5> rt;
152*0b57cec5SDimitry Andric  bits<5> rs;
153*0b57cec5SDimitry Andric  bits<5> sa;
154*0b57cec5SDimitry Andric
155*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
156*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
157*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
158*0b57cec5SDimitry Andric  let Inst{15-11} = sa;
159*0b57cec5SDimitry Andric  let Inst{10-0}  = op;
160*0b57cec5SDimitry Andric}
161*0b57cec5SDimitry Andric
162*0b57cec5SDimitry Andricclass POOL32A_1RMEMB0_FMT<string opstr, bits<10> funct> : MMDSPInst<opstr> {
163*0b57cec5SDimitry Andric  bits<5> index;
164*0b57cec5SDimitry Andric  bits<5> base;
165*0b57cec5SDimitry Andric  bits<5> rd;
166*0b57cec5SDimitry Andric
167*0b57cec5SDimitry Andric  let Inst{31-26} = 0;
168*0b57cec5SDimitry Andric  let Inst{25-21} = index;
169*0b57cec5SDimitry Andric  let Inst{20-16} = base;
170*0b57cec5SDimitry Andric  let Inst{15-11} = rd;
171*0b57cec5SDimitry Andric  let Inst{10}    = 0b0;
172*0b57cec5SDimitry Andric  let Inst{9-0}   = funct;
173*0b57cec5SDimitry Andric}
174*0b57cec5SDimitry Andric
175*0b57cec5SDimitry Andricclass POOL32A_1RAC_FMT<string instr_asm, bits<8> funct> : MMDSPInst<instr_asm> {
176*0b57cec5SDimitry Andric  bits<5> rs;
177*0b57cec5SDimitry Andric  bits<2> ac;
178*0b57cec5SDimitry Andric
179*0b57cec5SDimitry Andric  let Inst{31-26} = 0;
180*0b57cec5SDimitry Andric  let Inst{25-21} = 0;
181*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
182*0b57cec5SDimitry Andric  let Inst{15-14} = ac;
183*0b57cec5SDimitry Andric  let Inst{13-6}  = funct;
184*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
185*0b57cec5SDimitry Andric}
186*0b57cec5SDimitry Andric
187*0b57cec5SDimitry Andricclass POOL32A_1RMASK7_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
188*0b57cec5SDimitry Andric  bits<5> rt;
189*0b57cec5SDimitry Andric  bits<7> mask;
190*0b57cec5SDimitry Andric
191*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
192*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
193*0b57cec5SDimitry Andric  let Inst{20-14} = mask;
194*0b57cec5SDimitry Andric  let Inst{13-6}  = op;
195*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
196*0b57cec5SDimitry Andric}
197*0b57cec5SDimitry Andric
198*0b57cec5SDimitry Andricclass POOL32A_1RIMM10_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
199*0b57cec5SDimitry Andric  bits<5> rd;
200*0b57cec5SDimitry Andric  bits<10> imm;
201*0b57cec5SDimitry Andric
202*0b57cec5SDimitry Andric  let Inst{31-26} = 0;
203*0b57cec5SDimitry Andric  let Inst{25-16} = imm;
204*0b57cec5SDimitry Andric  let Inst{15-11} = rd;
205*0b57cec5SDimitry Andric  let Inst{10}    = 0;
206*0b57cec5SDimitry Andric  let Inst{9-0}   = op;
207*0b57cec5SDimitry Andric}
208*0b57cec5SDimitry Andric
209*0b57cec5SDimitry Andricclass POOL32A_1RIMM8_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> {
210*0b57cec5SDimitry Andric  bits<5> rt;
211*0b57cec5SDimitry Andric  bits<8> imm;
212*0b57cec5SDimitry Andric
213*0b57cec5SDimitry Andric  let Inst{31-26} = 0;
214*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
215*0b57cec5SDimitry Andric  let Inst{20-13} = imm;
216*0b57cec5SDimitry Andric  let Inst{12}    = 0;
217*0b57cec5SDimitry Andric  let Inst{11-6}  = op;
218*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
219*0b57cec5SDimitry Andric}
220*0b57cec5SDimitry Andric
221*0b57cec5SDimitry Andricclass POOL32A_4B0SHIFT6AC4B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
222*0b57cec5SDimitry Andric  bits<6> shift;
223*0b57cec5SDimitry Andric  bits<2> ac;
224*0b57cec5SDimitry Andric
225*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
226*0b57cec5SDimitry Andric  let Inst{25-22} = 0b0000;
227*0b57cec5SDimitry Andric  let Inst{21-16} = shift;
228*0b57cec5SDimitry Andric  let Inst{15-14} = ac;
229*0b57cec5SDimitry Andric  let Inst{13-10} = 0b0000;
230*0b57cec5SDimitry Andric  let Inst{9-0}   = op;
231*0b57cec5SDimitry Andric}
232*0b57cec5SDimitry Andric
233*0b57cec5SDimitry Andricclass POOL32A_5B01RAC_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
234*0b57cec5SDimitry Andric  bits<5> rs;
235*0b57cec5SDimitry Andric  bits<2> ac;
236*0b57cec5SDimitry Andric
237*0b57cec5SDimitry Andric  let Inst{31-26} = 0b000000;
238*0b57cec5SDimitry Andric  let Inst{25-21} = 0b00000;
239*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
240*0b57cec5SDimitry Andric  let Inst{15-14} = ac;
241*0b57cec5SDimitry Andric  let Inst{13-6}  = op;
242*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
243*0b57cec5SDimitry Andric}
244*0b57cec5SDimitry Andric
245*0b57cec5SDimitry Andricclass POOL32I_IMMB0_FMT<string opstr, bits<5> op> : MMDSPInst<opstr> {
246*0b57cec5SDimitry Andric  bits<16> offset;
247*0b57cec5SDimitry Andric
248*0b57cec5SDimitry Andric  let Inst{31-26} = 0b010000;
249*0b57cec5SDimitry Andric  let Inst{25-21} = op;
250*0b57cec5SDimitry Andric  let Inst{20-16} = 0;
251*0b57cec5SDimitry Andric  let Inst{15-0}  = offset;
252*0b57cec5SDimitry Andric}
253*0b57cec5SDimitry Andric
254*0b57cec5SDimitry Andricclass POOL32A_2RBP_FMT<string opstr> : MMDSPInst<opstr> {
255*0b57cec5SDimitry Andric  bits<5> rt;
256*0b57cec5SDimitry Andric  bits<5> rs;
257*0b57cec5SDimitry Andric  bits<2> bp;
258*0b57cec5SDimitry Andric
259*0b57cec5SDimitry Andric  let Inst{31-26} = 0;
260*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
261*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
262*0b57cec5SDimitry Andric  let Inst{15-14} = bp;
263*0b57cec5SDimitry Andric  let Inst{13-6}  = 0b00100010;
264*0b57cec5SDimitry Andric  let Inst{5-0}   = 0b111100;
265*0b57cec5SDimitry Andric}
266*0b57cec5SDimitry Andric
267*0b57cec5SDimitry Andricclass POOL32A_2RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
268*0b57cec5SDimitry Andric  bits<5> rt;
269*0b57cec5SDimitry Andric  bits<5> rs;
270*0b57cec5SDimitry Andric
271*0b57cec5SDimitry Andric  let Inst{31-26} = 0;
272*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
273*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
274*0b57cec5SDimitry Andric  let Inst{15-10} = 0;
275*0b57cec5SDimitry Andric  let Inst{9-0}   = op;
276*0b57cec5SDimitry Andric}
277*0b57cec5SDimitry Andric
278*0b57cec5SDimitry Andricclass POOL32S_3RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
279*0b57cec5SDimitry Andric  bits<5> rt;
280*0b57cec5SDimitry Andric  bits<5> rs;
281*0b57cec5SDimitry Andric  bits<5> rd;
282*0b57cec5SDimitry Andric
283*0b57cec5SDimitry Andric  let Inst{31-26} = 0b010110;
284*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
285*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
286*0b57cec5SDimitry Andric  let Inst{15-11} = rd;
287*0b57cec5SDimitry Andric  let Inst{10}    = 0b0;
288*0b57cec5SDimitry Andric  let Inst{9-0}   = op;
289*0b57cec5SDimitry Andric}
290*0b57cec5SDimitry Andric
291*0b57cec5SDimitry Andricclass POOL32A_2R2B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
292*0b57cec5SDimitry Andric  bits<5> rt;
293*0b57cec5SDimitry Andric  bits<5> rs;
294*0b57cec5SDimitry Andric
295*0b57cec5SDimitry Andric  let Inst{31-26} = 0;
296*0b57cec5SDimitry Andric  let Inst{25-21} = rt;
297*0b57cec5SDimitry Andric  let Inst{20-16} = rs;
298*0b57cec5SDimitry Andric  let Inst{15-11} = 0;
299*0b57cec5SDimitry Andric  let Inst{10}    = 0;
300*0b57cec5SDimitry Andric  let Inst{9-0}   = op;
301*0b57cec5SDimitry Andric}
302