blob: 61769f3dd7a568da76c1d9e9af274d797a595a4e [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 Stellardc721a232014-05-16 20:56:47 +000010// Execpt for the NONE field, this must be kept in sync with the SISubtarget enum
11// in AMDGPUMCInstLower.h
12def SISubtarget {
13 int NONE = -1;
14 int SI = 0;
15}
16
Tom Stellard75aadc22012-12-11 21:25:42 +000017//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +000018// SI DAG Nodes
19//===----------------------------------------------------------------------===//
20
Tom Stellard9fa17912013-08-14 23:24:45 +000021def SIload_constant : SDNode<"AMDGPUISD::LOAD_CONSTANT",
Tom Stellard868fd922014-04-17 21:00:11 +000022 SDTypeProfile<1, 2, [SDTCisVT<0, f32>, SDTCisVT<1, v4i32>, SDTCisVT<2, i32>]>,
Tom Stellard9fa17912013-08-14 23:24:45 +000023 [SDNPMayLoad, SDNPMemOperand]
24>;
25
Tom Stellardafcf12f2013-09-12 02:55:14 +000026def SItbuffer_store : SDNode<"AMDGPUISD::TBUFFER_STORE_FORMAT",
27 SDTypeProfile<0, 13,
Tom Stellard868fd922014-04-17 21:00:11 +000028 [SDTCisVT<0, v4i32>, // rsrc(SGPR)
Tom Stellardafcf12f2013-09-12 02:55:14 +000029 SDTCisVT<1, iAny>, // vdata(VGPR)
30 SDTCisVT<2, i32>, // num_channels(imm)
31 SDTCisVT<3, i32>, // vaddr(VGPR)
32 SDTCisVT<4, i32>, // soffset(SGPR)
33 SDTCisVT<5, i32>, // inst_offset(imm)
34 SDTCisVT<6, i32>, // dfmt(imm)
35 SDTCisVT<7, i32>, // nfmt(imm)
36 SDTCisVT<8, i32>, // offen(imm)
37 SDTCisVT<9, i32>, // idxen(imm)
38 SDTCisVT<10, i32>, // glc(imm)
39 SDTCisVT<11, i32>, // slc(imm)
40 SDTCisVT<12, i32> // tfe(imm)
41 ]>,
42 [SDNPMayStore, SDNPMemOperand, SDNPHasChain]
43>;
44
Tom Stellard9fa17912013-08-14 23:24:45 +000045def SIload_input : SDNode<"AMDGPUISD::LOAD_INPUT",
Tom Stellard868fd922014-04-17 21:00:11 +000046 SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisVT<1, v4i32>, SDTCisVT<2, i16>,
Tom Stellard9fa17912013-08-14 23:24:45 +000047 SDTCisVT<3, i32>]>
48>;
49
50class SDSample<string opcode> : SDNode <opcode,
Tom Stellard67850652013-08-14 23:24:53 +000051 SDTypeProfile<1, 4, [SDTCisVT<0, v4f32>, SDTCisVT<2, v32i8>,
Tom Stellard868fd922014-04-17 21:00:11 +000052 SDTCisVT<3, v4i32>, SDTCisVT<4, i32>]>
Tom Stellard9fa17912013-08-14 23:24:45 +000053>;
54
55def SIsample : SDSample<"AMDGPUISD::SAMPLE">;
56def SIsampleb : SDSample<"AMDGPUISD::SAMPLEB">;
57def SIsampled : SDSample<"AMDGPUISD::SAMPLED">;
58def SIsamplel : SDSample<"AMDGPUISD::SAMPLEL">;
59
Tom Stellard26075d52013-02-07 19:39:38 +000060// Transformation function, extract the lower 32bit of a 64bit immediate
61def LO32 : SDNodeXForm<imm, [{
62 return CurDAG->getTargetConstant(N->getZExtValue() & 0xffffffff, MVT::i32);
63}]>;
64
Tom Stellardab8a8c82013-07-12 18:15:02 +000065def LO32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000066 APInt V = N->getValueAPF().bitcastToAPInt().trunc(32);
67 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000068}]>;
69
Tom Stellard26075d52013-02-07 19:39:38 +000070// Transformation function, extract the upper 32bit of a 64bit immediate
71def HI32 : SDNodeXForm<imm, [{
72 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
73}]>;
74
Tom Stellardab8a8c82013-07-12 18:15:02 +000075def HI32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000076 APInt V = N->getValueAPF().bitcastToAPInt().lshr(32).trunc(32);
77 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000078}]>;
79
Tom Stellard044e4182014-02-06 18:36:34 +000080def IMM8bitDWORD : PatLeaf <(imm),
81 [{return (N->getZExtValue() & ~0x3FC) == 0;}]
Tom Stellard89093802013-02-07 19:39:40 +000082>;
83
Tom Stellard044e4182014-02-06 18:36:34 +000084def as_dword_i32imm : SDNodeXForm<imm, [{
85 return CurDAG->getTargetConstant(N->getZExtValue() >> 2, MVT::i32);
86}]>;
87
Tom Stellardafcf12f2013-09-12 02:55:14 +000088def as_i1imm : SDNodeXForm<imm, [{
89 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i1);
90}]>;
91
92def as_i8imm : SDNodeXForm<imm, [{
93 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i8);
94}]>;
95
Tom Stellard07a10a32013-06-03 17:39:43 +000096def as_i16imm : SDNodeXForm<imm, [{
97 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
98}]>;
99
Tom Stellard044e4182014-02-06 18:36:34 +0000100def as_i32imm: SDNodeXForm<imm, [{
101 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i32);
102}]>;
103
Matt Arsenault99ed7892014-03-19 22:19:49 +0000104def IMM8bit : PatLeaf <(imm),
105 [{return isUInt<8>(N->getZExtValue());}]
106>;
107
Tom Stellard07a10a32013-06-03 17:39:43 +0000108def IMM12bit : PatLeaf <(imm),
109 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +0000110>;
111
Matt Arsenault99ed7892014-03-19 22:19:49 +0000112def IMM16bit : PatLeaf <(imm),
113 [{return isUInt<16>(N->getZExtValue());}]
114>;
115
Tom Stellardd6cb8e82014-05-09 16:42:21 +0000116def IMM32bit : PatLeaf <(imm),
117 [{return isUInt<32>(N->getZExtValue());}]
118>;
119
Tom Stellarde2367942014-02-06 18:36:41 +0000120def mubuf_vaddr_offset : PatFrag<
121 (ops node:$ptr, node:$offset, node:$imm_offset),
122 (add (add node:$ptr, node:$offset), node:$imm_offset)
123>;
124
Christian Konigf82901a2013-02-26 17:52:23 +0000125class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Tom Stellard7ed0b522014-04-03 20:19:27 +0000126 return isInlineImmediate(N);
Christian Konigb559b072013-02-16 11:28:36 +0000127}]>;
128
Tom Stellarddf94dc32013-08-14 23:24:24 +0000129class SGPRImm <dag frag> : PatLeaf<frag, [{
130 if (TM.getSubtarget<AMDGPUSubtarget>().getGeneration() <
131 AMDGPUSubtarget::SOUTHERN_ISLANDS) {
132 return false;
133 }
134 const SIRegisterInfo *SIRI =
135 static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
136 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
137 U != E; ++U) {
138 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
139 return true;
140 }
141 }
142 return false;
143}]>;
144
Matt Arsenaulta98cd6a2013-12-19 05:32:55 +0000145def FRAMEri32 : Operand<iPTR> {
Matt Arsenault06028dd2014-05-01 16:37:52 +0000146 let MIOperandInfo = (ops i32:$ptr, i32imm:$index);
Tom Stellard81d871d2013-11-13 23:36:50 +0000147}
148
Christian Konig72d5d5c2013-02-21 15:16:44 +0000149//===----------------------------------------------------------------------===//
150// SI assembler operands
151//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000152
Christian Konigeabf8332013-02-21 15:16:49 +0000153def SIOperand {
154 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000155 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +0000156}
157
Christian Konig72d5d5c2013-02-21 15:16:44 +0000158include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +0000159
Christian Konig72d5d5c2013-02-21 15:16:44 +0000160//===----------------------------------------------------------------------===//
161//
162// SI Instruction multiclass helpers.
163//
164// Instructions with _32 take 32-bit operands.
165// Instructions with _64 take 64-bit operands.
166//
167// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
168// encoding is the standard encoding, but instruction that make use of
169// any of the instruction modifiers must use the 64-bit encoding.
170//
171// Instructions with _e32 use the 32-bit encoding.
172// Instructions with _e64 use the 64-bit encoding.
173//
174//===----------------------------------------------------------------------===//
175
176//===----------------------------------------------------------------------===//
177// Scalar classes
178//===----------------------------------------------------------------------===//
179
Christian Konige0130a22013-02-21 15:17:13 +0000180class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
181 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
182 opName#" $dst, $src0", pattern
183>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000184
Christian Konige0130a22013-02-21 15:17:13 +0000185class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
186 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
187 opName#" $dst, $src0", pattern
188>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000189
Matt Arsenault8333e432014-06-10 19:18:24 +0000190// 64-bit input, 32-bit output.
191class SOP1_32_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
192 op, (outs SReg_32:$dst), (ins SSrc_64:$src0),
193 opName#" $dst, $src0", pattern
194>;
195
Christian Konige0130a22013-02-21 15:17:13 +0000196class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
197 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
198 opName#" $dst, $src0, $src1", pattern
199>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000200
Christian Konige0130a22013-02-21 15:17:13 +0000201class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
202 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
203 opName#" $dst, $src0, $src1", pattern
204>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000205
Tom Stellard82166022013-11-13 23:36:37 +0000206class SOP2_SHIFT_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
207 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_32:$src1),
208 opName#" $dst, $src0, $src1", pattern
209>;
210
Christian Konig72d5d5c2013-02-21 15:16:44 +0000211
Matt Arsenault0cb92e12014-04-11 19:25:18 +0000212class SOPC_Helper <bits<7> op, RegisterClass rc, ValueType vt,
213 string opName, PatLeaf cond> : SOPC <
214 op, (outs SCCReg:$dst), (ins rc:$src0, rc:$src1),
215 opName#" $dst, $src0, $src1", []>;
216
217class SOPC_32<bits<7> op, string opName, PatLeaf cond = COND_NULL>
218 : SOPC_Helper<op, SSrc_32, i32, opName, cond>;
219
220class SOPC_64<bits<7> op, string opName, PatLeaf cond = COND_NULL>
221 : SOPC_Helper<op, SSrc_64, i64, opName, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000222
Christian Konige0130a22013-02-21 15:17:13 +0000223class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
224 op, (outs SReg_32:$dst), (ins i16imm:$src0),
225 opName#" $dst, $src0", pattern
226>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000227
Christian Konige0130a22013-02-21 15:17:13 +0000228class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
229 op, (outs SReg_64:$dst), (ins i16imm:$src0),
230 opName#" $dst, $src0", pattern
231>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000232
Christian Konig9c7afd12013-03-18 11:33:50 +0000233multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
234 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000235 def _IMM : SMRD <
236 op, 1, (outs dstClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000237 (ins baseClass:$sbase, u32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000238 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000239 >;
240
241 def _SGPR : SMRD <
242 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000243 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000244 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000245 >;
246}
247
248//===----------------------------------------------------------------------===//
249// Vector ALU classes
250//===----------------------------------------------------------------------===//
251
Christian Konigf741fbf2013-02-26 17:52:42 +0000252class VOP <string opName> {
253 string OpName = opName;
254}
255
Christian Konig3c145802013-03-27 09:12:59 +0000256class VOP2_REV <string revOp, bit isOrig> {
257 string RevOp = revOp;
258 bit IsOrig = isOrig;
259}
260
Tom Stellardc721a232014-05-16 20:56:47 +0000261class SIMCInstr <string pseudo, int subtarget> {
262 string PseudoInstr = pseudo;
263 int Subtarget = subtarget;
264}
265
266multiclass VOP3_m <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern,
267 string opName> {
268
269 def "" : InstSI <outs, ins, "", pattern>, VOP <opName>,
270 SIMCInstr<OpName, SISubtarget.NONE> {
271 let isPseudo = 1;
272 }
273
274 def _si : VOP3 <op, outs, ins, asm, []>, SIMCInstr<opName, SISubtarget.SI>;
275
276}
277
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000278// This must always be right before the operand being input modified.
279def InputMods : OperandWithDefaultOps <i32, (ops (i32 0))> {
280 let PrintMethod = "printOperandAndMods";
281}
282
Christian Konig3da70172013-02-21 15:16:53 +0000283multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
284 string opName, list<dag> pattern> {
285
Christian Konigf741fbf2013-02-26 17:52:42 +0000286 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000287 op, (outs drc:$dst), (ins src:$src0),
288 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000289 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000290
Christian Konig3da70172013-02-21 15:16:53 +0000291 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000292 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000293 (outs drc:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000294 (ins InputMods:$src0_modifiers, src:$src0, i32imm:$clamp, i32imm:$omod),
295 opName#"_e64 $dst, $src0_modifiers, $clamp, $omod", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000296 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000297 let src1 = SIOperand.ZERO;
298 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000299 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000300}
301
Christian Konig3da70172013-02-21 15:16:53 +0000302multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
303 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
304
305multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
306 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
307
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000308multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
309 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
310
311multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
312 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
313
Christian Konigae034e62013-02-21 15:16:58 +0000314multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000315 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000316 def _e32 : VOP2 <
317 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
318 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000319 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000320
Christian Konigae034e62013-02-21 15:16:58 +0000321 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000322 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000323 (outs vrc:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000324 (ins InputMods:$src0_modifiers, arc:$src0,
325 InputMods:$src1_modifiers, arc:$src1,
326 i32imm:$clamp, i32imm:$omod),
327 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod", []
Christian Konig3c145802013-03-27 09:12:59 +0000328 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000329 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000330 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000331}
332
Christian Konig3c145802013-03-27 09:12:59 +0000333multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
334 string revOp = opName>
335 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000336
Christian Konig3c145802013-03-27 09:12:59 +0000337multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
338 string revOp = opName>
339 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000340
Christian Konig3c145802013-03-27 09:12:59 +0000341multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
Tom Stellarde28859f2014-03-07 20:12:39 +0000342 RegisterClass src0_rc, string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000343
344 def _e32 : VOP2 <
Tom Stellarde28859f2014-03-07 20:12:39 +0000345 op, (outs VReg_32:$dst), (ins src0_rc:$src0, VReg_32:$src1),
Christian Konigd3039962013-02-26 17:52:09 +0000346 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000347 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000348
349 def _e64 : VOP3b <
350 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
351 (outs VReg_32:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000352 (ins InputMods: $src0_modifiers, VSrc_32:$src0,
353 InputMods:$src1_modifiers, VSrc_32:$src1,
354 i32imm:$clamp, i32imm:$omod),
355 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod", []
Christian Konig3c145802013-03-27 09:12:59 +0000356 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000357 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000358 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
359 can write it into any SGPR. We currently don't use the carry out,
360 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000361 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000362 }
363}
364
Christian Konig72d5d5c2013-02-21 15:16:44 +0000365multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000366 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000367
Christian Konigb19849a2013-02-21 15:17:04 +0000368 def _e32 : VOPC <
369 op, (ins arc:$src0, vrc:$src1),
370 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000371 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000372
Christian Konig72d5d5c2013-02-21 15:16:44 +0000373 def _e64 : VOP3 <
374 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
375 (outs SReg_64:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000376 (ins InputMods:$src0_modifiers, arc:$src0,
377 InputMods:$src1_modifiers, arc:$src1,
378 InstFlag:$clamp, InstFlag:$omod),
379 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod",
Christian Konigb19849a2013-02-21 15:17:04 +0000380 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000381 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000382 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000383 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000384 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000385 let src2_modifiers = 0;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000386 }
387}
388
Christian Konigb19849a2013-02-21 15:17:04 +0000389multiclass VOPC_32 <bits<8> op, string opName,
390 ValueType vt = untyped, PatLeaf cond = COND_NULL>
391 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000392
Christian Konigb19849a2013-02-21 15:17:04 +0000393multiclass VOPC_64 <bits<8> op, string opName,
394 ValueType vt = untyped, PatLeaf cond = COND_NULL>
395 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000396
Tom Stellardc721a232014-05-16 20:56:47 +0000397multiclass VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3_m <
Christian Konigf5754a02013-02-21 15:17:09 +0000398 op, (outs VReg_32:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000399 (ins InputMods: $src0_modifiers, VSrc_32:$src0, InputMods:$src1_modifiers,
400 VSrc_32:$src1, InputMods:$src2_modifiers, VSrc_32:$src2,
401 InstFlag:$clamp, InstFlag:$omod),
Tom Stellardc721a232014-05-16 20:56:47 +0000402 opName#" $dst, $src0_modifiers, $src1, $src2, $clamp, $omod", pattern, opName
403>;
Christian Konigf5754a02013-02-21 15:17:09 +0000404
Matt Arsenault93840c02014-06-09 17:00:46 +0000405class VOP3_64_32 <bits <9> op, string opName, list<dag> pattern> : VOP3 <
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000406 op, (outs VReg_64:$dst),
407 (ins VSrc_64:$src0, VSrc_32:$src1),
408 opName#" $dst, $src0, $src1", pattern
409>, VOP <opName> {
410
411 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000412 let src0_modifiers = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000413 let clamp = 0;
414 let omod = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000415}
416
Christian Konigf5754a02013-02-21 15:17:09 +0000417class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
418 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000419 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000420 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000421 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000422>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000423
Christian Konig72d5d5c2013-02-21 15:16:44 +0000424//===----------------------------------------------------------------------===//
425// Vector I/O classes
426//===----------------------------------------------------------------------===//
427
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000428class DS_1A <bits<8> op, dag outs, dag ins, string asm, list<dag> pat> :
429 DS <op, outs, ins, asm, pat> {
430 bits<16> offset;
431
Matt Arsenault99ed7892014-03-19 22:19:49 +0000432 // Single load interpret the 2 i8imm operands as a single i16 offset.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000433 let offset0 = offset{7-0};
434 let offset1 = offset{15-8};
435}
436
437class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000438 op,
439 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000440 (ins i1imm:$gds, VReg_32:$addr, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000441 asm#" $vdst, $addr, $offset, [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000442 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000443 let data0 = 0;
444 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000445 let mayLoad = 1;
446 let mayStore = 0;
447}
448
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000449class DS_Load2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
450 op,
451 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000452 (ins i1imm:$gds, VReg_32:$addr, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000453 asm#" $gds, $vdst, $addr, $offset0, $offset1, [M0]",
454 []> {
455 let data0 = 0;
456 let data1 = 0;
457 let mayLoad = 1;
458 let mayStore = 0;
459}
460
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000461class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000462 op,
463 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000464 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000465 asm#" $addr, $data0, $offset [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000466 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000467 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000468 let mayStore = 1;
469 let mayLoad = 0;
470 let vdst = 0;
471}
472
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000473class DS_Store2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
474 op,
475 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000476 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000477 asm#" $addr, $data0, $data1, $offset0, $offset1 [M0]",
478 []> {
479 let mayStore = 1;
480 let mayLoad = 0;
481 let vdst = 0;
482}
483
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000484// 1 address, 1 data.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000485class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
Tom Stellard13c68ef2013-09-05 18:38:09 +0000486 op,
487 (outs rc:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000488 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000489 asm#" $vdst, $addr, $data0, $offset, [M0]",
Tom Stellard13c68ef2013-09-05 18:38:09 +0000490 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000491
492 let data1 = 0;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000493 let mayStore = 1;
494 let mayLoad = 1;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000495}
496
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000497// 1 address, 0 data.
498class DS_1A0D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
499 op,
500 (outs rc:$vdst),
501 (ins i1imm:$gds, VReg_32:$addr, u16imm:$offset),
502 asm#" $vdst, $addr, $offset, [M0]",
503 []> {
504 let data0 = 0;
505 let data1 = 0;
506 let mayStore = 1;
507 let mayLoad = 1;
508}
509
510// 1 address, 0 data.
511class DS_1A0D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
512 op,
513 (outs ),
514 (ins i1imm:$gds, VReg_32:$addr, u16imm:$offset),
515 asm#" $addr, $offset, [M0]",
516 []> {
517 let data0 = 0;
518 let data1 = 0;
519 let mayStore = 1;
520 let mayLoad = 1;
521}
522
523// 1 address, 2 data.
524class DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
525 op,
526 (outs rc:$vdst),
527 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1, u16imm:$offset),
528 asm#" $vdst, $addr, $data0, $data1, $offset, [M0]",
529 []> {
530 let mayStore = 1;
531 let mayLoad = 1;
532}
533
534// 1 address, 2 data.
535class DS_1A2D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
536 op,
537 (outs),
538 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1, u16imm:$offset),
539 asm#" $addr, $data0, $data1, $offset, [M0]",
540 []> {
541 let mayStore = 1;
542 let mayLoad = 1;
543}
544
545// 1 address, 1 data.
546class DS_1A1D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
547 op,
548 (outs),
549 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, u16imm:$offset),
550 asm#" $addr, $data0, $offset, [M0]",
551 []> {
552
553 let data1 = 0;
554 let mayStore = 1;
555 let mayLoad = 1;
556}
557
Christian Konig72d5d5c2013-02-21 15:16:44 +0000558class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
559 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000560 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000561 (ins regClass:$vdata, u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000562 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000563 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000564 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
565 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000566 []> {
567 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000568 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000569}
Tom Stellard75aadc22012-12-11 21:25:42 +0000570
Tom Stellardf1ee7162013-05-20 15:02:31 +0000571multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
572
Michel Danzer13736222014-01-27 07:20:51 +0000573 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000574
Michel Danzer13736222014-01-27 07:20:51 +0000575 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000576
Michel Danzer13736222014-01-27 07:20:51 +0000577 let offen = 0, idxen = 0 in {
578 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
579 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000580 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000581 i1imm:$slc, i1imm:$tfe),
582 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
583 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000584
Michel Danzer13736222014-01-27 07:20:51 +0000585 let offen = 1, idxen = 0, offset = 0 in {
586 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
587 (ins SReg_128:$srsrc, VReg_32:$vaddr,
588 SSrc_32:$soffset, i1imm:$glc, i1imm:$slc,
589 i1imm:$tfe),
590 asm#" $vdata, $srsrc + $vaddr + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
591 }
592
593 let offen = 0, idxen = 1 in {
594 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
595 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000596 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000597 i1imm:$slc, i1imm:$tfe),
598 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
599 }
600
601 let offen = 1, idxen = 1 in {
602 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
603 (ins SReg_128:$srsrc, VReg_64:$vaddr,
604 SSrc_32:$soffset, i1imm:$glc,
605 i1imm:$slc, i1imm:$tfe),
606 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
607 }
608 }
609
610 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
611 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000612 (ins SReg_128:$srsrc, VReg_64:$vaddr, u16imm:$offset),
Michel Danzer13736222014-01-27 07:20:51 +0000613 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
614 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000615 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000616}
617
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000618class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
619 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000620 u16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000621 name#" $vdata, $srsrc + $vaddr + $offset",
622 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000623
624 let mayLoad = 0;
625 let mayStore = 1;
626
627 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000628 let offen = 0;
629 let idxen = 0;
630 let glc = 0;
631 let addr64 = 1;
632 let lds = 0;
633 let slc = 0;
634 let tfe = 0;
635 let soffset = 128; // ZERO
636}
637
Christian Konig72d5d5c2013-02-21 15:16:44 +0000638class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
639 op,
640 (outs regClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000641 (ins u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000642 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000643 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000644 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
645 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000646 []> {
647 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000648 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000649}
650
Tom Stellard682bfbc2013-10-10 17:11:24 +0000651class MIMG_Mask <string op, int channels> {
652 string Op = op;
653 int Channels = channels;
654}
655
Tom Stellard16a9a202013-08-14 23:24:17 +0000656class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000657 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000658 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000659 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000660 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000661 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000662 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000663 SReg_256:$srsrc),
664 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
665 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
666 []> {
667 let SSAMP = 0;
668 let mayLoad = 1;
669 let mayStore = 0;
670 let hasPostISelHook = 1;
671}
672
Tom Stellard682bfbc2013-10-10 17:11:24 +0000673multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
674 RegisterClass dst_rc,
675 int channels> {
676 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
677 MIMG_Mask<asm#"_V1", channels>;
678 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
679 MIMG_Mask<asm#"_V2", channels>;
680 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
681 MIMG_Mask<asm#"_V4", channels>;
682}
683
Tom Stellard16a9a202013-08-14 23:24:17 +0000684multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000685 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
686 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
687 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
688 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000689}
690
691class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000692 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000693 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000694 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000695 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000696 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000697 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000698 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000699 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
700 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000701 []> {
702 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000703 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000704 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000705}
706
Tom Stellard682bfbc2013-10-10 17:11:24 +0000707multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
708 RegisterClass dst_rc,
709 int channels> {
710 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
711 MIMG_Mask<asm#"_V1", channels>;
712 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
713 MIMG_Mask<asm#"_V2", channels>;
714 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
715 MIMG_Mask<asm#"_V4", channels>;
716 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
717 MIMG_Mask<asm#"_V8", channels>;
718 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
719 MIMG_Mask<asm#"_V16", channels>;
720}
721
Tom Stellard16a9a202013-08-14 23:24:17 +0000722multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000723 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
724 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
725 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
726 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000727}
728
Christian Konigf741fbf2013-02-26 17:52:42 +0000729//===----------------------------------------------------------------------===//
730// Vector instruction mappings
731//===----------------------------------------------------------------------===//
732
733// Maps an opcode in e32 form to its e64 equivalent
734def getVOPe64 : InstrMapping {
735 let FilterClass = "VOP";
736 let RowFields = ["OpName"];
737 let ColFields = ["Size"];
738 let KeyCol = ["4"];
739 let ValueCols = [["8"]];
740}
741
Christian Konig3c145802013-03-27 09:12:59 +0000742// Maps an original opcode to its commuted version
743def getCommuteRev : InstrMapping {
744 let FilterClass = "VOP2_REV";
745 let RowFields = ["RevOp"];
746 let ColFields = ["IsOrig"];
747 let KeyCol = ["1"];
748 let ValueCols = [["0"]];
749}
750
Tom Stellard682bfbc2013-10-10 17:11:24 +0000751def getMaskedMIMGOp : InstrMapping {
752 let FilterClass = "MIMG_Mask";
753 let RowFields = ["Op"];
754 let ColFields = ["Channels"];
755 let KeyCol = ["4"];
756 let ValueCols = [["1"], ["2"], ["3"] ];
757}
758
Christian Konig3c145802013-03-27 09:12:59 +0000759// Maps an commuted opcode to its original version
760def getCommuteOrig : InstrMapping {
761 let FilterClass = "VOP2_REV";
762 let RowFields = ["RevOp"];
763 let ColFields = ["IsOrig"];
764 let KeyCol = ["0"];
765 let ValueCols = [["1"]];
766}
767
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000768def isDS : InstrMapping {
769 let FilterClass = "DS";
770 let RowFields = ["Inst"];
771 let ColFields = ["Size"];
772 let KeyCol = ["8"];
773 let ValueCols = [["8"]];
774}
775
Tom Stellardc721a232014-05-16 20:56:47 +0000776def getMCOpcode : InstrMapping {
777 let FilterClass = "SIMCInstr";
778 let RowFields = ["PseudoInstr"];
779 let ColFields = ["Subtarget"];
780 let KeyCol = [!cast<string>(SISubtarget.NONE)];
781 let ValueCols = [[!cast<string>(SISubtarget.SI)]];
782}
783
Tom Stellard75aadc22012-12-11 21:25:42 +0000784include "SIInstructions.td"