1292915Sdim//===-- MicroMipsDSPInstrFormats.td - Instruction Formats --*- tablegen -*-===//
2292915Sdim//
3292915Sdim//                     The LLVM Compiler Infrastructure
4292915Sdim//
5292915Sdim// This file is distributed under the University of Illinois Open Source
6292915Sdim// License. See LICENSE.TXT for details.
7292915Sdim//
8292915Sdim//===----------------------------------------------------------------------===//
9292915Sdim
10292915Sdimclass MMDSPInst<string opstr = "">
11292915Sdim    : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther>, PredicateControl {
12292915Sdim  let InsnPredicates = [HasDSP];
13292915Sdim  let AdditionalPredicates = [InMicroMips];
14292915Sdim  string BaseOpcode = opstr;
15292915Sdim  string Arch = "mmdsp";
16292915Sdim  let DecoderNamespace = "MicroMips";
17292915Sdim}
18292915Sdim
19292915Sdimclass MMDSPInstAlias<string Asm, dag Result, bit Emit = 0b1>
20292915Sdim    : InstAlias<Asm, Result, Emit>, PredicateControl {
21292915Sdim  let InsnPredicates = [HasDSP];
22292915Sdim  let AdditionalPredicates = [InMicroMips];
23292915Sdim}
24292915Sdim
25292915Sdimclass POOL32A_3R_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
26292915Sdim  bits<5> rd;
27292915Sdim  bits<5> rs;
28292915Sdim  bits<5> rt;
29292915Sdim
30292915Sdim  let Inst{31-26} = 0b000000;
31292915Sdim  let Inst{25-21} = rt;
32292915Sdim  let Inst{20-16} = rs;
33292915Sdim  let Inst{15-11} = rd;
34292915Sdim  let Inst{10-0}  = op;
35292915Sdim}
36292915Sdim
37292915Sdimclass POOL32A_2R_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
38292915Sdim  bits<5> rt;
39292915Sdim  bits<5> rs;
40292915Sdim
41292915Sdim  let Inst{31-26} = 0b000000;
42292915Sdim  let Inst{25-21} = rt;
43292915Sdim  let Inst{20-16} = rs;
44292915Sdim  let Inst{15-6}  = op;
45292915Sdim  let Inst{5-0}   = 0b111100;
46292915Sdim}
47292915Sdim
48292915Sdimclass POOL32A_2RAC_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
49292915Sdim  bits<5> rt;
50292915Sdim  bits<5> rs;
51292915Sdim  bits<2> ac;
52292915Sdim
53292915Sdim  let Inst{31-26} = 0b000000;
54292915Sdim  let Inst{25-21} = rt;
55292915Sdim  let Inst{20-16} = rs;
56292915Sdim  let Inst{15-14} = ac;
57292915Sdim  let Inst{13-6}  = op;
58292915Sdim  let Inst{5-0}   = 0b111100;
59292915Sdim}
60292915Sdim
61292915Sdimclass POOL32A_3RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
62292915Sdim  bits<5> rd;
63292915Sdim  bits<5> rs;
64292915Sdim  bits<5> rt;
65292915Sdim
66292915Sdim  let Inst{31-26} = 0b000000;
67292915Sdim  let Inst{25-21} = rt;
68292915Sdim  let Inst{20-16} = rs;
69292915Sdim  let Inst{15-11} = rd;
70292915Sdim  let Inst{10}    = 0b0;
71292915Sdim  let Inst{9-0}   = op;
72292915Sdim}
73292915Sdim
74292915Sdimclass POOL32A_2RSA4_FMT<string opstr, bits<12> op> : MMDSPInst<opstr> {
75292915Sdim  bits<5> rt;
76292915Sdim  bits<5> rs;
77292915Sdim  bits<4> sa;
78292915Sdim
79292915Sdim  let Inst{31-26} = 0b000000;
80292915Sdim  let Inst{25-21} = rt;
81292915Sdim  let Inst{20-16} = rs;
82292915Sdim  let Inst{15-12} = sa;
83292915Sdim  let Inst{11-0}  = op;
84292915Sdim}
85292915Sdim
86292915Sdimclass POOL32A_2RSA3_FMT<string opstr, bits<7> op> : MMDSPInst<opstr> {
87292915Sdim  bits<5> rt;
88292915Sdim  bits<5> rs;
89292915Sdim  bits<3> sa;
90292915Sdim
91292915Sdim  let Inst{31-26} = 0b000000;
92292915Sdim  let Inst{25-21} = rt;
93292915Sdim  let Inst{20-16} = rs;
94292915Sdim  let Inst{15-13} = sa;
95292915Sdim  let Inst{12-6}  = op;
96292915Sdim  let Inst{5-0}   = 0b111100;
97292915Sdim}
98292915Sdim
99292915Sdimclass POOL32A_2RSA5B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
100292915Sdim  bits<5> rt;
101292915Sdim  bits<5> rs;
102292915Sdim  bits<5> sa;
103292915Sdim
104292915Sdim  let Inst{31-26} = 0b000000;
105292915Sdim  let Inst{25-21} = rt;
106292915Sdim  let Inst{20-16} = rs;
107292915Sdim  let Inst{15-11} = sa;
108292915Sdim  let Inst{10}    = 0b0;
109292915Sdim  let Inst{9-0}   = op;
110292915Sdim}
111292915Sdim
112292915Sdimclass POOL32A_2RSA4B0_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
113292915Sdim  bits<5> rt;
114292915Sdim  bits<5> rs;
115292915Sdim  bits<4> sa;
116292915Sdim
117292915Sdim  let Inst{31-26} = 0b000000;
118292915Sdim  let Inst{25-21} = rt;
119292915Sdim  let Inst{20-16} = rs;
120292915Sdim  let Inst{15-12} = sa;
121292915Sdim  let Inst{11}    = 0b0;
122292915Sdim  let Inst{10-0}  = op;
123292915Sdim}
124292915Sdim
125292915Sdimclass POOL32A_2RSA4OP6_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> {
126292915Sdim  bits<5> rt;
127292915Sdim  bits<5> rs;
128292915Sdim  bits<4> sa;
129292915Sdim
130292915Sdim  let Inst{31-26} = 0b000000;
131292915Sdim  let Inst{25-21} = rt;
132292915Sdim  let Inst{20-16} = rs;
133292915Sdim  let Inst{15-12} = sa;
134292915Sdim  let Inst{11-6}  = op;
135292915Sdim  let Inst{5-0}   = 0b111100;
136292915Sdim}
137292915Sdim
138292915Sdimclass POOL32A_1RIMM5AC_FMT<string opstr, bits<8> funct> : MMDSPInst<opstr> {
139292915Sdim  bits<5> rt;
140292915Sdim  bits<5> imm;
141292915Sdim  bits<2> ac;
142292915Sdim
143292915Sdim  let Inst{31-26} = 0b000000;
144292915Sdim  let Inst{25-21} = rt;
145292915Sdim  let Inst{20-16} = imm;
146292915Sdim  let Inst{15-14} = ac;
147292915Sdim  let Inst{13-6}  = funct;
148292915Sdim  let Inst{5-0}   = 0b111100;
149292915Sdim}
150292915Sdim
151292915Sdimclass POOL32A_2RSA5_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
152292915Sdim  bits<5> rt;
153292915Sdim  bits<5> rs;
154292915Sdim  bits<5> sa;
155292915Sdim
156292915Sdim  let Inst{31-26} = 0b000000;
157292915Sdim  let Inst{25-21} = rt;
158292915Sdim  let Inst{20-16} = rs;
159292915Sdim  let Inst{15-11} = sa;
160292915Sdim  let Inst{10-0}  = op;
161292915Sdim}
162292915Sdim
163292915Sdimclass POOL32A_1RMEMB0_FMT<string opstr, bits<10> funct> : MMDSPInst<opstr> {
164292915Sdim  bits<5> index;
165292915Sdim  bits<5> base;
166292915Sdim  bits<5> rd;
167292915Sdim
168292915Sdim  let Inst{31-26} = 0;
169292915Sdim  let Inst{25-21} = index;
170292915Sdim  let Inst{20-16} = base;
171292915Sdim  let Inst{15-11} = rd;
172292915Sdim  let Inst{10}    = 0b0;
173292915Sdim  let Inst{9-0}   = funct;
174292915Sdim}
175292915Sdim
176292915Sdimclass POOL32A_1RAC_FMT<string instr_asm, bits<8> funct> : MMDSPInst<instr_asm> {
177292915Sdim  bits<5> rs;
178292915Sdim  bits<2> ac;
179292915Sdim
180292915Sdim  let Inst{31-26} = 0;
181292915Sdim  let Inst{25-21} = 0;
182292915Sdim  let Inst{20-16} = rs;
183292915Sdim  let Inst{15-14} = ac;
184292915Sdim  let Inst{13-6}  = funct;
185292915Sdim  let Inst{5-0}   = 0b111100;
186292915Sdim}
187292915Sdim
188292915Sdimclass POOL32A_1RMASK7_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
189292915Sdim  bits<5> rt;
190292915Sdim  bits<7> mask;
191292915Sdim
192292915Sdim  let Inst{31-26} = 0b000000;
193292915Sdim  let Inst{25-21} = rt;
194292915Sdim  let Inst{20-14} = mask;
195292915Sdim  let Inst{13-6}  = op;
196292915Sdim  let Inst{5-0}   = 0b111100;
197292915Sdim}
198292915Sdim
199292915Sdimclass POOL32A_1RIMM10_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
200292915Sdim  bits<5> rd;
201292915Sdim  bits<10> imm;
202292915Sdim
203292915Sdim  let Inst{31-26} = 0;
204292915Sdim  let Inst{25-16} = imm;
205292915Sdim  let Inst{15-11} = rd;
206292915Sdim  let Inst{10}    = 0;
207292915Sdim  let Inst{9-0}   = op;
208292915Sdim}
209292915Sdim
210292915Sdimclass POOL32A_1RIMM8_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> {
211292915Sdim  bits<5> rt;
212292915Sdim  bits<8> imm;
213292915Sdim
214292915Sdim  let Inst{31-26} = 0;
215292915Sdim  let Inst{25-21} = rt;
216292915Sdim  let Inst{20-13} = imm;
217292915Sdim  let Inst{12}    = 0;
218292915Sdim  let Inst{11-6}  = op;
219292915Sdim  let Inst{5-0}   = 0b111100;
220292915Sdim}
221292915Sdim
222292915Sdimclass POOL32A_4B0SHIFT6AC4B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
223292915Sdim  bits<6> shift;
224292915Sdim  bits<2> ac;
225292915Sdim
226292915Sdim  let Inst{31-26} = 0b000000;
227292915Sdim  let Inst{25-22} = 0b0000;
228292915Sdim  let Inst{21-16} = shift;
229292915Sdim  let Inst{15-14} = ac;
230292915Sdim  let Inst{13-10} = 0b0000;
231292915Sdim  let Inst{9-0}   = op;
232292915Sdim}
233292915Sdim
234292915Sdimclass POOL32A_5B01RAC_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
235292915Sdim  bits<5> rs;
236292915Sdim  bits<2> ac;
237292915Sdim
238292915Sdim  let Inst{31-26} = 0b000000;
239292915Sdim  let Inst{25-21} = 0b00000;
240292915Sdim  let Inst{20-16} = rs;
241292915Sdim  let Inst{15-14} = ac;
242292915Sdim  let Inst{13-6}  = op;
243292915Sdim  let Inst{5-0}   = 0b111100;
244292915Sdim}
245