blob: d538c785781c79173697780980c1818950643289 [file] [log] [blame]
Valery Pykhtin2828b9b2016-09-19 14:39:49 +00001//===-- VOPInstructions.td - Vector Instruction Defintions ----------------===//
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
Valery Pykhtin355103f2016-09-23 09:08:07 +000010// dummies for outer let
11class LetDummies {
12 bit isCommutable;
13 bit isConvertibleToThreeAddress;
14 bit isMoveImm;
15 bit isReMaterializable;
16 bit isAsCheapAsAMove;
17 bit VOPAsmPrefer32Bit;
18 Predicate SubtargetPredicate;
19 string Constraints;
20 string DisableEncoding;
21 list<SchedReadWrite> SchedRW;
22 list<Register> Uses;
23 list<Register> Defs;
24}
25
26class VOP <string opName> {
27 string OpName = opName;
28}
29
30class VOPAnyCommon <dag outs, dag ins, string asm, list<dag> pattern> :
31 InstSI <outs, ins, asm, pattern> {
32
33 let mayLoad = 0;
34 let mayStore = 0;
35 let hasSideEffects = 0;
36 let UseNamedOperandTable = 1;
37 let VALU = 1;
38}
39
40class VOP3Common <dag outs, dag ins, string asm = "",
41 list<dag> pattern = [], bit HasMods = 0,
42 bit VOP3Only = 0> :
43 VOPAnyCommon <outs, ins, asm, pattern> {
44
45 // Using complex patterns gives VOP3 patterns a very high complexity rating,
46 // but standalone patterns are almost always prefered, so we need to adjust the
47 // priority lower. The goal is to use a high number to reduce complexity to
48 // zero (or less than zero).
49 let AddedComplexity = -1000;
50
51 let VOP3 = 1;
52 let VALU = 1;
53 let Uses = [EXEC];
54
55 let AsmMatchConverter =
56 !if(!eq(VOP3Only,1),
57 "cvtVOP3",
58 !if(!eq(HasMods,1), "cvtVOP3_2_mod", ""));
59
60 let AsmVariantName = AMDGPUAsmVariants.VOP3;
61
62 let isCodeGenOnly = 0;
63
64 int Size = 8;
65
66 // Because SGPRs may be allowed if there are multiple operands, we
67 // need a post-isel hook to insert copies in order to avoid
68 // violating constant bus requirements.
69 let hasPostISelHook = 1;
70}
71
72
73class VOP3_Pseudo <string opName, VOPProfile P, list<dag> pattern=[], bit VOP3Only = 0> :
Valery Pykhtin2828b9b2016-09-19 14:39:49 +000074 InstSI <P.Outs64, P.Ins64, "", pattern>,
75 VOP <opName>,
76 SIMCInstr<opName#"_e64", SIEncodingFamily.NONE>,
77 MnemonicAlias<opName#"_e64", opName> {
78
79 let isPseudo = 1;
80 let isCodeGenOnly = 1;
81 let UseNamedOperandTable = 1;
82
83 string Mnemonic = opName;
84 string AsmOperands = P.Asm64;
85
86 let Size = 8;
87 let mayLoad = 0;
88 let mayStore = 0;
89 let hasSideEffects = 0;
90 let SubtargetPredicate = isGCN;
91
92 // Because SGPRs may be allowed if there are multiple operands, we
93 // need a post-isel hook to insert copies in order to avoid
94 // violating constant bus requirements.
95 let hasPostISelHook = 1;
96
97 // Using complex patterns gives VOP3 patterns a very high complexity rating,
98 // but standalone patterns are almost always prefered, so we need to adjust the
99 // priority lower. The goal is to use a high number to reduce complexity to
100 // zero (or less than zero).
101 let AddedComplexity = -1000;
102
103 let VOP3 = 1;
104 let VALU = 1;
105 let Uses = [EXEC];
106
107 let AsmVariantName = AMDGPUAsmVariants.VOP3;
108 let AsmMatchConverter =
109 !if(!eq(VOP3Only,1),
110 "cvtVOP3",
111 !if(!eq(P.HasModifiers, 1), "cvtVOP3_2_mod", ""));
112
113 VOPProfile Pfl = P;
114}
115
Valery Pykhtin355103f2016-09-23 09:08:07 +0000116class VOP3_Real <VOP3_Pseudo ps, int EncodingFamily> :
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000117 InstSI <ps.OutOperandList, ps.InOperandList, ps.Mnemonic # ps.AsmOperands, []>,
118 SIMCInstr <ps.PseudoInstr, EncodingFamily> {
119
120 let isPseudo = 0;
121 let isCodeGenOnly = 0;
122
123 // copy relevant pseudo op flags
124 let SubtargetPredicate = ps.SubtargetPredicate;
125 let AsmMatchConverter = ps.AsmMatchConverter;
126 let AsmVariantName = ps.AsmVariantName;
127 let Constraints = ps.Constraints;
128 let DisableEncoding = ps.DisableEncoding;
129 let TSFlags = ps.TSFlags;
130}
131
Valery Pykhtin355103f2016-09-23 09:08:07 +0000132class VOP3a<VOPProfile P> : Enc64 {
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000133 bits<2> src0_modifiers;
134 bits<9> src0;
135 bits<2> src1_modifiers;
136 bits<9> src1;
137 bits<2> src2_modifiers;
138 bits<9> src2;
139 bits<1> clamp;
140 bits<2> omod;
141
142 let Inst{8} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0);
143 let Inst{9} = !if(P.HasSrc1Mods, src1_modifiers{1}, 0);
144 let Inst{10} = !if(P.HasSrc2Mods, src2_modifiers{1}, 0);
145
146 let Inst{31-26} = 0x34; //encoding
Valery Pykhtin355103f2016-09-23 09:08:07 +0000147 let Inst{40-32} = !if(P.HasSrc0, src0, 0);
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000148 let Inst{49-41} = !if(P.HasSrc1, src1, 0);
149 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
150 let Inst{60-59} = !if(P.HasOMod, omod, 0);
151 let Inst{61} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0);
152 let Inst{62} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0);
153 let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0);
154}
155
Valery Pykhtin355103f2016-09-23 09:08:07 +0000156class VOP3a_si <bits<9> op, VOPProfile P> : VOP3a<P> {
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000157 let Inst{25-17} = op;
Valery Pykhtin355103f2016-09-23 09:08:07 +0000158 let Inst{11} = !if(P.HasClamp, clamp{0}, 0);
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000159}
160
Valery Pykhtin355103f2016-09-23 09:08:07 +0000161class VOP3a_vi <bits<10> op, VOPProfile P> : VOP3a<P> {
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000162 let Inst{25-16} = op;
Valery Pykhtin355103f2016-09-23 09:08:07 +0000163 let Inst{15} = !if(P.HasClamp, clamp{0}, 0);
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000164}
165
Valery Pykhtin355103f2016-09-23 09:08:07 +0000166class VOP3e_si <bits<9> op, VOPProfile P> : VOP3a_si <op, P> {
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000167 bits<8> vdst;
Valery Pykhtin355103f2016-09-23 09:08:07 +0000168 let Inst{7-0} = !if(P.EmitDst, vdst{7-0}, 0);
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000169}
170
Valery Pykhtin355103f2016-09-23 09:08:07 +0000171class VOP3e_vi <bits<10> op, VOPProfile P> : VOP3a_vi <op, P> {
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000172 bits<8> vdst;
Valery Pykhtin355103f2016-09-23 09:08:07 +0000173 let Inst{7-0} = !if(P.EmitDst, vdst{7-0}, 0);
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000174}
175
Valery Pykhtin355103f2016-09-23 09:08:07 +0000176class VOP3be <VOPProfile P> : Enc64 {
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000177 bits<8> vdst;
178 bits<2> src0_modifiers;
179 bits<9> src0;
180 bits<2> src1_modifiers;
181 bits<9> src1;
182 bits<2> src2_modifiers;
183 bits<9> src2;
184 bits<7> sdst;
185 bits<2> omod;
186
187 let Inst{7-0} = vdst;
188 let Inst{14-8} = sdst;
189 let Inst{31-26} = 0x34; //encoding
190 let Inst{40-32} = !if(P.HasSrc0, src0, 0);
191 let Inst{49-41} = !if(P.HasSrc1, src1, 0);
192 let Inst{58-50} = !if(P.HasSrc2, src2, 0);
193 let Inst{60-59} = !if(P.HasOMod, omod, 0);
194 let Inst{61} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0);
195 let Inst{62} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0);
196 let Inst{63} = !if(P.HasSrc2Mods, src2_modifiers{0}, 0);
197}
198
Valery Pykhtin355103f2016-09-23 09:08:07 +0000199class VOP3be_si <bits<9> op, VOPProfile P> : VOP3be<P> {
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000200 let Inst{25-17} = op;
201}
202
Valery Pykhtin355103f2016-09-23 09:08:07 +0000203class VOP3be_vi <bits<10> op, VOPProfile P> : VOP3be<P> {
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000204 bits<1> clamp;
205 let Inst{25-16} = op;
Valery Pykhtin355103f2016-09-23 09:08:07 +0000206 let Inst{15} = !if(P.HasClamp, clamp{0}, 0);
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000207}
208
Valery Pykhtin355103f2016-09-23 09:08:07 +0000209class VOP_SDWAe<VOPProfile P> : Enc64 {
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000210 bits<8> src0;
211 bits<3> src0_sel;
Valery Pykhtin355103f2016-09-23 09:08:07 +0000212 bits<2> src0_modifiers; // float: {abs,neg}, int {sext}
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000213 bits<3> src1_sel;
Valery Pykhtin355103f2016-09-23 09:08:07 +0000214 bits<2> src1_modifiers;
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000215 bits<3> dst_sel;
216 bits<2> dst_unused;
217 bits<1> clamp;
218
219 bits<3> SDWA_DWORD = 6;
220 bits<2> SDWA_UNUSED_PRESERVE = 2;
221
222 let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0);
Valery Pykhtin355103f2016-09-23 09:08:07 +0000223 let Inst{42-40} = !if(P.EmitDst, dst_sel{2-0}, SDWA_DWORD{2-0});
224 let Inst{44-43} = !if(P.EmitDst, dst_unused{1-0}, SDWA_UNUSED_PRESERVE{1-0});
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000225 let Inst{45} = !if(P.HasSDWAClamp, clamp{0}, 0);
226 let Inst{50-48} = !if(P.HasSrc0, src0_sel{2-0}, SDWA_DWORD{2-0});
Valery Pykhtin355103f2016-09-23 09:08:07 +0000227 let Inst{53-52} = !if(P.HasSrc0FloatMods, src0_modifiers{1-0}, 0);
228 let Inst{51} = !if(P.HasSrc0IntMods, src0_modifiers{0}, 0);
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000229 let Inst{58-56} = !if(P.HasSrc1, src1_sel{2-0}, SDWA_DWORD{2-0});
Valery Pykhtin355103f2016-09-23 09:08:07 +0000230 let Inst{61-60} = !if(P.HasSrc1FloatMods, src1_modifiers{1-0}, 0);
231 let Inst{59} = !if(P.HasSrc1IntMods, src1_modifiers{0}, 0);
232}
233
234class VOP_SDWA <string OpName, VOPProfile P> :
235 InstSI <P.OutsSDWA, P.InsSDWA, OpName#P.AsmSDWA, []>,
236 VOP_SDWAe<P> {
237 let mayLoad = 0;
238 let mayStore = 0;
239 let hasSideEffects = 0;
240 let UseNamedOperandTable = 1;
241 let VALU = 1;
242 let SDWA = 1;
243 let Size = 8;
244
245 let SubtargetPredicate = isVI;
246 let AssemblerPredicate = !if(P.HasExt, isVI, DisableInst);
247 let AsmVariantName = !if(P.HasExt, AMDGPUAsmVariants.SDWA,
248 AMDGPUAsmVariants.Disable);
249 let DecoderNamespace = "SDWA";
250}
251
252class VOP_DPPe<VOPProfile P> : Enc64 {
253 bits<2> src0_modifiers;
254 bits<8> src0;
255 bits<2> src1_modifiers;
256 bits<9> dpp_ctrl;
257 bits<1> bound_ctrl;
258 bits<4> bank_mask;
259 bits<4> row_mask;
260
261 let Inst{39-32} = !if(P.HasSrc0, src0{7-0}, 0);
262 let Inst{48-40} = dpp_ctrl;
263 let Inst{51} = bound_ctrl;
264 let Inst{52} = !if(P.HasSrc0Mods, src0_modifiers{0}, 0); // src0_neg
265 let Inst{53} = !if(P.HasSrc0Mods, src0_modifiers{1}, 0); // src0_abs
266 let Inst{54} = !if(P.HasSrc1Mods, src1_modifiers{0}, 0); // src1_neg
267 let Inst{55} = !if(P.HasSrc1Mods, src1_modifiers{1}, 0); // src1_abs
268 let Inst{59-56} = bank_mask;
269 let Inst{63-60} = row_mask;
270}
271
272class VOP_DPP <string OpName, VOPProfile P> :
273 InstSI <P.OutsDPP, P.InsDPP, OpName#P.AsmDPP, []>,
274 VOP_DPPe<P> {
275
276 let mayLoad = 0;
277 let mayStore = 0;
278 let hasSideEffects = 0;
279 let UseNamedOperandTable = 1;
280
281 let VALU = 1;
282 let DPP = 1;
283 let Size = 8;
284
285 let AsmMatchConverter = !if(!eq(P.HasModifiers,1), "cvtDPP", "");
286 let SubtargetPredicate = isVI;
287 let AssemblerPredicate = !if(P.HasExt, isVI, DisableInst);
288 let AsmVariantName = !if(P.HasExt, AMDGPUAsmVariants.DPP,
289 AMDGPUAsmVariants.Disable);
290 let DecoderNamespace = "DPP";
Valery Pykhtin2828b9b2016-09-19 14:39:49 +0000291}
292
293include "VOPCInstructions.td"
Valery Pykhtin355103f2016-09-23 09:08:07 +0000294include "VOP1Instructions.td"
295include "VOP2Instructions.td"
Valery Pykhtine330cfa2016-09-20 10:41:16 +0000296include "VOP3Instructions.td"