blob: 16021fff531f692a157f0268173e277b41a32403 [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
Matt Arsenault9babdf42016-06-22 20:15:28 +000014class InstSI <dag outs, dag ins, string asm = "",
15 list<dag> pattern = []> :
16 AMDGPUInst<outs, ins, asm, pattern>, PredicateControl {
Tom Stellard75aadc22012-12-11 21:25:42 +000017
Sam Koltonc01faa32016-11-15 13:39:07 +000018 field bit VM_CNT = 0;
19 field bit EXP_CNT = 0;
20 field bit LGKM_CNT = 0;
Matt Arsenaultc5f174d2014-12-01 15:52:46 +000021
Sam Koltonc01faa32016-11-15 13:39:07 +000022 field bit SALU = 0;
23 field bit VALU = 0;
Matt Arsenaultc5f174d2014-12-01 15:52:46 +000024
Sam Koltonc01faa32016-11-15 13:39:07 +000025 field bit SOP1 = 0;
26 field bit SOP2 = 0;
27 field bit SOPC = 0;
28 field bit SOPK = 0;
29 field bit SOPP = 0;
Matt Arsenaultc5f174d2014-12-01 15:52:46 +000030
Sam Koltonc01faa32016-11-15 13:39:07 +000031 field bit VOP1 = 0;
32 field bit VOP2 = 0;
33 field bit VOP3 = 0;
34 field bit VOPC = 0;
35 field bit SDWA = 0;
36 field bit DPP = 0;
Matt Arsenaultc5f174d2014-12-01 15:52:46 +000037
Sam Koltonc01faa32016-11-15 13:39:07 +000038 field bit MUBUF = 0;
39 field bit MTBUF = 0;
40 field bit SMRD = 0;
41 field bit DS = 0;
42 field bit MIMG = 0;
43 field bit FLAT = 0;
Matt Arsenault7bee6ac2016-12-05 20:23:10 +000044 field bit EXP = 0;
Nicolai Haehnle8a482b32016-08-02 19:31:14 +000045
46 // Whether WQM _must_ be enabled for this instruction.
Sam Koltonc01faa32016-11-15 13:39:07 +000047 field bit WQM = 0;
48 field bit VGPRSpill = 0;
49 field bit SGPRSpill = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +000050
Tom Stellard88e0b252015-10-06 15:57:53 +000051 // This bit tells the assembler to use the 32-bit encoding in case it
52 // is unable to infer the encoding from the operands.
Sam Koltonc01faa32016-11-15 13:39:07 +000053 field bit VOPAsmPrefer32Bit = 0;
Tom Stellard88e0b252015-10-06 15:57:53 +000054
Sam Koltonc01faa32016-11-15 13:39:07 +000055 field bit Gather4 = 0;
Nicolai Haehnlec06bfa12016-07-11 21:59:43 +000056
Nicolai Haehnle8a482b32016-08-02 19:31:14 +000057 // Whether WQM _must_ be disabled for this instruction.
Sam Koltonc01faa32016-11-15 13:39:07 +000058 field bit DisableWQM = 0;
Nicolai Haehnle8a482b32016-08-02 19:31:14 +000059
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +000060 // Most sopk treat the immediate as a signed 16-bit, however some
61 // use it as unsigned.
Sam Koltonc01faa32016-11-15 13:39:07 +000062 field bit SOPKZext = 0;
Matt Arsenault7ccf6cd2016-09-16 21:41:16 +000063
Matt Arsenault7b647552016-10-28 21:55:15 +000064 // This is an s_store_dword* instruction that requires a cache flush
65 // on wave termination. It is necessary to distinguish from mayStore
66 // SMEM instructions like the cache flush ones.
Sam Koltonc01faa32016-11-15 13:39:07 +000067 field bit ScalarStore = 0;
Matt Arsenault7b647552016-10-28 21:55:15 +000068
Matt Arsenault2d8c2892016-11-01 20:42:24 +000069 // Whether the operands can be ignored when computing the
70 // instruction size.
Sam Koltonc01faa32016-11-15 13:39:07 +000071 field bit FixedSize = 0;
Matt Arsenault2d8c2892016-11-01 20:42:24 +000072
Matt Arsenaulte2fabd32014-07-29 18:51:56 +000073 // These need to be kept in sync with the enum in SIInstrFlags.
Christian Konig72d5d5c2013-02-21 15:16:44 +000074 let TSFlags{0} = VM_CNT;
75 let TSFlags{1} = EXP_CNT;
76 let TSFlags{2} = LGKM_CNT;
Matt Arsenaultc5f174d2014-12-01 15:52:46 +000077
78 let TSFlags{3} = SALU;
79 let TSFlags{4} = VALU;
80
81 let TSFlags{5} = SOP1;
82 let TSFlags{6} = SOP2;
83 let TSFlags{7} = SOPC;
84 let TSFlags{8} = SOPK;
85 let TSFlags{9} = SOPP;
86
87 let TSFlags{10} = VOP1;
88 let TSFlags{11} = VOP2;
89 let TSFlags{12} = VOP3;
90 let TSFlags{13} = VOPC;
Sam Kolton3025e7f2016-04-26 13:33:56 +000091 let TSFlags{14} = SDWA;
92 let TSFlags{15} = DPP;
Matt Arsenaultc5f174d2014-12-01 15:52:46 +000093
Sam Kolton3025e7f2016-04-26 13:33:56 +000094 let TSFlags{16} = MUBUF;
95 let TSFlags{17} = MTBUF;
96 let TSFlags{18} = SMRD;
97 let TSFlags{19} = DS;
98 let TSFlags{20} = MIMG;
99 let TSFlags{21} = FLAT;
Matt Arsenault7bee6ac2016-12-05 20:23:10 +0000100 let TSFlags{22} = EXP;
101 let TSFlags{23} = WQM;
102 let TSFlags{24} = VGPRSpill;
103 let TSFlags{25} = SGPRSpill;
104 let TSFlags{26} = VOPAsmPrefer32Bit;
105 let TSFlags{27} = Gather4;
106 let TSFlags{28} = DisableWQM;
107 let TSFlags{29} = SOPKZext;
108 let TSFlags{30} = ScalarStore;
109 let TSFlags{31} = FixedSize;
Matt Arsenaultcb0ac3d2014-09-26 17:54:59 +0000110
Tom Stellardae38f302015-01-14 01:13:19 +0000111 let SchedRW = [Write32Bit];
Tom Stellarde1818af2016-02-18 03:42:32 +0000112
113 field bits<1> DisableSIDecoder = 0;
114 field bits<1> DisableVIDecoder = 0;
115 field bits<1> DisableDecoder = 0;
116
117 let isAsmParserOnly = !if(!eq(DisableDecoder{0}, {0}), 0, 1);
Sam Koltond63d8a72016-09-09 09:37:51 +0000118 let AsmVariantName = AMDGPUAsmVariants.Default;
Tom Stellard75aadc22012-12-11 21:25:42 +0000119}
120
Matt Arsenaultfc7e6a02016-07-12 00:23:17 +0000121class PseudoInstSI<dag outs, dag ins, list<dag> pattern = []>
122 : InstSI<outs, ins, "", pattern> {
123 let isPseudo = 1;
124 let isCodeGenOnly = 1;
125}
126
Matt Arsenault71ed8a62016-08-27 03:00:51 +0000127class SPseudoInstSI<dag outs, dag ins, list<dag> pattern = []>
128 : PseudoInstSI<outs, ins, pattern> {
129 let SALU = 1;
130}
131
132class VPseudoInstSI<dag outs, dag ins, list<dag> pattern = []>
133 : PseudoInstSI<outs, ins, pattern> {
134 let VALU = 1;
135 let Uses = [EXEC];
136}
137
138class CFPseudoInstSI<dag outs, dag ins, list<dag> pattern = [],
139 bit UseExec = 0, bit DefExec = 0> :
140 SPseudoInstSI<outs, ins, pattern> {
141
142 let Uses = !if(UseExec, [EXEC], []);
143 let Defs = !if(DefExec, [EXEC, SCC], [SCC]);
Matt Arsenault6408c912016-09-16 22:11:18 +0000144 let mayLoad = 0;
145 let mayStore = 0;
146 let hasSideEffects = 0;
Matt Arsenault71ed8a62016-08-27 03:00:51 +0000147}
148
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000149class Enc32 {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000150 field bits<32> Inst;
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000151 int Size = 4;
Tom Stellard75aadc22012-12-11 21:25:42 +0000152}
153
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000154class Enc64 {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000155 field bits<64> Inst;
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000156 int Size = 8;
Tom Stellard75aadc22012-12-11 21:25:42 +0000157}
158
Tom Stellardc0503922015-03-12 21:34:22 +0000159class VOPDstOperand <RegisterClass rc> : RegisterOperand <rc, "printVOPDst">;
Tom Stellardc0503922015-03-12 21:34:22 +0000160
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000161class VINTRPe <bits<2> op> : Enc32 {
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000162 bits<8> vdst;
163 bits<8> vsrc;
164 bits<2> attrchan;
165 bits<6> attr;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000166
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000167 let Inst{7-0} = vsrc;
168 let Inst{9-8} = attrchan;
169 let Inst{15-10} = attr;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000170 let Inst{17-16} = op;
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000171 let Inst{25-18} = vdst;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000172 let Inst{31-26} = 0x32; // encoding
Christian Konige3cba882013-02-16 11:28:02 +0000173}
174
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000175class MIMGe <bits<7> op> : Enc64 {
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000176 bits<8> vdata;
177 bits<4> dmask;
178 bits<1> unorm;
179 bits<1> glc;
180 bits<1> da;
181 bits<1> r128;
182 bits<1> tfe;
183 bits<1> lwe;
184 bits<1> slc;
185 bits<8> vaddr;
186 bits<7> srsrc;
187 bits<7> ssamp;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000188
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000189 let Inst{11-8} = dmask;
190 let Inst{12} = unorm;
191 let Inst{13} = glc;
192 let Inst{14} = da;
193 let Inst{15} = r128;
194 let Inst{16} = tfe;
195 let Inst{17} = lwe;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000196 let Inst{24-18} = op;
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000197 let Inst{25} = slc;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000198 let Inst{31-26} = 0x3c;
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000199 let Inst{39-32} = vaddr;
200 let Inst{47-40} = vdata;
201 let Inst{52-48} = srsrc{6-2};
202 let Inst{57-53} = ssamp{6-2};
Christian Konig72d5d5c2013-02-21 15:16:44 +0000203}
204
Matt Arsenault3f981402014-09-15 15:41:53 +0000205class EXPe : Enc64 {
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000206 bits<4> en;
207 bits<6> tgt;
208 bits<1> compr;
209 bits<1> done;
210 bits<1> vm;
211 bits<8> vsrc0;
212 bits<8> vsrc1;
213 bits<8> vsrc2;
214 bits<8> vsrc3;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000215
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000216 let Inst{3-0} = en;
217 let Inst{9-4} = tgt;
218 let Inst{10} = compr;
219 let Inst{11} = done;
220 let Inst{12} = vm;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000221 let Inst{31-26} = 0x3e;
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000222 let Inst{39-32} = vsrc0;
223 let Inst{47-40} = vsrc1;
224 let Inst{55-48} = vsrc2;
225 let Inst{63-56} = vsrc3;
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000226}
227
228let Uses = [EXEC] in {
229
Marek Olsak5df00d62014-12-07 12:18:57 +0000230class VINTRPCommon <dag outs, dag ins, string asm, list<dag> pattern> :
231 InstSI <outs, ins, asm, pattern> {
Tom Stellard2a484332016-12-09 15:57:15 +0000232
233 // VINTRP instructions read parameter values from LDS, but these parameter
234 // values are stored outside of the LDS memory that is allocated to the
235 // shader for general purpose use.
236 //
237 // While it may be possible for ds_read/ds_write instructions to access
238 // the parameter values in LDS, this would essentially be an out-of-bounds
239 // memory access which we consider to be undefined behavior.
240 //
241 // So even though these instructions read memory, this memory is outside the
242 // addressable memory space for the shader, and we consider these instructions
243 // to be readnone.
244 let mayLoad = 0;
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000245 let mayStore = 0;
Matt Arsenault9a072c12014-11-18 23:57:33 +0000246 let hasSideEffects = 0;
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000247}
248
Matt Arsenault7bee6ac2016-12-05 20:23:10 +0000249class EXPCommon<dag outs, dag ins, string asm, list<dag> pattern> :
250 InstSI<outs, ins, asm, pattern> {
251 let EXP = 1;
252 let EXP_CNT = 1;
253 let mayLoad = 0; // Set to 1 if done bit is set.
254 let mayStore = 1;
255 let UseNamedOperandTable = 1;
256 let Uses = [EXEC];
257 let SchedRW = [WriteExport];
258}
259
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000260} // End Uses = [EXEC]
261
Nikolay Haustov5bf46ac12016-03-04 10:39:50 +0000262class MIMG <dag outs, dag ins, string asm, list<dag> pattern> :
263 InstSI <outs, ins, asm, pattern> {
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000264
265 let VM_CNT = 1;
266 let EXP_CNT = 1;
267 let MIMG = 1;
Matt Arsenault80f766a2015-09-10 01:23:28 +0000268 let Uses = [EXEC];
Matt Arsenault9a072c12014-11-18 23:57:33 +0000269
Tom Stellard1397d492016-02-11 21:45:07 +0000270 let UseNamedOperandTable = 1;
Matt Arsenault9a072c12014-11-18 23:57:33 +0000271 let hasSideEffects = 0; // XXX ????
Tom Stellarde5a1cda2014-07-21 17:44:28 +0000272}