blob: 866e3490cc0c9c37219582a87ac01d635bdaa2f9 [file] [log] [blame]
Christian Konig72d5d5c2013-02-21 15:16:44 +00001//===-- SIInstrInfo.td - SI Instruction Infos -------------*- tablegen -*--===//
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
Tom Stellard94d2e992014-10-07 23:51:34 +000010class vop {
11 field bits<9> SI3;
Marek Olsak5df00d62014-12-07 12:18:57 +000012 field bits<10> VI3;
Tom Stellard94d2e992014-10-07 23:51:34 +000013}
14
Marek Olsak5df00d62014-12-07 12:18:57 +000015class vopc <bits<8> si, bits<8> vi = !add(0x40, si)> : vop {
Tom Stellard0aec5872014-10-07 23:51:39 +000016 field bits<8> SI = si;
Marek Olsak5df00d62014-12-07 12:18:57 +000017 field bits<8> VI = vi;
Tom Stellard0aec5872014-10-07 23:51:39 +000018
Marek Olsak5df00d62014-12-07 12:18:57 +000019 field bits<9> SI3 = {0, si{7-0}};
20 field bits<10> VI3 = {0, 0, vi{7-0}};
Tom Stellard0aec5872014-10-07 23:51:39 +000021}
22
Marek Olsak5df00d62014-12-07 12:18:57 +000023class vop1 <bits<8> si, bits<8> vi = si> : vop {
24 field bits<8> SI = si;
25 field bits<8> VI = vi;
Tom Stellard94d2e992014-10-07 23:51:34 +000026
Marek Olsak5df00d62014-12-07 12:18:57 +000027 field bits<9> SI3 = {1, 1, si{6-0}};
28 field bits<10> VI3 = !add(0x140, vi);
Tom Stellard94d2e992014-10-07 23:51:34 +000029}
30
Marek Olsak5df00d62014-12-07 12:18:57 +000031class vop2 <bits<6> si, bits<6> vi = si> : vop {
Tom Stellardbec5a242014-10-07 23:51:38 +000032 field bits<6> SI = si;
Marek Olsak5df00d62014-12-07 12:18:57 +000033 field bits<6> VI = vi;
Tom Stellardbec5a242014-10-07 23:51:38 +000034
Marek Olsak5df00d62014-12-07 12:18:57 +000035 field bits<9> SI3 = {1, 0, 0, si{5-0}};
36 field bits<10> VI3 = {0, 1, 0, 0, vi{5-0}};
Tom Stellardbec5a242014-10-07 23:51:38 +000037}
38
Marek Olsakf0b130a2015-01-15 18:43:06 +000039// Specify a VOP2 opcode for SI and VOP3 opcode for VI
40// that doesn't have VOP2 encoding on VI
41class vop23 <bits<6> si, bits<10> vi> : vop2 <si> {
42 let VI3 = vi;
43}
44
Marek Olsak5df00d62014-12-07 12:18:57 +000045class vop3 <bits<9> si, bits<10> vi = {0, si}> : vop {
46 let SI3 = si;
47 let VI3 = vi;
48}
49
50class sop1 <bits<8> si, bits<8> vi = si> {
51 field bits<8> SI = si;
52 field bits<8> VI = vi;
53}
54
55class sop2 <bits<7> si, bits<7> vi = si> {
56 field bits<7> SI = si;
57 field bits<7> VI = vi;
58}
59
60class sopk <bits<5> si, bits<5> vi = si> {
61 field bits<5> SI = si;
62 field bits<5> VI = vi;
Tom Stellard845bb3c2014-10-07 23:51:41 +000063}
64
Tom Stellardc721a232014-05-16 20:56:47 +000065// Execpt for the NONE field, this must be kept in sync with the SISubtarget enum
Marek Olsaka93603d2015-01-15 18:42:51 +000066// in AMDGPUInstrInfo.cpp
Tom Stellardc721a232014-05-16 20:56:47 +000067def SISubtarget {
68 int NONE = -1;
69 int SI = 0;
Marek Olsak5df00d62014-12-07 12:18:57 +000070 int VI = 1;
Tom Stellardc721a232014-05-16 20:56:47 +000071}
72
Tom Stellard75aadc22012-12-11 21:25:42 +000073//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +000074// SI DAG Nodes
75//===----------------------------------------------------------------------===//
76
Tom Stellard9fa17912013-08-14 23:24:45 +000077def SIload_constant : SDNode<"AMDGPUISD::LOAD_CONSTANT",
Tom Stellard868fd922014-04-17 21:00:11 +000078 SDTypeProfile<1, 2, [SDTCisVT<0, f32>, SDTCisVT<1, v4i32>, SDTCisVT<2, i32>]>,
Tom Stellard9fa17912013-08-14 23:24:45 +000079 [SDNPMayLoad, SDNPMemOperand]
80>;
81
Tom Stellardafcf12f2013-09-12 02:55:14 +000082def SItbuffer_store : SDNode<"AMDGPUISD::TBUFFER_STORE_FORMAT",
83 SDTypeProfile<0, 13,
Tom Stellard868fd922014-04-17 21:00:11 +000084 [SDTCisVT<0, v4i32>, // rsrc(SGPR)
Tom Stellardafcf12f2013-09-12 02:55:14 +000085 SDTCisVT<1, iAny>, // vdata(VGPR)
86 SDTCisVT<2, i32>, // num_channels(imm)
87 SDTCisVT<3, i32>, // vaddr(VGPR)
88 SDTCisVT<4, i32>, // soffset(SGPR)
89 SDTCisVT<5, i32>, // inst_offset(imm)
90 SDTCisVT<6, i32>, // dfmt(imm)
91 SDTCisVT<7, i32>, // nfmt(imm)
92 SDTCisVT<8, i32>, // offen(imm)
93 SDTCisVT<9, i32>, // idxen(imm)
94 SDTCisVT<10, i32>, // glc(imm)
95 SDTCisVT<11, i32>, // slc(imm)
96 SDTCisVT<12, i32> // tfe(imm)
97 ]>,
98 [SDNPMayStore, SDNPMemOperand, SDNPHasChain]
99>;
100
Tom Stellard9fa17912013-08-14 23:24:45 +0000101def SIload_input : SDNode<"AMDGPUISD::LOAD_INPUT",
Tom Stellard868fd922014-04-17 21:00:11 +0000102 SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisVT<1, v4i32>, SDTCisVT<2, i16>,
Tom Stellard9fa17912013-08-14 23:24:45 +0000103 SDTCisVT<3, i32>]>
104>;
105
106class SDSample<string opcode> : SDNode <opcode,
Tom Stellard67850652013-08-14 23:24:53 +0000107 SDTypeProfile<1, 4, [SDTCisVT<0, v4f32>, SDTCisVT<2, v32i8>,
Tom Stellard868fd922014-04-17 21:00:11 +0000108 SDTCisVT<3, v4i32>, SDTCisVT<4, i32>]>
Tom Stellard9fa17912013-08-14 23:24:45 +0000109>;
110
111def SIsample : SDSample<"AMDGPUISD::SAMPLE">;
112def SIsampleb : SDSample<"AMDGPUISD::SAMPLEB">;
113def SIsampled : SDSample<"AMDGPUISD::SAMPLED">;
114def SIsamplel : SDSample<"AMDGPUISD::SAMPLEL">;
115
Tom Stellard067c8152014-07-21 14:01:14 +0000116def SIconstdata_ptr : SDNode<
117 "AMDGPUISD::CONST_DATA_PTR", SDTypeProfile <1, 0, [SDTCisVT<0, i64>]>
118>;
119
Tom Stellard26075d52013-02-07 19:39:38 +0000120// Transformation function, extract the lower 32bit of a 64bit immediate
121def LO32 : SDNodeXForm<imm, [{
122 return CurDAG->getTargetConstant(N->getZExtValue() & 0xffffffff, MVT::i32);
123}]>;
124
Tom Stellardab8a8c82013-07-12 18:15:02 +0000125def LO32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +0000126 APInt V = N->getValueAPF().bitcastToAPInt().trunc(32);
127 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +0000128}]>;
129
Tom Stellard26075d52013-02-07 19:39:38 +0000130// Transformation function, extract the upper 32bit of a 64bit immediate
131def HI32 : SDNodeXForm<imm, [{
132 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
133}]>;
134
Tom Stellardab8a8c82013-07-12 18:15:02 +0000135def HI32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +0000136 APInt V = N->getValueAPF().bitcastToAPInt().lshr(32).trunc(32);
137 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +0000138}]>;
139
Tom Stellard044e4182014-02-06 18:36:34 +0000140def IMM8bitDWORD : PatLeaf <(imm),
141 [{return (N->getZExtValue() & ~0x3FC) == 0;}]
Tom Stellard89093802013-02-07 19:39:40 +0000142>;
143
Tom Stellard044e4182014-02-06 18:36:34 +0000144def as_dword_i32imm : SDNodeXForm<imm, [{
145 return CurDAG->getTargetConstant(N->getZExtValue() >> 2, MVT::i32);
146}]>;
147
Tom Stellardafcf12f2013-09-12 02:55:14 +0000148def as_i1imm : SDNodeXForm<imm, [{
149 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i1);
150}]>;
151
152def as_i8imm : SDNodeXForm<imm, [{
153 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i8);
154}]>;
155
Tom Stellard07a10a32013-06-03 17:39:43 +0000156def as_i16imm : SDNodeXForm<imm, [{
157 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
158}]>;
159
Tom Stellard044e4182014-02-06 18:36:34 +0000160def as_i32imm: SDNodeXForm<imm, [{
161 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i32);
162}]>;
163
Matt Arsenaultbecd6562014-12-03 05:22:35 +0000164def as_i64imm: SDNodeXForm<imm, [{
165 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i64);
166}]>;
167
Tom Stellardfb77f002015-01-13 22:59:41 +0000168// Copied from the AArch64 backend:
169def bitcast_fpimm_to_i32 : SDNodeXForm<fpimm, [{
170return CurDAG->getTargetConstant(
171 N->getValueAPF().bitcastToAPInt().getZExtValue(), MVT::i32);
172}]>;
173
174// Copied from the AArch64 backend:
175def bitcast_fpimm_to_i64 : SDNodeXForm<fpimm, [{
176return CurDAG->getTargetConstant(
177 N->getValueAPF().bitcastToAPInt().getZExtValue(), MVT::i64);
178}]>;
179
Matt Arsenault99ed7892014-03-19 22:19:49 +0000180def IMM8bit : PatLeaf <(imm),
181 [{return isUInt<8>(N->getZExtValue());}]
182>;
183
Tom Stellard07a10a32013-06-03 17:39:43 +0000184def IMM12bit : PatLeaf <(imm),
185 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +0000186>;
187
Matt Arsenault99ed7892014-03-19 22:19:49 +0000188def IMM16bit : PatLeaf <(imm),
189 [{return isUInt<16>(N->getZExtValue());}]
190>;
191
Marek Olsak58f61a82014-12-07 17:17:38 +0000192def IMM20bit : PatLeaf <(imm),
193 [{return isUInt<20>(N->getZExtValue());}]
194>;
195
Tom Stellardd6cb8e82014-05-09 16:42:21 +0000196def IMM32bit : PatLeaf <(imm),
197 [{return isUInt<32>(N->getZExtValue());}]
198>;
199
Tom Stellarde2367942014-02-06 18:36:41 +0000200def mubuf_vaddr_offset : PatFrag<
201 (ops node:$ptr, node:$offset, node:$imm_offset),
202 (add (add node:$ptr, node:$offset), node:$imm_offset)
203>;
204
Christian Konigf82901a2013-02-26 17:52:23 +0000205class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Tom Stellard7ed0b522014-04-03 20:19:27 +0000206 return isInlineImmediate(N);
Christian Konigb559b072013-02-16 11:28:36 +0000207}]>;
208
Matt Arsenault303011a2014-12-17 21:04:08 +0000209class InlineFPImm <ValueType vt> : PatLeaf <(vt fpimm), [{
210 return isInlineImmediate(N);
211}]>;
212
Tom Stellarddf94dc32013-08-14 23:24:24 +0000213class SGPRImm <dag frag> : PatLeaf<frag, [{
Eric Christopher7792e322015-01-30 23:24:40 +0000214 if (Subtarget->getGeneration() < AMDGPUSubtarget::SOUTHERN_ISLANDS) {
Tom Stellarddf94dc32013-08-14 23:24:24 +0000215 return false;
216 }
217 const SIRegisterInfo *SIRI =
Eric Christopher7792e322015-01-30 23:24:40 +0000218 static_cast<const SIRegisterInfo *>(Subtarget->getRegisterInfo());
Tom Stellarddf94dc32013-08-14 23:24:24 +0000219 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
220 U != E; ++U) {
221 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
222 return true;
223 }
224 }
225 return false;
226}]>;
227
Tom Stellard01825af2014-07-21 14:01:08 +0000228//===----------------------------------------------------------------------===//
229// Custom Operands
230//===----------------------------------------------------------------------===//
231
Matt Arsenaulta98cd6a2013-12-19 05:32:55 +0000232def FRAMEri32 : Operand<iPTR> {
Matt Arsenault06028dd2014-05-01 16:37:52 +0000233 let MIOperandInfo = (ops i32:$ptr, i32imm:$index);
Tom Stellard81d871d2013-11-13 23:36:50 +0000234}
235
Tom Stellard01825af2014-07-21 14:01:08 +0000236def sopp_brtarget : Operand<OtherVT> {
237 let EncoderMethod = "getSOPPBrEncoding";
238 let OperandType = "OPERAND_PCREL";
239}
240
Tom Stellardb4a313a2014-08-01 00:32:39 +0000241include "SIInstrFormats.td"
Marek Olsak5df00d62014-12-07 12:18:57 +0000242include "VIInstrFormats.td"
Tom Stellardb4a313a2014-08-01 00:32:39 +0000243
Tom Stellard229d5e62014-08-05 14:48:12 +0000244let OperandType = "OPERAND_IMMEDIATE" in {
245
246def offen : Operand<i1> {
247 let PrintMethod = "printOffen";
248}
249def idxen : Operand<i1> {
250 let PrintMethod = "printIdxen";
251}
252def addr64 : Operand<i1> {
253 let PrintMethod = "printAddr64";
254}
255def mbuf_offset : Operand<i16> {
256 let PrintMethod = "printMBUFOffset";
257}
Matt Arsenault61cc9082014-10-10 22:16:07 +0000258def ds_offset : Operand<i16> {
259 let PrintMethod = "printDSOffset";
260}
261def ds_offset0 : Operand<i8> {
262 let PrintMethod = "printDSOffset0";
263}
264def ds_offset1 : Operand<i8> {
265 let PrintMethod = "printDSOffset1";
266}
Tom Stellard065e3d42015-03-09 18:49:54 +0000267def gds : Operand <i1> {
268 let PrintMethod = "printGDS";
269}
Tom Stellard229d5e62014-08-05 14:48:12 +0000270def glc : Operand <i1> {
271 let PrintMethod = "printGLC";
272}
273def slc : Operand <i1> {
274 let PrintMethod = "printSLC";
275}
276def tfe : Operand <i1> {
277 let PrintMethod = "printTFE";
278}
279
Matt Arsenault97069782014-09-30 19:49:48 +0000280def omod : Operand <i32> {
281 let PrintMethod = "printOModSI";
282}
283
284def ClampMod : Operand <i1> {
285 let PrintMethod = "printClampSI";
286}
287
Tom Stellard229d5e62014-08-05 14:48:12 +0000288} // End OperandType = "OPERAND_IMMEDIATE"
289
Tom Stellardc0503922015-03-12 21:34:22 +0000290def VOPDstS64 : VOPDstOperand <SReg_64>;
291
Christian Konig72d5d5c2013-02-21 15:16:44 +0000292//===----------------------------------------------------------------------===//
Tom Stellardb02c2682014-06-24 23:33:07 +0000293// Complex patterns
294//===----------------------------------------------------------------------===//
295
Tom Stellard85e8b6d2014-08-22 18:49:33 +0000296def DS1Addr1Offset : ComplexPattern<i32, 2, "SelectDS1Addr1Offset">;
Tom Stellardf3fc5552014-08-22 18:49:35 +0000297def DS64Bit4ByteAligned : ComplexPattern<i32, 3, "SelectDS64Bit4ByteAligned">;
Tom Stellard85e8b6d2014-08-22 18:49:33 +0000298
Tom Stellardb02094e2014-07-21 15:45:01 +0000299def MUBUFAddr32 : ComplexPattern<i64, 9, "SelectMUBUFAddr32">;
Tom Stellard1f9939f2015-02-27 14:59:41 +0000300def MUBUFAddr64 : ComplexPattern<i64, 7, "SelectMUBUFAddr64">;
Tom Stellardc53861a2015-02-11 00:34:32 +0000301def MUBUFAddr64Atomic : ComplexPattern<i64, 5, "SelectMUBUFAddr64">;
Tom Stellardb02094e2014-07-21 15:45:01 +0000302def MUBUFScratch : ComplexPattern<i64, 4, "SelectMUBUFScratch">;
Tom Stellard155bbb72014-08-11 22:18:17 +0000303def MUBUFOffset : ComplexPattern<i64, 6, "SelectMUBUFOffset">;
Tom Stellard7980fc82014-09-25 18:30:26 +0000304def MUBUFOffsetAtomic : ComplexPattern<i64, 4, "SelectMUBUFOffset">;
Tom Stellardb02c2682014-06-24 23:33:07 +0000305
Tom Stellardb4a313a2014-08-01 00:32:39 +0000306def VOP3Mods0 : ComplexPattern<untyped, 4, "SelectVOP3Mods0">;
Matt Arsenault1cffa4c2014-11-13 19:49:04 +0000307def VOP3Mods0Clamp : ComplexPattern<untyped, 3, "SelectVOP3Mods0Clamp">;
Matt Arsenault4831ce52015-01-06 23:00:37 +0000308def VOP3Mods0Clamp0OMod : ComplexPattern<untyped, 4, "SelectVOP3Mods0Clamp0OMod">;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000309def VOP3Mods : ComplexPattern<untyped, 2, "SelectVOP3Mods">;
310
Tom Stellardb02c2682014-06-24 23:33:07 +0000311//===----------------------------------------------------------------------===//
Christian Konig72d5d5c2013-02-21 15:16:44 +0000312// SI assembler operands
313//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000314
Christian Konigeabf8332013-02-21 15:16:49 +0000315def SIOperand {
316 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000317 int VCC = 0x6A;
Matt Arsenault3f981402014-09-15 15:41:53 +0000318 int FLAT_SCR = 0x68;
Tom Stellard75aadc22012-12-11 21:25:42 +0000319}
320
Tom Stellardb4a313a2014-08-01 00:32:39 +0000321def SRCMODS {
322 int NONE = 0;
Marek Olsak7d777282015-03-24 13:40:15 +0000323 int NEG = 1;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000324}
325
326def DSTCLAMP {
327 int NONE = 0;
328}
329
330def DSTOMOD {
331 int NONE = 0;
332}
Tom Stellard75aadc22012-12-11 21:25:42 +0000333
Christian Konig72d5d5c2013-02-21 15:16:44 +0000334//===----------------------------------------------------------------------===//
335//
336// SI Instruction multiclass helpers.
337//
338// Instructions with _32 take 32-bit operands.
339// Instructions with _64 take 64-bit operands.
340//
341// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
342// encoding is the standard encoding, but instruction that make use of
343// any of the instruction modifiers must use the 64-bit encoding.
344//
345// Instructions with _e32 use the 32-bit encoding.
346// Instructions with _e64 use the 64-bit encoding.
347//
348//===----------------------------------------------------------------------===//
349
Tom Stellardc470c962014-10-01 14:44:42 +0000350class SIMCInstr <string pseudo, int subtarget> {
351 string PseudoInstr = pseudo;
352 int Subtarget = subtarget;
353}
354
Christian Konig72d5d5c2013-02-21 15:16:44 +0000355//===----------------------------------------------------------------------===//
Tom Stellard3a35d8f2014-10-01 14:44:45 +0000356// EXP classes
357//===----------------------------------------------------------------------===//
358
359class EXPCommon : InstSI<
360 (outs),
361 (ins i32imm:$en, i32imm:$tgt, i32imm:$compr, i32imm:$done, i32imm:$vm,
Tom Stellard45c0b3a2015-01-07 20:59:25 +0000362 VGPR_32:$src0, VGPR_32:$src1, VGPR_32:$src2, VGPR_32:$src3),
Tom Stellard326d6ec2014-11-05 14:50:53 +0000363 "exp $en, $tgt, $compr, $done, $vm, $src0, $src1, $src2, $src3",
Tom Stellard3a35d8f2014-10-01 14:44:45 +0000364 [] > {
365
366 let EXP_CNT = 1;
367 let Uses = [EXEC];
368}
369
370multiclass EXP_m {
371
Tom Stellard1ca873b2015-02-18 16:08:17 +0000372 let isPseudo = 1, isCodeGenOnly = 1 in {
Tom Stellard326d6ec2014-11-05 14:50:53 +0000373 def "" : EXPCommon, SIMCInstr <"exp", SISubtarget.NONE> ;
Tom Stellard3a35d8f2014-10-01 14:44:45 +0000374 }
375
Tom Stellard326d6ec2014-11-05 14:50:53 +0000376 def _si : EXPCommon, SIMCInstr <"exp", SISubtarget.SI>, EXPe;
Marek Olsak5df00d62014-12-07 12:18:57 +0000377
378 def _vi : EXPCommon, SIMCInstr <"exp", SISubtarget.VI>, EXPe_vi;
Tom Stellard3a35d8f2014-10-01 14:44:45 +0000379}
380
381//===----------------------------------------------------------------------===//
Christian Konig72d5d5c2013-02-21 15:16:44 +0000382// Scalar classes
383//===----------------------------------------------------------------------===//
384
Marek Olsak5df00d62014-12-07 12:18:57 +0000385class SOP1_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> :
386 SOP1 <outs, ins, "", pattern>,
387 SIMCInstr<opName, SISubtarget.NONE> {
388 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +0000389 let isCodeGenOnly = 1;
Marek Olsak5df00d62014-12-07 12:18:57 +0000390}
Christian Konig72d5d5c2013-02-21 15:16:44 +0000391
Marek Olsak367447c2015-01-27 17:25:11 +0000392class SOP1_Real_si <sop1 op, string opName, dag outs, dag ins, string asm> :
393 SOP1 <outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000394 SOP1e <op.SI>,
395 SIMCInstr<opName, SISubtarget.SI>;
396
Marek Olsak367447c2015-01-27 17:25:11 +0000397class SOP1_Real_vi <sop1 op, string opName, dag outs, dag ins, string asm> :
398 SOP1 <outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000399 SOP1e <op.VI>,
400 SIMCInstr<opName, SISubtarget.VI>;
401
Tom Stellarde1e4a2d32015-02-13 21:02:37 +0000402multiclass SOP1_m <sop1 op, string opName, dag outs, dag ins, string asm,
403 list<dag> pattern> {
Marek Olsak5df00d62014-12-07 12:18:57 +0000404
Tom Stellarde1e4a2d32015-02-13 21:02:37 +0000405 def "" : SOP1_Pseudo <opName, outs, ins, pattern>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000406
Tom Stellarde1e4a2d32015-02-13 21:02:37 +0000407 def _si : SOP1_Real_si <op, opName, outs, ins, asm>;
408
409 def _vi : SOP1_Real_vi <op, opName, outs, ins, asm>;
410
Marek Olsak5df00d62014-12-07 12:18:57 +0000411}
412
Tom Stellarde1e4a2d32015-02-13 21:02:37 +0000413multiclass SOP1_32 <sop1 op, string opName, list<dag> pattern> : SOP1_m <
414 op, opName, (outs SReg_32:$dst), (ins SSrc_32:$src0),
415 opName#" $dst, $src0", pattern
416>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000417
Tom Stellarde1e4a2d32015-02-13 21:02:37 +0000418multiclass SOP1_64 <sop1 op, string opName, list<dag> pattern> : SOP1_m <
419 op, opName, (outs SReg_64:$dst), (ins SSrc_64:$src0),
420 opName#" $dst, $src0", pattern
421>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000422
423// no input, 64-bit output.
424multiclass SOP1_64_0 <sop1 op, string opName, list<dag> pattern> {
425 def "" : SOP1_Pseudo <opName, (outs SReg_64:$dst), (ins), pattern>;
426
427 def _si : SOP1_Real_si <op, opName, (outs SReg_64:$dst), (ins),
Marek Olsak367447c2015-01-27 17:25:11 +0000428 opName#" $dst"> {
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000429 let ssrc0 = 0;
Marek Olsak5df00d62014-12-07 12:18:57 +0000430 }
431
432 def _vi : SOP1_Real_vi <op, opName, (outs SReg_64:$dst), (ins),
Marek Olsak367447c2015-01-27 17:25:11 +0000433 opName#" $dst"> {
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +0000434 let ssrc0 = 0;
Marek Olsak5df00d62014-12-07 12:18:57 +0000435 }
436}
Christian Konig72d5d5c2013-02-21 15:16:44 +0000437
Tom Stellardce449ad2015-02-18 16:08:11 +0000438// 64-bit input, no output
439multiclass SOP1_1 <sop1 op, string opName, list<dag> pattern> {
440 def "" : SOP1_Pseudo <opName, (outs), (ins SReg_64:$src0), pattern>;
441
442 def _si : SOP1_Real_si <op, opName, (outs), (ins SReg_64:$src0),
443 opName#" $src0"> {
444 let sdst = 0;
445 }
446
447 def _vi : SOP1_Real_vi <op, opName, (outs), (ins SReg_64:$src0),
448 opName#" $src0"> {
449 let sdst = 0;
450 }
451}
452
Matt Arsenault8333e432014-06-10 19:18:24 +0000453// 64-bit input, 32-bit output.
Tom Stellarde1e4a2d32015-02-13 21:02:37 +0000454multiclass SOP1_32_64 <sop1 op, string opName, list<dag> pattern> : SOP1_m <
455 op, opName, (outs SReg_32:$dst), (ins SSrc_64:$src0),
456 opName#" $dst, $src0", pattern
457>;
Matt Arsenault1a179e82014-11-13 20:23:36 +0000458
Marek Olsak5df00d62014-12-07 12:18:57 +0000459class SOP2_Pseudo<string opName, dag outs, dag ins, list<dag> pattern> :
460 SOP2<outs, ins, "", pattern>,
461 SIMCInstr<opName, SISubtarget.NONE> {
462 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +0000463 let isCodeGenOnly = 1;
Marek Olsak5df00d62014-12-07 12:18:57 +0000464 let Size = 4;
Tom Stellard0c0008c2015-02-18 16:08:13 +0000465
466 // Pseudo instructions have no encodings, but adding this field here allows
467 // us to do:
468 // let sdst = xxx in {
469 // for multiclasses that include both real and pseudo instructions.
470 field bits<7> sdst = 0;
Marek Olsak5df00d62014-12-07 12:18:57 +0000471}
Christian Konig72d5d5c2013-02-21 15:16:44 +0000472
Marek Olsak367447c2015-01-27 17:25:11 +0000473class SOP2_Real_si<sop2 op, string opName, dag outs, dag ins, string asm> :
474 SOP2<outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000475 SOP2e<op.SI>,
476 SIMCInstr<opName, SISubtarget.SI>;
Matt Arsenault94812212014-11-14 18:18:16 +0000477
Marek Olsak367447c2015-01-27 17:25:11 +0000478class SOP2_Real_vi<sop2 op, string opName, dag outs, dag ins, string asm> :
479 SOP2<outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000480 SOP2e<op.VI>,
481 SIMCInstr<opName, SISubtarget.VI>;
482
483multiclass SOP2_SELECT_32 <sop2 op, string opName, list<dag> pattern> {
484 def "" : SOP2_Pseudo <opName, (outs SReg_32:$dst),
485 (ins SSrc_32:$src0, SSrc_32:$src1, SCCReg:$scc), pattern>;
486
487 def _si : SOP2_Real_si <op, opName, (outs SReg_32:$dst),
488 (ins SSrc_32:$src0, SSrc_32:$src1, SCCReg:$scc),
Marek Olsak367447c2015-01-27 17:25:11 +0000489 opName#" $dst, $src0, $src1 [$scc]">;
Marek Olsak5df00d62014-12-07 12:18:57 +0000490
491 def _vi : SOP2_Real_vi <op, opName, (outs SReg_32:$dst),
492 (ins SSrc_32:$src0, SSrc_32:$src1, SCCReg:$scc),
Marek Olsak367447c2015-01-27 17:25:11 +0000493 opName#" $dst, $src0, $src1 [$scc]">;
Marek Olsak5df00d62014-12-07 12:18:57 +0000494}
495
Tom Stellardee21faa2015-02-18 16:08:09 +0000496multiclass SOP2_m <sop2 op, string opName, dag outs, dag ins, string asm,
497 list<dag> pattern> {
Marek Olsak5df00d62014-12-07 12:18:57 +0000498
Tom Stellardee21faa2015-02-18 16:08:09 +0000499 def "" : SOP2_Pseudo <opName, outs, ins, pattern>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000500
Tom Stellardee21faa2015-02-18 16:08:09 +0000501 def _si : SOP2_Real_si <op, opName, outs, ins, asm>;
502
503 def _vi : SOP2_Real_vi <op, opName, outs, ins, asm>;
504
Marek Olsak5df00d62014-12-07 12:18:57 +0000505}
506
Tom Stellardee21faa2015-02-18 16:08:09 +0000507multiclass SOP2_32 <sop2 op, string opName, list<dag> pattern> : SOP2_m <
508 op, opName, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
509 opName#" $dst, $src0, $src1", pattern
510>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000511
Tom Stellardee21faa2015-02-18 16:08:09 +0000512multiclass SOP2_64 <sop2 op, string opName, list<dag> pattern> : SOP2_m <
513 op, opName, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
514 opName#" $dst, $src0, $src1", pattern
515>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000516
Tom Stellardee21faa2015-02-18 16:08:09 +0000517multiclass SOP2_64_32 <sop2 op, string opName, list<dag> pattern> : SOP2_m <
518 op, opName, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_32:$src1),
519 opName#" $dst, $src0, $src1", pattern
520>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000521
Tom Stellardb6550522015-01-12 19:33:18 +0000522class SOPC_Helper <bits<7> op, RegisterOperand rc, ValueType vt,
Matt Arsenault0cb92e12014-04-11 19:25:18 +0000523 string opName, PatLeaf cond> : SOPC <
524 op, (outs SCCReg:$dst), (ins rc:$src0, rc:$src1),
Tom Stellarde2f5b412015-03-12 21:34:28 +0000525 opName#" $src0, $src1", []>;
Matt Arsenault0cb92e12014-04-11 19:25:18 +0000526
527class SOPC_32<bits<7> op, string opName, PatLeaf cond = COND_NULL>
528 : SOPC_Helper<op, SSrc_32, i32, opName, cond>;
529
530class SOPC_64<bits<7> op, string opName, PatLeaf cond = COND_NULL>
531 : SOPC_Helper<op, SSrc_64, i64, opName, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000532
Marek Olsak5df00d62014-12-07 12:18:57 +0000533class SOPK_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> :
534 SOPK <outs, ins, "", pattern>,
535 SIMCInstr<opName, SISubtarget.NONE> {
536 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +0000537 let isCodeGenOnly = 1;
Marek Olsak5df00d62014-12-07 12:18:57 +0000538}
Christian Konig72d5d5c2013-02-21 15:16:44 +0000539
Marek Olsak367447c2015-01-27 17:25:11 +0000540class SOPK_Real_si <sopk op, string opName, dag outs, dag ins, string asm> :
541 SOPK <outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000542 SOPKe <op.SI>,
543 SIMCInstr<opName, SISubtarget.SI>;
544
Marek Olsak367447c2015-01-27 17:25:11 +0000545class SOPK_Real_vi <sopk op, string opName, dag outs, dag ins, string asm> :
546 SOPK <outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000547 SOPKe <op.VI>,
548 SIMCInstr<opName, SISubtarget.VI>;
549
550multiclass SOPK_32 <sopk op, string opName, list<dag> pattern> {
551 def "" : SOPK_Pseudo <opName, (outs SReg_32:$dst), (ins u16imm:$src0),
552 pattern>;
553
554 def _si : SOPK_Real_si <op, opName, (outs SReg_32:$dst), (ins u16imm:$src0),
Marek Olsak367447c2015-01-27 17:25:11 +0000555 opName#" $dst, $src0">;
Marek Olsak5df00d62014-12-07 12:18:57 +0000556
557 def _vi : SOPK_Real_vi <op, opName, (outs SReg_32:$dst), (ins u16imm:$src0),
Marek Olsak367447c2015-01-27 17:25:11 +0000558 opName#" $dst, $src0">;
Marek Olsak5df00d62014-12-07 12:18:57 +0000559}
560
561multiclass SOPK_SCC <sopk op, string opName, list<dag> pattern> {
562 def "" : SOPK_Pseudo <opName, (outs SCCReg:$dst),
563 (ins SReg_32:$src0, u16imm:$src1), pattern>;
564
565 def _si : SOPK_Real_si <op, opName, (outs SCCReg:$dst),
Marek Olsak367447c2015-01-27 17:25:11 +0000566 (ins SReg_32:$src0, u16imm:$src1), opName#" $dst, $src0">;
Marek Olsak5df00d62014-12-07 12:18:57 +0000567
568 def _vi : SOPK_Real_vi <op, opName, (outs SCCReg:$dst),
Marek Olsak367447c2015-01-27 17:25:11 +0000569 (ins SReg_32:$src0, u16imm:$src1), opName#" $dst, $src0">;
Marek Olsak5df00d62014-12-07 12:18:57 +0000570}
Christian Konig72d5d5c2013-02-21 15:16:44 +0000571
Tom Stellardc470c962014-10-01 14:44:42 +0000572//===----------------------------------------------------------------------===//
573// SMRD classes
574//===----------------------------------------------------------------------===//
575
576class SMRD_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> :
577 SMRD <outs, ins, "", pattern>,
578 SIMCInstr<opName, SISubtarget.NONE> {
579 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +0000580 let isCodeGenOnly = 1;
Tom Stellardc470c962014-10-01 14:44:42 +0000581}
582
583class SMRD_Real_si <bits<5> op, string opName, bit imm, dag outs, dag ins,
584 string asm> :
585 SMRD <outs, ins, asm, []>,
586 SMRDe <op, imm>,
587 SIMCInstr<opName, SISubtarget.SI>;
588
Marek Olsak5df00d62014-12-07 12:18:57 +0000589class SMRD_Real_vi <bits<8> op, string opName, bit imm, dag outs, dag ins,
590 string asm> :
591 SMRD <outs, ins, asm, []>,
592 SMEMe_vi <op, imm>,
593 SIMCInstr<opName, SISubtarget.VI>;
594
Tom Stellardc470c962014-10-01 14:44:42 +0000595multiclass SMRD_m <bits<5> op, string opName, bit imm, dag outs, dag ins,
596 string asm, list<dag> pattern> {
597
598 def "" : SMRD_Pseudo <opName, outs, ins, pattern>;
599
600 def _si : SMRD_Real_si <op, opName, imm, outs, ins, asm>;
601
Matt Arsenault1991f5e2015-02-18 02:10:40 +0000602 // glc is only applicable to scalar stores, which are not yet
603 // implemented.
604 let glc = 0 in {
605 def _vi : SMRD_Real_vi <{0, 0, 0, op}, opName, imm, outs, ins, asm>;
606 }
Tom Stellardc470c962014-10-01 14:44:42 +0000607}
608
609multiclass SMRD_Helper <bits<5> op, string opName, RegisterClass baseClass,
Christian Konig9c7afd12013-03-18 11:33:50 +0000610 RegisterClass dstClass> {
Tom Stellardc470c962014-10-01 14:44:42 +0000611 defm _IMM : SMRD_m <
612 op, opName#"_IMM", 1, (outs dstClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000613 (ins baseClass:$sbase, u32imm:$offset),
Tom Stellardc470c962014-10-01 14:44:42 +0000614 opName#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000615 >;
616
Tom Stellardc470c962014-10-01 14:44:42 +0000617 defm _SGPR : SMRD_m <
618 op, opName#"_SGPR", 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000619 (ins baseClass:$sbase, SReg_32:$soff),
Tom Stellardc470c962014-10-01 14:44:42 +0000620 opName#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000621 >;
622}
623
624//===----------------------------------------------------------------------===//
625// Vector ALU classes
626//===----------------------------------------------------------------------===//
627
Tom Stellardb4a313a2014-08-01 00:32:39 +0000628// This must always be right before the operand being input modified.
629def InputMods : OperandWithDefaultOps <i32, (ops (i32 0))> {
630 let PrintMethod = "printOperandAndMods";
631}
632def InputModsNoDefault : Operand <i32> {
633 let PrintMethod = "printOperandAndMods";
634}
635
636class getNumSrcArgs<ValueType Src1, ValueType Src2> {
637 int ret =
638 !if (!eq(Src1.Value, untyped.Value), 1, // VOP1
639 !if (!eq(Src2.Value, untyped.Value), 2, // VOP2
640 3)); // VOP3
641}
642
643// Returns the register class to use for the destination of VOP[123C]
644// instructions for the given VT.
645class getVALUDstForVT<ValueType VT> {
Tom Stellardc0503922015-03-12 21:34:22 +0000646 RegisterOperand ret = !if(!eq(VT.Size, 32), VOPDstOperand<VGPR_32>,
647 !if(!eq(VT.Size, 64), VOPDstOperand<VReg_64>,
648 VOPDstOperand<SReg_64>)); // else VT == i1
Tom Stellardb4a313a2014-08-01 00:32:39 +0000649}
650
651// Returns the register class to use for source 0 of VOP[12C]
652// instructions for the given VT.
653class getVOPSrc0ForVT<ValueType VT> {
Tom Stellardb6550522015-01-12 19:33:18 +0000654 RegisterOperand ret = !if(!eq(VT.Size, 32), VSrc_32, VSrc_64);
Tom Stellardb4a313a2014-08-01 00:32:39 +0000655}
656
657// Returns the register class to use for source 1 of VOP[12C] for the
658// given VT.
659class getVOPSrc1ForVT<ValueType VT> {
Tom Stellard45c0b3a2015-01-07 20:59:25 +0000660 RegisterClass ret = !if(!eq(VT.Size, 32), VGPR_32, VReg_64);
Tom Stellardb4a313a2014-08-01 00:32:39 +0000661}
662
Tom Stellardb4a313a2014-08-01 00:32:39 +0000663// Returns the register class to use for sources of VOP3 instructions for the
664// given VT.
665class getVOP3SrcForVT<ValueType VT> {
Tom Stellardb6550522015-01-12 19:33:18 +0000666 RegisterOperand ret = !if(!eq(VT.Size, 32), VCSrc_32, VCSrc_64);
Tom Stellardb4a313a2014-08-01 00:32:39 +0000667}
668
Tom Stellardb4a313a2014-08-01 00:32:39 +0000669// Returns 1 if the source arguments have modifiers, 0 if they do not.
670class hasModifiers<ValueType SrcVT> {
671 bit ret = !if(!eq(SrcVT.Value, f32.Value), 1,
672 !if(!eq(SrcVT.Value, f64.Value), 1, 0));
673}
674
675// Returns the input arguments for VOP[12C] instructions for the given SrcVT.
Tom Stellardb6550522015-01-12 19:33:18 +0000676class getIns32 <RegisterOperand Src0RC, RegisterClass Src1RC, int NumSrcArgs> {
Tom Stellardb4a313a2014-08-01 00:32:39 +0000677 dag ret = !if(!eq(NumSrcArgs, 1), (ins Src0RC:$src0), // VOP1
678 !if(!eq(NumSrcArgs, 2), (ins Src0RC:$src0, Src1RC:$src1), // VOP2
679 (ins)));
680}
681
682// Returns the input arguments for VOP3 instructions for the given SrcVT.
Tom Stellardb6550522015-01-12 19:33:18 +0000683class getIns64 <RegisterOperand Src0RC, RegisterOperand Src1RC,
684 RegisterOperand Src2RC, int NumSrcArgs,
Tom Stellardb4a313a2014-08-01 00:32:39 +0000685 bit HasModifiers> {
686
687 dag ret =
688 !if (!eq(NumSrcArgs, 1),
689 !if (!eq(HasModifiers, 1),
690 // VOP1 with modifiers
691 (ins InputModsNoDefault:$src0_modifiers, Src0RC:$src0,
Matt Arsenault97069782014-09-30 19:49:48 +0000692 ClampMod:$clamp, omod:$omod)
Tom Stellardb4a313a2014-08-01 00:32:39 +0000693 /* else */,
694 // VOP1 without modifiers
695 (ins Src0RC:$src0)
696 /* endif */ ),
697 !if (!eq(NumSrcArgs, 2),
698 !if (!eq(HasModifiers, 1),
699 // VOP 2 with modifiers
700 (ins InputModsNoDefault:$src0_modifiers, Src0RC:$src0,
701 InputModsNoDefault:$src1_modifiers, Src1RC:$src1,
Matt Arsenault97069782014-09-30 19:49:48 +0000702 ClampMod:$clamp, omod:$omod)
Tom Stellardb4a313a2014-08-01 00:32:39 +0000703 /* else */,
704 // VOP2 without modifiers
705 (ins Src0RC:$src0, Src1RC:$src1)
706 /* endif */ )
707 /* NumSrcArgs == 3 */,
708 !if (!eq(HasModifiers, 1),
709 // VOP3 with modifiers
710 (ins InputModsNoDefault:$src0_modifiers, Src0RC:$src0,
711 InputModsNoDefault:$src1_modifiers, Src1RC:$src1,
712 InputModsNoDefault:$src2_modifiers, Src2RC:$src2,
Matt Arsenault97069782014-09-30 19:49:48 +0000713 ClampMod:$clamp, omod:$omod)
Tom Stellardb4a313a2014-08-01 00:32:39 +0000714 /* else */,
715 // VOP3 without modifiers
716 (ins Src0RC:$src0, Src1RC:$src1, Src2RC:$src2)
717 /* endif */ )));
718}
719
720// Returns the assembly string for the inputs and outputs of a VOP[12C]
721// instruction. This does not add the _e32 suffix, so it can be reused
722// by getAsm64.
723class getAsm32 <int NumSrcArgs> {
724 string src1 = ", $src1";
725 string src2 = ", $src2";
Tom Stellardc0503922015-03-12 21:34:22 +0000726 string ret = "$dst, $src0"#
Tom Stellardb4a313a2014-08-01 00:32:39 +0000727 !if(!eq(NumSrcArgs, 1), "", src1)#
728 !if(!eq(NumSrcArgs, 3), src2, "");
729}
730
731// Returns the assembly string for the inputs and outputs of a VOP3
732// instruction.
733class getAsm64 <int NumSrcArgs, bit HasModifiers> {
Matt Arsenault268757b2015-01-15 23:17:03 +0000734 string src0 = !if(!eq(NumSrcArgs, 1), "$src0_modifiers", "$src0_modifiers,");
Matt Arsenault97069782014-09-30 19:49:48 +0000735 string src1 = !if(!eq(NumSrcArgs, 1), "",
736 !if(!eq(NumSrcArgs, 2), " $src1_modifiers",
737 " $src1_modifiers,"));
738 string src2 = !if(!eq(NumSrcArgs, 3), " $src2_modifiers", "");
Tom Stellardb4a313a2014-08-01 00:32:39 +0000739 string ret =
740 !if(!eq(HasModifiers, 0),
741 getAsm32<NumSrcArgs>.ret,
Tom Stellardc0503922015-03-12 21:34:22 +0000742 "$dst, "#src0#src1#src2#"$clamp"#"$omod");
Tom Stellardb4a313a2014-08-01 00:32:39 +0000743}
744
745
746class VOPProfile <list<ValueType> _ArgVT> {
747
748 field list<ValueType> ArgVT = _ArgVT;
749
750 field ValueType DstVT = ArgVT[0];
751 field ValueType Src0VT = ArgVT[1];
752 field ValueType Src1VT = ArgVT[2];
753 field ValueType Src2VT = ArgVT[3];
Tom Stellardc0503922015-03-12 21:34:22 +0000754 field RegisterOperand DstRC = getVALUDstForVT<DstVT>.ret;
Tom Stellardb6550522015-01-12 19:33:18 +0000755 field RegisterOperand Src0RC32 = getVOPSrc0ForVT<Src0VT>.ret;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000756 field RegisterClass Src1RC32 = getVOPSrc1ForVT<Src1VT>.ret;
Tom Stellardb6550522015-01-12 19:33:18 +0000757 field RegisterOperand Src0RC64 = getVOP3SrcForVT<Src0VT>.ret;
758 field RegisterOperand Src1RC64 = getVOP3SrcForVT<Src1VT>.ret;
759 field RegisterOperand Src2RC64 = getVOP3SrcForVT<Src2VT>.ret;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000760
761 field int NumSrcArgs = getNumSrcArgs<Src1VT, Src2VT>.ret;
762 field bit HasModifiers = hasModifiers<Src0VT>.ret;
763
764 field dag Outs = (outs DstRC:$dst);
765
766 field dag Ins32 = getIns32<Src0RC32, Src1RC32, NumSrcArgs>.ret;
767 field dag Ins64 = getIns64<Src0RC64, Src1RC64, Src2RC64, NumSrcArgs,
768 HasModifiers>.ret;
769
Tom Stellardc0503922015-03-12 21:34:22 +0000770 field string Asm32 = getAsm32<NumSrcArgs>.ret;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000771 field string Asm64 = getAsm64<NumSrcArgs, HasModifiers>.ret;
772}
773
774def VOP_F32_F32 : VOPProfile <[f32, f32, untyped, untyped]>;
775def VOP_F32_F64 : VOPProfile <[f32, f64, untyped, untyped]>;
776def VOP_F32_I32 : VOPProfile <[f32, i32, untyped, untyped]>;
777def VOP_F64_F32 : VOPProfile <[f64, f32, untyped, untyped]>;
778def VOP_F64_F64 : VOPProfile <[f64, f64, untyped, untyped]>;
779def VOP_F64_I32 : VOPProfile <[f64, i32, untyped, untyped]>;
780def VOP_I32_F32 : VOPProfile <[i32, f32, untyped, untyped]>;
781def VOP_I32_F64 : VOPProfile <[i32, f64, untyped, untyped]>;
782def VOP_I32_I32 : VOPProfile <[i32, i32, untyped, untyped]>;
783
784def VOP_F32_F32_F32 : VOPProfile <[f32, f32, f32, untyped]>;
785def VOP_F32_F32_I32 : VOPProfile <[f32, f32, i32, untyped]>;
786def VOP_F64_F64_F64 : VOPProfile <[f64, f64, f64, untyped]>;
787def VOP_F64_F64_I32 : VOPProfile <[f64, f64, i32, untyped]>;
788def VOP_I32_F32_F32 : VOPProfile <[i32, f32, f32, untyped]>;
Marek Olsak11057ee2015-02-03 17:38:01 +0000789def VOP_I32_F32_I32 : VOPProfile <[i32, f32, i32, untyped]>;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000790def VOP_I32_I32_I32 : VOPProfile <[i32, i32, i32, untyped]>;
791def VOP_I32_I32_I32_VCC : VOPProfile <[i32, i32, i32, untyped]> {
Tom Stellard73ae1cb2014-09-23 21:26:25 +0000792 let Src0RC32 = VCSrc_32;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000793}
Matt Arsenault4831ce52015-01-06 23:00:37 +0000794
795def VOP_I1_F32_I32 : VOPProfile <[i1, f32, i32, untyped]> {
796 let Ins64 = (ins InputModsNoDefault:$src0_modifiers, Src0RC64:$src0, Src1RC64:$src1);
Tom Stellardc0503922015-03-12 21:34:22 +0000797 let Asm64 = "$dst, $src0_modifiers, $src1";
Matt Arsenault4831ce52015-01-06 23:00:37 +0000798}
799
800def VOP_I1_F64_I32 : VOPProfile <[i1, f64, i32, untyped]> {
801 let Ins64 = (ins InputModsNoDefault:$src0_modifiers, Src0RC64:$src0, Src1RC64:$src1);
Tom Stellardc0503922015-03-12 21:34:22 +0000802 let Asm64 = "$dst, $src0_modifiers, $src1";
Matt Arsenault4831ce52015-01-06 23:00:37 +0000803}
804
Tom Stellardb4a313a2014-08-01 00:32:39 +0000805def VOP_I64_I64_I32 : VOPProfile <[i64, i64, i32, untyped]>;
Marek Olsak707a6d02015-02-03 21:53:01 +0000806def VOP_I64_I32_I64 : VOPProfile <[i64, i32, i64, untyped]>;
Tom Stellardb4a313a2014-08-01 00:32:39 +0000807def VOP_I64_I64_I64 : VOPProfile <[i64, i64, i64, untyped]>;
Tom Stellard5224df32015-03-10 16:16:44 +0000808def VOP_CNDMASK : VOPProfile <[i32, i32, i32, untyped]> {
809 let Ins32 = (ins Src0RC32:$src0, Src1RC32:$src1, VCCReg:$src2);
810 let Ins64 = (ins Src0RC64:$src0, Src1RC64:$src1, SSrc_64:$src2);
Tom Stellardc0503922015-03-12 21:34:22 +0000811 let Asm64 = "$dst, $src0, $src1, $src2";
Tom Stellard5224df32015-03-10 16:16:44 +0000812}
Tom Stellardb4a313a2014-08-01 00:32:39 +0000813
814def VOP_F32_F32_F32_F32 : VOPProfile <[f32, f32, f32, f32]>;
Matt Arsenault70120fa2015-02-21 21:29:00 +0000815def VOP_MADK : VOPProfile <[f32, f32, f32, f32]> {
816 field dag Ins = (ins VCSrc_32:$src0, VGPR_32:$vsrc1, u32imm:$src2);
Tom Stellardc0503922015-03-12 21:34:22 +0000817 field string Asm = "$dst, $src0, $vsrc1, $src2";
Matt Arsenault70120fa2015-02-21 21:29:00 +0000818}
Tom Stellardb4a313a2014-08-01 00:32:39 +0000819def VOP_F64_F64_F64_F64 : VOPProfile <[f64, f64, f64, f64]>;
820def VOP_I32_I32_I32_I32 : VOPProfile <[i32, i32, i32, i32]>;
821def VOP_I64_I32_I32_I64 : VOPProfile <[i64, i32, i32, i64]>;
822
823
Christian Konigf741fbf2013-02-26 17:52:42 +0000824class VOP <string opName> {
825 string OpName = opName;
826}
827
Christian Konig3c145802013-03-27 09:12:59 +0000828class VOP2_REV <string revOp, bit isOrig> {
829 string RevOp = revOp;
830 bit IsOrig = isOrig;
831}
832
Matt Arsenault9903ccf2014-09-08 15:07:27 +0000833class AtomicNoRet <string noRetOp, bit isRet> {
834 string NoRetOp = noRetOp;
835 bit IsRet = isRet;
836}
837
Tom Stellard94d2e992014-10-07 23:51:34 +0000838class VOP1_Pseudo <dag outs, dag ins, list<dag> pattern, string opName> :
839 VOP1Common <outs, ins, "", pattern>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000840 VOP <opName>,
841 SIMCInstr <opName#"_e32", SISubtarget.NONE> {
Tom Stellard94d2e992014-10-07 23:51:34 +0000842 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +0000843 let isCodeGenOnly = 1;
Tom Stellardc34c37a2015-02-18 16:08:15 +0000844
845 field bits<8> vdst;
846 field bits<9> src0;
Tom Stellard94d2e992014-10-07 23:51:34 +0000847}
848
Tom Stellard23c2c3d2015-03-20 15:14:21 +0000849class VOP1_Real_si <string opName, vop1 op, dag outs, dag ins, string asm> :
850 VOP1<op.SI, outs, ins, asm, []>,
851 SIMCInstr <opName#"_e32", SISubtarget.SI>;
852
853class VOP1_Real_vi <string opName, vop1 op, dag outs, dag ins, string asm> :
854 VOP1<op.VI, outs, ins, asm, []>,
855 SIMCInstr <opName#"_e32", SISubtarget.VI>;
856
Tom Stellard94d2e992014-10-07 23:51:34 +0000857multiclass VOP1_m <vop1 op, dag outs, dag ins, string asm, list<dag> pattern,
858 string opName> {
859 def "" : VOP1_Pseudo <outs, ins, pattern, opName>;
860
Tom Stellard23c2c3d2015-03-20 15:14:21 +0000861 def _si : VOP1_Real_si <opName, op, outs, ins, asm>;
862
863 def _vi : VOP1_Real_vi <opName, op, outs, ins, asm>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000864}
865
Marek Olsak3ecf5082015-02-03 21:53:05 +0000866multiclass VOP1SI_m <vop1 op, dag outs, dag ins, string asm, list<dag> pattern,
867 string opName> {
868 def "" : VOP1_Pseudo <outs, ins, pattern, opName>;
869
Tom Stellard23c2c3d2015-03-20 15:14:21 +0000870 def _si : VOP1_Real_si <opName, op, outs, ins, asm>;
Marek Olsak3ecf5082015-02-03 21:53:05 +0000871}
872
Marek Olsak5df00d62014-12-07 12:18:57 +0000873class VOP2_Pseudo <dag outs, dag ins, list<dag> pattern, string opName> :
874 VOP2Common <outs, ins, "", pattern>,
875 VOP <opName>,
876 SIMCInstr<opName#"_e32", SISubtarget.NONE> {
877 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +0000878 let isCodeGenOnly = 1;
Marek Olsak5df00d62014-12-07 12:18:57 +0000879}
880
Tom Stellard3b0dab92015-03-20 15:14:23 +0000881class VOP2_Real_si <string opName, vop2 op, dag outs, dag ins, string asm> :
882 VOP2 <op.SI, outs, ins, opName#asm, []>,
883 SIMCInstr <opName#"_e32", SISubtarget.SI>;
884
885class VOP2_Real_vi <string opName, vop2 op, dag outs, dag ins, string asm> :
Marek Olsak2a1c9d02015-03-27 19:10:06 +0000886 VOP2 <op.VI, outs, ins, opName#asm, []>,
Tom Stellard3b0dab92015-03-20 15:14:23 +0000887 SIMCInstr <opName#"_e32", SISubtarget.VI>;
888
Marek Olsakf0b130a2015-01-15 18:43:06 +0000889multiclass VOP2SI_m <vop2 op, dag outs, dag ins, string asm, list<dag> pattern,
Marek Olsak7585a292015-02-03 17:38:05 +0000890 string opName, string revOp> {
Marek Olsakf0b130a2015-01-15 18:43:06 +0000891 def "" : VOP2_Pseudo <outs, ins, pattern, opName>,
Marek Olsak7585a292015-02-03 17:38:05 +0000892 VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Marek Olsakf0b130a2015-01-15 18:43:06 +0000893
Tom Stellard3b0dab92015-03-20 15:14:23 +0000894 def _si : VOP2_Real_si <opName, op, outs, ins, asm>;
Marek Olsakf0b130a2015-01-15 18:43:06 +0000895}
896
Marek Olsak5df00d62014-12-07 12:18:57 +0000897multiclass VOP2_m <vop2 op, dag outs, dag ins, string asm, list<dag> pattern,
Marek Olsak7585a292015-02-03 17:38:05 +0000898 string opName, string revOp> {
Marek Olsak5df00d62014-12-07 12:18:57 +0000899 def "" : VOP2_Pseudo <outs, ins, pattern, opName>,
Marek Olsak7585a292015-02-03 17:38:05 +0000900 VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000901
Tom Stellard3b0dab92015-03-20 15:14:23 +0000902 def _si : VOP2_Real_si <opName, op, outs, ins, asm>;
903
904 def _vi : VOP2_Real_vi <opName, op, outs, ins, asm>;
905
Tom Stellard94d2e992014-10-07 23:51:34 +0000906}
907
Tom Stellardb4a313a2014-08-01 00:32:39 +0000908class VOP3DisableFields <bit HasSrc1, bit HasSrc2, bit HasModifiers> {
909
910 bits<2> src0_modifiers = !if(HasModifiers, ?, 0);
911 bits<2> src1_modifiers = !if(HasModifiers, !if(HasSrc1, ?, 0), 0);
Matt Arsenault096ec1e2015-02-18 02:15:30 +0000912 bits<2> src2_modifiers = !if(HasModifiers, !if(HasSrc2, ?, 0), 0);
Tom Stellardb4a313a2014-08-01 00:32:39 +0000913 bits<2> omod = !if(HasModifiers, ?, 0);
914 bits<1> clamp = !if(HasModifiers, ?, 0);
915 bits<9> src1 = !if(HasSrc1, ?, 0);
916 bits<9> src2 = !if(HasSrc2, ?, 0);
917}
918
Matt Arsenault096ec1e2015-02-18 02:15:30 +0000919class VOP3DisableModFields <bit HasSrc0Mods,
920 bit HasSrc1Mods = 0,
921 bit HasSrc2Mods = 0,
922 bit HasOutputMods = 0> {
923 bits<2> src0_modifiers = !if(HasSrc0Mods, ?, 0);
924 bits<2> src1_modifiers = !if(HasSrc1Mods, ?, 0);
925 bits<2> src2_modifiers = !if(HasSrc2Mods, ?, 0);
926 bits<2> omod = !if(HasOutputMods, ?, 0);
927 bits<1> clamp = !if(HasOutputMods, ?, 0);
928}
929
Tom Stellardbda32c92014-07-21 17:44:29 +0000930class VOP3_Pseudo <dag outs, dag ins, list<dag> pattern, string opName> :
931 VOP3Common <outs, ins, "", pattern>,
932 VOP <opName>,
Marek Olsak5df00d62014-12-07 12:18:57 +0000933 SIMCInstr<opName#"_e64", SISubtarget.NONE> {
Tom Stellardbda32c92014-07-21 17:44:29 +0000934 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +0000935 let isCodeGenOnly = 1;
Tom Stellardbda32c92014-07-21 17:44:29 +0000936}
937
938class VOP3_Real_si <bits<9> op, dag outs, dag ins, string asm, string opName> :
Marek Olsak5df00d62014-12-07 12:18:57 +0000939 VOP3Common <outs, ins, asm, []>,
940 VOP3e <op>,
941 SIMCInstr<opName#"_e64", SISubtarget.SI>;
Tom Stellardbda32c92014-07-21 17:44:29 +0000942
Marek Olsak5df00d62014-12-07 12:18:57 +0000943class VOP3_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName> :
944 VOP3Common <outs, ins, asm, []>,
945 VOP3e_vi <op>,
946 SIMCInstr <opName#"_e64", SISubtarget.VI>;
947
Matt Arsenault692acf12015-02-14 03:02:23 +0000948class VOP3b_Real_si <bits<9> op, dag outs, dag ins, string asm, string opName> :
949 VOP3Common <outs, ins, asm, []>,
950 VOP3be <op>,
951 SIMCInstr<opName#"_e64", SISubtarget.SI>;
952
953class VOP3b_Real_vi <bits<10> op, dag outs, dag ins, string asm, string opName> :
954 VOP3Common <outs, ins, asm, []>,
955 VOP3be_vi <op>,
956 SIMCInstr <opName#"_e64", SISubtarget.VI>;
957
Marek Olsak5df00d62014-12-07 12:18:57 +0000958multiclass VOP3_m <vop op, dag outs, dag ins, string asm, list<dag> pattern,
Tom Stellardb4a313a2014-08-01 00:32:39 +0000959 string opName, int NumSrcArgs, bit HasMods = 1> {
Tom Stellardc721a232014-05-16 20:56:47 +0000960
Tom Stellardbda32c92014-07-21 17:44:29 +0000961 def "" : VOP3_Pseudo <outs, ins, pattern, opName>;
Tom Stellardc721a232014-05-16 20:56:47 +0000962
Tom Stellard845bb3c2014-10-07 23:51:41 +0000963 def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName>,
Tom Stellardb4a313a2014-08-01 00:32:39 +0000964 VOP3DisableFields<!if(!eq(NumSrcArgs, 1), 0, 1),
965 !if(!eq(NumSrcArgs, 2), 0, 1),
966 HasMods>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000967 def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName>,
968 VOP3DisableFields<!if(!eq(NumSrcArgs, 1), 0, 1),
969 !if(!eq(NumSrcArgs, 2), 0, 1),
970 HasMods>;
971}
Tom Stellardc721a232014-05-16 20:56:47 +0000972
Marek Olsak5df00d62014-12-07 12:18:57 +0000973// VOP3_m without source modifiers
Matt Arsenault65fa1c42015-02-18 02:15:27 +0000974multiclass VOP3_m_nomods <vop op, dag outs, dag ins, string asm, list<dag> pattern,
Marek Olsak5df00d62014-12-07 12:18:57 +0000975 string opName, int NumSrcArgs, bit HasMods = 1> {
976
977 def "" : VOP3_Pseudo <outs, ins, pattern, opName>;
978
979 let src0_modifiers = 0,
980 src1_modifiers = 0,
Matt Arsenault65fa1c42015-02-18 02:15:27 +0000981 src2_modifiers = 0,
982 clamp = 0,
983 omod = 0 in {
Marek Olsak5df00d62014-12-07 12:18:57 +0000984 def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName>;
985 def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName>;
986 }
Tom Stellardc721a232014-05-16 20:56:47 +0000987}
988
Tom Stellard94d2e992014-10-07 23:51:34 +0000989multiclass VOP3_1_m <vop op, dag outs, dag ins, string asm,
Tom Stellardb4a313a2014-08-01 00:32:39 +0000990 list<dag> pattern, string opName, bit HasMods = 1> {
Tom Stellardbda32c92014-07-21 17:44:29 +0000991
992 def "" : VOP3_Pseudo <outs, ins, pattern, opName>;
993
Tom Stellard94d2e992014-10-07 23:51:34 +0000994 def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName>,
Tom Stellardb4a313a2014-08-01 00:32:39 +0000995 VOP3DisableFields<0, 0, HasMods>;
Marek Olsak5df00d62014-12-07 12:18:57 +0000996
997 def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName>,
998 VOP3DisableFields<0, 0, HasMods>;
Tom Stellardbda32c92014-07-21 17:44:29 +0000999}
1000
Marek Olsak3ecf5082015-02-03 21:53:05 +00001001multiclass VOP3SI_1_m <vop op, dag outs, dag ins, string asm,
1002 list<dag> pattern, string opName, bit HasMods = 1> {
1003
1004 def "" : VOP3_Pseudo <outs, ins, pattern, opName>;
1005
1006 def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName>,
1007 VOP3DisableFields<0, 0, HasMods>;
1008 // No VI instruction. This class is for SI only.
1009}
1010
Tom Stellardbec5a242014-10-07 23:51:38 +00001011multiclass VOP3_2_m <vop op, dag outs, dag ins, string asm,
Marek Olsak7585a292015-02-03 17:38:05 +00001012 list<dag> pattern, string opName, string revOp,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001013 bit HasMods = 1, bit UseFullOp = 0> {
1014
1015 def "" : VOP3_Pseudo <outs, ins, pattern, opName>,
Marek Olsak7585a292015-02-03 17:38:05 +00001016 VOP2_REV<revOp#"_e64", !eq(revOp, opName)>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001017
Marek Olsak191507e2015-02-03 17:38:12 +00001018 def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName>,
Marek Olsak5df00d62014-12-07 12:18:57 +00001019 VOP3DisableFields<1, 0, HasMods>;
1020
Marek Olsak191507e2015-02-03 17:38:12 +00001021 def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName>,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001022 VOP3DisableFields<1, 0, HasMods>;
1023}
1024
Marek Olsak191507e2015-02-03 17:38:12 +00001025multiclass VOP3SI_2_m <vop op, dag outs, dag ins, string asm,
1026 list<dag> pattern, string opName, string revOp,
1027 bit HasMods = 1, bit UseFullOp = 0> {
1028
1029 def "" : VOP3_Pseudo <outs, ins, pattern, opName>,
1030 VOP2_REV<revOp#"_e64", !eq(revOp, opName)>;
1031
1032 def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName>,
1033 VOP3DisableFields<1, 0, HasMods>;
1034
1035 // No VI instruction. This class is for SI only.
1036}
1037
Matt Arsenault692acf12015-02-14 03:02:23 +00001038// XXX - Is v_div_scale_{f32|f64} only available in vop3b without
1039// option of implicit vcc use?
Tom Stellard845bb3c2014-10-07 23:51:41 +00001040multiclass VOP3b_2_m <vop op, dag outs, dag ins, string asm,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001041 list<dag> pattern, string opName, string revOp,
1042 bit HasMods = 1, bit UseFullOp = 0> {
1043 def "" : VOP3_Pseudo <outs, ins, pattern, opName>,
1044 VOP2_REV<revOp#"_e64", !eq(revOp, opName)>;
1045
1046 // The VOP2 variant puts the carry out into VCC, the VOP3 variant
1047 // can write it into any SGPR. We currently don't use the carry out,
1048 // so for now hardcode it to VCC as well.
1049 let sdst = SIOperand.VCC, Defs = [VCC] in {
Matt Arsenault692acf12015-02-14 03:02:23 +00001050 def _si : VOP3b_Real_si <op.SI3, outs, ins, asm, opName>,
1051 VOP3DisableFields<1, 0, HasMods>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001052
Matt Arsenault692acf12015-02-14 03:02:23 +00001053 def _vi : VOP3b_Real_vi <op.VI3, outs, ins, asm, opName>,
1054 VOP3DisableFields<1, 0, HasMods>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001055 } // End sdst = SIOperand.VCC, Defs = [VCC]
1056}
1057
Matt Arsenault31ec5982015-02-14 03:40:35 +00001058multiclass VOP3b_3_m <vop op, dag outs, dag ins, string asm,
1059 list<dag> pattern, string opName, string revOp,
1060 bit HasMods = 1, bit UseFullOp = 0> {
1061 def "" : VOP3_Pseudo <outs, ins, pattern, opName>;
1062
1063
1064 def _si : VOP3b_Real_si <op.SI3, outs, ins, asm, opName>,
1065 VOP3DisableFields<1, 1, HasMods>;
1066
1067 def _vi : VOP3b_Real_vi <op.VI3, outs, ins, asm, opName>,
1068 VOP3DisableFields<1, 1, HasMods>;
1069}
1070
Tom Stellard0aec5872014-10-07 23:51:39 +00001071multiclass VOP3_C_m <vop op, dag outs, dag ins, string asm,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001072 list<dag> pattern, string opName,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001073 bit HasMods, bit defExec, string revOp> {
Tom Stellardbda32c92014-07-21 17:44:29 +00001074
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001075 def "" : VOP3_Pseudo <outs, ins, pattern, opName>,
Matt Arsenault88a13c62015-03-23 18:45:41 +00001076 VOP2_REV<revOp#"_e64", !eq(revOp, opName)>;
Tom Stellardbda32c92014-07-21 17:44:29 +00001077
Tom Stellard0aec5872014-10-07 23:51:39 +00001078 def _si : VOP3_Real_si <op.SI3, outs, ins, asm, opName>,
Marek Olsak5df00d62014-12-07 12:18:57 +00001079 VOP3DisableFields<1, 0, HasMods> {
1080 let Defs = !if(defExec, [EXEC], []);
1081 }
1082
1083 def _vi : VOP3_Real_vi <op.VI3, outs, ins, asm, opName>,
1084 VOP3DisableFields<1, 0, HasMods> {
Tom Stellard0aec5872014-10-07 23:51:39 +00001085 let Defs = !if(defExec, [EXEC], []);
Christian Konigd3039962013-02-26 17:52:09 +00001086 }
1087}
1088
Marek Olsak15e4a592015-01-15 18:42:55 +00001089// An instruction that is VOP2 on SI and VOP3 on VI, no modifiers.
1090multiclass VOP2SI_3VI_m <vop3 op, string opName, dag outs, dag ins,
1091 string asm, list<dag> pattern = []> {
Tom Stellard1ca873b2015-02-18 16:08:17 +00001092 let isPseudo = 1, isCodeGenOnly = 1 in {
Marek Olsak15e4a592015-01-15 18:42:55 +00001093 def "" : VOPAnyCommon <outs, ins, "", pattern>,
1094 SIMCInstr<opName, SISubtarget.NONE>;
1095 }
1096
1097 def _si : VOP2 <op.SI3{5-0}, outs, ins, asm, []>,
1098 SIMCInstr <opName, SISubtarget.SI>;
1099
1100 def _vi : VOP3Common <outs, ins, asm, []>,
1101 VOP3e_vi <op.VI3>,
1102 VOP3DisableFields <1, 0, 0>,
1103 SIMCInstr <opName, SISubtarget.VI>;
1104}
1105
Tom Stellard94d2e992014-10-07 23:51:34 +00001106multiclass VOP1_Helper <vop1 op, string opName, dag outs,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001107 dag ins32, string asm32, list<dag> pat32,
1108 dag ins64, string asm64, list<dag> pat64,
1109 bit HasMods> {
Christian Konigb19849a2013-02-21 15:17:04 +00001110
Marek Olsak5df00d62014-12-07 12:18:57 +00001111 defm _e32 : VOP1_m <op, outs, ins32, opName#asm32, pat32, opName>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001112
Tom Stellardc0503922015-03-12 21:34:22 +00001113 defm _e64 : VOP3_1_m <op, outs, ins64, opName#asm64, pat64, opName, HasMods>;
Christian Konig72d5d5c2013-02-21 15:16:44 +00001114}
1115
Tom Stellard94d2e992014-10-07 23:51:34 +00001116multiclass VOP1Inst <vop1 op, string opName, VOPProfile P,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001117 SDPatternOperator node = null_frag> : VOP1_Helper <
1118 op, opName, P.Outs,
1119 P.Ins32, P.Asm32, [],
1120 P.Ins64, P.Asm64,
1121 !if(P.HasModifiers,
1122 [(set P.DstVT:$dst, (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0,
Matt Arsenault97069782014-09-30 19:49:48 +00001123 i32:$src0_modifiers, i1:$clamp, i32:$omod))))],
Tom Stellardb4a313a2014-08-01 00:32:39 +00001124 [(set P.DstVT:$dst, (node P.Src0VT:$src0))]),
1125 P.HasModifiers
Tom Stellardc721a232014-05-16 20:56:47 +00001126>;
Christian Konigf5754a02013-02-21 15:17:09 +00001127
Marek Olsak5df00d62014-12-07 12:18:57 +00001128multiclass VOP1InstSI <vop1 op, string opName, VOPProfile P,
1129 SDPatternOperator node = null_frag> {
1130
Marek Olsak3ecf5082015-02-03 21:53:05 +00001131 defm _e32 : VOP1SI_m <op, P.Outs, P.Ins32, opName#P.Asm32, [], opName>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001132
Marek Olsak3ecf5082015-02-03 21:53:05 +00001133 defm _e64 : VOP3SI_1_m <op, P.Outs, P.Ins64, opName#P.Asm64,
Marek Olsak5df00d62014-12-07 12:18:57 +00001134 !if(P.HasModifiers,
1135 [(set P.DstVT:$dst, (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0,
1136 i32:$src0_modifiers, i1:$clamp, i32:$omod))))],
Marek Olsak3ecf5082015-02-03 21:53:05 +00001137 [(set P.DstVT:$dst, (node P.Src0VT:$src0))]),
1138 opName, P.HasModifiers>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001139}
Tom Stellard1cfd7a52013-05-20 15:02:12 +00001140
Tom Stellardbec5a242014-10-07 23:51:38 +00001141multiclass VOP2_Helper <vop2 op, string opName, dag outs,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001142 dag ins32, string asm32, list<dag> pat32,
1143 dag ins64, string asm64, list<dag> pat64,
Marek Olsak7585a292015-02-03 17:38:05 +00001144 string revOp, bit HasMods> {
1145 defm _e32 : VOP2_m <op, outs, ins32, asm32, pat32, opName, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001146
Tom Stellardbec5a242014-10-07 23:51:38 +00001147 defm _e64 : VOP3_2_m <op,
Tom Stellardc0503922015-03-12 21:34:22 +00001148 outs, ins64, opName#asm64, pat64, opName, revOp, HasMods
Tom Stellardb4a313a2014-08-01 00:32:39 +00001149 >;
Tom Stellard1cfd7a52013-05-20 15:02:12 +00001150}
1151
Tom Stellardbec5a242014-10-07 23:51:38 +00001152multiclass VOP2Inst <vop2 op, string opName, VOPProfile P,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001153 SDPatternOperator node = null_frag,
Marek Olsak7585a292015-02-03 17:38:05 +00001154 string revOp = opName> : VOP2_Helper <
Tom Stellardb4a313a2014-08-01 00:32:39 +00001155 op, opName, P.Outs,
1156 P.Ins32, P.Asm32, [],
1157 P.Ins64, P.Asm64,
1158 !if(P.HasModifiers,
1159 [(set P.DstVT:$dst,
1160 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
Matt Arsenault97069782014-09-30 19:49:48 +00001161 i1:$clamp, i32:$omod)),
Tom Stellardb4a313a2014-08-01 00:32:39 +00001162 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))],
1163 [(set P.DstVT:$dst, (node P.Src0VT:$src0, P.Src1VT:$src1))]),
Marek Olsak7585a292015-02-03 17:38:05 +00001164 revOp, P.HasModifiers
Tom Stellardb4a313a2014-08-01 00:32:39 +00001165>;
1166
Marek Olsak191507e2015-02-03 17:38:12 +00001167multiclass VOP2InstSI <vop2 op, string opName, VOPProfile P,
1168 SDPatternOperator node = null_frag,
1169 string revOp = opName> {
1170 defm _e32 : VOP2SI_m <op, P.Outs, P.Ins32, P.Asm32, [], opName, revOp>;
1171
Tom Stellardc0503922015-03-12 21:34:22 +00001172 defm _e64 : VOP3SI_2_m <op, P.Outs, P.Ins64, opName#P.Asm64,
Marek Olsak191507e2015-02-03 17:38:12 +00001173 !if(P.HasModifiers,
1174 [(set P.DstVT:$dst,
1175 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
1176 i1:$clamp, i32:$omod)),
1177 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))],
1178 [(set P.DstVT:$dst, (node P.Src0VT:$src0, P.Src1VT:$src1))]),
1179 opName, revOp, P.HasModifiers>;
1180}
1181
Tom Stellard845bb3c2014-10-07 23:51:41 +00001182multiclass VOP2b_Helper <vop2 op, string opName, dag outs,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001183 dag ins32, string asm32, list<dag> pat32,
1184 dag ins64, string asm64, list<dag> pat64,
1185 string revOp, bit HasMods> {
1186
Marek Olsak7585a292015-02-03 17:38:05 +00001187 defm _e32 : VOP2_m <op, outs, ins32, asm32, pat32, opName, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001188
Tom Stellard845bb3c2014-10-07 23:51:41 +00001189 defm _e64 : VOP3b_2_m <op,
Tom Stellardc0503922015-03-12 21:34:22 +00001190 outs, ins64, opName#asm64, pat64, opName, revOp, HasMods
Tom Stellardb4a313a2014-08-01 00:32:39 +00001191 >;
1192}
1193
Tom Stellard845bb3c2014-10-07 23:51:41 +00001194multiclass VOP2bInst <vop2 op, string opName, VOPProfile P,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001195 SDPatternOperator node = null_frag,
1196 string revOp = opName> : VOP2b_Helper <
1197 op, opName, P.Outs,
1198 P.Ins32, P.Asm32, [],
1199 P.Ins64, P.Asm64,
1200 !if(P.HasModifiers,
1201 [(set P.DstVT:$dst,
1202 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
Matt Arsenault97069782014-09-30 19:49:48 +00001203 i1:$clamp, i32:$omod)),
Tom Stellardb4a313a2014-08-01 00:32:39 +00001204 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))],
1205 [(set P.DstVT:$dst, (node P.Src0VT:$src0, P.Src1VT:$src1))]),
1206 revOp, P.HasModifiers
1207>;
1208
Marek Olsakf0b130a2015-01-15 18:43:06 +00001209// A VOP2 instruction that is VOP3-only on VI.
1210multiclass VOP2_VI3_Helper <vop23 op, string opName, dag outs,
1211 dag ins32, string asm32, list<dag> pat32,
1212 dag ins64, string asm64, list<dag> pat64,
Marek Olsak7585a292015-02-03 17:38:05 +00001213 string revOp, bit HasMods> {
1214 defm _e32 : VOP2SI_m <op, outs, ins32, asm32, pat32, opName, revOp>;
Marek Olsakf0b130a2015-01-15 18:43:06 +00001215
Tom Stellardc0503922015-03-12 21:34:22 +00001216 defm _e64 : VOP3_2_m <op, outs, ins64, opName#asm64, pat64, opName,
Marek Olsak7585a292015-02-03 17:38:05 +00001217 revOp, HasMods>;
Marek Olsakf0b130a2015-01-15 18:43:06 +00001218}
1219
1220multiclass VOP2_VI3_Inst <vop23 op, string opName, VOPProfile P,
1221 SDPatternOperator node = null_frag,
Marek Olsak7585a292015-02-03 17:38:05 +00001222 string revOp = opName>
Marek Olsakf0b130a2015-01-15 18:43:06 +00001223 : VOP2_VI3_Helper <
1224 op, opName, P.Outs,
1225 P.Ins32, P.Asm32, [],
1226 P.Ins64, P.Asm64,
1227 !if(P.HasModifiers,
1228 [(set P.DstVT:$dst,
1229 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
1230 i1:$clamp, i32:$omod)),
1231 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))],
1232 [(set P.DstVT:$dst, (node P.Src0VT:$src0, P.Src1VT:$src1))]),
Marek Olsak7585a292015-02-03 17:38:05 +00001233 revOp, P.HasModifiers
Marek Olsakf0b130a2015-01-15 18:43:06 +00001234>;
1235
Matt Arsenault70120fa2015-02-21 21:29:00 +00001236multiclass VOP2MADK <vop2 op, string opName, list<dag> pattern = []> {
1237
1238 def "" : VOP2_Pseudo <VOP_MADK.Outs, VOP_MADK.Ins, pattern, opName>;
1239
1240let isCodeGenOnly = 0 in {
1241 def _si : VOP2Common <VOP_MADK.Outs, VOP_MADK.Ins,
1242 !strconcat(opName, VOP_MADK.Asm), []>,
1243 SIMCInstr <opName#"_e32", SISubtarget.SI>,
1244 VOP2_MADKe <op.SI>;
1245
1246 def _vi : VOP2Common <VOP_MADK.Outs, VOP_MADK.Ins,
1247 !strconcat(opName, VOP_MADK.Asm), []>,
1248 SIMCInstr <opName#"_e32", SISubtarget.VI>,
1249 VOP2_MADKe <op.VI>;
1250} // End isCodeGenOnly = 0
1251}
1252
Marek Olsak5df00d62014-12-07 12:18:57 +00001253class VOPC_Pseudo <dag outs, dag ins, list<dag> pattern, string opName> :
1254 VOPCCommon <ins, "", pattern>,
1255 VOP <opName>,
1256 SIMCInstr<opName#"_e32", SISubtarget.NONE> {
1257 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +00001258 let isCodeGenOnly = 1;
Marek Olsak5df00d62014-12-07 12:18:57 +00001259}
1260
1261multiclass VOPC_m <vopc op, dag outs, dag ins, string asm, list<dag> pattern,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001262 string opName, bit DefExec, string revOpName = ""> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001263 def "" : VOPC_Pseudo <outs, ins, pattern, opName>;
1264
1265 def _si : VOPC<op.SI, ins, asm, []>,
1266 SIMCInstr <opName#"_e32", SISubtarget.SI> {
1267 let Defs = !if(DefExec, [EXEC], []);
Matt Arsenault42f39e12015-03-23 18:45:35 +00001268 let hasSideEffects = DefExec;
Marek Olsak5df00d62014-12-07 12:18:57 +00001269 }
1270
1271 def _vi : VOPC<op.VI, ins, asm, []>,
1272 SIMCInstr <opName#"_e32", SISubtarget.VI> {
1273 let Defs = !if(DefExec, [EXEC], []);
Matt Arsenault42f39e12015-03-23 18:45:35 +00001274 let hasSideEffects = DefExec;
Marek Olsak5df00d62014-12-07 12:18:57 +00001275 }
1276}
1277
Tom Stellard0aec5872014-10-07 23:51:39 +00001278multiclass VOPC_Helper <vopc op, string opName,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001279 dag ins32, string asm32, list<dag> pat32,
1280 dag out64, dag ins64, string asm64, list<dag> pat64,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001281 bit HasMods, bit DefExec, string revOp> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001282 defm _e32 : VOPC_m <op, (outs), ins32, opName#asm32, pat32, opName, DefExec>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001283
Tom Stellardc0503922015-03-12 21:34:22 +00001284 defm _e64 : VOP3_C_m <op, out64, ins64, opName#asm64, pat64,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001285 opName, HasMods, DefExec, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001286}
1287
Matt Arsenault096ec1e2015-02-18 02:15:30 +00001288// Special case for class instructions which only have modifiers on
1289// the 1st source operand.
1290multiclass VOPC_Class_Helper <vopc op, string opName,
1291 dag ins32, string asm32, list<dag> pat32,
1292 dag out64, dag ins64, string asm64, list<dag> pat64,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001293 bit HasMods, bit DefExec, string revOp> {
Matt Arsenault096ec1e2015-02-18 02:15:30 +00001294 defm _e32 : VOPC_m <op, (outs), ins32, opName#asm32, pat32, opName, DefExec>;
1295
Tom Stellardc0503922015-03-12 21:34:22 +00001296 defm _e64 : VOP3_C_m <op, out64, ins64, opName#asm64, pat64,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001297 opName, HasMods, DefExec, revOp>,
Matt Arsenault096ec1e2015-02-18 02:15:30 +00001298 VOP3DisableModFields<1, 0, 0>;
1299}
1300
Tom Stellard0aec5872014-10-07 23:51:39 +00001301multiclass VOPCInst <vopc op, string opName,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001302 VOPProfile P, PatLeaf cond = COND_NULL,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001303 string revOp = opName,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001304 bit DefExec = 0> : VOPC_Helper <
1305 op, opName,
1306 P.Ins32, P.Asm32, [],
Tom Stellardc0503922015-03-12 21:34:22 +00001307 (outs VOPDstS64:$dst), P.Ins64, P.Asm64,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001308 !if(P.HasModifiers,
1309 [(set i1:$dst,
1310 (setcc (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
Matt Arsenault97069782014-09-30 19:49:48 +00001311 i1:$clamp, i32:$omod)),
Tom Stellardb4a313a2014-08-01 00:32:39 +00001312 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)),
1313 cond))],
1314 [(set i1:$dst, (setcc P.Src0VT:$src0, P.Src1VT:$src1, cond))]),
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001315 P.HasModifiers, DefExec, revOp
Tom Stellardb4a313a2014-08-01 00:32:39 +00001316>;
1317
Matt Arsenault4831ce52015-01-06 23:00:37 +00001318multiclass VOPCClassInst <vopc op, string opName, VOPProfile P,
Matt Arsenault096ec1e2015-02-18 02:15:30 +00001319 bit DefExec = 0> : VOPC_Class_Helper <
Matt Arsenault4831ce52015-01-06 23:00:37 +00001320 op, opName,
1321 P.Ins32, P.Asm32, [],
Tom Stellardc0503922015-03-12 21:34:22 +00001322 (outs VOPDstS64:$dst), P.Ins64, P.Asm64,
Matt Arsenault4831ce52015-01-06 23:00:37 +00001323 !if(P.HasModifiers,
1324 [(set i1:$dst,
1325 (AMDGPUfp_class (P.Src0VT (VOP3Mods0Clamp0OMod P.Src0VT:$src0, i32:$src0_modifiers)), P.Src1VT:$src1))],
1326 [(set i1:$dst, (AMDGPUfp_class P.Src0VT:$src0, P.Src1VT:$src1))]),
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001327 P.HasModifiers, DefExec, opName
Matt Arsenault4831ce52015-01-06 23:00:37 +00001328>;
1329
1330
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001331multiclass VOPC_F32 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> :
1332 VOPCInst <op, opName, VOP_F32_F32_F32, cond, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001333
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001334multiclass VOPC_F64 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> :
1335 VOPCInst <op, opName, VOP_F64_F64_F64, cond, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001336
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001337multiclass VOPC_I32 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> :
1338 VOPCInst <op, opName, VOP_I32_I32_I32, cond, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001339
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001340multiclass VOPC_I64 <vopc op, string opName, PatLeaf cond = COND_NULL, string revOp = opName> :
1341 VOPCInst <op, opName, VOP_I64_I64_I64, cond, revOp>;
Christian Konigf5754a02013-02-21 15:17:09 +00001342
Matt Arsenaultf2b0aeb2014-06-23 18:28:28 +00001343
Tom Stellard0aec5872014-10-07 23:51:39 +00001344multiclass VOPCX <vopc op, string opName, VOPProfile P,
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001345 PatLeaf cond = COND_NULL,
1346 string revOp = "">
1347 : VOPCInst <op, opName, P, cond, revOp, 1>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001348
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001349multiclass VOPCX_F32 <vopc op, string opName, string revOp = opName> :
1350 VOPCX <op, opName, VOP_F32_F32_F32, COND_NULL, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001351
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001352multiclass VOPCX_F64 <vopc op, string opName, string revOp = opName> :
1353 VOPCX <op, opName, VOP_F64_F64_F64, COND_NULL, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001354
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001355multiclass VOPCX_I32 <vopc op, string opName, string revOp = opName> :
1356 VOPCX <op, opName, VOP_I32_I32_I32, COND_NULL, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001357
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00001358multiclass VOPCX_I64 <vopc op, string opName, string revOp = opName> :
1359 VOPCX <op, opName, VOP_I64_I64_I64, COND_NULL, revOp>;
Tom Stellardb4a313a2014-08-01 00:32:39 +00001360
Tom Stellard845bb3c2014-10-07 23:51:41 +00001361multiclass VOP3_Helper <vop3 op, string opName, dag outs, dag ins, string asm,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001362 list<dag> pat, int NumSrcArgs, bit HasMods> : VOP3_m <
Tom Stellardc0503922015-03-12 21:34:22 +00001363 op, outs, ins, opName#" "#asm, pat, opName, NumSrcArgs, HasMods
Tom Stellardb4a313a2014-08-01 00:32:39 +00001364>;
1365
Matt Arsenault4831ce52015-01-06 23:00:37 +00001366multiclass VOPC_CLASS_F32 <vopc op, string opName> :
1367 VOPCClassInst <op, opName, VOP_I1_F32_I32, 0>;
1368
1369multiclass VOPCX_CLASS_F32 <vopc op, string opName> :
1370 VOPCClassInst <op, opName, VOP_I1_F32_I32, 1>;
1371
1372multiclass VOPC_CLASS_F64 <vopc op, string opName> :
1373 VOPCClassInst <op, opName, VOP_I1_F64_I32, 0>;
1374
1375multiclass VOPCX_CLASS_F64 <vopc op, string opName> :
1376 VOPCClassInst <op, opName, VOP_I1_F64_I32, 1>;
1377
Tom Stellard845bb3c2014-10-07 23:51:41 +00001378multiclass VOP3Inst <vop3 op, string opName, VOPProfile P,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001379 SDPatternOperator node = null_frag> : VOP3_Helper <
Tom Stellardc0503922015-03-12 21:34:22 +00001380 op, opName, (outs P.DstRC.RegClass:$dst), P.Ins64, P.Asm64,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001381 !if(!eq(P.NumSrcArgs, 3),
1382 !if(P.HasModifiers,
1383 [(set P.DstVT:$dst,
1384 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
Matt Arsenault97069782014-09-30 19:49:48 +00001385 i1:$clamp, i32:$omod)),
Tom Stellardb4a313a2014-08-01 00:32:39 +00001386 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)),
1387 (P.Src2VT (VOP3Mods P.Src2VT:$src2, i32:$src2_modifiers))))],
1388 [(set P.DstVT:$dst, (node P.Src0VT:$src0, P.Src1VT:$src1,
1389 P.Src2VT:$src2))]),
1390 !if(!eq(P.NumSrcArgs, 2),
1391 !if(P.HasModifiers,
1392 [(set P.DstVT:$dst,
1393 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
Matt Arsenault97069782014-09-30 19:49:48 +00001394 i1:$clamp, i32:$omod)),
Tom Stellardb4a313a2014-08-01 00:32:39 +00001395 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers))))],
1396 [(set P.DstVT:$dst, (node P.Src0VT:$src0, P.Src1VT:$src1))])
1397 /* P.NumSrcArgs == 1 */,
1398 !if(P.HasModifiers,
1399 [(set P.DstVT:$dst,
1400 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
Matt Arsenault97069782014-09-30 19:49:48 +00001401 i1:$clamp, i32:$omod))))],
Tom Stellardb4a313a2014-08-01 00:32:39 +00001402 [(set P.DstVT:$dst, (node P.Src0VT:$src0))]))),
1403 P.NumSrcArgs, P.HasModifiers
1404>;
1405
Matt Arsenault1bc9d952015-02-14 04:22:00 +00001406// Special case for v_div_fmas_{f32|f64}, since it seems to be the
1407// only VOP instruction that implicitly reads VCC.
1408multiclass VOP3_VCC_Inst <vop3 op, string opName,
1409 VOPProfile P,
1410 SDPatternOperator node = null_frag> : VOP3_Helper <
1411 op, opName,
Tom Stellardc0503922015-03-12 21:34:22 +00001412 (outs P.DstRC.RegClass:$dst),
Matt Arsenault1bc9d952015-02-14 04:22:00 +00001413 (ins InputModsNoDefault:$src0_modifiers, P.Src0RC64:$src0,
1414 InputModsNoDefault:$src1_modifiers, P.Src1RC64:$src1,
1415 InputModsNoDefault:$src2_modifiers, P.Src2RC64:$src2,
1416 ClampMod:$clamp,
1417 omod:$omod),
1418 " $dst, $src0_modifiers, $src1_modifiers, $src2_modifiers"#"$clamp"#"$omod",
1419 [(set P.DstVT:$dst,
1420 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers,
1421 i1:$clamp, i32:$omod)),
1422 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)),
1423 (P.Src2VT (VOP3Mods P.Src2VT:$src2, i32:$src2_modifiers)),
1424 (i1 VCC)))],
1425 3, 1
1426>;
1427
Tom Stellardb6550522015-01-12 19:33:18 +00001428multiclass VOP3b_Helper <vop op, RegisterClass vrc, RegisterOperand arc,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001429 string opName, list<dag> pattern> :
Matt Arsenault31ec5982015-02-14 03:40:35 +00001430 VOP3b_3_m <
Matt Arsenaulta95f5a02014-11-04 20:29:20 +00001431 op, (outs vrc:$vdst, SReg_64:$sdst),
Matt Arsenault272c50a2014-09-30 19:49:43 +00001432 (ins InputModsNoDefault:$src0_modifiers, arc:$src0,
1433 InputModsNoDefault:$src1_modifiers, arc:$src1,
1434 InputModsNoDefault:$src2_modifiers, arc:$src2,
Matt Arsenaultf2676a52014-11-05 19:35:00 +00001435 ClampMod:$clamp, omod:$omod),
Matt Arsenaulta95f5a02014-11-04 20:29:20 +00001436 opName#" $vdst, $sdst, $src0_modifiers, $src1_modifiers, $src2_modifiers"#"$clamp"#"$omod", pattern,
Tom Stellardb4a313a2014-08-01 00:32:39 +00001437 opName, opName, 1, 1
1438>;
Matt Arsenaultf2b0aeb2014-06-23 18:28:28 +00001439
Tom Stellard845bb3c2014-10-07 23:51:41 +00001440multiclass VOP3b_64 <vop3 op, string opName, list<dag> pattern> :
Matt Arsenaultf2b0aeb2014-06-23 18:28:28 +00001441 VOP3b_Helper <op, VReg_64, VSrc_64, opName, pattern>;
1442
Tom Stellard845bb3c2014-10-07 23:51:41 +00001443multiclass VOP3b_32 <vop3 op, string opName, list<dag> pattern> :
Tom Stellard45c0b3a2015-01-07 20:59:25 +00001444 VOP3b_Helper <op, VGPR_32, VSrc_32, opName, pattern>;
Matt Arsenaultf2b0aeb2014-06-23 18:28:28 +00001445
Matt Arsenault8675db12014-08-29 16:01:14 +00001446
1447class Vop3ModPat<Instruction Inst, VOPProfile P, SDPatternOperator node> : Pat<
Matt Arsenault97069782014-09-30 19:49:48 +00001448 (node (P.Src0VT (VOP3Mods0 P.Src0VT:$src0, i32:$src0_modifiers, i1:$clamp, i32:$omod)),
Matt Arsenault8675db12014-08-29 16:01:14 +00001449 (P.Src1VT (VOP3Mods P.Src1VT:$src1, i32:$src1_modifiers)),
1450 (P.Src2VT (VOP3Mods P.Src2VT:$src2, i32:$src2_modifiers))),
1451 (Inst i32:$src0_modifiers, P.Src0VT:$src0,
1452 i32:$src1_modifiers, P.Src1VT:$src1,
1453 i32:$src2_modifiers, P.Src2VT:$src2,
Matt Arsenault97069782014-09-30 19:49:48 +00001454 i1:$clamp,
Matt Arsenault8675db12014-08-29 16:01:14 +00001455 i32:$omod)>;
1456
Christian Konig72d5d5c2013-02-21 15:16:44 +00001457//===----------------------------------------------------------------------===//
Marek Olsak5df00d62014-12-07 12:18:57 +00001458// Interpolation opcodes
1459//===----------------------------------------------------------------------===//
1460
Marek Olsak367447c2015-01-27 17:25:11 +00001461class VINTRP_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> :
1462 VINTRPCommon <outs, ins, "", pattern>,
Marek Olsak5df00d62014-12-07 12:18:57 +00001463 SIMCInstr<opName, SISubtarget.NONE> {
1464 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +00001465 let isCodeGenOnly = 1;
Marek Olsak5df00d62014-12-07 12:18:57 +00001466}
1467
1468class VINTRP_Real_si <bits <2> op, string opName, dag outs, dag ins,
Marek Olsak367447c2015-01-27 17:25:11 +00001469 string asm> :
1470 VINTRPCommon <outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +00001471 VINTRPe <op>,
1472 SIMCInstr<opName, SISubtarget.SI>;
1473
1474class VINTRP_Real_vi <bits <2> op, string opName, dag outs, dag ins,
Marek Olsak367447c2015-01-27 17:25:11 +00001475 string asm> :
1476 VINTRPCommon <outs, ins, asm, []>,
Marek Olsak5df00d62014-12-07 12:18:57 +00001477 VINTRPe_vi <op>,
1478 SIMCInstr<opName, SISubtarget.VI>;
1479
1480multiclass VINTRP_m <bits <2> op, string opName, dag outs, dag ins, string asm,
1481 string disableEncoding = "", string constraints = "",
1482 list<dag> pattern = []> {
1483 let DisableEncoding = disableEncoding,
1484 Constraints = constraints in {
Marek Olsak367447c2015-01-27 17:25:11 +00001485 def "" : VINTRP_Pseudo <opName, outs, ins, pattern>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001486
Marek Olsak367447c2015-01-27 17:25:11 +00001487 def _si : VINTRP_Real_si <op, opName, outs, ins, asm>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001488
Marek Olsak367447c2015-01-27 17:25:11 +00001489 def _vi : VINTRP_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001490 }
1491}
1492
1493//===----------------------------------------------------------------------===//
Christian Konig72d5d5c2013-02-21 15:16:44 +00001494// Vector I/O classes
1495//===----------------------------------------------------------------------===//
1496
Marek Olsak5df00d62014-12-07 12:18:57 +00001497class DS_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> :
1498 DS <outs, ins, "", pattern>,
1499 SIMCInstr <opName, SISubtarget.NONE> {
1500 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +00001501 let isCodeGenOnly = 1;
Marek Olsak5df00d62014-12-07 12:18:57 +00001502}
1503
1504class DS_Real_si <bits<8> op, string opName, dag outs, dag ins, string asm> :
1505 DS <outs, ins, asm, []>,
1506 DSe <op>,
1507 SIMCInstr <opName, SISubtarget.SI>;
1508
1509class DS_Real_vi <bits<8> op, string opName, dag outs, dag ins, string asm> :
1510 DS <outs, ins, asm, []>,
1511 DSe_vi <op>,
1512 SIMCInstr <opName, SISubtarget.VI>;
1513
Tom Stellardcf051f42015-03-09 18:49:45 +00001514class DS_Off16_Real_si <bits<8> op, string opName, dag outs, dag ins, string asm> :
1515 DS_Real_si <op,opName, outs, ins, asm> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001516
1517 // Single load interpret the 2 i8imm operands as a single i16 offset.
1518 bits<16> offset;
1519 let offset0 = offset{7-0};
1520 let offset1 = offset{15-8};
1521}
1522
Tom Stellardcf051f42015-03-09 18:49:45 +00001523class DS_Off16_Real_vi <bits<8> op, string opName, dag outs, dag ins, string asm> :
1524 DS_Real_vi <op, opName, outs, ins, asm> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001525
1526 // Single load interpret the 2 i8imm operands as a single i16 offset.
1527 bits<16> offset;
1528 let offset0 = offset{7-0};
1529 let offset1 = offset{15-8};
1530}
1531
Tom Stellardcf051f42015-03-09 18:49:45 +00001532multiclass DS_1A_RET <bits<8> op, string opName, RegisterClass rc,
1533 dag outs = (outs rc:$vdst),
Tom Stellard065e3d42015-03-09 18:49:54 +00001534 dag ins = (ins VGPR_32:$addr, ds_offset:$offset, gds:$gds, M0Reg:$m0),
1535 string asm = opName#" $vdst, $addr"#"$offset$gds"> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001536
Tom Stellardcf051f42015-03-09 18:49:45 +00001537 def "" : DS_Pseudo <opName, outs, ins, []>;
1538
1539 let data0 = 0, data1 = 0 in {
1540 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1541 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001542 }
1543}
1544
Tom Stellardcf051f42015-03-09 18:49:45 +00001545multiclass DS_1A_Off8_RET <bits<8> op, string opName, RegisterClass rc,
1546 dag outs = (outs rc:$vdst),
Tom Stellard065e3d42015-03-09 18:49:54 +00001547 dag ins = (ins VGPR_32:$addr, ds_offset0:$offset0, ds_offset1:$offset1,
1548 gds:$gds, M0Reg:$m0),
1549 string asm = opName#" $vdst, $addr"#"$offset0"#"$offset1$gds"> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001550
Tom Stellardcf051f42015-03-09 18:49:45 +00001551 def "" : DS_Pseudo <opName, outs, ins, []>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001552
Tom Stellardcf051f42015-03-09 18:49:45 +00001553 let data0 = 0, data1 = 0 in {
1554 def _si : DS_Real_si <op, opName, outs, ins, asm>;
1555 def _vi : DS_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001556 }
1557}
1558
Tom Stellardcf051f42015-03-09 18:49:45 +00001559multiclass DS_1A1D_NORET <bits<8> op, string opName, RegisterClass rc,
1560 dag outs = (outs),
Tom Stellard065e3d42015-03-09 18:49:54 +00001561 dag ins = (ins VGPR_32:$addr, rc:$data0, ds_offset:$offset, gds:$gds,
Tom Stellardcf051f42015-03-09 18:49:45 +00001562 M0Reg:$m0),
Tom Stellard065e3d42015-03-09 18:49:54 +00001563 string asm = opName#" $addr, $data0"#"$offset$gds"> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001564
Tom Stellardcf051f42015-03-09 18:49:45 +00001565 def "" : DS_Pseudo <opName, outs, ins, []>,
1566 AtomicNoRet<opName, 0>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001567
Tom Stellardcf051f42015-03-09 18:49:45 +00001568 let data1 = 0, vdst = 0 in {
1569 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1570 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001571 }
1572}
1573
Tom Stellardcf051f42015-03-09 18:49:45 +00001574multiclass DS_1A1D_Off8_NORET <bits<8> op, string opName, RegisterClass rc,
1575 dag outs = (outs),
Tom Stellard065e3d42015-03-09 18:49:54 +00001576 dag ins = (ins VGPR_32:$addr, rc:$data0, rc:$data1,
1577 ds_offset0:$offset0, ds_offset1:$offset1, gds:$gds, M0Reg:$m0),
1578 string asm = opName#" $addr, $data0, $data1"#"$offset0"#"$offset1"#"$gds"> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001579
Tom Stellardcf051f42015-03-09 18:49:45 +00001580 def "" : DS_Pseudo <opName, outs, ins, []>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001581
Tom Stellardcf051f42015-03-09 18:49:45 +00001582 let vdst = 0 in {
1583 def _si : DS_Real_si <op, opName, outs, ins, asm>;
1584 def _vi : DS_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak5df00d62014-12-07 12:18:57 +00001585 }
1586}
1587
Tom Stellardcf051f42015-03-09 18:49:45 +00001588multiclass DS_1A1D_RET <bits<8> op, string opName, RegisterClass rc,
1589 string noRetOp = "",
1590 dag outs = (outs rc:$vdst),
Tom Stellard065e3d42015-03-09 18:49:54 +00001591 dag ins = (ins VGPR_32:$addr, rc:$data0, ds_offset:$offset, gds:$gds,
Tom Stellardcf051f42015-03-09 18:49:45 +00001592 M0Reg:$m0),
Tom Stellard065e3d42015-03-09 18:49:54 +00001593 string asm = opName#" $vdst, $addr, $data0"#"$offset$gds"> {
Marek Olsak5df00d62014-12-07 12:18:57 +00001594
Tom Stellardcf051f42015-03-09 18:49:45 +00001595 def "" : DS_Pseudo <opName, outs, ins, []>,
1596 AtomicNoRet<noRetOp, 1>;
Matt Arsenault9cd8c382014-03-19 22:19:39 +00001597
Tom Stellardcf051f42015-03-09 18:49:45 +00001598 let data1 = 0 in {
1599 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1600 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak0c1f8812015-01-27 17:25:07 +00001601 }
Matt Arsenault9cd8c382014-03-19 22:19:39 +00001602}
1603
Tom Stellardcf051f42015-03-09 18:49:45 +00001604multiclass DS_1A2D_RET_m <bits<8> op, string opName, RegisterClass rc,
1605 string noRetOp = "", dag ins,
1606 dag outs = (outs rc:$vdst),
Tom Stellard065e3d42015-03-09 18:49:54 +00001607 string asm = opName#" $vdst, $addr, $data0, $data1"#"$offset"#"$gds"> {
Tom Stellard13c68ef2013-09-05 18:38:09 +00001608
Tom Stellardcf051f42015-03-09 18:49:45 +00001609 def "" : DS_Pseudo <opName, outs, ins, []>,
1610 AtomicNoRet<noRetOp, 1>;
Marek Olsak0c1f8812015-01-27 17:25:07 +00001611
Tom Stellardcf051f42015-03-09 18:49:45 +00001612 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1613 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak0c1f8812015-01-27 17:25:07 +00001614}
1615
1616multiclass DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc,
Tom Stellardcf051f42015-03-09 18:49:45 +00001617 string noRetOp = "", RegisterClass src = rc> :
1618 DS_1A2D_RET_m <op, asm, rc, noRetOp,
Tom Stellard065e3d42015-03-09 18:49:54 +00001619 (ins VGPR_32:$addr, src:$data0, src:$data1,
1620 ds_offset:$offset, gds:$gds, M0Reg:$m0)
Tom Stellardcf051f42015-03-09 18:49:45 +00001621>;
Matt Arsenault8c6613d2014-06-11 18:08:39 +00001622
Tom Stellardcf051f42015-03-09 18:49:45 +00001623multiclass DS_1A2D_NORET <bits<8> op, string opName, RegisterClass rc,
1624 string noRetOp = opName,
1625 dag outs = (outs),
Tom Stellard065e3d42015-03-09 18:49:54 +00001626 dag ins = (ins VGPR_32:$addr, rc:$data0, rc:$data1,
1627 ds_offset:$offset, gds:$gds, M0Reg:$m0),
1628 string asm = opName#" $addr, $data0, $data1"#"$offset"#"$gds"> {
Marek Olsak0c1f8812015-01-27 17:25:07 +00001629
Tom Stellardcf051f42015-03-09 18:49:45 +00001630 def "" : DS_Pseudo <opName, outs, ins, []>,
1631 AtomicNoRet<noRetOp, 0>;
1632
1633 let vdst = 0 in {
1634 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1635 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak0c1f8812015-01-27 17:25:07 +00001636 }
1637}
1638
Tom Stellarddb4995a2015-03-09 16:03:45 +00001639multiclass DS_0A_RET <bits<8> op, string opName,
1640 dag outs = (outs VGPR_32:$vdst),
Tom Stellard065e3d42015-03-09 18:49:54 +00001641 dag ins = (ins ds_offset:$offset, gds:$gds, M0Reg:$m0),
1642 string asm = opName#" $vdst"#"$offset"#"$gds"> {
Tom Stellarddb4995a2015-03-09 16:03:45 +00001643
1644 let mayLoad = 1, mayStore = 1 in {
1645 def "" : DS_Pseudo <opName, outs, ins, []>;
1646
1647 let addr = 0, data0 = 0, data1 = 0 in {
Tom Stellardcf051f42015-03-09 18:49:45 +00001648 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1649 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
Tom Stellarddb4995a2015-03-09 16:03:45 +00001650 } // end addr = 0, data0 = 0, data1 = 0
1651 } // end mayLoad = 1, mayStore = 1
1652}
1653
1654multiclass DS_1A_RET_GDS <bits<8> op, string opName,
1655 dag outs = (outs VGPR_32:$vdst),
1656 dag ins = (ins VGPR_32:$addr, ds_offset:$offset, M0Reg:$m0),
Tom Stellard065e3d42015-03-09 18:49:54 +00001657 string asm = opName#" $vdst, $addr"#"$offset gds"> {
Tom Stellarddb4995a2015-03-09 16:03:45 +00001658
Tom Stellardcf051f42015-03-09 18:49:45 +00001659 def "" : DS_Pseudo <opName, outs, ins, []>;
Tom Stellarddb4995a2015-03-09 16:03:45 +00001660
Tom Stellardcf051f42015-03-09 18:49:45 +00001661 let data0 = 0, data1 = 0, gds = 1 in {
1662 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1663 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
1664 } // end data0 = 0, data1 = 0, gds = 1
Tom Stellarddb4995a2015-03-09 16:03:45 +00001665}
1666
1667multiclass DS_1A_GDS <bits<8> op, string opName,
1668 dag outs = (outs),
1669 dag ins = (ins VGPR_32:$addr, M0Reg:$m0),
1670 string asm = opName#" $addr gds"> {
1671
1672 def "" : DS_Pseudo <opName, outs, ins, []>;
1673
1674 let vdst = 0, data0 = 0, data1 = 0, offset0 = 0, offset1 = 0, gds = 1 in {
1675 def _si : DS_Real_si <op, opName, outs, ins, asm>;
1676 def _vi : DS_Real_vi <op, opName, outs, ins, asm>;
1677 } // end vdst = 0, data = 0, data1 = 0, gds = 1
1678}
1679
1680multiclass DS_1A <bits<8> op, string opName,
1681 dag outs = (outs),
Tom Stellard065e3d42015-03-09 18:49:54 +00001682 dag ins = (ins VGPR_32:$addr, ds_offset:$offset, M0Reg:$m0, gds:$gds),
1683 string asm = opName#" $addr"#"$offset"#"$gds"> {
Tom Stellarddb4995a2015-03-09 16:03:45 +00001684
1685 let mayLoad = 1, mayStore = 1 in {
1686 def "" : DS_Pseudo <opName, outs, ins, []>;
1687
1688 let vdst = 0, data0 = 0, data1 = 0 in {
Tom Stellardcf051f42015-03-09 18:49:45 +00001689 def _si : DS_Off16_Real_si <op, opName, outs, ins, asm>;
1690 def _vi : DS_Off16_Real_vi <op, opName, outs, ins, asm>;
Tom Stellarddb4995a2015-03-09 16:03:45 +00001691 } // let vdst = 0, data0 = 0, data1 = 0
1692 } // end mayLoad = 1, mayStore = 1
1693}
1694
Tom Stellard0c238c22014-10-01 14:44:43 +00001695//===----------------------------------------------------------------------===//
1696// MTBUF classes
1697//===----------------------------------------------------------------------===//
1698
1699class MTBUF_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> :
1700 MTBUF <outs, ins, "", pattern>,
1701 SIMCInstr<opName, SISubtarget.NONE> {
1702 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +00001703 let isCodeGenOnly = 1;
Tom Stellard0c238c22014-10-01 14:44:43 +00001704}
1705
1706class MTBUF_Real_si <bits<3> op, string opName, dag outs, dag ins,
1707 string asm> :
1708 MTBUF <outs, ins, asm, []>,
1709 MTBUFe <op>,
1710 SIMCInstr<opName, SISubtarget.SI>;
1711
Marek Olsak5df00d62014-12-07 12:18:57 +00001712class MTBUF_Real_vi <bits<4> op, string opName, dag outs, dag ins, string asm> :
1713 MTBUF <outs, ins, asm, []>,
1714 MTBUFe_vi <op>,
1715 SIMCInstr <opName, SISubtarget.VI>;
1716
Tom Stellard0c238c22014-10-01 14:44:43 +00001717multiclass MTBUF_m <bits<3> op, string opName, dag outs, dag ins, string asm,
1718 list<dag> pattern> {
1719
1720 def "" : MTBUF_Pseudo <opName, outs, ins, pattern>;
1721
1722 def _si : MTBUF_Real_si <op, opName, outs, ins, asm>;
1723
Marek Olsak5df00d62014-12-07 12:18:57 +00001724 def _vi : MTBUF_Real_vi <{0, op{2}, op{1}, op{0}}, opName, outs, ins, asm>;
1725
Tom Stellard0c238c22014-10-01 14:44:43 +00001726}
1727
1728let mayStore = 1, mayLoad = 0 in {
1729
1730multiclass MTBUF_Store_Helper <bits<3> op, string opName,
1731 RegisterClass regClass> : MTBUF_m <
1732 op, opName, (outs),
1733 (ins regClass:$vdata, u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
Tom Stellard45c0b3a2015-01-07 20:59:25 +00001734 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VGPR_32:$vaddr,
Tom Stellardc3d7eeb2014-12-19 22:15:30 +00001735 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SCSrc_32:$soffset),
Tom Stellard0c238c22014-10-01 14:44:43 +00001736 opName#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
1737 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset", []
1738>;
1739
1740} // mayStore = 1, mayLoad = 0
1741
1742let mayLoad = 1, mayStore = 0 in {
1743
1744multiclass MTBUF_Load_Helper <bits<3> op, string opName,
1745 RegisterClass regClass> : MTBUF_m <
1746 op, opName, (outs regClass:$dst),
1747 (ins u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Tom Stellard45c0b3a2015-01-07 20:59:25 +00001748 i8imm:$dfmt, i8imm:$nfmt, VGPR_32:$vaddr, SReg_128:$srsrc,
Tom Stellardc3d7eeb2014-12-19 22:15:30 +00001749 i1imm:$slc, i1imm:$tfe, SCSrc_32:$soffset),
Tom Stellard0c238c22014-10-01 14:44:43 +00001750 opName#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
1751 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset", []
1752>;
1753
1754} // mayLoad = 1, mayStore = 0
1755
Marek Olsak5df00d62014-12-07 12:18:57 +00001756//===----------------------------------------------------------------------===//
1757// MUBUF classes
1758//===----------------------------------------------------------------------===//
1759
Marek Olsakee98b112015-01-27 17:24:58 +00001760class mubuf <bits<7> si, bits<7> vi = si> {
1761 field bits<7> SI = si;
1762 field bits<7> VI = vi;
1763}
1764
Marek Olsak7ef6db42015-01-27 17:24:54 +00001765class MUBUFAddr64Table <bit is_addr64, string suffix = ""> {
1766 bit IsAddr64 = is_addr64;
1767 string OpName = NAME # suffix;
1768}
1769
1770class MUBUF_Pseudo <string opName, dag outs, dag ins, list<dag> pattern> :
1771 MUBUF <outs, ins, "", pattern>,
1772 SIMCInstr<opName, SISubtarget.NONE> {
1773 let isPseudo = 1;
Tom Stellard1ca873b2015-02-18 16:08:17 +00001774 let isCodeGenOnly = 1;
Marek Olsak7ef6db42015-01-27 17:24:54 +00001775
1776 // dummy fields, so that we can use let statements around multiclasses
1777 bits<1> offen;
1778 bits<1> idxen;
1779 bits<8> vaddr;
1780 bits<1> glc;
1781 bits<1> slc;
1782 bits<1> tfe;
1783 bits<8> soffset;
1784}
1785
Marek Olsakee98b112015-01-27 17:24:58 +00001786class MUBUF_Real_si <mubuf op, string opName, dag outs, dag ins,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001787 string asm> :
1788 MUBUF <outs, ins, asm, []>,
Marek Olsakee98b112015-01-27 17:24:58 +00001789 MUBUFe <op.SI>,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001790 SIMCInstr<opName, SISubtarget.SI> {
1791 let lds = 0;
1792}
1793
Marek Olsakee98b112015-01-27 17:24:58 +00001794class MUBUF_Real_vi <mubuf op, string opName, dag outs, dag ins,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001795 string asm> :
1796 MUBUF <outs, ins, asm, []>,
Marek Olsakee98b112015-01-27 17:24:58 +00001797 MUBUFe_vi <op.VI>,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001798 SIMCInstr<opName, SISubtarget.VI> {
1799 let lds = 0;
1800}
1801
Marek Olsakee98b112015-01-27 17:24:58 +00001802multiclass MUBUF_m <mubuf op, string opName, dag outs, dag ins, string asm,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001803 list<dag> pattern> {
1804
1805 def "" : MUBUF_Pseudo <opName, outs, ins, pattern>,
1806 MUBUFAddr64Table <0>;
1807
1808 let addr64 = 0 in {
1809 def _si : MUBUF_Real_si <op, opName, outs, ins, asm>;
1810 }
Marek Olsakee98b112015-01-27 17:24:58 +00001811
1812 def _vi : MUBUF_Real_vi <op, opName, outs, ins, asm>;
Marek Olsak7ef6db42015-01-27 17:24:54 +00001813}
1814
Marek Olsakee98b112015-01-27 17:24:58 +00001815multiclass MUBUFAddr64_m <mubuf op, string opName, dag outs,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001816 dag ins, string asm, list<dag> pattern> {
1817
1818 def "" : MUBUF_Pseudo <opName, outs, ins, pattern>,
1819 MUBUFAddr64Table <1>;
1820
1821 let addr64 = 1 in {
1822 def _si : MUBUF_Real_si <op, opName, outs, ins, asm>;
1823 }
1824
1825 // There is no VI version. If the pseudo is selected, it should be lowered
1826 // for VI appropriately.
1827}
1828
Marek Olsak5df00d62014-12-07 12:18:57 +00001829class MUBUF_si <bits<7> op, dag outs, dag ins, string asm, list<dag> pattern> :
Tom Stellard3260ec42014-12-09 00:03:51 +00001830 MUBUF <outs, ins, asm, pattern>, MUBUFe <op> {
Marek Olsak7ef6db42015-01-27 17:24:54 +00001831 let lds = 0;
Tom Stellard3260ec42014-12-09 00:03:51 +00001832}
Marek Olsak5df00d62014-12-07 12:18:57 +00001833
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001834multiclass MUBUFAtomicOffset_m <mubuf op, string opName, dag outs, dag ins,
1835 string asm, list<dag> pattern, bit is_return> {
Tom Stellard7980fc82014-09-25 18:30:26 +00001836
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001837 def "" : MUBUF_Pseudo <opName, outs, ins, pattern>,
1838 MUBUFAddr64Table <0, !if(is_return, "_RTN", "")>,
1839 AtomicNoRet<NAME#"_OFFSET", is_return>;
1840
1841 let offen = 0, idxen = 0, tfe = 0, vaddr = 0 in {
1842 let addr64 = 0 in {
1843 def _si : MUBUF_Real_si <op, opName, outs, ins, asm>;
1844 }
1845
1846 def _vi : MUBUF_Real_vi <op, opName, outs, ins, asm>;
1847 }
Tom Stellard7980fc82014-09-25 18:30:26 +00001848}
1849
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001850multiclass MUBUFAtomicAddr64_m <mubuf op, string opName, dag outs, dag ins,
1851 string asm, list<dag> pattern, bit is_return> {
Tom Stellard7980fc82014-09-25 18:30:26 +00001852
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001853 def "" : MUBUF_Pseudo <opName, outs, ins, pattern>,
1854 MUBUFAddr64Table <1, !if(is_return, "_RTN", "")>,
1855 AtomicNoRet<NAME#"_ADDR64", is_return>;
1856
Tom Stellardc53861a2015-02-11 00:34:32 +00001857 let offen = 0, idxen = 0, addr64 = 1, tfe = 0 in {
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001858 def _si : MUBUF_Real_si <op, opName, outs, ins, asm>;
1859 }
1860
1861 // There is no VI version. If the pseudo is selected, it should be lowered
1862 // for VI appropriately.
Tom Stellard7980fc82014-09-25 18:30:26 +00001863}
1864
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001865multiclass MUBUF_Atomic <mubuf op, string name, RegisterClass rc,
Tom Stellard7980fc82014-09-25 18:30:26 +00001866 ValueType vt, SDPatternOperator atomic> {
1867
1868 let mayStore = 1, mayLoad = 1, hasPostISelHook = 1 in {
1869
1870 // No return variants
1871 let glc = 0 in {
1872
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001873 defm _ADDR64 : MUBUFAtomicAddr64_m <
1874 op, name#"_addr64", (outs),
Tom Stellard7980fc82014-09-25 18:30:26 +00001875 (ins rc:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
Tom Stellard49282c92015-02-27 14:59:44 +00001876 SCSrc_32:$soffset, mbuf_offset:$offset, slc:$slc),
Matt Arsenault2ad8bab2015-02-18 02:04:35 +00001877 name#" $vdata, $vaddr, $srsrc, $soffset addr64"#"$offset"#"$slc", [], 0
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001878 >;
Tom Stellard7980fc82014-09-25 18:30:26 +00001879
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001880 defm _OFFSET : MUBUFAtomicOffset_m <
1881 op, name#"_offset", (outs),
Tom Stellard49282c92015-02-27 14:59:44 +00001882 (ins rc:$vdata, SReg_128:$srsrc, SCSrc_32:$soffset, mbuf_offset:$offset,
1883 slc:$slc),
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001884 name#" $vdata, $srsrc, $soffset"#"$offset"#"$slc", [], 0
1885 >;
Tom Stellard7980fc82014-09-25 18:30:26 +00001886 } // glc = 0
1887
1888 // Variant that return values
1889 let glc = 1, Constraints = "$vdata = $vdata_in",
1890 DisableEncoding = "$vdata_in" in {
1891
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001892 defm _RTN_ADDR64 : MUBUFAtomicAddr64_m <
1893 op, name#"_rtn_addr64", (outs rc:$vdata),
Tom Stellard7980fc82014-09-25 18:30:26 +00001894 (ins rc:$vdata_in, SReg_128:$srsrc, VReg_64:$vaddr,
Tom Stellard49282c92015-02-27 14:59:44 +00001895 SCSrc_32:$soffset, mbuf_offset:$offset, slc:$slc),
Tom Stellardc53861a2015-02-11 00:34:32 +00001896 name#" $vdata, $vaddr, $srsrc, $soffset addr64"#"$offset"#" glc"#"$slc",
Tom Stellard7980fc82014-09-25 18:30:26 +00001897 [(set vt:$vdata,
Tom Stellardc53861a2015-02-11 00:34:32 +00001898 (atomic (MUBUFAddr64Atomic v4i32:$srsrc, i64:$vaddr, i32:$soffset,
1899 i16:$offset, i1:$slc), vt:$vdata_in))], 1
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001900 >;
Tom Stellard7980fc82014-09-25 18:30:26 +00001901
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001902 defm _RTN_OFFSET : MUBUFAtomicOffset_m <
1903 op, name#"_rtn_offset", (outs rc:$vdata),
Tom Stellard49282c92015-02-27 14:59:44 +00001904 (ins rc:$vdata_in, SReg_128:$srsrc, SCSrc_32:$soffset,
1905 mbuf_offset:$offset, slc:$slc),
Tom Stellard7980fc82014-09-25 18:30:26 +00001906 name#" $vdata, $srsrc, $soffset"#"$offset"#" glc $slc",
1907 [(set vt:$vdata,
1908 (atomic (MUBUFOffsetAtomic v4i32:$srsrc, i32:$soffset, i16:$offset,
Marek Olsak19d9e1f2015-01-27 17:25:02 +00001909 i1:$slc), vt:$vdata_in))], 1
1910 >;
Tom Stellard7980fc82014-09-25 18:30:26 +00001911
1912 } // glc = 1
1913
1914 } // mayStore = 1, mayLoad = 1, hasPostISelHook = 1
1915}
1916
Marek Olsakee98b112015-01-27 17:24:58 +00001917multiclass MUBUF_Load_Helper <mubuf op, string name, RegisterClass regClass,
Tom Stellard7c1838d2014-07-02 20:53:56 +00001918 ValueType load_vt = i32,
1919 SDPatternOperator ld = null_frag> {
Tom Stellardf1ee7162013-05-20 15:02:31 +00001920
Tom Stellard3e41dc42014-12-09 00:03:54 +00001921 let mayLoad = 1, mayStore = 0 in {
Marek Olsak7ef6db42015-01-27 17:24:54 +00001922 let offen = 0, idxen = 0, vaddr = 0 in {
1923 defm _OFFSET : MUBUF_m <op, name#"_offset", (outs regClass:$vdata),
Tom Stellard49282c92015-02-27 14:59:44 +00001924 (ins SReg_128:$srsrc, SCSrc_32:$soffset,
1925 mbuf_offset:$offset, glc:$glc, slc:$slc, tfe:$tfe),
Marek Olsak7ef6db42015-01-27 17:24:54 +00001926 name#" $vdata, $srsrc, $soffset"#"$offset"#"$glc"#"$slc"#"$tfe",
1927 [(set load_vt:$vdata, (ld (MUBUFOffset v4i32:$srsrc,
1928 i32:$soffset, i16:$offset,
1929 i1:$glc, i1:$slc, i1:$tfe)))]>;
Michel Danzer13736222014-01-27 07:20:51 +00001930 }
1931
Marek Olsak7ef6db42015-01-27 17:24:54 +00001932 let offen = 1, idxen = 0 in {
1933 defm _OFFEN : MUBUF_m <op, name#"_offen", (outs regClass:$vdata),
Tom Stellardc229baa2015-03-10 16:16:49 +00001934 (ins VGPR_32:$vaddr, SReg_128:$srsrc,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001935 SCSrc_32:$soffset, mbuf_offset:$offset, glc:$glc, slc:$slc,
1936 tfe:$tfe),
1937 name#" $vdata, $vaddr, $srsrc, $soffset offen"#"$offset"#"$glc"#"$slc"#"$tfe", []>;
1938 }
1939
1940 let offen = 0, idxen = 1 in {
1941 defm _IDXEN : MUBUF_m <op, name#"_idxen", (outs regClass:$vdata),
Tom Stellardc229baa2015-03-10 16:16:49 +00001942 (ins VGPR_32:$vaddr, SReg_128:$srsrc,
Tom Stellard49282c92015-02-27 14:59:44 +00001943 SCSrc_32:$soffset, mbuf_offset:$offset, glc:$glc,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001944 slc:$slc, tfe:$tfe),
1945 name#" $vdata, $vaddr, $srsrc, $soffset idxen"#"$offset"#"$glc"#"$slc"#"$tfe", []>;
1946 }
1947
1948 let offen = 1, idxen = 1 in {
1949 defm _BOTHEN : MUBUF_m <op, name#"_bothen", (outs regClass:$vdata),
Tom Stellardc229baa2015-03-10 16:16:49 +00001950 (ins VReg_64:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset,
Tom Stellard49282c92015-02-27 14:59:44 +00001951 mbuf_offset:$offset, glc:$glc, slc:$slc, tfe:$tfe),
Matt Arsenaultcaa12882015-02-18 02:04:38 +00001952 name#" $vdata, $vaddr, $srsrc, $soffset idxen offen"#"$offset"#"$glc"#"$slc"#"$tfe", []>;
Marek Olsak7ef6db42015-01-27 17:24:54 +00001953 }
1954
Tom Stellard1f9939f2015-02-27 14:59:41 +00001955 let offen = 0, idxen = 0 in {
Marek Olsak7ef6db42015-01-27 17:24:54 +00001956 defm _ADDR64 : MUBUFAddr64_m <op, name#"_addr64", (outs regClass:$vdata),
Tom Stellardc229baa2015-03-10 16:16:49 +00001957 (ins VReg_64:$vaddr, SReg_128:$srsrc,
Tom Stellard1f9939f2015-02-27 14:59:41 +00001958 SCSrc_32:$soffset, mbuf_offset:$offset,
1959 glc:$glc, slc:$slc, tfe:$tfe),
1960 name#" $vdata, $vaddr, $srsrc, $soffset addr64"#"$offset"#
1961 "$glc"#"$slc"#"$tfe",
Tom Stellard7c1838d2014-07-02 20:53:56 +00001962 [(set load_vt:$vdata, (ld (MUBUFAddr64 v4i32:$srsrc,
Tom Stellardc53861a2015-02-11 00:34:32 +00001963 i64:$vaddr, i32:$soffset,
Tom Stellard1f9939f2015-02-27 14:59:41 +00001964 i16:$offset, i1:$glc, i1:$slc,
1965 i1:$tfe)))]>;
Michel Danzer13736222014-01-27 07:20:51 +00001966 }
Tom Stellardf1ee7162013-05-20 15:02:31 +00001967 }
Tom Stellard75aadc22012-12-11 21:25:42 +00001968}
1969
Marek Olsakee98b112015-01-27 17:24:58 +00001970multiclass MUBUF_Store_Helper <mubuf op, string name, RegisterClass vdataClass,
Tom Stellardaec94b32015-02-27 14:59:46 +00001971 ValueType store_vt = i32, SDPatternOperator st = null_frag> {
Tom Stellard42fb60e2015-01-14 15:42:31 +00001972 let mayLoad = 0, mayStore = 1 in {
Marek Olsak7ef6db42015-01-27 17:24:54 +00001973 defm : MUBUF_m <op, name, (outs),
Tom Stellardc229baa2015-03-10 16:16:49 +00001974 (ins vdataClass:$vdata, VGPR_32:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset,
Marek Olsak7ef6db42015-01-27 17:24:54 +00001975 mbuf_offset:$offset, offen:$offen, idxen:$idxen, glc:$glc, slc:$slc,
1976 tfe:$tfe),
1977 name#" $vdata, $vaddr, $srsrc, $soffset"#"$offen"#"$idxen"#"$offset"#
Tom Stellard1f9939f2015-02-27 14:59:41 +00001978 "$glc"#"$slc"#"$tfe", []>;
Tom Stellardddea4862014-08-11 22:18:14 +00001979
Tom Stellard155bbb72014-08-11 22:18:17 +00001980 let offen = 0, idxen = 0, vaddr = 0 in {
Marek Olsak7ef6db42015-01-27 17:24:54 +00001981 defm _OFFSET : MUBUF_m <op, name#"_offset",(outs),
Tom Stellard49282c92015-02-27 14:59:44 +00001982 (ins vdataClass:$vdata, SReg_128:$srsrc, SCSrc_32:$soffset,
1983 mbuf_offset:$offset, glc:$glc, slc:$slc, tfe:$tfe),
Marek Olsak7ef6db42015-01-27 17:24:54 +00001984 name#" $vdata, $srsrc, $soffset"#"$offset"#"$glc"#"$slc"#"$tfe",
1985 [(st store_vt:$vdata, (MUBUFOffset v4i32:$srsrc, i32:$soffset,
1986 i16:$offset, i1:$glc, i1:$slc, i1:$tfe))]>;
Tom Stellard155bbb72014-08-11 22:18:17 +00001987 } // offen = 0, idxen = 0, vaddr = 0
1988
Tom Stellardddea4862014-08-11 22:18:14 +00001989 let offen = 1, idxen = 0 in {
Marek Olsak7ef6db42015-01-27 17:24:54 +00001990 defm _OFFEN : MUBUF_m <op, name#"_offen", (outs),
Tom Stellardc229baa2015-03-10 16:16:49 +00001991 (ins vdataClass:$vdata, VGPR_32:$vaddr, SReg_128:$srsrc,
Tom Stellard49282c92015-02-27 14:59:44 +00001992 SCSrc_32:$soffset, mbuf_offset:$offset, glc:$glc,
1993 slc:$slc, tfe:$tfe),
Marek Olsak7ef6db42015-01-27 17:24:54 +00001994 name#" $vdata, $vaddr, $srsrc, $soffset offen"#"$offset"#
1995 "$glc"#"$slc"#"$tfe", []>;
Tom Stellardddea4862014-08-11 22:18:14 +00001996 } // end offen = 1, idxen = 0
1997
Tom Stellarda14b0112015-03-10 16:16:51 +00001998 let offen = 0, idxen = 1 in {
1999 defm _IDXEN : MUBUF_m <op, name#"_idxen", (outs),
2000 (ins vdataClass:$vdata, VGPR_32:$vaddr, SReg_128:$srsrc,
2001 SCSrc_32:$soffset, mbuf_offset:$offset, glc:$glc,
2002 slc:$slc, tfe:$tfe),
2003 name#" $vdata, $vaddr, $srsrc, $soffset idxen"#"$offset"#"$glc"#"$slc"#"$tfe", []>;
2004 }
2005
2006 let offen = 1, idxen = 1 in {
2007 defm _BOTHEN : MUBUF_m <op, name#"_bothen", (outs),
2008 (ins vdataClass:$vdata, VReg_64:$vaddr, SReg_128:$srsrc, SCSrc_32:$soffset,
2009 mbuf_offset:$offset, glc:$glc, slc:$slc, tfe:$tfe),
2010 name#" $vdata, $vaddr, $srsrc, $soffset idxen offen"#"$offset"#"$glc"#"$slc"#"$tfe", []>;
2011 }
2012
Tom Stellard1f9939f2015-02-27 14:59:41 +00002013 let offen = 0, idxen = 0 in {
Marek Olsak7ef6db42015-01-27 17:24:54 +00002014 defm _ADDR64 : MUBUFAddr64_m <op, name#"_addr64", (outs),
Tom Stellardc229baa2015-03-10 16:16:49 +00002015 (ins vdataClass:$vdata, VReg_64:$vaddr, SReg_128:$srsrc,
2016 SCSrc_32:$soffset,
Tom Stellard1f9939f2015-02-27 14:59:41 +00002017 mbuf_offset:$offset, glc:$glc, slc:$slc,
2018 tfe:$tfe),
2019 name#" $vdata, $vaddr, $srsrc, $soffset addr64"#
2020 "$offset"#"$glc"#"$slc"#"$tfe",
Marek Olsak7ef6db42015-01-27 17:24:54 +00002021 [(st store_vt:$vdata,
Tom Stellardc53861a2015-02-11 00:34:32 +00002022 (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr,
Tom Stellard1f9939f2015-02-27 14:59:41 +00002023 i32:$soffset, i16:$offset,
2024 i1:$glc, i1:$slc, i1:$tfe))]>;
Marek Olsak7ef6db42015-01-27 17:24:54 +00002025 }
2026 } // End mayLoad = 0, mayStore = 1
Tom Stellard754f80f2013-04-05 23:31:51 +00002027}
2028
Matt Arsenault3f981402014-09-15 15:41:53 +00002029class FLAT_Load_Helper <bits<7> op, string asm, RegisterClass regClass> :
Matt Arsenaulte6c52412015-02-18 02:10:37 +00002030 FLAT <op, (outs regClass:$vdst),
Matt Arsenault3f981402014-09-15 15:41:53 +00002031 (ins VReg_64:$addr),
Matt Arsenaulte6c52412015-02-18 02:10:37 +00002032 asm#" $vdst, $addr, [M0, FLAT_SCRATCH]", []> {
Matt Arsenault3f981402014-09-15 15:41:53 +00002033 let glc = 0;
2034 let slc = 0;
2035 let tfe = 0;
Matt Arsenaulte6c52412015-02-18 02:10:37 +00002036 let data = 0;
Matt Arsenault3f981402014-09-15 15:41:53 +00002037 let mayLoad = 1;
2038}
2039
2040class FLAT_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
2041 FLAT <op, (outs), (ins vdataClass:$data, VReg_64:$addr),
2042 name#" $data, $addr, [M0, FLAT_SCRATCH]",
2043 []> {
2044
2045 let mayLoad = 0;
2046 let mayStore = 1;
2047
2048 // Encoding
2049 let glc = 0;
2050 let slc = 0;
2051 let tfe = 0;
Matt Arsenaulte6c52412015-02-18 02:10:37 +00002052 let vdst = 0;
Matt Arsenault3f981402014-09-15 15:41:53 +00002053}
2054
Tom Stellard682bfbc2013-10-10 17:11:24 +00002055class MIMG_Mask <string op, int channels> {
2056 string Op = op;
2057 int Channels = channels;
2058}
2059
Tom Stellard16a9a202013-08-14 23:24:17 +00002060class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002061 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +00002062 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +00002063 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002064 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +00002065 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +00002066 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +00002067 SReg_256:$srsrc),
2068 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
2069 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
2070 []> {
Matt Arsenaulte3dbcf62015-02-18 02:15:35 +00002071 let ssamp = 0;
Tom Stellard353b3362013-05-06 23:02:12 +00002072 let mayLoad = 1;
2073 let mayStore = 0;
2074 let hasPostISelHook = 1;
2075}
2076
Tom Stellard682bfbc2013-10-10 17:11:24 +00002077multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
2078 RegisterClass dst_rc,
2079 int channels> {
Tom Stellard45c0b3a2015-01-07 20:59:25 +00002080 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VGPR_32>,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002081 MIMG_Mask<asm#"_V1", channels>;
2082 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
2083 MIMG_Mask<asm#"_V2", channels>;
2084 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
2085 MIMG_Mask<asm#"_V4", channels>;
2086}
2087
Tom Stellard16a9a202013-08-14 23:24:17 +00002088multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard45c0b3a2015-01-07 20:59:25 +00002089 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VGPR_32, 1>;
Tom Stellard682bfbc2013-10-10 17:11:24 +00002090 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
2091 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
2092 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +00002093}
2094
2095class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002096 RegisterClass dst_rc,
Michel Danzer494391b2015-02-06 02:51:20 +00002097 RegisterClass src_rc, int wqm> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +00002098 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002099 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +00002100 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +00002101 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +00002102 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +00002103 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
2104 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +00002105 []> {
2106 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +00002107 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +00002108 let hasPostISelHook = 1;
Michel Danzer494391b2015-02-06 02:51:20 +00002109 let WQM = wqm;
Tom Stellard75aadc22012-12-11 21:25:42 +00002110}
2111
Tom Stellard682bfbc2013-10-10 17:11:24 +00002112multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
2113 RegisterClass dst_rc,
Michel Danzer494391b2015-02-06 02:51:20 +00002114 int channels, int wqm> {
2115 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VGPR_32, wqm>,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002116 MIMG_Mask<asm#"_V1", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002117 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64, wqm>,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002118 MIMG_Mask<asm#"_V2", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002119 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128, wqm>,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002120 MIMG_Mask<asm#"_V4", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002121 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256, wqm>,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002122 MIMG_Mask<asm#"_V8", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002123 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512, wqm>,
Tom Stellard682bfbc2013-10-10 17:11:24 +00002124 MIMG_Mask<asm#"_V16", channels>;
2125}
2126
Tom Stellard16a9a202013-08-14 23:24:17 +00002127multiclass MIMG_Sampler <bits<7> op, string asm> {
Michel Danzer494391b2015-02-06 02:51:20 +00002128 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VGPR_32, 1, 0>;
2129 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2, 0>;
2130 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3, 0>;
2131 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4, 0>;
2132}
2133
2134multiclass MIMG_Sampler_WQM <bits<7> op, string asm> {
2135 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VGPR_32, 1, 1>;
2136 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2, 1>;
2137 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3, 1>;
2138 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4, 1>;
Tom Stellard16a9a202013-08-14 23:24:17 +00002139}
2140
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002141class MIMG_Gather_Helper <bits<7> op, string asm,
2142 RegisterClass dst_rc,
Michel Danzer494391b2015-02-06 02:51:20 +00002143 RegisterClass src_rc, int wqm> : MIMG <
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002144 op,
2145 (outs dst_rc:$vdata),
2146 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
2147 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
2148 SReg_256:$srsrc, SReg_128:$ssamp),
2149 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
2150 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
2151 []> {
2152 let mayLoad = 1;
2153 let mayStore = 0;
2154
2155 // DMASK was repurposed for GATHER4. 4 components are always
2156 // returned and DMASK works like a swizzle - it selects
2157 // the component to fetch. The only useful DMASK values are
2158 // 1=red, 2=green, 4=blue, 8=alpha. (e.g. 1 returns
2159 // (red,red,red,red) etc.) The ISA document doesn't mention
2160 // this.
2161 // Therefore, disable all code which updates DMASK by setting these two:
2162 let MIMG = 0;
2163 let hasPostISelHook = 0;
Michel Danzer494391b2015-02-06 02:51:20 +00002164 let WQM = wqm;
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002165}
2166
2167multiclass MIMG_Gather_Src_Helper <bits<7> op, string asm,
2168 RegisterClass dst_rc,
Michel Danzer494391b2015-02-06 02:51:20 +00002169 int channels, int wqm> {
2170 def _V1 : MIMG_Gather_Helper <op, asm, dst_rc, VGPR_32, wqm>,
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002171 MIMG_Mask<asm#"_V1", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002172 def _V2 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_64, wqm>,
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002173 MIMG_Mask<asm#"_V2", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002174 def _V4 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_128, wqm>,
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002175 MIMG_Mask<asm#"_V4", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002176 def _V8 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_256, wqm>,
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002177 MIMG_Mask<asm#"_V8", channels>;
Michel Danzer494391b2015-02-06 02:51:20 +00002178 def _V16 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_512, wqm>,
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002179 MIMG_Mask<asm#"_V16", channels>;
2180}
2181
2182multiclass MIMG_Gather <bits<7> op, string asm> {
Michel Danzer494391b2015-02-06 02:51:20 +00002183 defm _V1 : MIMG_Gather_Src_Helper<op, asm, VGPR_32, 1, 0>;
2184 defm _V2 : MIMG_Gather_Src_Helper<op, asm, VReg_64, 2, 0>;
2185 defm _V3 : MIMG_Gather_Src_Helper<op, asm, VReg_96, 3, 0>;
2186 defm _V4 : MIMG_Gather_Src_Helper<op, asm, VReg_128, 4, 0>;
2187}
2188
2189multiclass MIMG_Gather_WQM <bits<7> op, string asm> {
2190 defm _V1 : MIMG_Gather_Src_Helper<op, asm, VGPR_32, 1, 1>;
2191 defm _V2 : MIMG_Gather_Src_Helper<op, asm, VReg_64, 2, 1>;
2192 defm _V3 : MIMG_Gather_Src_Helper<op, asm, VReg_96, 3, 1>;
2193 defm _V4 : MIMG_Gather_Src_Helper<op, asm, VReg_128, 4, 1>;
Marek Olsak51b8e7b2014-06-18 22:00:29 +00002194}
2195
Christian Konigf741fbf2013-02-26 17:52:42 +00002196//===----------------------------------------------------------------------===//
2197// Vector instruction mappings
2198//===----------------------------------------------------------------------===//
2199
2200// Maps an opcode in e32 form to its e64 equivalent
2201def getVOPe64 : InstrMapping {
2202 let FilterClass = "VOP";
2203 let RowFields = ["OpName"];
2204 let ColFields = ["Size"];
2205 let KeyCol = ["4"];
2206 let ValueCols = [["8"]];
2207}
2208
Tom Stellard1aaad692014-07-21 16:55:33 +00002209// Maps an opcode in e64 form to its e32 equivalent
2210def getVOPe32 : InstrMapping {
2211 let FilterClass = "VOP";
2212 let RowFields = ["OpName"];
2213 let ColFields = ["Size"];
2214 let KeyCol = ["8"];
2215 let ValueCols = [["4"]];
2216}
2217
Tom Stellard682bfbc2013-10-10 17:11:24 +00002218def getMaskedMIMGOp : InstrMapping {
2219 let FilterClass = "MIMG_Mask";
2220 let RowFields = ["Op"];
2221 let ColFields = ["Channels"];
2222 let KeyCol = ["4"];
2223 let ValueCols = [["1"], ["2"], ["3"] ];
2224}
2225
Christian Konig3c145802013-03-27 09:12:59 +00002226// Maps an commuted opcode to its original version
2227def getCommuteOrig : InstrMapping {
2228 let FilterClass = "VOP2_REV";
2229 let RowFields = ["RevOp"];
2230 let ColFields = ["IsOrig"];
2231 let KeyCol = ["0"];
2232 let ValueCols = [["1"]];
2233}
2234
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00002235// Maps an original opcode to its commuted version
2236def getCommuteRev : InstrMapping {
2237 let FilterClass = "VOP2_REV";
2238 let RowFields = ["RevOp"];
2239 let ColFields = ["IsOrig"];
2240 let KeyCol = ["1"];
2241 let ValueCols = [["0"]];
2242}
2243
2244def getCommuteCmpOrig : InstrMapping {
Matt Arsenault88a13c62015-03-23 18:45:41 +00002245 let FilterClass = "VOP2_REV";
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00002246 let RowFields = ["RevOp"];
2247 let ColFields = ["IsOrig"];
2248 let KeyCol = ["0"];
2249 let ValueCols = [["1"]];
2250}
2251
2252// Maps an original opcode to its commuted version
2253def getCommuteCmpRev : InstrMapping {
Matt Arsenault88a13c62015-03-23 18:45:41 +00002254 let FilterClass = "VOP2_REV";
Matt Arsenaultf5b2cd82015-03-23 18:45:30 +00002255 let RowFields = ["RevOp"];
2256 let ColFields = ["IsOrig"];
2257 let KeyCol = ["1"];
2258 let ValueCols = [["0"]];
2259}
2260
2261
Marek Olsak5df00d62014-12-07 12:18:57 +00002262def getMCOpcodeGen : InstrMapping {
Tom Stellardc721a232014-05-16 20:56:47 +00002263 let FilterClass = "SIMCInstr";
2264 let RowFields = ["PseudoInstr"];
2265 let ColFields = ["Subtarget"];
2266 let KeyCol = [!cast<string>(SISubtarget.NONE)];
Marek Olsak5df00d62014-12-07 12:18:57 +00002267 let ValueCols = [[!cast<string>(SISubtarget.SI)],[!cast<string>(SISubtarget.VI)]];
Tom Stellardc721a232014-05-16 20:56:47 +00002268}
2269
Tom Stellard155bbb72014-08-11 22:18:17 +00002270def getAddr64Inst : InstrMapping {
2271 let FilterClass = "MUBUFAddr64Table";
Tom Stellard7980fc82014-09-25 18:30:26 +00002272 let RowFields = ["OpName"];
Tom Stellard155bbb72014-08-11 22:18:17 +00002273 let ColFields = ["IsAddr64"];
2274 let KeyCol = ["0"];
2275 let ValueCols = [["1"]];
2276}
2277
Matt Arsenault9903ccf2014-09-08 15:07:27 +00002278// Maps an atomic opcode to its version with a return value.
2279def getAtomicRetOp : InstrMapping {
2280 let FilterClass = "AtomicNoRet";
2281 let RowFields = ["NoRetOp"];
2282 let ColFields = ["IsRet"];
2283 let KeyCol = ["0"];
2284 let ValueCols = [["1"]];
2285}
2286
2287// Maps an atomic opcode to its returnless version.
2288def getAtomicNoRetOp : InstrMapping {
2289 let FilterClass = "AtomicNoRet";
2290 let RowFields = ["NoRetOp"];
2291 let ColFields = ["IsRet"];
2292 let KeyCol = ["1"];
2293 let ValueCols = [["0"]];
2294}
2295
Tom Stellard75aadc22012-12-11 21:25:42 +00002296include "SIInstructions.td"
Marek Olsak5df00d62014-12-07 12:18:57 +00002297include "CIInstructions.td"
2298include "VIInstructions.td"