blob: eb9746779374c75adb8fa0a1daf25f3aa62b8168 [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
Tom Stellard092f3322014-06-17 19:34:46 +0000269 def "" : VOP3Common <outs, ins, "", pattern>, VOP <opName>,
Tom Stellardc721a232014-05-16 20:56:47 +0000270 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,
Matt Arsenault520e7c42014-06-18 16:53:48 +0000366 string opName, ValueType vt, PatLeaf cond, bit defExec = 0> {
Christian Konigb19849a2013-02-21 15:17:04 +0000367 def _e32 : VOPC <
368 op, (ins arc:$src0, vrc:$src1),
369 opName#"_e32 $dst, $src0, $src1", []
Matt Arsenault520e7c42014-06-18 16:53:48 +0000370 >, VOP <opName> {
371 let Defs = !if(defExec, [VCC, EXEC], [VCC]);
372 }
Christian Konigb19849a2013-02-21 15:17:04 +0000373
Christian Konig72d5d5c2013-02-21 15:16:44 +0000374 def _e64 : VOP3 <
375 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
376 (outs SReg_64:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000377 (ins InputMods:$src0_modifiers, arc:$src0,
378 InputMods:$src1_modifiers, arc:$src1,
379 InstFlag:$clamp, InstFlag:$omod),
380 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod",
Christian Konigb19849a2013-02-21 15:17:04 +0000381 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000382 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000383 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000384 >, VOP <opName> {
Matt Arsenault520e7c42014-06-18 16:53:48 +0000385 let Defs = !if(defExec, [EXEC], []);
Tom Stellard459a79a2013-05-20 15:02:08 +0000386 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000387 let src2_modifiers = 0;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000388 }
389}
390
Christian Konigb19849a2013-02-21 15:17:04 +0000391multiclass VOPC_32 <bits<8> op, string opName,
392 ValueType vt = untyped, PatLeaf cond = COND_NULL>
393 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000394
Christian Konigb19849a2013-02-21 15:17:04 +0000395multiclass VOPC_64 <bits<8> op, string opName,
396 ValueType vt = untyped, PatLeaf cond = COND_NULL>
397 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000398
Matt Arsenault520e7c42014-06-18 16:53:48 +0000399multiclass VOPCX_32 <bits<8> op, string opName,
400 ValueType vt = untyped, PatLeaf cond = COND_NULL>
401 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond, 1>;
402
403multiclass VOPCX_64 <bits<8> op, string opName,
404 ValueType vt = untyped, PatLeaf cond = COND_NULL>
405 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond, 1>;
406
Tom Stellardc721a232014-05-16 20:56:47 +0000407multiclass VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3_m <
Christian Konigf5754a02013-02-21 15:17:09 +0000408 op, (outs VReg_32:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000409 (ins InputMods: $src0_modifiers, VSrc_32:$src0, InputMods:$src1_modifiers,
410 VSrc_32:$src1, InputMods:$src2_modifiers, VSrc_32:$src2,
411 InstFlag:$clamp, InstFlag:$omod),
Tom Stellardc721a232014-05-16 20:56:47 +0000412 opName#" $dst, $src0_modifiers, $src1, $src2, $clamp, $omod", pattern, opName
413>;
Christian Konigf5754a02013-02-21 15:17:09 +0000414
Matt Arsenault93840c02014-06-09 17:00:46 +0000415class VOP3_64_32 <bits <9> op, string opName, list<dag> pattern> : VOP3 <
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000416 op, (outs VReg_64:$dst),
417 (ins VSrc_64:$src0, VSrc_32:$src1),
418 opName#" $dst, $src0, $src1", pattern
419>, VOP <opName> {
420
421 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000422 let src0_modifiers = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000423 let clamp = 0;
424 let omod = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000425}
426
Christian Konigf5754a02013-02-21 15:17:09 +0000427class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
428 op, (outs VReg_64:$dst),
Matt Arsenaultdbc9aae2014-06-18 17:13:51 +0000429 (ins InputMods:$src0_modifiers, VSrc_64:$src0,
430 InputMods:$src1_modifiers, VSrc_64:$src1,
431 InputMods:$src2_modifiers, VSrc_64:$src2,
432 InstFlag:$clamp, InstFlag:$omod),
433 opName#" $dst, $src0_modifiers, $src1_modifiers, $src2_modifiers, $clamp, $omod", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000434>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000435
Christian Konig72d5d5c2013-02-21 15:16:44 +0000436//===----------------------------------------------------------------------===//
437// Vector I/O classes
438//===----------------------------------------------------------------------===//
439
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000440class DS_1A <bits<8> op, dag outs, dag ins, string asm, list<dag> pat> :
441 DS <op, outs, ins, asm, pat> {
442 bits<16> offset;
443
Matt Arsenault99ed7892014-03-19 22:19:49 +0000444 // Single load interpret the 2 i8imm operands as a single i16 offset.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000445 let offset0 = offset{7-0};
446 let offset1 = offset{15-8};
447}
448
449class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000450 op,
451 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000452 (ins i1imm:$gds, VReg_32:$addr, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000453 asm#" $vdst, $addr, $offset, [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000454 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000455 let data0 = 0;
456 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000457 let mayLoad = 1;
458 let mayStore = 0;
459}
460
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000461class DS_Load2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
462 op,
463 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000464 (ins i1imm:$gds, VReg_32:$addr, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000465 asm#" $gds, $vdst, $addr, $offset0, $offset1, [M0]",
466 []> {
467 let data0 = 0;
468 let data1 = 0;
469 let mayLoad = 1;
470 let mayStore = 0;
471}
472
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000473class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000474 op,
475 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000476 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000477 asm#" $addr, $data0, $offset [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000478 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000479 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000480 let mayStore = 1;
481 let mayLoad = 0;
482 let vdst = 0;
483}
484
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000485class DS_Store2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
486 op,
487 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000488 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000489 asm#" $addr, $data0, $data1, $offset0, $offset1 [M0]",
490 []> {
491 let mayStore = 1;
492 let mayLoad = 0;
493 let vdst = 0;
494}
495
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000496// 1 address, 1 data.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000497class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
Tom Stellard13c68ef2013-09-05 18:38:09 +0000498 op,
499 (outs rc:$vdst),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000500 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000501 asm#" $vdst, $addr, $data0, $offset, [M0]",
Tom Stellard13c68ef2013-09-05 18:38:09 +0000502 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000503
504 let data1 = 0;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000505 let mayStore = 1;
506 let mayLoad = 1;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000507}
508
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000509// 1 address, 2 data.
510class DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
511 op,
512 (outs rc:$vdst),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000513 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000514 asm#" $vdst, $addr, $data0, $data1, $offset, [M0]",
515 []> {
516 let mayStore = 1;
517 let mayLoad = 1;
518}
519
520// 1 address, 2 data.
521class DS_1A2D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
522 op,
523 (outs),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000524 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000525 asm#" $addr, $data0, $data1, $offset, [M0]",
526 []> {
527 let mayStore = 1;
528 let mayLoad = 1;
529}
530
531// 1 address, 1 data.
532class DS_1A1D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
533 op,
534 (outs),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000535 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000536 asm#" $addr, $data0, $offset, [M0]",
537 []> {
538
539 let data1 = 0;
540 let mayStore = 1;
541 let mayLoad = 1;
542}
543
Christian Konig72d5d5c2013-02-21 15:16:44 +0000544class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
545 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000546 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000547 (ins regClass:$vdata, u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000548 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000549 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000550 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
551 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000552 []> {
553 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000554 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000555}
Tom Stellard75aadc22012-12-11 21:25:42 +0000556
Tom Stellardf1ee7162013-05-20 15:02:31 +0000557multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
558
Michel Danzer13736222014-01-27 07:20:51 +0000559 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000560
Michel Danzer13736222014-01-27 07:20:51 +0000561 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000562
Michel Danzer13736222014-01-27 07:20:51 +0000563 let offen = 0, idxen = 0 in {
564 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
565 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000566 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000567 i1imm:$slc, i1imm:$tfe),
568 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
569 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000570
Michel Danzer13736222014-01-27 07:20:51 +0000571 let offen = 1, idxen = 0, offset = 0 in {
572 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
573 (ins SReg_128:$srsrc, VReg_32:$vaddr,
574 SSrc_32:$soffset, i1imm:$glc, i1imm:$slc,
575 i1imm:$tfe),
576 asm#" $vdata, $srsrc + $vaddr + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
577 }
578
579 let offen = 0, idxen = 1 in {
580 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
581 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000582 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000583 i1imm:$slc, i1imm:$tfe),
584 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
585 }
586
587 let offen = 1, idxen = 1 in {
588 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
589 (ins SReg_128:$srsrc, VReg_64:$vaddr,
590 SSrc_32:$soffset, i1imm:$glc,
591 i1imm:$slc, i1imm:$tfe),
592 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
593 }
594 }
595
596 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
597 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000598 (ins SReg_128:$srsrc, VReg_64:$vaddr, u16imm:$offset),
Michel Danzer13736222014-01-27 07:20:51 +0000599 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
600 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000601 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000602}
603
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000604class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
605 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000606 u16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000607 name#" $vdata, $srsrc + $vaddr + $offset",
608 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000609
610 let mayLoad = 0;
611 let mayStore = 1;
612
613 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000614 let offen = 0;
615 let idxen = 0;
616 let glc = 0;
617 let addr64 = 1;
618 let lds = 0;
619 let slc = 0;
620 let tfe = 0;
621 let soffset = 128; // ZERO
622}
623
Christian Konig72d5d5c2013-02-21 15:16:44 +0000624class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
625 op,
626 (outs regClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000627 (ins u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000628 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000629 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000630 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
631 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000632 []> {
633 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000634 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000635}
636
Tom Stellard682bfbc2013-10-10 17:11:24 +0000637class MIMG_Mask <string op, int channels> {
638 string Op = op;
639 int Channels = channels;
640}
641
Tom Stellard16a9a202013-08-14 23:24:17 +0000642class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000643 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000644 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000645 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000646 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000647 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000648 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000649 SReg_256:$srsrc),
650 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
651 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
652 []> {
653 let SSAMP = 0;
654 let mayLoad = 1;
655 let mayStore = 0;
656 let hasPostISelHook = 1;
657}
658
Tom Stellard682bfbc2013-10-10 17:11:24 +0000659multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
660 RegisterClass dst_rc,
661 int channels> {
662 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
663 MIMG_Mask<asm#"_V1", channels>;
664 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
665 MIMG_Mask<asm#"_V2", channels>;
666 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
667 MIMG_Mask<asm#"_V4", channels>;
668}
669
Tom Stellard16a9a202013-08-14 23:24:17 +0000670multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000671 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
672 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
673 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
674 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000675}
676
677class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000678 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000679 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000680 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000681 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000682 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000683 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000684 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000685 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
686 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000687 []> {
688 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000689 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000690 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000691}
692
Tom Stellard682bfbc2013-10-10 17:11:24 +0000693multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
694 RegisterClass dst_rc,
695 int channels> {
696 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
697 MIMG_Mask<asm#"_V1", channels>;
698 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
699 MIMG_Mask<asm#"_V2", channels>;
700 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
701 MIMG_Mask<asm#"_V4", channels>;
702 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
703 MIMG_Mask<asm#"_V8", channels>;
704 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
705 MIMG_Mask<asm#"_V16", channels>;
706}
707
Tom Stellard16a9a202013-08-14 23:24:17 +0000708multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000709 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
710 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
711 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
712 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000713}
714
Christian Konigf741fbf2013-02-26 17:52:42 +0000715//===----------------------------------------------------------------------===//
716// Vector instruction mappings
717//===----------------------------------------------------------------------===//
718
719// Maps an opcode in e32 form to its e64 equivalent
720def getVOPe64 : InstrMapping {
721 let FilterClass = "VOP";
722 let RowFields = ["OpName"];
723 let ColFields = ["Size"];
724 let KeyCol = ["4"];
725 let ValueCols = [["8"]];
726}
727
Christian Konig3c145802013-03-27 09:12:59 +0000728// Maps an original opcode to its commuted version
729def getCommuteRev : InstrMapping {
730 let FilterClass = "VOP2_REV";
731 let RowFields = ["RevOp"];
732 let ColFields = ["IsOrig"];
733 let KeyCol = ["1"];
734 let ValueCols = [["0"]];
735}
736
Tom Stellard682bfbc2013-10-10 17:11:24 +0000737def getMaskedMIMGOp : InstrMapping {
738 let FilterClass = "MIMG_Mask";
739 let RowFields = ["Op"];
740 let ColFields = ["Channels"];
741 let KeyCol = ["4"];
742 let ValueCols = [["1"], ["2"], ["3"] ];
743}
744
Christian Konig3c145802013-03-27 09:12:59 +0000745// Maps an commuted opcode to its original version
746def getCommuteOrig : InstrMapping {
747 let FilterClass = "VOP2_REV";
748 let RowFields = ["RevOp"];
749 let ColFields = ["IsOrig"];
750 let KeyCol = ["0"];
751 let ValueCols = [["1"]];
752}
753
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000754def isDS : InstrMapping {
755 let FilterClass = "DS";
756 let RowFields = ["Inst"];
757 let ColFields = ["Size"];
758 let KeyCol = ["8"];
759 let ValueCols = [["8"]];
760}
761
Tom Stellardc721a232014-05-16 20:56:47 +0000762def getMCOpcode : InstrMapping {
763 let FilterClass = "SIMCInstr";
764 let RowFields = ["PseudoInstr"];
765 let ColFields = ["Subtarget"];
766 let KeyCol = [!cast<string>(SISubtarget.NONE)];
767 let ValueCols = [[!cast<string>(SISubtarget.SI)]];
768}
769
Tom Stellard75aadc22012-12-11 21:25:42 +0000770include "SIInstructions.td"