blob: c1f22a5d26d0207dc737989425b136152b43a4a8 [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
166def MUBUFAddr64 : ComplexPattern<i64, 3, "SelectMUBUFAddr64">;
167
168//===----------------------------------------------------------------------===//
Christian Konig72d5d5c2013-02-21 15:16:44 +0000169// SI assembler operands
170//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000171
Christian Konigeabf8332013-02-21 15:16:49 +0000172def SIOperand {
173 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000174 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +0000175}
176
Christian Konig72d5d5c2013-02-21 15:16:44 +0000177include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +0000178
Christian Konig72d5d5c2013-02-21 15:16:44 +0000179//===----------------------------------------------------------------------===//
180//
181// SI Instruction multiclass helpers.
182//
183// Instructions with _32 take 32-bit operands.
184// Instructions with _64 take 64-bit operands.
185//
186// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
187// encoding is the standard encoding, but instruction that make use of
188// any of the instruction modifiers must use the 64-bit encoding.
189//
190// Instructions with _e32 use the 32-bit encoding.
191// Instructions with _e64 use the 64-bit encoding.
192//
193//===----------------------------------------------------------------------===//
194
195//===----------------------------------------------------------------------===//
196// Scalar classes
197//===----------------------------------------------------------------------===//
198
Christian Konige0130a22013-02-21 15:17:13 +0000199class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
200 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
201 opName#" $dst, $src0", pattern
202>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000203
Christian Konige0130a22013-02-21 15:17:13 +0000204class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
205 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
206 opName#" $dst, $src0", pattern
207>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000208
Matt Arsenault8333e432014-06-10 19:18:24 +0000209// 64-bit input, 32-bit output.
210class SOP1_32_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
211 op, (outs SReg_32:$dst), (ins SSrc_64:$src0),
212 opName#" $dst, $src0", pattern
213>;
214
Christian Konige0130a22013-02-21 15:17:13 +0000215class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
216 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
217 opName#" $dst, $src0, $src1", pattern
218>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000219
Christian Konige0130a22013-02-21 15:17:13 +0000220class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
221 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
222 opName#" $dst, $src0, $src1", pattern
223>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000224
Tom Stellard82166022013-11-13 23:36:37 +0000225class SOP2_SHIFT_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
226 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_32:$src1),
227 opName#" $dst, $src0, $src1", pattern
228>;
229
Christian Konig72d5d5c2013-02-21 15:16:44 +0000230
Matt Arsenault0cb92e12014-04-11 19:25:18 +0000231class SOPC_Helper <bits<7> op, RegisterClass rc, ValueType vt,
232 string opName, PatLeaf cond> : SOPC <
233 op, (outs SCCReg:$dst), (ins rc:$src0, rc:$src1),
234 opName#" $dst, $src0, $src1", []>;
235
236class SOPC_32<bits<7> op, string opName, PatLeaf cond = COND_NULL>
237 : SOPC_Helper<op, SSrc_32, i32, opName, cond>;
238
239class SOPC_64<bits<7> op, string opName, PatLeaf cond = COND_NULL>
240 : SOPC_Helper<op, SSrc_64, i64, opName, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000241
Christian Konige0130a22013-02-21 15:17:13 +0000242class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
243 op, (outs SReg_32:$dst), (ins i16imm:$src0),
244 opName#" $dst, $src0", pattern
245>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000246
Christian Konige0130a22013-02-21 15:17:13 +0000247class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
248 op, (outs SReg_64:$dst), (ins i16imm:$src0),
249 opName#" $dst, $src0", pattern
250>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000251
Christian Konig9c7afd12013-03-18 11:33:50 +0000252multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
253 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000254 def _IMM : SMRD <
255 op, 1, (outs dstClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000256 (ins baseClass:$sbase, u32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000257 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000258 >;
259
260 def _SGPR : SMRD <
261 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000262 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000263 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000264 >;
265}
266
267//===----------------------------------------------------------------------===//
268// Vector ALU classes
269//===----------------------------------------------------------------------===//
270
Christian Konigf741fbf2013-02-26 17:52:42 +0000271class VOP <string opName> {
272 string OpName = opName;
273}
274
Christian Konig3c145802013-03-27 09:12:59 +0000275class VOP2_REV <string revOp, bit isOrig> {
276 string RevOp = revOp;
277 bit IsOrig = isOrig;
278}
279
Tom Stellardc721a232014-05-16 20:56:47 +0000280class SIMCInstr <string pseudo, int subtarget> {
281 string PseudoInstr = pseudo;
282 int Subtarget = subtarget;
283}
284
285multiclass VOP3_m <bits<9> op, dag outs, dag ins, string asm, list<dag> pattern,
286 string opName> {
287
Tom Stellard092f3322014-06-17 19:34:46 +0000288 def "" : VOP3Common <outs, ins, "", pattern>, VOP <opName>,
Tom Stellardc721a232014-05-16 20:56:47 +0000289 SIMCInstr<OpName, SISubtarget.NONE> {
290 let isPseudo = 1;
291 }
292
293 def _si : VOP3 <op, outs, ins, asm, []>, SIMCInstr<opName, SISubtarget.SI>;
294
295}
296
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000297// This must always be right before the operand being input modified.
298def InputMods : OperandWithDefaultOps <i32, (ops (i32 0))> {
299 let PrintMethod = "printOperandAndMods";
300}
301
Christian Konig3da70172013-02-21 15:16:53 +0000302multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
303 string opName, list<dag> pattern> {
304
Christian Konigf741fbf2013-02-26 17:52:42 +0000305 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000306 op, (outs drc:$dst), (ins src:$src0),
307 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000308 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000309
Christian Konig3da70172013-02-21 15:16:53 +0000310 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000311 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000312 (outs drc:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000313 (ins InputMods:$src0_modifiers, src:$src0, i32imm:$clamp, i32imm:$omod),
314 opName#"_e64 $dst, $src0_modifiers, $clamp, $omod", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000315 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000316 let src1 = SIOperand.ZERO;
317 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000318 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000319}
320
Christian Konig3da70172013-02-21 15:16:53 +0000321multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
322 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
323
324multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
325 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
326
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000327multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
328 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
329
330multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
331 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
332
Christian Konigae034e62013-02-21 15:16:58 +0000333multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000334 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000335 def _e32 : VOP2 <
336 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
337 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000338 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000339
Christian Konigae034e62013-02-21 15:16:58 +0000340 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000341 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000342 (outs vrc:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000343 (ins InputMods:$src0_modifiers, arc:$src0,
344 InputMods:$src1_modifiers, arc:$src1,
345 i32imm:$clamp, i32imm:$omod),
346 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod", []
Christian Konig3c145802013-03-27 09:12:59 +0000347 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000348 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000349 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000350}
351
Christian Konig3c145802013-03-27 09:12:59 +0000352multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
353 string revOp = opName>
354 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000355
Christian Konig3c145802013-03-27 09:12:59 +0000356multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
357 string revOp = opName>
358 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000359
Christian Konig3c145802013-03-27 09:12:59 +0000360multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
Tom Stellarde28859f2014-03-07 20:12:39 +0000361 RegisterClass src0_rc, string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000362
363 def _e32 : VOP2 <
Tom Stellarde28859f2014-03-07 20:12:39 +0000364 op, (outs VReg_32:$dst), (ins src0_rc:$src0, VReg_32:$src1),
Christian Konigd3039962013-02-26 17:52:09 +0000365 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000366 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000367
368 def _e64 : VOP3b <
369 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
370 (outs VReg_32:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000371 (ins InputMods: $src0_modifiers, VSrc_32:$src0,
372 InputMods:$src1_modifiers, VSrc_32:$src1,
373 i32imm:$clamp, i32imm:$omod),
374 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod", []
Christian Konig3c145802013-03-27 09:12:59 +0000375 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000376 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000377 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
378 can write it into any SGPR. We currently don't use the carry out,
379 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000380 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000381 }
382}
383
Christian Konig72d5d5c2013-02-21 15:16:44 +0000384multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Matt Arsenault520e7c42014-06-18 16:53:48 +0000385 string opName, ValueType vt, PatLeaf cond, bit defExec = 0> {
Christian Konigb19849a2013-02-21 15:17:04 +0000386 def _e32 : VOPC <
387 op, (ins arc:$src0, vrc:$src1),
388 opName#"_e32 $dst, $src0, $src1", []
Matt Arsenault520e7c42014-06-18 16:53:48 +0000389 >, VOP <opName> {
390 let Defs = !if(defExec, [VCC, EXEC], [VCC]);
391 }
Christian Konigb19849a2013-02-21 15:17:04 +0000392
Christian Konig72d5d5c2013-02-21 15:16:44 +0000393 def _e64 : VOP3 <
394 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
395 (outs SReg_64:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000396 (ins InputMods:$src0_modifiers, arc:$src0,
397 InputMods:$src1_modifiers, arc:$src1,
398 InstFlag:$clamp, InstFlag:$omod),
399 opName#"_e64 $dst, $src0_modifiers, $src1_modifiers, $clamp, $omod",
Christian Konigb19849a2013-02-21 15:17:04 +0000400 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000401 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000402 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000403 >, VOP <opName> {
Matt Arsenault520e7c42014-06-18 16:53:48 +0000404 let Defs = !if(defExec, [EXEC], []);
Tom Stellard459a79a2013-05-20 15:02:08 +0000405 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000406 let src2_modifiers = 0;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000407 }
408}
409
Christian Konigb19849a2013-02-21 15:17:04 +0000410multiclass VOPC_32 <bits<8> op, string opName,
411 ValueType vt = untyped, PatLeaf cond = COND_NULL>
412 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000413
Christian Konigb19849a2013-02-21 15:17:04 +0000414multiclass VOPC_64 <bits<8> op, string opName,
415 ValueType vt = untyped, PatLeaf cond = COND_NULL>
416 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000417
Matt Arsenault520e7c42014-06-18 16:53:48 +0000418multiclass VOPCX_32 <bits<8> op, string opName,
419 ValueType vt = untyped, PatLeaf cond = COND_NULL>
420 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond, 1>;
421
422multiclass VOPCX_64 <bits<8> op, string opName,
423 ValueType vt = untyped, PatLeaf cond = COND_NULL>
424 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond, 1>;
425
Tom Stellardc721a232014-05-16 20:56:47 +0000426multiclass VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3_m <
Christian Konigf5754a02013-02-21 15:17:09 +0000427 op, (outs VReg_32:$dst),
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000428 (ins InputMods: $src0_modifiers, VSrc_32:$src0, InputMods:$src1_modifiers,
429 VSrc_32:$src1, InputMods:$src2_modifiers, VSrc_32:$src2,
430 InstFlag:$clamp, InstFlag:$omod),
Tom Stellardc721a232014-05-16 20:56:47 +0000431 opName#" $dst, $src0_modifiers, $src1, $src2, $clamp, $omod", pattern, opName
432>;
Christian Konigf5754a02013-02-21 15:17:09 +0000433
Matt Arsenault93840c02014-06-09 17:00:46 +0000434class VOP3_64_32 <bits <9> op, string opName, list<dag> pattern> : VOP3 <
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000435 op, (outs VReg_64:$dst),
436 (ins VSrc_64:$src0, VSrc_32:$src1),
437 opName#" $dst, $src0, $src1", pattern
438>, VOP <opName> {
439
440 let src2 = SIOperand.ZERO;
Vincent Lejeune94af31f2014-05-10 19:18:33 +0000441 let src0_modifiers = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000442 let clamp = 0;
443 let omod = 0;
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000444}
445
Christian Konigf5754a02013-02-21 15:17:09 +0000446class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
447 op, (outs VReg_64:$dst),
Matt Arsenaultdbc9aae2014-06-18 17:13:51 +0000448 (ins InputMods:$src0_modifiers, VSrc_64:$src0,
449 InputMods:$src1_modifiers, VSrc_64:$src1,
450 InputMods:$src2_modifiers, VSrc_64:$src2,
451 InstFlag:$clamp, InstFlag:$omod),
452 opName#" $dst, $src0_modifiers, $src1_modifiers, $src2_modifiers, $clamp, $omod", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000453>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000454
Matt Arsenaultf2b0aeb2014-06-23 18:28:28 +0000455
456class VOP3b_Helper <bits<9> op, RegisterClass vrc, RegisterClass arc,
457 string opName, list<dag> pattern> : VOP3 <
458 op, (outs vrc:$dst0, SReg_64:$dst1),
459 (ins arc:$src0, arc:$src1, arc:$src2,
460 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
461 opName#" $dst0, $dst1, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
462>, VOP <opName>;
463
464
465class VOP3b_64 <bits<9> op, string opName, list<dag> pattern> :
466 VOP3b_Helper <op, VReg_64, VSrc_64, opName, pattern>;
467
468class VOP3b_32 <bits<9> op, string opName, list<dag> pattern> :
469 VOP3b_Helper <op, VReg_32, VSrc_32, opName, pattern>;
470
Christian Konig72d5d5c2013-02-21 15:16:44 +0000471//===----------------------------------------------------------------------===//
472// Vector I/O classes
473//===----------------------------------------------------------------------===//
474
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000475class DS_1A <bits<8> op, dag outs, dag ins, string asm, list<dag> pat> :
476 DS <op, outs, ins, asm, pat> {
477 bits<16> offset;
478
Matt Arsenault99ed7892014-03-19 22:19:49 +0000479 // Single load interpret the 2 i8imm operands as a single i16 offset.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000480 let offset0 = offset{7-0};
481 let offset1 = offset{15-8};
482}
483
484class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000485 op,
486 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000487 (ins i1imm:$gds, VReg_32:$addr, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000488 asm#" $vdst, $addr, $offset, [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000489 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000490 let data0 = 0;
491 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000492 let mayLoad = 1;
493 let mayStore = 0;
494}
495
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000496class DS_Load2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
497 op,
498 (outs regClass:$vdst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000499 (ins i1imm:$gds, VReg_32:$addr, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000500 asm#" $gds, $vdst, $addr, $offset0, $offset1, [M0]",
501 []> {
502 let data0 = 0;
503 let data1 = 0;
504 let mayLoad = 1;
505 let mayStore = 0;
506}
507
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000508class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000509 op,
510 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000511 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000512 asm#" $addr, $data0, $offset [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000513 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000514 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000515 let mayStore = 1;
516 let mayLoad = 0;
517 let vdst = 0;
518}
519
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000520class DS_Store2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
521 op,
522 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000523 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, u8imm:$offset0, u8imm:$offset1),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000524 asm#" $addr, $data0, $data1, $offset0, $offset1 [M0]",
525 []> {
526 let mayStore = 1;
527 let mayLoad = 0;
528 let vdst = 0;
529}
530
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000531// 1 address, 1 data.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000532class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
Tom Stellard13c68ef2013-09-05 18:38:09 +0000533 op,
534 (outs rc:$vdst),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000535 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000536 asm#" $vdst, $addr, $data0, $offset, [M0]",
Tom Stellard13c68ef2013-09-05 18:38:09 +0000537 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000538
539 let data1 = 0;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000540 let mayStore = 1;
541 let mayLoad = 1;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000542}
543
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000544// 1 address, 2 data.
545class DS_1A2D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
546 op,
547 (outs rc:$vdst),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000548 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000549 asm#" $vdst, $addr, $data0, $data1, $offset, [M0]",
550 []> {
551 let mayStore = 1;
552 let mayLoad = 1;
553}
554
555// 1 address, 2 data.
556class DS_1A2D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
557 op,
558 (outs),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000559 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, rc:$data1, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000560 asm#" $addr, $data0, $data1, $offset, [M0]",
561 []> {
562 let mayStore = 1;
563 let mayLoad = 1;
564}
565
566// 1 address, 1 data.
567class DS_1A1D_NORET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
568 op,
569 (outs),
Matt Arsenaultcaa0ec22014-06-11 18:08:54 +0000570 (ins i1imm:$gds, VReg_32:$addr, rc:$data0, u16imm:$offset),
Matt Arsenault8c6613d2014-06-11 18:08:39 +0000571 asm#" $addr, $data0, $offset, [M0]",
572 []> {
573
574 let data1 = 0;
575 let mayStore = 1;
576 let mayLoad = 1;
577}
578
Christian Konig72d5d5c2013-02-21 15:16:44 +0000579class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
580 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000581 (outs),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000582 (ins regClass:$vdata, u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000583 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000584 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000585 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
586 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000587 []> {
588 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000589 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000590}
Tom Stellard75aadc22012-12-11 21:25:42 +0000591
Tom Stellard7c1838d2014-07-02 20:53:56 +0000592multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass,
593 ValueType load_vt = i32,
594 SDPatternOperator ld = null_frag> {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000595
Michel Danzer13736222014-01-27 07:20:51 +0000596 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000597
Michel Danzer13736222014-01-27 07:20:51 +0000598 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000599
Michel Danzer13736222014-01-27 07:20:51 +0000600 let offen = 0, idxen = 0 in {
601 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
602 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000603 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000604 i1imm:$slc, i1imm:$tfe),
605 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
606 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000607
Michel Danzer13736222014-01-27 07:20:51 +0000608 let offen = 1, idxen = 0, offset = 0 in {
609 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
610 (ins SReg_128:$srsrc, VReg_32:$vaddr,
611 SSrc_32:$soffset, i1imm:$glc, i1imm:$slc,
612 i1imm:$tfe),
613 asm#" $vdata, $srsrc + $vaddr + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
614 }
615
616 let offen = 0, idxen = 1 in {
617 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
618 (ins SReg_128:$srsrc, VReg_32:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000619 u16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
Michel Danzer13736222014-01-27 07:20:51 +0000620 i1imm:$slc, i1imm:$tfe),
621 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
622 }
623
624 let offen = 1, idxen = 1 in {
625 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
626 (ins SReg_128:$srsrc, VReg_64:$vaddr,
627 SSrc_32:$soffset, i1imm:$glc,
628 i1imm:$slc, i1imm:$tfe),
629 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
630 }
631 }
632
633 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
634 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000635 (ins SReg_128:$srsrc, VReg_64:$vaddr, u16imm:$offset),
Tom Stellard7c1838d2014-07-02 20:53:56 +0000636 asm#" $vdata, $srsrc + $vaddr + $offset",
637 [(set load_vt:$vdata, (ld (MUBUFAddr64 v4i32:$srsrc,
638 i64:$vaddr, u16imm:$offset)))]>;
Michel Danzer13736222014-01-27 07:20:51 +0000639 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000640 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000641}
642
Tom Stellardb02c2682014-06-24 23:33:07 +0000643class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
644 ValueType store_vt, SDPatternOperator st> :
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000645 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000646 u16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000647 name#" $vdata, $srsrc + $vaddr + $offset",
Tom Stellardb02c2682014-06-24 23:33:07 +0000648 [(st store_vt:$vdata, (MUBUFAddr64 v4i32:$srsrc, i64:$vaddr, u16imm:$offset))]> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000649
650 let mayLoad = 0;
651 let mayStore = 1;
652
653 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000654 let offen = 0;
655 let idxen = 0;
656 let glc = 0;
657 let addr64 = 1;
658 let lds = 0;
659 let slc = 0;
660 let tfe = 0;
661 let soffset = 128; // ZERO
662}
663
Christian Konig72d5d5c2013-02-21 15:16:44 +0000664class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
665 op,
666 (outs regClass:$dst),
Matt Arsenault4d7d3832014-04-15 22:32:49 +0000667 (ins u16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000668 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000669 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000670 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
671 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000672 []> {
673 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000674 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000675}
676
Tom Stellard682bfbc2013-10-10 17:11:24 +0000677class MIMG_Mask <string op, int channels> {
678 string Op = op;
679 int Channels = channels;
680}
681
Tom Stellard16a9a202013-08-14 23:24:17 +0000682class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000683 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000684 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000685 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000686 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000687 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000688 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000689 SReg_256:$srsrc),
690 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
691 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
692 []> {
693 let SSAMP = 0;
694 let mayLoad = 1;
695 let mayStore = 0;
696 let hasPostISelHook = 1;
697}
698
Tom Stellard682bfbc2013-10-10 17:11:24 +0000699multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
700 RegisterClass dst_rc,
701 int channels> {
702 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
703 MIMG_Mask<asm#"_V1", channels>;
704 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
705 MIMG_Mask<asm#"_V2", channels>;
706 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
707 MIMG_Mask<asm#"_V4", channels>;
708}
709
Tom Stellard16a9a202013-08-14 23:24:17 +0000710multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000711 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
712 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
713 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
714 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000715}
716
717class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000718 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000719 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000720 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000721 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000722 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000723 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000724 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000725 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
726 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000727 []> {
728 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000729 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000730 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000731}
732
Tom Stellard682bfbc2013-10-10 17:11:24 +0000733multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
734 RegisterClass dst_rc,
735 int channels> {
736 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
737 MIMG_Mask<asm#"_V1", channels>;
738 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
739 MIMG_Mask<asm#"_V2", channels>;
740 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
741 MIMG_Mask<asm#"_V4", channels>;
742 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
743 MIMG_Mask<asm#"_V8", channels>;
744 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
745 MIMG_Mask<asm#"_V16", channels>;
746}
747
Tom Stellard16a9a202013-08-14 23:24:17 +0000748multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000749 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
750 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
751 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
752 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000753}
754
Marek Olsak51b8e7b2014-06-18 22:00:29 +0000755class MIMG_Gather_Helper <bits<7> op, string asm,
756 RegisterClass dst_rc,
757 RegisterClass src_rc> : MIMG <
758 op,
759 (outs dst_rc:$vdata),
760 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
761 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
762 SReg_256:$srsrc, SReg_128:$ssamp),
763 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
764 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
765 []> {
766 let mayLoad = 1;
767 let mayStore = 0;
768
769 // DMASK was repurposed for GATHER4. 4 components are always
770 // returned and DMASK works like a swizzle - it selects
771 // the component to fetch. The only useful DMASK values are
772 // 1=red, 2=green, 4=blue, 8=alpha. (e.g. 1 returns
773 // (red,red,red,red) etc.) The ISA document doesn't mention
774 // this.
775 // Therefore, disable all code which updates DMASK by setting these two:
776 let MIMG = 0;
777 let hasPostISelHook = 0;
778}
779
780multiclass MIMG_Gather_Src_Helper <bits<7> op, string asm,
781 RegisterClass dst_rc,
782 int channels> {
783 def _V1 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_32>,
784 MIMG_Mask<asm#"_V1", channels>;
785 def _V2 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_64>,
786 MIMG_Mask<asm#"_V2", channels>;
787 def _V4 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_128>,
788 MIMG_Mask<asm#"_V4", channels>;
789 def _V8 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_256>,
790 MIMG_Mask<asm#"_V8", channels>;
791 def _V16 : MIMG_Gather_Helper <op, asm, dst_rc, VReg_512>,
792 MIMG_Mask<asm#"_V16", channels>;
793}
794
795multiclass MIMG_Gather <bits<7> op, string asm> {
796 defm _V1 : MIMG_Gather_Src_Helper<op, asm, VReg_32, 1>;
797 defm _V2 : MIMG_Gather_Src_Helper<op, asm, VReg_64, 2>;
798 defm _V3 : MIMG_Gather_Src_Helper<op, asm, VReg_96, 3>;
799 defm _V4 : MIMG_Gather_Src_Helper<op, asm, VReg_128, 4>;
800}
801
Christian Konigf741fbf2013-02-26 17:52:42 +0000802//===----------------------------------------------------------------------===//
803// Vector instruction mappings
804//===----------------------------------------------------------------------===//
805
806// Maps an opcode in e32 form to its e64 equivalent
807def getVOPe64 : InstrMapping {
808 let FilterClass = "VOP";
809 let RowFields = ["OpName"];
810 let ColFields = ["Size"];
811 let KeyCol = ["4"];
812 let ValueCols = [["8"]];
813}
814
Christian Konig3c145802013-03-27 09:12:59 +0000815// Maps an original opcode to its commuted version
816def getCommuteRev : InstrMapping {
817 let FilterClass = "VOP2_REV";
818 let RowFields = ["RevOp"];
819 let ColFields = ["IsOrig"];
820 let KeyCol = ["1"];
821 let ValueCols = [["0"]];
822}
823
Tom Stellard682bfbc2013-10-10 17:11:24 +0000824def getMaskedMIMGOp : InstrMapping {
825 let FilterClass = "MIMG_Mask";
826 let RowFields = ["Op"];
827 let ColFields = ["Channels"];
828 let KeyCol = ["4"];
829 let ValueCols = [["1"], ["2"], ["3"] ];
830}
831
Christian Konig3c145802013-03-27 09:12:59 +0000832// Maps an commuted opcode to its original version
833def getCommuteOrig : InstrMapping {
834 let FilterClass = "VOP2_REV";
835 let RowFields = ["RevOp"];
836 let ColFields = ["IsOrig"];
837 let KeyCol = ["0"];
838 let ValueCols = [["1"]];
839}
840
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000841def isDS : InstrMapping {
842 let FilterClass = "DS";
843 let RowFields = ["Inst"];
844 let ColFields = ["Size"];
845 let KeyCol = ["8"];
846 let ValueCols = [["8"]];
847}
848
Tom Stellardc721a232014-05-16 20:56:47 +0000849def getMCOpcode : InstrMapping {
850 let FilterClass = "SIMCInstr";
851 let RowFields = ["PseudoInstr"];
852 let ColFields = ["Subtarget"];
853 let KeyCol = [!cast<string>(SISubtarget.NONE)];
854 let ValueCols = [[!cast<string>(SISubtarget.SI)]];
855}
856
Tom Stellard75aadc22012-12-11 21:25:42 +0000857include "SIInstructions.td"