blob: 52049b00f54d05c3d4bd8b54949bcffa3b075d56 [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 Stellard067c8152014-07-21 14:01:14 +000060def SIconstdata_ptr : SDNode<
61 "AMDGPUISD::CONST_DATA_PTR", SDTypeProfile <1, 0, [SDTCisVT<0, i64>]>
62>;
63
Tom Stellard26075d52013-02-07 19:39:38 +000064// Transformation function, extract the lower 32bit of a 64bit immediate
65def LO32 : SDNodeXForm<imm, [{
66 return CurDAG->getTargetConstant(N->getZExtValue() & 0xffffffff, MVT::i32);
67}]>;
68
Tom Stellardab8a8c82013-07-12 18:15:02 +000069def LO32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000070 APInt V = N->getValueAPF().bitcastToAPInt().trunc(32);
71 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000072}]>;
73
Tom Stellard26075d52013-02-07 19:39:38 +000074// Transformation function, extract the upper 32bit of a 64bit immediate
75def HI32 : SDNodeXForm<imm, [{
76 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
77}]>;
78
Tom Stellardab8a8c82013-07-12 18:15:02 +000079def HI32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000080 APInt V = N->getValueAPF().bitcastToAPInt().lshr(32).trunc(32);
81 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000082}]>;
83
Tom Stellard044e4182014-02-06 18:36:34 +000084def IMM8bitDWORD : PatLeaf <(imm),
85 [{return (N->getZExtValue() & ~0x3FC) == 0;}]
Tom Stellard89093802013-02-07 19:39:40 +000086>;
87
Tom Stellard044e4182014-02-06 18:36:34 +000088def as_dword_i32imm : SDNodeXForm<imm, [{
89 return CurDAG->getTargetConstant(N->getZExtValue() >> 2, MVT::i32);
90}]>;
91
Tom Stellardafcf12f2013-09-12 02:55:14 +000092def as_i1imm : SDNodeXForm<imm, [{
93 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i1);
94}]>;
95
96def as_i8imm : SDNodeXForm<imm, [{
97 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i8);
98}]>;
99
Tom Stellard07a10a32013-06-03 17:39:43 +0000100def as_i16imm : SDNodeXForm<imm, [{
101 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
102}]>;
103
Tom Stellard044e4182014-02-06 18:36:34 +0000104def as_i32imm: SDNodeXForm<imm, [{
105 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i32);
106}]>;
107
Matt Arsenault99ed7892014-03-19 22:19:49 +0000108def IMM8bit : PatLeaf <(imm),
109 [{return isUInt<8>(N->getZExtValue());}]
110>;
111
Tom Stellard07a10a32013-06-03 17:39:43 +0000112def IMM12bit : PatLeaf <(imm),
113 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +0000114>;
115
Matt Arsenault99ed7892014-03-19 22:19:49 +0000116def IMM16bit : PatLeaf <(imm),
117 [{return isUInt<16>(N->getZExtValue());}]
118>;
119
Tom Stellardd6cb8e82014-05-09 16:42:21 +0000120def IMM32bit : PatLeaf <(imm),
121 [{return isUInt<32>(N->getZExtValue());}]
122>;
123
Tom Stellarde2367942014-02-06 18:36:41 +0000124def mubuf_vaddr_offset : PatFrag<
125 (ops node:$ptr, node:$offset, node:$imm_offset),
126 (add (add node:$ptr, node:$offset), node:$imm_offset)
127>;
128
Christian Konigf82901a2013-02-26 17:52:23 +0000129class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Tom Stellard7ed0b522014-04-03 20:19:27 +0000130 return isInlineImmediate(N);
Christian Konigb559b072013-02-16 11:28:36 +0000131}]>;
132
Tom Stellarddf94dc32013-08-14 23:24:24 +0000133class SGPRImm <dag frag> : PatLeaf<frag, [{
134 if (TM.getSubtarget<AMDGPUSubtarget>().getGeneration() <
135 AMDGPUSubtarget::SOUTHERN_ISLANDS) {
136 return false;
137 }
138 const SIRegisterInfo *SIRI =
139 static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
140 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
141 U != E; ++U) {
142 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
143 return true;
144 }
145 }
146 return false;
147}]>;
148
Tom Stellard01825af2014-07-21 14:01:08 +0000149//===----------------------------------------------------------------------===//
150// Custom Operands
151//===----------------------------------------------------------------------===//
152
Matt Arsenaulta98cd6a2013-12-19 05:32:55 +0000153def FRAMEri32 : Operand<iPTR> {
Matt Arsenault06028dd2014-05-01 16:37:52 +0000154 let MIOperandInfo = (ops i32:$ptr, i32imm:$index);
Tom Stellard81d871d2013-11-13 23:36:50 +0000155}
156
Tom Stellard01825af2014-07-21 14:01:08 +0000157def sopp_brtarget : Operand<OtherVT> {
158 let EncoderMethod = "getSOPPBrEncoding";
159 let OperandType = "OPERAND_PCREL";
160}
161
Christian Konig72d5d5c2013-02-21 15:16:44 +0000162//===----------------------------------------------------------------------===//
Tom Stellardb02c2682014-06-24 23:33:07 +0000163// Complex patterns
164//===----------------------------------------------------------------------===//
165
Tom Stellardb02094e2014-07-21 15:45:01 +0000166def MUBUFAddr32 : ComplexPattern<i64, 9, "SelectMUBUFAddr32">;
Tom Stellardb02c2682014-06-24 23:33:07 +0000167def MUBUFAddr64 : ComplexPattern<i64, 3, "SelectMUBUFAddr64">;
Tom Stellardb02094e2014-07-21 15:45:01 +0000168def MUBUFScratch : ComplexPattern<i64, 4, "SelectMUBUFScratch">;
Tom Stellardb02c2682014-06-24 23:33:07 +0000169
170//===----------------------------------------------------------------------===//
Christian Konig72d5d5c2013-02-21 15:16:44 +0000171// SI assembler operands
172//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000173
Christian Konigeabf8332013-02-21 15:16:49 +0000174def SIOperand {
175 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000176 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +0000177}
178
Christian Konig72d5d5c2013-02-21 15:16:44 +0000179include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +0000180
Christian Konig72d5d5c2013-02-21 15:16:44 +0000181//===----------------------------------------------------------------------===//
182//
183// SI Instruction multiclass helpers.
184//
185// Instructions with _32 take 32-bit operands.
186// Instructions with _64 take 64-bit operands.
187//
188// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
189// encoding is the standard encoding, but instruction that make use of
190// any of the instruction modifiers must use the 64-bit encoding.
191//
192// Instructions with _e32 use the 32-bit encoding.
193// Instructions with _e64 use the 64-bit encoding.
194//
195//===----------------------------------------------------------------------===//
196
197//===----------------------------------------------------------------------===//
198// Scalar classes
199//===----------------------------------------------------------------------===//
200
Christian Konige0130a22013-02-21 15:17:13 +0000201class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
202 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
203 opName#" $dst, $src0", pattern
204>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000205
Christian Konige0130a22013-02-21 15:17:13 +0000206class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
207 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
208 opName#" $dst, $src0", pattern
209>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000210
Matt Arsenault8333e432014-06-10 19:18:24 +0000211// 64-bit input, 32-bit output.
212class SOP1_32_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
213 op, (outs SReg_32:$dst), (ins SSrc_64:$src0),
214 opName#" $dst, $src0", pattern
215>;
216
Christian Konige0130a22013-02-21 15:17:13 +0000217class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
218 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
219 opName#" $dst, $src0, $src1", pattern
220>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000221
Christian Konige0130a22013-02-21 15:17:13 +0000222class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
223 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
224 opName#" $dst, $src0, $src1", pattern
225>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000226
Tom Stellard82166022013-11-13 23:36:37 +0000227class SOP2_SHIFT_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
228 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_32:$src1),
229 opName#" $dst, $src0, $src1", pattern
230>;
231
Christian Konig72d5d5c2013-02-21 15:16:44 +0000232
Matt Arsenault0cb92e12014-04-11 19:25:18 +0000233class SOPC_Helper <bits<7> op, RegisterClass rc, ValueType vt,
234 string opName, PatLeaf cond> : SOPC <
235 op, (outs SCCReg:$dst), (ins rc:$src0, rc:$src1),
236 opName#" $dst, $src0, $src1", []>;
237
238class SOPC_32<bits<7> op, string opName, PatLeaf cond = COND_NULL>
239 : SOPC_Helper<op, SSrc_32, i32, opName, cond>;
240
241class SOPC_64<bits<7> op, string opName, PatLeaf cond = COND_NULL>
242 : SOPC_Helper<op, SSrc_64, i64, opName, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000243
Christian Konige0130a22013-02-21 15:17:13 +0000244class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
245 op, (outs SReg_32:$dst), (ins i16imm:$src0),
246 opName#" $dst, $src0", pattern
247>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000248
Christian Konige0130a22013-02-21 15:17:13 +0000249class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
250 op, (outs SReg_64:$dst), (ins i16imm:$src0),
251 opName#" $dst, $src0", pattern
252>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000253
Christian Konig9c7afd12013-03-18 11:33:50 +0000254multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
255 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000256 def _IMM : SMRD <
257 op, 1, (outs dstClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000258 (ins baseClass:$sbase, u32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000259 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000260 >;
261
262 def _SGPR : SMRD <
263 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000264 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000265 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000266 >;
267}
268
269//===----------------------------------------------------------------------===//
270// Vector ALU classes
271//===----------------------------------------------------------------------===//
272
Christian Konigf741fbf2013-02-26 17:52:42 +0000273class VOP <string opName> {
274 string OpName = opName;
275}
276
Christian Konig3c145802013-03-27 09:12:59 +0000277class VOP2_REV <string revOp, bit isOrig> {
278 string RevOp = revOp;
279 bit IsOrig = isOrig;
280}
281
Tom Stellardc721a232014-05-16 20:56:47 +0000282class SIMCInstr <string pseudo, int subtarget> {
283 string PseudoInstr = pseudo;
284 int Subtarget = subtarget;
285}
286
287multiclass VOP3_m <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern,
288 string opName> {
289
Tom Stellard092f3322014-06-17 19:34:46 +0000290 def "" : VOP3Common <outs, ins, "", pattern>, VOP <opName>,
Tom Stellardc721a232014-05-16 20:56:47 +0000291 SIMCInstr<OpName, SISubtarget.NONE> {
292 let isPseudo = 1;
293 }
294
295 def _si : VOP3 <op, outs, ins, asm, []>, SIMCInstr<opName, SISubtarget.SI>;
296
297}
298
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000299// This must always be right before the operand being input modified.
300def InputMods : OperandWithDefaultOps <i32, (ops (i32 0))> {
301 let PrintMethod = "printOperandAndMods";
302}
303
Christian Konig3da70172013-02-21 15:16:53 +0000304multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
305 string opName, list<dag> pattern> {
306
Christian Konigf741fbf2013-02-26 17:52:42 +0000307 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000308 op, (outs drc:$dst), (ins src:$src0),
309 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000310 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000311
Christian Konig3da70172013-02-21 15:16:53 +0000312 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000313 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000314 (outs drc:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000315 (ins InputMods:$src0_modifiers, src:$src0, i32imm:$clamp, i32imm:$omod),
316 opName#"_e64 $dst, $src0_modifiers, $clamp, $omod", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000317 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000318 let src1 = SIOperand.ZERO;
319 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000320 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000321}
322
Christian Konig3da70172013-02-21 15:16:53 +0000323multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
324 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
325
326multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
327 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
328
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000329multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
330 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
331
332multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
333 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
334
Christian Konigae034e62013-02-21 15:16:58 +0000335multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000336 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000337 def _e32 : VOP2 <
338 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
339 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000340 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000341
Christian Konigae034e62013-02-21 15:16:58 +0000342 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000343 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000344 (outs vrc:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000345 (ins InputMods:$src0_modifiers, arc:$src0,
346 InputMods:$src1_modifiers, arc:$src1,
347 i32imm:$clamp, i32imm:$omod),
348 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod", []
Christian Konig3c145802013-03-27 09:12:59 +0000349 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000350 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000351 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000352}
353
Christian Konig3c145802013-03-27 09:12:59 +0000354multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
355 string revOp = opName>
356 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000357
Christian Konig3c145802013-03-27 09:12:59 +0000358multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
359 string revOp = opName>
360 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000361
Christian Konig3c145802013-03-27 09:12:59 +0000362multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
Tom Stellarde28859f2014-03-07 20:12:39 +0000363 RegisterClass src0_rc, string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000364
365 def _e32 : VOP2 <
Tom Stellarde28859f2014-03-07 20:12:39 +0000366 op, (outs VReg_32:$dst), (ins src0_rc:$src0, VReg_32:$src1),
Christian Konigd3039962013-02-26 17:52:09 +0000367 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000368 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000369
370 def _e64 : VOP3b <
371 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
372 (outs VReg_32:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000373 (ins InputMods: $src0_modifiers, VSrc_32:$src0,
374 InputMods:$src1_modifiers, VSrc_32:$src1,
375 i32imm:$clamp, i32imm:$omod),
376 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod", []
Christian Konig3c145802013-03-27 09:12:59 +0000377 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000378 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000379 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
380 can write it into any SGPR. We currently don't use the carry out,
381 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000382 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000383 }
384}
385
Christian Konig72d5d5c2013-02-21 15:16:44 +0000386multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Matt Arsenault520e7c42014-06-18 16:53:48 +0000387 string opName, ValueType vt, PatLeaf cond, bit defExec = 0> {
Christian Konigb19849a2013-02-21 15:17:04 +0000388 def _e32 : VOPC <
389 op, (ins arc:$src0, vrc:$src1),
390 opName#"_e32 $dst, $src0, $src1", []
Matt Arsenault520e7c42014-06-18 16:53:48 +0000391 >, VOP <opName> {
392 let Defs = !if(defExec, [VCC, EXEC], [VCC]);
393 }
Christian Konigb19849a2013-02-21 15:17:04 +0000394
Christian Konig72d5d5c2013-02-21 15:16:44 +0000395 def _e64 : VOP3 <
396 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
397 (outs SReg_64:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000398 (ins InputMods:$src0_modifiers, arc:$src0,
399 InputMods:$src1_modifiers, arc:$src1,
400 InstFlag:$clamp, InstFlag:$omod),
401 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod",
Christian Konigb19849a2013-02-21 15:17:04 +0000402 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000403 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000404 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000405 >, VOP <opName> {
Matt Arsenault520e7c42014-06-18 16:53:48 +0000406 let Defs = !if(defExec, [EXEC], []);
Tom Stellard459a79a2013-05-20 15:02:08 +0000407 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000408 let src2_modifiers = 0;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000409 }
410}
411
Christian Konigb19849a2013-02-21 15:17:04 +0000412multiclass VOPC_32 <bits<8> op, string opName,
413 ValueType vt = untyped, PatLeaf cond = COND_NULL>
414 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000415
Christian Konigb19849a2013-02-21 15:17:04 +0000416multiclass VOPC_64 <bits<8> op, string opName,
417 ValueType vt = untyped, PatLeaf cond = COND_NULL>
418 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000419
Matt Arsenault520e7c42014-06-18 16:53:48 +0000420multiclass VOPCX_32 <bits<8> op, string opName,
421 ValueType vt = untyped, PatLeaf cond = COND_NULL>
422 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond, 1>;
423
424multiclass VOPCX_64 <bits<8> op, string opName,
425 ValueType vt = untyped, PatLeaf cond = COND_NULL>
426 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond, 1>;
427
Tom Stellardc721a232014-05-16 20:56:47 +0000428multiclass VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3_m <
Christian Konigf5754a02013-02-21 15:17:09 +0000429 op, (outs VReg_32:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000430 (ins InputMods: $src0_modifiers, VSrc_32:$src0, InputMods:$src1_modifiers,
431 VSrc_32:$src1, InputMods:$src2_modifiers, VSrc_32:$src2,
432 InstFlag:$clamp, InstFlag:$omod),
Tom Stellardc721a232014-05-16 20:56:47 +0000433 opName#" $dst, $src0_modifiers, $src1, $src2, $clamp, $omod", pattern, opName
434>;
Christian Konigf5754a02013-02-21 15:17:09 +0000435
Matt Arsenault93840c02014-06-09 17:00:46 +0000436class VOP3_64_32 <bits <9> op, string opName, list<dag> pattern> : VOP3 <
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000437 op, (outs VReg_64:$dst),
438 (ins VSrc_64:$src0, VSrc_32:$src1),
439 opName#" $dst, $src0, $src1", pattern
440>, VOP <opName> {
441
442 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000443 let src0_modifiers = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000444 let clamp = 0;
445 let omod = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000446}
447
Christian Konigf5754a02013-02-21 15:17:09 +0000448class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
449 op, (outs VReg_64:$dst),
Matt Arsenaultdbc9aae2014-06-18 17:13:51 +0000450 (ins InputMods:$src0_modifiers, VSrc_64:$src0,
451 InputMods:$src1_modifiers, VSrc_64:$src1,
452 InputMods:$src2_modifiers, VSrc_64:$src2,
453 InstFlag:$clamp, InstFlag:$omod),
454 opName#" $dst, $src0_modifiers, $src1_modifiers, $src2_modifiers, $clamp, $omod", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000455>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000456
Matt Arsenaultf2b0aeb2014-06-23 18:28:28 +0000457
458class VOP3b_Helper <bits<9> op, RegisterClass vrc, RegisterClass arc,
459 string opName, list<dag> pattern> : VOP3 <
460 op, (outs vrc:$dst0, SReg_64:$dst1),
461 (ins arc:$src0, arc:$src1, arc:$src2,
462 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
463 opName#" $dst0, $dst1, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
464>, VOP <opName>;
465
466
467class VOP3b_64 <bits<9> op, string opName, list<dag> pattern> :
468 VOP3b_Helper <op, VReg_64, VSrc_64, opName, pattern>;
469
470class VOP3b_32 <bits<9> op, string opName, list<dag> pattern> :
471 VOP3b_Helper <op, VReg_32, VSrc_32, opName, pattern>;
472
Christian Konig72d5d5c2013-02-21 15:16:44 +0000473//===----------------------------------------------------------------------===//
474// Vector I/O classes
475//===----------------------------------------------------------------------===//
476
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000477class DS_1A <bits<8> op, dag outs, dag ins, string asm, list<dag> pat> :
478 DS <op, outs, ins, asm, pat> {
479 bits<16> offset;
480
Matt Arsenault99ed7892014-03-19 22:19:49 +0000481 // Single load interpret the 2 i8imm operands as a single i16 offset.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000482 let offset0 = offset{7-0};
483 let offset1 = offset{15-8};
484}
485
486class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000487 op,
488 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000489 (ins i1imm:$gds, VReg_32:$addr, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000490 asm#" $vdst, $addr, $offset, [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000491 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000492 let data0 = 0;
493 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000494 let mayLoad = 1;
495 let mayStore = 0;
496}
497
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000498class DS_Load2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
499 op,
500 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000501 (ins i1imm:$gds, VReg_32:$addr, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000502 asm#" $gds, $vdst, $addr, $offset0, $offset1, [M0]",
503 []> {
504 let data0 = 0;
505 let data1 = 0;
506 let mayLoad = 1;
507 let mayStore = 0;
508}
509
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000510class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000511 op,
512 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000513 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000514 asm#" $addr, $data0, $offset [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000515 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000516 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000517 let mayStore = 1;
518 let mayLoad = 0;
519 let vdst = 0;
520}
521
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000522class DS_Store2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
523 op,
524 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000525 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000526 asm#" $addr, $data0, $data1, $offset0, $offset1 [M0]",
527 []> {
528 let mayStore = 1;
529 let mayLoad = 0;
530 let vdst = 0;
531}
532
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000533// 1 address, 1 data.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000534class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
Tom Stellard13c68ef2013-09-05 18:38:09 +0000535 op,
536 (outs rc:$vdst),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000537 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000538 asm#" $vdst, $addr, $data0, $offset, [M0]",
Tom Stellard13c68ef2013-09-05 18:38:09 +0000539 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000540
541 let data1 = 0;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000542 let mayStore = 1;
543 let mayLoad = 1;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000544}
545
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000546// 1 address, 2 data.
547class DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
548 op,
549 (outs rc:$vdst),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000550 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000551 asm#" $vdst, $addr, $data0, $data1, $offset, [M0]",
552 []> {
553 let mayStore = 1;
554 let mayLoad = 1;
555}
556
557// 1 address, 2 data.
558class DS_1A2D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
559 op,
560 (outs),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000561 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000562 asm#" $addr, $data0, $data1, $offset, [M0]",
563 []> {
564 let mayStore = 1;
565 let mayLoad = 1;
566}
567
568// 1 address, 1 data.
569class DS_1A1D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
570 op,
571 (outs),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000572 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000573 asm#" $addr, $data0, $offset, [M0]",
574 []> {
575
576 let data1 = 0;
577 let mayStore = 1;
578 let mayLoad = 1;
579}
580
Christian Konig72d5d5c2013-02-21 15:16:44 +0000581class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
582 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000583 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000584 (ins regClass:$vdata, u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000585 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000586 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000587 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
588 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000589 []> {
590 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000591 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000592}
Tom Stellard75aadc22012-12-11 21:25:42 +0000593
Tom Stellard7c1838d2014-07-02 20:53:56 +0000594multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass,
595 ValueType load_vt = i32,
596 SDPatternOperator ld = null_frag> {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000597
Michel Danzer13736222014-01-27 07:20:51 +0000598 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000599
Michel Danzer13736222014-01-27 07:20:51 +0000600 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000601
Tom Stellard8e44d942014-07-21 15:44:55 +0000602 let offen = 0, idxen = 0, vaddr = 0 in {
Michel Danzer13736222014-01-27 07:20:51 +0000603 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
Tom Stellard8e44d942014-07-21 15:44:55 +0000604 (ins SReg_128:$srsrc,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000605 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000606 i1imm:$slc, i1imm:$tfe),
607 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
608 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000609
Tom Stellardb02094e2014-07-21 15:45:01 +0000610 let offen = 1, idxen = 0 in {
Michel Danzer13736222014-01-27 07:20:51 +0000611 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
612 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Tom Stellardb02094e2014-07-21 15:45:01 +0000613 SSrc_32:$soffset, u16imm:$offset, i1imm:$glc, i1imm:$slc,
Michel Danzer13736222014-01-27 07:20:51 +0000614 i1imm:$tfe),
Tom Stellardb02094e2014-07-21 15:45:01 +0000615 asm#" $vdata, $srsrc + $vaddr + $soffset + $offset, glc=$glc, slc=$slc, tfe=$tfe", []>;
Michel Danzer13736222014-01-27 07:20:51 +0000616 }
617
618 let offen = 0, idxen = 1 in {
619 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
620 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000621 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000622 i1imm:$slc, i1imm:$tfe),
623 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
624 }
625
626 let offen = 1, idxen = 1 in {
627 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
628 (ins SReg_128:$srsrc, VReg_64:$vaddr,
629 SSrc_32:$soffset, i1imm:$glc,
630 i1imm:$slc, i1imm:$tfe),
631 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
632 }
633 }
634
635 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
636 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000637 (ins SReg_128:$srsrc, VReg_64:$vaddr, u16imm:$offset),
Tom Stellard7c1838d2014-07-02 20:53:56 +0000638 asm#" $vdata, $srsrc + $vaddr + $offset",
639 [(set load_vt:$vdata, (ld (MUBUFAddr64 v4i32:$srsrc,
640 i64:$vaddr, u16imm:$offset)))]>;
Michel Danzer13736222014-01-27 07:20:51 +0000641 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000642 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000643}
644
Tom Stellardb02094e2014-07-21 15:45:01 +0000645multiclass MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
646 ValueType store_vt, SDPatternOperator st> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000647
Tom Stellardb02094e2014-07-21 15:45:01 +0000648 def "" : MUBUF <
649 op, (outs),
650 (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_32:$vaddr, SSrc_32:$soffset,
651 u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$slc,
652 i1imm:$tfe),
653 name#" $vdata, $srsrc, $vaddr, $soffset, $offset $offen $idxen $glc $slc $tfe",
654 []
655 > {
656 let addr64 = 0;
657 }
Tom Stellard754f80f2013-04-05 23:31:51 +0000658
Tom Stellardb02094e2014-07-21 15:45:01 +0000659 def _ADDR64 : MUBUF <
660 op, (outs),
661 (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, u16imm:$offset),
662 name#" $vdata, $srsrc + $vaddr + $offset",
663 [(st store_vt:$vdata,
664 (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, u16imm:$offset))]> {
665
666 let mayLoad = 0;
667 let mayStore = 1;
668
669 // Encoding
670 let offen = 0;
671 let idxen = 0;
672 let glc = 0;
673 let addr64 = 1;
674 let lds = 0;
675 let slc = 0;
676 let tfe = 0;
677 let soffset = 128; // ZERO
678 }
Tom Stellard754f80f2013-04-05 23:31:51 +0000679}
680
Christian Konig72d5d5c2013-02-21 15:16:44 +0000681class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
682 op,
683 (outs regClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000684 (ins u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000685 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000686 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000687 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
688 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000689 []> {
690 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000691 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000692}
693
Tom Stellard682bfbc2013-10-10 17:11:24 +0000694class MIMG_Mask <string op, int channels> {
695 string Op = op;
696 int Channels = channels;
697}
698
Tom Stellard16a9a202013-08-14 23:24:17 +0000699class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000700 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000701 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000702 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000703 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000704 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000705 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000706 SReg_256:$srsrc),
707 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
708 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
709 []> {
710 let SSAMP = 0;
711 let mayLoad = 1;
712 let mayStore = 0;
713 let hasPostISelHook = 1;
714}
715
Tom Stellard682bfbc2013-10-10 17:11:24 +0000716multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
717 RegisterClass dst_rc,
718 int channels> {
719 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
720 MIMG_Mask<asm#"_V1", channels>;
721 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
722 MIMG_Mask<asm#"_V2", channels>;
723 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
724 MIMG_Mask<asm#"_V4", channels>;
725}
726
Tom Stellard16a9a202013-08-14 23:24:17 +0000727multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000728 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
729 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
730 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
731 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000732}
733
734class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000735 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000736 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000737 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000738 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000739 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000740 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000741 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000742 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
743 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000744 []> {
745 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000746 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000747 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000748}
749
Tom Stellard682bfbc2013-10-10 17:11:24 +0000750multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
751 RegisterClass dst_rc,
752 int channels> {
753 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
754 MIMG_Mask<asm#"_V1", channels>;
755 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
756 MIMG_Mask<asm#"_V2", channels>;
757 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
758 MIMG_Mask<asm#"_V4", channels>;
759 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
760 MIMG_Mask<asm#"_V8", channels>;
761 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
762 MIMG_Mask<asm#"_V16", channels>;
763}
764
Tom Stellard16a9a202013-08-14 23:24:17 +0000765multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000766 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
767 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
768 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
769 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000770}
771
Marek Olsak51b8e7b2014-06-18 22:00:29 +0000772class MIMG_Gather_Helper <bits<7> op, string asm,
773 RegisterClass dst_rc,
774 RegisterClass src_rc> : MIMG <
775 op,
776 (outs dst_rc:$vdata),
777 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
778 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
779 SReg_256:$srsrc, SReg_128:$ssamp),
780 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
781 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
782 []> {
783 let mayLoad = 1;
784 let mayStore = 0;
785
786 // DMASK was repurposed for GATHER4. 4 components are always
787 // returned and DMASK works like a swizzle - it selects
788 // the component to fetch. The only useful DMASK values are
789 // 1=red, 2=green, 4=blue, 8=alpha. (e.g. 1 returns
790 // (red,red,red,red) etc.) The ISA document doesn't mention
791 // this.
792 // Therefore, disable all code which updates DMASK by setting these two:
793 let MIMG = 0;
794 let hasPostISelHook = 0;
795}
796
797multiclass MIMG_Gather_Src_Helper <bits<7> op, string asm,
798 RegisterClass dst_rc,
799 int channels> {
800 def _V1 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_32>,
801 MIMG_Mask<asm#"_V1", channels>;
802 def _V2 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_64>,
803 MIMG_Mask<asm#"_V2", channels>;
804 def _V4 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_128>,
805 MIMG_Mask<asm#"_V4", channels>;
806 def _V8 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_256>,
807 MIMG_Mask<asm#"_V8", channels>;
808 def _V16 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_512>,
809 MIMG_Mask<asm#"_V16", channels>;
810}
811
812multiclass MIMG_Gather <bits<7> op, string asm> {
813 defm _V1 : MIMG_Gather_Src_Helper<op, asm, VReg_32, 1>;
814 defm _V2 : MIMG_Gather_Src_Helper<op, asm, VReg_64, 2>;
815 defm _V3 : MIMG_Gather_Src_Helper<op, asm, VReg_96, 3>;
816 defm _V4 : MIMG_Gather_Src_Helper<op, asm, VReg_128, 4>;
817}
818
Christian Konigf741fbf2013-02-26 17:52:42 +0000819//===----------------------------------------------------------------------===//
820// Vector instruction mappings
821//===----------------------------------------------------------------------===//
822
823// Maps an opcode in e32 form to its e64 equivalent
824def getVOPe64 : InstrMapping {
825 let FilterClass = "VOP";
826 let RowFields = ["OpName"];
827 let ColFields = ["Size"];
828 let KeyCol = ["4"];
829 let ValueCols = [["8"]];
830}
831
Christian Konig3c145802013-03-27 09:12:59 +0000832// Maps an original opcode to its commuted version
833def getCommuteRev : InstrMapping {
834 let FilterClass = "VOP2_REV";
835 let RowFields = ["RevOp"];
836 let ColFields = ["IsOrig"];
837 let KeyCol = ["1"];
838 let ValueCols = [["0"]];
839}
840
Tom Stellard682bfbc2013-10-10 17:11:24 +0000841def getMaskedMIMGOp : InstrMapping {
842 let FilterClass = "MIMG_Mask";
843 let RowFields = ["Op"];
844 let ColFields = ["Channels"];
845 let KeyCol = ["4"];
846 let ValueCols = [["1"], ["2"], ["3"] ];
847}
848
Christian Konig3c145802013-03-27 09:12:59 +0000849// Maps an commuted opcode to its original version
850def getCommuteOrig : InstrMapping {
851 let FilterClass = "VOP2_REV";
852 let RowFields = ["RevOp"];
853 let ColFields = ["IsOrig"];
854 let KeyCol = ["0"];
855 let ValueCols = [["1"]];
856}
857
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000858def isDS : InstrMapping {
859 let FilterClass = "DS";
860 let RowFields = ["Inst"];
861 let ColFields = ["Size"];
862 let KeyCol = ["8"];
863 let ValueCols = [["8"]];
864}
865
Tom Stellardc721a232014-05-16 20:56:47 +0000866def getMCOpcode : InstrMapping {
867 let FilterClass = "SIMCInstr";
868 let RowFields = ["PseudoInstr"];
869 let ColFields = ["Subtarget"];
870 let KeyCol = [!cast<string>(SISubtarget.NONE)];
871 let ValueCols = [[!cast<string>(SISubtarget.SI)]];
872}
873
Tom Stellard75aadc22012-12-11 21:25:42 +0000874include "SIInstructions.td"