1//===-- MicroMipsDSPInstrFormats.td - 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
10class MMDSPInst<string opstr = "">
11    : MipsInst<(outs), (ins), "", [], NoItinerary, FrmOther>, PredicateControl {
12  let InsnPredicates = [HasDSP];
13  let AdditionalPredicates = [InMicroMips];
14  string BaseOpcode = opstr;
15  string Arch = "mmdsp";
16  let DecoderNamespace = "MicroMips";
17}
18
19class POOL32A_3R_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
20  bits<5> rd;
21  bits<5> rs;
22  bits<5> rt;
23
24  let Inst{31-26} = 0b000000;
25  let Inst{25-21} = rt;
26  let Inst{20-16} = rs;
27  let Inst{15-11} = rd;
28  let Inst{10-0}  = op;
29}
30
31class POOL32A_2R_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
32  bits<5> rt;
33  bits<5> rs;
34
35  let Inst{31-26} = 0b000000;
36  let Inst{25-21} = rt;
37  let Inst{20-16} = rs;
38  let Inst{15-6}  = op;
39  let Inst{5-0}   = 0b111100;
40}
41
42class POOL32A_2RAC_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
43  bits<5> rt;
44  bits<5> rs;
45  bits<2> ac;
46
47  let Inst{31-26} = 0b000000;
48  let Inst{25-21} = rt;
49  let Inst{20-16} = rs;
50  let Inst{15-14} = ac;
51  let Inst{13-6}  = op;
52  let Inst{5-0}   = 0b111100;
53}
54
55class POOL32A_3RB0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
56  bits<5> rd;
57  bits<5> rs;
58  bits<5> rt;
59
60  let Inst{31-26} = 0b000000;
61  let Inst{25-21} = rt;
62  let Inst{20-16} = rs;
63  let Inst{15-11} = rd;
64  let Inst{10}    = 0b0;
65  let Inst{9-0}   = op;
66}
67
68class POOL32A_2RSA4_FMT<string opstr, bits<12> op> : MMDSPInst<opstr> {
69  bits<5> rt;
70  bits<5> rs;
71  bits<4> sa;
72
73  let Inst{31-26} = 0b000000;
74  let Inst{25-21} = rt;
75  let Inst{20-16} = rs;
76  let Inst{15-12} = sa;
77  let Inst{11-0}  = op;
78}
79
80class POOL32A_2RSA3_FMT<string opstr, bits<7> op> : MMDSPInst<opstr> {
81  bits<5> rt;
82  bits<5> rs;
83  bits<3> sa;
84
85  let Inst{31-26} = 0b000000;
86  let Inst{25-21} = rt;
87  let Inst{20-16} = rs;
88  let Inst{15-13} = sa;
89  let Inst{12-6}  = op;
90  let Inst{5-0}   = 0b111100;
91}
92
93class POOL32A_2RSA5B0_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
94  bits<5> rt;
95  bits<5> rs;
96  bits<5> sa;
97
98  let Inst{31-26} = 0b000000;
99  let Inst{25-21} = rt;
100  let Inst{20-16} = rs;
101  let Inst{15-11} = sa;
102  let Inst{10}    = 0b0;
103  let Inst{9-0}   = op;
104}
105
106class POOL32A_2RSA4B0_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
107  bits<5> rt;
108  bits<5> rs;
109  bits<4> sa;
110
111  let Inst{31-26} = 0b000000;
112  let Inst{25-21} = rt;
113  let Inst{20-16} = rs;
114  let Inst{15-12} = sa;
115  let Inst{11}    = 0b0;
116  let Inst{10-0}  = op;
117}
118
119class POOL32A_2RSA4OP6_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> {
120  bits<5> rt;
121  bits<5> rs;
122  bits<4> sa;
123
124  let Inst{31-26} = 0b000000;
125  let Inst{25-21} = rt;
126  let Inst{20-16} = rs;
127  let Inst{15-12} = sa;
128  let Inst{11-6}  = op;
129  let Inst{5-0}   = 0b111100;
130}
131
132class POOL32A_1RIMM5AC_FMT<string opstr, bits<8> funct> : MMDSPInst<opstr> {
133  bits<5> rt;
134  bits<5> imm;
135  bits<2> ac;
136
137  let Inst{31-26} = 0b000000;
138  let Inst{25-21} = rt;
139  let Inst{20-16} = imm;
140  let Inst{15-14} = ac;
141  let Inst{13-6}  = funct;
142  let Inst{5-0}   = 0b111100;
143}
144
145class POOL32A_2RSA5_FMT<string opstr, bits<11> op> : MMDSPInst<opstr> {
146  bits<5> rt;
147  bits<5> rs;
148  bits<5> sa;
149
150  let Inst{31-26} = 0b000000;
151  let Inst{25-21} = rt;
152  let Inst{20-16} = rs;
153  let Inst{15-11} = sa;
154  let Inst{10-0}  = op;
155}
156
157class POOL32A_1RMEMB0_FMT<string opstr, bits<10> funct> : MMDSPInst<opstr> {
158  bits<5> index;
159  bits<5> base;
160  bits<5> rd;
161
162  let Inst{31-26} = 0;
163  let Inst{25-21} = index;
164  let Inst{20-16} = base;
165  let Inst{15-11} = rd;
166  let Inst{10}    = 0b0;
167  let Inst{9-0}   = funct;
168}
169
170class POOL32A_1RAC_FMT<string instr_asm, bits<8> funct> : MMDSPInst<instr_asm> {
171  bits<5> rs;
172  bits<2> ac;
173
174  let Inst{31-26} = 0;
175  let Inst{25-21} = 0;
176  let Inst{20-16} = rs;
177  let Inst{15-14} = ac;
178  let Inst{13-6}  = funct;
179  let Inst{5-0}   = 0b111100;
180}
181
182class POOL32A_1RMASK7_FMT<string opstr, bits<8> op> : MMDSPInst<opstr> {
183  bits<5> rt;
184  bits<7> mask;
185
186  let Inst{31-26} = 0b000000;
187  let Inst{25-21} = rt;
188  let Inst{20-14} = mask;
189  let Inst{13-6}  = op;
190  let Inst{5-0}   = 0b111100;
191}
192
193class POOL32A_1RIMM10_FMT<string opstr, bits<10> op> : MMDSPInst<opstr> {
194  bits<5> rd;
195  bits<10> imm;
196
197  let Inst{31-26} = 0;
198  let Inst{25-16} = imm;
199  let Inst{15-11} = rd;
200  let Inst{10}    = 0;
201  let Inst{9-0}   = op;
202}
203
204class POOL32A_1RIMM8_FMT<string opstr, bits<6> op> : MMDSPInst<opstr> {
205  bits<5> rt;
206  bits<8> imm;
207
208  let Inst{31-26} = 0;
209  let Inst{25-21} = rt;
210  let Inst{20-13} = imm;
211  let Inst{12}    = 0;
212  let Inst{11-6}  = op;
213  let Inst{5-0}   = 0b111100;
214}
215