blob: 51f323d88aec9bec2a9bf82290735ac2e66157cf [file] [log] [blame]
Christian Konig72d5d5c2013-02-21 15:16:44 +00001//===-- SIInstrFormats.td - SI Instruction Encodings ----------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +00002//
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//
10// SI Instruction format definitions.
11//
Tom Stellard75aadc22012-12-11 21:25:42 +000012//===----------------------------------------------------------------------===//
13
Christian Konig72d5d5c2013-02-21 15:16:44 +000014class InstSI <dag outs, dag ins, string asm, list<dag> pattern> :
15 AMDGPUInst<outs, ins, asm, pattern> {
Tom Stellard75aadc22012-12-11 21:25:42 +000016
Christian Konig72d5d5c2013-02-21 15:16:44 +000017 field bits<1> VM_CNT = 0;
18 field bits<1> EXP_CNT = 0;
19 field bits<1> LGKM_CNT = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +000020
Christian Konig72d5d5c2013-02-21 15:16:44 +000021 let TSFlags{0} = VM_CNT;
22 let TSFlags{1} = EXP_CNT;
23 let TSFlags{2} = LGKM_CNT;
Tom Stellard75aadc22012-12-11 21:25:42 +000024}
25
Christian Konig72d5d5c2013-02-21 15:16:44 +000026class Enc32 <dag outs, dag ins, string asm, list<dag> pattern> :
27 InstSI <outs, ins, asm, pattern> {
Tom Stellard75aadc22012-12-11 21:25:42 +000028
Christian Konig72d5d5c2013-02-21 15:16:44 +000029 field bits<32> Inst;
30 let Size = 4;
Tom Stellard75aadc22012-12-11 21:25:42 +000031}
32
Christian Konig72d5d5c2013-02-21 15:16:44 +000033class Enc64 <dag outs, dag ins, string asm, list<dag> pattern> :
34 InstSI <outs, ins, asm, pattern> {
Tom Stellard75aadc22012-12-11 21:25:42 +000035
Christian Konig72d5d5c2013-02-21 15:16:44 +000036 field bits<64> Inst;
37 let Size = 8;
Tom Stellard75aadc22012-12-11 21:25:42 +000038}
39
Christian Konig72d5d5c2013-02-21 15:16:44 +000040//===----------------------------------------------------------------------===//
41// Scalar operations
42//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +000043
Christian Konig72d5d5c2013-02-21 15:16:44 +000044class SOP1 <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
45 Enc32<outs, ins, asm, pattern> {
Tom Stellard75aadc22012-12-11 21:25:42 +000046
Christian Konig72d5d5c2013-02-21 15:16:44 +000047 bits<7> SDST;
48 bits<8> SSRC0;
Tom Stellard75aadc22012-12-11 21:25:42 +000049
Christian Konig72d5d5c2013-02-21 15:16:44 +000050 let Inst{7-0} = SSRC0;
51 let Inst{15-8} = op;
52 let Inst{22-16} = SDST;
53 let Inst{31-23} = 0x17d; //encoding;
Tom Stellard75aadc22012-12-11 21:25:42 +000054
Christian Konige3cba882013-02-16 11:28:02 +000055 let mayLoad = 0;
Christian Konig72d5d5c2013-02-21 15:16:44 +000056 let mayStore = 0;
57 let hasSideEffects = 0;
Christian Konige3cba882013-02-16 11:28:02 +000058}
59
Christian Konig72d5d5c2013-02-21 15:16:44 +000060class SOP2 <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
61 Enc32 <outs, ins, asm, pattern> {
62
63 bits<7> SDST;
64 bits<8> SSRC0;
65 bits<8> SSRC1;
66
67 let Inst{7-0} = SSRC0;
68 let Inst{15-8} = SSRC1;
69 let Inst{22-16} = SDST;
70 let Inst{29-23} = op;
71 let Inst{31-30} = 0x2; // encoding
72
73 let mayLoad = 0;
74 let mayStore = 0;
75 let hasSideEffects = 0;
76}
77
78class SOPC <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
79 Enc32<outs, ins, asm, pattern> {
80
81 bits<8> SSRC0;
82 bits<8> SSRC1;
83
84 let Inst{7-0} = SSRC0;
85 let Inst{15-8} = SSRC1;
86 let Inst{22-16} = op;
87 let Inst{31-23} = 0x17e;
88
89 let DisableEncoding = "$dst";
90 let mayLoad = 0;
91 let mayStore = 0;
92 let hasSideEffects = 0;
93}
94
95class SOPK <bits<5> op, dag outs, dag ins, string asm, list<dag> pattern> :
96 Enc32 <outs, ins , asm, pattern> {
97
98 bits <7> SDST;
99 bits <16> SIMM16;
100
101 let Inst{15-0} = SIMM16;
102 let Inst{22-16} = SDST;
103 let Inst{27-23} = op;
104 let Inst{31-28} = 0xb; //encoding
105
106 let mayLoad = 0;
107 let mayStore = 0;
108 let hasSideEffects = 0;
109}
110
111class SOPP <bits<7> op, dag ins, string asm, list<dag> pattern> : Enc32 <
112 (outs),
113 ins,
Christian Konige3cba882013-02-16 11:28:02 +0000114 asm,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000115 pattern > {
116
117 bits <16> SIMM16;
118
119 let Inst{15-0} = SIMM16;
120 let Inst{22-16} = op;
121 let Inst{31-23} = 0x17f; // encoding
122
123 let mayLoad = 0;
124 let mayStore = 0;
125 let hasSideEffects = 0;
126}
127
128class SMRD <bits<5> op, bits<1> imm, dag outs, dag ins, string asm,
129 list<dag> pattern> : Enc32<outs, ins, asm, pattern> {
130
131 bits<7> SDST;
Christian Konig84652962013-03-01 09:46:17 +0000132 bits<7> SBASE;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000133 bits<8> OFFSET;
134
135 let Inst{7-0} = OFFSET;
136 let Inst{8} = imm;
Christian Konig84652962013-03-01 09:46:17 +0000137 let Inst{14-9} = SBASE{6-1};
Christian Konig72d5d5c2013-02-21 15:16:44 +0000138 let Inst{21-15} = SDST;
139 let Inst{26-22} = op;
140 let Inst{31-27} = 0x18; //encoding
141
142 let LGKM_CNT = 1;
143}
144
145//===----------------------------------------------------------------------===//
146// Vector ALU operations
147//===----------------------------------------------------------------------===//
148
149let Uses = [EXEC] in {
150
151class VOP1 <bits<8> op, dag outs, dag ins, string asm, list<dag> pattern> :
152 Enc32 <outs, ins, asm, pattern> {
153
154 bits<8> VDST;
155 bits<9> SRC0;
156
157 let Inst{8-0} = SRC0;
158 let Inst{16-9} = op;
159 let Inst{24-17} = VDST;
160 let Inst{31-25} = 0x3f; //encoding
161
162 let mayLoad = 0;
163 let mayStore = 0;
164 let hasSideEffects = 0;
165}
166
167class VOP2 <bits<6> op, dag outs, dag ins, string asm, list<dag> pattern> :
168 Enc32 <outs, ins, asm, pattern> {
169
170 bits<8> VDST;
171 bits<9> SRC0;
172 bits<8> VSRC1;
173
174 let Inst{8-0} = SRC0;
175 let Inst{16-9} = VSRC1;
176 let Inst{24-17} = VDST;
177 let Inst{30-25} = op;
178 let Inst{31} = 0x0; //encoding
179
180 let mayLoad = 0;
181 let mayStore = 0;
182 let hasSideEffects = 0;
183}
184
185class VOP3 <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern> :
186 Enc64 <outs, ins, asm, pattern> {
187
Tom Stellard459a79a2013-05-20 15:02:08 +0000188 bits<8> dst;
189 bits<9> src0;
190 bits<9> src1;
191 bits<9> src2;
192 bits<3> abs;
193 bits<1> clamp;
194 bits<2> omod;
195 bits<3> neg;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000196
Tom Stellard459a79a2013-05-20 15:02:08 +0000197 let Inst{7-0} = dst;
198 let Inst{10-8} = abs;
199 let Inst{11} = clamp;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000200 let Inst{25-17} = op;
201 let Inst{31-26} = 0x34; //encoding
Tom Stellard459a79a2013-05-20 15:02:08 +0000202 let Inst{40-32} = src0;
203 let Inst{49-41} = src1;
204 let Inst{58-50} = src2;
205 let Inst{60-59} = omod;
206 let Inst{63-61} = neg;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000207
208 let mayLoad = 0;
209 let mayStore = 0;
210 let hasSideEffects = 0;
211}
212
213class VOP3b <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern> :
214 Enc64 <outs, ins, asm, pattern> {
215
Tom Stellard459a79a2013-05-20 15:02:08 +0000216 bits<8> dst;
217 bits<9> src0;
218 bits<9> src1;
219 bits<9> src2;
220 bits<7> sdst;
221 bits<2> omod;
222 bits<3> neg;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000223
Tom Stellard459a79a2013-05-20 15:02:08 +0000224 let Inst{7-0} = dst;
225 let Inst{14-8} = sdst;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000226 let Inst{25-17} = op;
227 let Inst{31-26} = 0x34; //encoding
Tom Stellard459a79a2013-05-20 15:02:08 +0000228 let Inst{40-32} = src0;
229 let Inst{49-41} = src1;
230 let Inst{58-50} = src2;
231 let Inst{60-59} = omod;
232 let Inst{63-61} = neg;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000233
234 let mayLoad = 0;
235 let mayStore = 0;
236 let hasSideEffects = 0;
237}
238
239class VOPC <bits<8> op, dag ins, string asm, list<dag> pattern> :
240 Enc32 <(outs VCCReg:$dst), ins, asm, pattern> {
241
242 bits<9> SRC0;
243 bits<8> VSRC1;
244
245 let Inst{8-0} = SRC0;
246 let Inst{16-9} = VSRC1;
247 let Inst{24-17} = op;
248 let Inst{31-25} = 0x3e;
249
250 let DisableEncoding = "$dst";
251 let mayLoad = 0;
252 let mayStore = 0;
253 let hasSideEffects = 0;
254}
255
256class VINTRP <bits <2> op, dag outs, dag ins, string asm, list<dag> pattern> :
257 Enc32 <outs, ins, asm, pattern> {
258
259 bits<8> VDST;
260 bits<8> VSRC;
261 bits<2> ATTRCHAN;
262 bits<6> ATTR;
263
264 let Inst{7-0} = VSRC;
265 let Inst{9-8} = ATTRCHAN;
266 let Inst{15-10} = ATTR;
267 let Inst{17-16} = op;
268 let Inst{25-18} = VDST;
269 let Inst{31-26} = 0x32; // encoding
270
271 let neverHasSideEffects = 1;
Christian Konige3cba882013-02-16 11:28:02 +0000272 let mayLoad = 1;
273 let mayStore = 0;
274}
275
Christian Konig72d5d5c2013-02-21 15:16:44 +0000276} // End Uses = [EXEC]
277
278//===----------------------------------------------------------------------===//
279// Vector I/O operations
280//===----------------------------------------------------------------------===//
281
282let Uses = [EXEC] in {
283
284class MUBUF <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
285 Enc64<outs, ins, asm, pattern> {
286
Tom Stellard6db08eb2013-04-05 23:31:44 +0000287 bits<12> offset;
288 bits<1> offen;
289 bits<1> idxen;
290 bits<1> glc;
291 bits<1> addr64;
292 bits<1> lds;
293 bits<8> vaddr;
294 bits<8> vdata;
295 bits<7> srsrc;
296 bits<1> slc;
297 bits<1> tfe;
298 bits<8> soffset;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000299
Tom Stellard6db08eb2013-04-05 23:31:44 +0000300 let Inst{11-0} = offset;
301 let Inst{12} = offen;
302 let Inst{13} = idxen;
303 let Inst{14} = glc;
304 let Inst{15} = addr64;
305 let Inst{16} = lds;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000306 let Inst{24-18} = op;
307 let Inst{31-26} = 0x38; //encoding
Tom Stellard6db08eb2013-04-05 23:31:44 +0000308 let Inst{39-32} = vaddr;
309 let Inst{47-40} = vdata;
310 let Inst{52-48} = srsrc{6-2};
311 let Inst{54} = slc;
312 let Inst{55} = tfe;
313 let Inst{63-56} = soffset;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000314
315 let VM_CNT = 1;
316 let EXP_CNT = 1;
317
318 let neverHasSideEffects = 1;
Christian Konige3cba882013-02-16 11:28:02 +0000319}
320
Christian Konig72d5d5c2013-02-21 15:16:44 +0000321class MTBUF <bits<3> op, dag outs, dag ins, string asm, list<dag> pattern> :
322 Enc64<outs, ins, asm, pattern> {
Christian Konige3cba882013-02-16 11:28:02 +0000323
Christian Konig72d5d5c2013-02-21 15:16:44 +0000324 bits<8> VDATA;
325 bits<12> OFFSET;
326 bits<1> OFFEN;
327 bits<1> IDXEN;
328 bits<1> GLC;
329 bits<1> ADDR64;
330 bits<4> DFMT;
331 bits<3> NFMT;
332 bits<8> VADDR;
Christian Konig84652962013-03-01 09:46:17 +0000333 bits<7> SRSRC;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000334 bits<1> SLC;
335 bits<1> TFE;
336 bits<8> SOFFSET;
337
338 let Inst{11-0} = OFFSET;
339 let Inst{12} = OFFEN;
340 let Inst{13} = IDXEN;
341 let Inst{14} = GLC;
342 let Inst{15} = ADDR64;
343 let Inst{18-16} = op;
344 let Inst{22-19} = DFMT;
345 let Inst{25-23} = NFMT;
346 let Inst{31-26} = 0x3a; //encoding
347 let Inst{39-32} = VADDR;
348 let Inst{47-40} = VDATA;
Christian Konig84652962013-03-01 09:46:17 +0000349 let Inst{52-48} = SRSRC{6-2};
Christian Konig72d5d5c2013-02-21 15:16:44 +0000350 let Inst{54} = SLC;
351 let Inst{55} = TFE;
352 let Inst{63-56} = SOFFSET;
353
354 let VM_CNT = 1;
355 let EXP_CNT = 1;
356
357 let neverHasSideEffects = 1;
Christian Konige3cba882013-02-16 11:28:02 +0000358}
359
Christian Konig72d5d5c2013-02-21 15:16:44 +0000360class MIMG <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
361 Enc64 <outs, ins, asm, pattern> {
362
363 bits<8> VDATA;
364 bits<4> DMASK;
365 bits<1> UNORM;
366 bits<1> GLC;
367 bits<1> DA;
368 bits<1> R128;
369 bits<1> TFE;
370 bits<1> LWE;
371 bits<1> SLC;
372 bits<8> VADDR;
Christian Konig84652962013-03-01 09:46:17 +0000373 bits<7> SRSRC;
374 bits<7> SSAMP;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000375
376 let Inst{11-8} = DMASK;
377 let Inst{12} = UNORM;
378 let Inst{13} = GLC;
379 let Inst{14} = DA;
380 let Inst{15} = R128;
381 let Inst{16} = TFE;
382 let Inst{17} = LWE;
383 let Inst{24-18} = op;
384 let Inst{25} = SLC;
385 let Inst{31-26} = 0x3c;
386 let Inst{39-32} = VADDR;
387 let Inst{47-40} = VDATA;
Christian Konig84652962013-03-01 09:46:17 +0000388 let Inst{52-48} = SRSRC{6-2};
389 let Inst{57-53} = SSAMP{6-2};
Christian Konig72d5d5c2013-02-21 15:16:44 +0000390
391 let VM_CNT = 1;
392 let EXP_CNT = 1;
393}
394
395def EXP : Enc64<
396 (outs),
397 (ins i32imm:$en, i32imm:$tgt, i32imm:$compr, i32imm:$done, i32imm:$vm,
398 VReg_32:$src0, VReg_32:$src1, VReg_32:$src2, VReg_32:$src3),
399 "EXP $en, $tgt, $compr, $done, $vm, $src0, $src1, $src2, $src3",
400 [] > {
401
402 bits<4> EN;
403 bits<6> TGT;
404 bits<1> COMPR;
405 bits<1> DONE;
406 bits<1> VM;
407 bits<8> VSRC0;
408 bits<8> VSRC1;
409 bits<8> VSRC2;
410 bits<8> VSRC3;
411
412 let Inst{3-0} = EN;
413 let Inst{9-4} = TGT;
414 let Inst{10} = COMPR;
415 let Inst{11} = DONE;
416 let Inst{12} = VM;
417 let Inst{31-26} = 0x3e;
418 let Inst{39-32} = VSRC0;
419 let Inst{47-40} = VSRC1;
420 let Inst{55-48} = VSRC2;
421 let Inst{63-56} = VSRC3;
422
423 let EXP_CNT = 1;
424}
425
426} // End Uses = [EXEC]