blob: cb2358b1c2b4f1150d22e9e977eaab62b188d7f5 [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
10//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +000011// SI DAG Nodes
12//===----------------------------------------------------------------------===//
13
Tom Stellard89093802013-02-07 19:39:40 +000014// SMRD takes a 64bit memory address and can only add an 32bit offset
15def SIadd64bit32bit : SDNode<"ISD::ADD",
16 SDTypeProfile<1, 2, [SDTCisSameAs<0, 1>, SDTCisVT<0, i64>, SDTCisVT<2, i32>]>
17>;
18
Tom Stellard9fa17912013-08-14 23:24:45 +000019def SIload_constant : SDNode<"AMDGPUISD::LOAD_CONSTANT",
20 SDTypeProfile<1, 2, [SDTCisVT<0, f32>, SDTCisVT<1, i128>, SDTCisVT<2, i32>]>,
21 [SDNPMayLoad, SDNPMemOperand]
22>;
23
Tom Stellardafcf12f2013-09-12 02:55:14 +000024def SItbuffer_store : SDNode<"AMDGPUISD::TBUFFER_STORE_FORMAT",
25 SDTypeProfile<0, 13,
26 [SDTCisVT<0, i128>, // rsrc(SGPR)
27 SDTCisVT<1, iAny>, // vdata(VGPR)
28 SDTCisVT<2, i32>, // num_channels(imm)
29 SDTCisVT<3, i32>, // vaddr(VGPR)
30 SDTCisVT<4, i32>, // soffset(SGPR)
31 SDTCisVT<5, i32>, // inst_offset(imm)
32 SDTCisVT<6, i32>, // dfmt(imm)
33 SDTCisVT<7, i32>, // nfmt(imm)
34 SDTCisVT<8, i32>, // offen(imm)
35 SDTCisVT<9, i32>, // idxen(imm)
36 SDTCisVT<10, i32>, // glc(imm)
37 SDTCisVT<11, i32>, // slc(imm)
38 SDTCisVT<12, i32> // tfe(imm)
39 ]>,
40 [SDNPMayStore, SDNPMemOperand, SDNPHasChain]
41>;
42
Tom Stellard9fa17912013-08-14 23:24:45 +000043def SIload_input : SDNode<"AMDGPUISD::LOAD_INPUT",
44 SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisVT<1, i128>, SDTCisVT<2, i16>,
45 SDTCisVT<3, i32>]>
46>;
47
48class SDSample<string opcode> : SDNode <opcode,
Tom Stellard67850652013-08-14 23:24:53 +000049 SDTypeProfile<1, 4, [SDTCisVT<0, v4f32>, SDTCisVT<2, v32i8>,
Tom Stellard9fa17912013-08-14 23:24:45 +000050 SDTCisVT<3, i128>, SDTCisVT<4, i32>]>
51>;
52
53def SIsample : SDSample<"AMDGPUISD::SAMPLE">;
54def SIsampleb : SDSample<"AMDGPUISD::SAMPLEB">;
55def SIsampled : SDSample<"AMDGPUISD::SAMPLED">;
56def SIsamplel : SDSample<"AMDGPUISD::SAMPLEL">;
57
Tom Stellard26075d52013-02-07 19:39:38 +000058// Transformation function, extract the lower 32bit of a 64bit immediate
59def LO32 : SDNodeXForm<imm, [{
60 return CurDAG->getTargetConstant(N->getZExtValue() & 0xffffffff, MVT::i32);
61}]>;
62
Tom Stellardab8a8c82013-07-12 18:15:02 +000063def LO32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000064 APInt V = N->getValueAPF().bitcastToAPInt().trunc(32);
65 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000066}]>;
67
Tom Stellard26075d52013-02-07 19:39:38 +000068// Transformation function, extract the upper 32bit of a 64bit immediate
69def HI32 : SDNodeXForm<imm, [{
70 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
71}]>;
72
Tom Stellardab8a8c82013-07-12 18:15:02 +000073def HI32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000074 APInt V = N->getValueAPF().bitcastToAPInt().lshr(32).trunc(32);
75 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000076}]>;
77
Tom Stellard044e4182014-02-06 18:36:34 +000078def IMM8bitDWORD : PatLeaf <(imm),
79 [{return (N->getZExtValue() & ~0x3FC) == 0;}]
Tom Stellard89093802013-02-07 19:39:40 +000080>;
81
Tom Stellard044e4182014-02-06 18:36:34 +000082def as_dword_i32imm : SDNodeXForm<imm, [{
83 return CurDAG->getTargetConstant(N->getZExtValue() >> 2, MVT::i32);
84}]>;
85
Tom Stellardafcf12f2013-09-12 02:55:14 +000086def as_i1imm : SDNodeXForm<imm, [{
87 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i1);
88}]>;
89
90def as_i8imm : SDNodeXForm<imm, [{
91 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i8);
92}]>;
93
Tom Stellard07a10a32013-06-03 17:39:43 +000094def as_i16imm : SDNodeXForm<imm, [{
95 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
96}]>;
97
Tom Stellard044e4182014-02-06 18:36:34 +000098def as_i32imm: SDNodeXForm<imm, [{
99 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i32);
100}]>;
101
Tom Stellard07a10a32013-06-03 17:39:43 +0000102def IMM12bit : PatLeaf <(imm),
103 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +0000104>;
105
Tom Stellarde2367942014-02-06 18:36:41 +0000106def mubuf_vaddr_offset : PatFrag<
107 (ops node:$ptr, node:$offset, node:$imm_offset),
108 (add (add node:$ptr, node:$offset), node:$imm_offset)
109>;
110
Christian Konigf82901a2013-02-26 17:52:23 +0000111class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Bill Wendlinga3cd3502013-06-19 21:36:55 +0000112 return
113 (*(const SITargetLowering *)getTargetLowering()).analyzeImmediate(N) == 0;
Christian Konigb559b072013-02-16 11:28:36 +0000114}]>;
115
Tom Stellarddf94dc32013-08-14 23:24:24 +0000116class SGPRImm <dag frag> : PatLeaf<frag, [{
117 if (TM.getSubtarget<AMDGPUSubtarget>().getGeneration() <
118 AMDGPUSubtarget::SOUTHERN_ISLANDS) {
119 return false;
120 }
121 const SIRegisterInfo *SIRI =
122 static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
123 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
124 U != E; ++U) {
125 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
126 return true;
127 }
128 }
129 return false;
130}]>;
131
Matt Arsenaulta98cd6a2013-12-19 05:32:55 +0000132def FRAMEri32 : Operand<iPTR> {
Tom Stellard81d871d2013-11-13 23:36:50 +0000133 let MIOperandInfo = (ops SReg_32:$ptr, i32imm:$index);
134}
135
Christian Konig72d5d5c2013-02-21 15:16:44 +0000136//===----------------------------------------------------------------------===//
137// SI assembler operands
138//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000139
Christian Konigeabf8332013-02-21 15:16:49 +0000140def SIOperand {
141 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000142 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +0000143}
144
Christian Konig72d5d5c2013-02-21 15:16:44 +0000145include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +0000146
Christian Konig72d5d5c2013-02-21 15:16:44 +0000147//===----------------------------------------------------------------------===//
148//
149// SI Instruction multiclass helpers.
150//
151// Instructions with _32 take 32-bit operands.
152// Instructions with _64 take 64-bit operands.
153//
154// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
155// encoding is the standard encoding, but instruction that make use of
156// any of the instruction modifiers must use the 64-bit encoding.
157//
158// Instructions with _e32 use the 32-bit encoding.
159// Instructions with _e64 use the 64-bit encoding.
160//
161//===----------------------------------------------------------------------===//
162
163//===----------------------------------------------------------------------===//
164// Scalar classes
165//===----------------------------------------------------------------------===//
166
Christian Konige0130a22013-02-21 15:17:13 +0000167class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
168 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
169 opName#" $dst, $src0", pattern
170>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000171
Christian Konige0130a22013-02-21 15:17:13 +0000172class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
173 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
174 opName#" $dst, $src0", pattern
175>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000176
Christian Konige0130a22013-02-21 15:17:13 +0000177class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
178 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
179 opName#" $dst, $src0, $src1", pattern
180>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000181
Christian Konige0130a22013-02-21 15:17:13 +0000182class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
183 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
184 opName#" $dst, $src0, $src1", pattern
185>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000186
Tom Stellard82166022013-11-13 23:36:37 +0000187class SOP2_SHIFT_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
188 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_32:$src1),
189 opName#" $dst, $src0, $src1", pattern
190>;
191
Christian Konige0130a22013-02-21 15:17:13 +0000192class SOPC_32 <bits<7> op, string opName, list<dag> pattern> : SOPC <
193 op, (outs SCCReg:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
194 opName#" $dst, $src0, $src1", pattern
195>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000196
Christian Konige0130a22013-02-21 15:17:13 +0000197class SOPC_64 <bits<7> op, string opName, list<dag> pattern> : SOPC <
198 op, (outs SCCReg:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
199 opName#" $dst, $src0, $src1", pattern
200>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000201
Christian Konige0130a22013-02-21 15:17:13 +0000202class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
203 op, (outs SReg_32:$dst), (ins i16imm:$src0),
204 opName#" $dst, $src0", pattern
205>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000206
Christian Konige0130a22013-02-21 15:17:13 +0000207class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
208 op, (outs SReg_64:$dst), (ins i16imm:$src0),
209 opName#" $dst, $src0", pattern
210>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000211
Christian Konig9c7afd12013-03-18 11:33:50 +0000212multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
213 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000214 def _IMM : SMRD <
215 op, 1, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000216 (ins baseClass:$sbase, i32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000217 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000218 >;
219
220 def _SGPR : SMRD <
221 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000222 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000223 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000224 >;
225}
226
227//===----------------------------------------------------------------------===//
228// Vector ALU classes
229//===----------------------------------------------------------------------===//
230
Christian Konigf741fbf2013-02-26 17:52:42 +0000231class VOP <string opName> {
232 string OpName = opName;
233}
234
Christian Konig3c145802013-03-27 09:12:59 +0000235class VOP2_REV <string revOp, bit isOrig> {
236 string RevOp = revOp;
237 bit IsOrig = isOrig;
238}
239
Christian Konig3da70172013-02-21 15:16:53 +0000240multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
241 string opName, list<dag> pattern> {
242
Christian Konigf741fbf2013-02-26 17:52:42 +0000243 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000244 op, (outs drc:$dst), (ins src:$src0),
245 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000246 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000247
Christian Konig3da70172013-02-21 15:16:53 +0000248 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000249 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000250 (outs drc:$dst),
251 (ins src:$src0,
252 i32imm:$abs, i32imm:$clamp,
253 i32imm:$omod, i32imm:$neg),
254 opName#"_e64 $dst, $src0, $abs, $clamp, $omod, $neg", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000255 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000256 let src1 = SIOperand.ZERO;
257 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000258 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000259}
260
Christian Konig3da70172013-02-21 15:16:53 +0000261multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
262 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
263
264multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
265 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
266
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000267multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
268 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
269
270multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
271 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
272
Christian Konigae034e62013-02-21 15:16:58 +0000273multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000274 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000275 def _e32 : VOP2 <
276 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
277 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000278 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000279
Christian Konigae034e62013-02-21 15:16:58 +0000280 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000281 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000282 (outs vrc:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000283 (ins arc:$src0, arc:$src1,
Christian Konigae034e62013-02-21 15:16:58 +0000284 i32imm:$abs, i32imm:$clamp,
285 i32imm:$omod, i32imm:$neg),
286 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000287 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000288 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000289 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000290}
291
Christian Konig3c145802013-03-27 09:12:59 +0000292multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
293 string revOp = opName>
294 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000295
Christian Konig3c145802013-03-27 09:12:59 +0000296multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
297 string revOp = opName>
298 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000299
Christian Konig3c145802013-03-27 09:12:59 +0000300multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
301 string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000302
303 def _e32 : VOP2 <
304 op, (outs VReg_32:$dst), (ins VSrc_32:$src0, VReg_32:$src1),
305 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000306 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000307
308 def _e64 : VOP3b <
309 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
310 (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000311 (ins VSrc_32:$src0, VSrc_32:$src1,
Christian Konigd3039962013-02-26 17:52:09 +0000312 i32imm:$abs, i32imm:$clamp,
313 i32imm:$omod, i32imm:$neg),
314 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000315 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000316 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000317 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
318 can write it into any SGPR. We currently don't use the carry out,
319 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000320 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000321 }
322}
323
Christian Konig72d5d5c2013-02-21 15:16:44 +0000324multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000325 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000326
Christian Konigb19849a2013-02-21 15:17:04 +0000327 def _e32 : VOPC <
328 op, (ins arc:$src0, vrc:$src1),
329 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000330 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000331
Christian Konig72d5d5c2013-02-21 15:16:44 +0000332 def _e64 : VOP3 <
333 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
334 (outs SReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000335 (ins arc:$src0, arc:$src1,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000336 InstFlag:$abs, InstFlag:$clamp,
337 InstFlag:$omod, InstFlag:$neg),
Christian Konigb19849a2013-02-21 15:17:04 +0000338 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg",
339 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000340 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000341 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000342 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000343 let src2 = SIOperand.ZERO;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000344 }
345}
346
Christian Konigb19849a2013-02-21 15:17:04 +0000347multiclass VOPC_32 <bits<8> op, string opName,
348 ValueType vt = untyped, PatLeaf cond = COND_NULL>
349 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000350
Christian Konigb19849a2013-02-21 15:17:04 +0000351multiclass VOPC_64 <bits<8> op, string opName,
352 ValueType vt = untyped, PatLeaf cond = COND_NULL>
353 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000354
Christian Konigf5754a02013-02-21 15:17:09 +0000355class VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
356 op, (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000357 (ins VSrc_32:$src0, VSrc_32:$src1, VSrc_32:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000358 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000359 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000360>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000361
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000362class VOP3_64_Shift <bits <9> op, string opName, list<dag> pattern> : VOP3 <
363 op, (outs VReg_64:$dst),
364 (ins VSrc_64:$src0, VSrc_32:$src1),
365 opName#" $dst, $src0, $src1", pattern
366>, VOP <opName> {
367
368 let src2 = SIOperand.ZERO;
369 let abs = 0;
370 let clamp = 0;
371 let omod = 0;
372 let neg = 0;
373}
374
Christian Konigf5754a02013-02-21 15:17:09 +0000375class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
376 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000377 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000378 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000379 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000380>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000381
Christian Konig72d5d5c2013-02-21 15:16:44 +0000382//===----------------------------------------------------------------------===//
383// Vector I/O classes
384//===----------------------------------------------------------------------===//
385
Michel Danzer1c454302013-07-10 16:36:43 +0000386class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
387 op,
388 (outs regClass:$vdst),
Tom Stellarddba25712013-08-16 01:18:43 +0000389 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
390 i8imm:$offset0, i8imm:$offset1),
Michel Danzer1c454302013-07-10 16:36:43 +0000391 asm#" $vdst, $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
392 []> {
393 let mayLoad = 1;
394 let mayStore = 0;
395}
396
397class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
398 op,
399 (outs),
Tom Stellarddba25712013-08-16 01:18:43 +0000400 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
401 i8imm:$offset0, i8imm:$offset1),
Michel Danzer1c454302013-07-10 16:36:43 +0000402 asm#" $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
403 []> {
404 let mayStore = 1;
405 let mayLoad = 0;
406 let vdst = 0;
407}
408
Tom Stellard13c68ef2013-09-05 18:38:09 +0000409class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS <
410 op,
411 (outs rc:$vdst),
412 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, i8imm:$offset0,
413 i8imm:$offset1),
414 asm#" $gds, $vdst, $addr, $data0, $offset0, $offset1, [M0]",
415 []> {
416 let mayStore = 1;
417 let mayLoad = 1;
418 let data1 = 0;
419}
420
Christian Konig72d5d5c2013-02-21 15:16:44 +0000421class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
422 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000423 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000424 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
425 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000426 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000427 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
428 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000429 []> {
430 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000431 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000432}
Tom Stellard75aadc22012-12-11 21:25:42 +0000433
Tom Stellardf1ee7162013-05-20 15:02:31 +0000434multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
435
Michel Danzer13736222014-01-27 07:20:51 +0000436 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000437
Michel Danzer13736222014-01-27 07:20:51 +0000438 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000439
Michel Danzer13736222014-01-27 07:20:51 +0000440 let offen = 0, idxen = 0 in {
441 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
442 (ins SReg_128:$srsrc, VReg_32:$vaddr,
443 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
444 i1imm:$slc, i1imm:$tfe),
445 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
446 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000447
Michel Danzer13736222014-01-27 07:20:51 +0000448 let offen = 1, idxen = 0, offset = 0 in {
449 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
450 (ins SReg_128:$srsrc, VReg_32:$vaddr,
451 SSrc_32:$soffset, i1imm:$glc, i1imm:$slc,
452 i1imm:$tfe),
453 asm#" $vdata, $srsrc + $vaddr + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
454 }
455
456 let offen = 0, idxen = 1 in {
457 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
458 (ins SReg_128:$srsrc, VReg_32:$vaddr,
459 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
460 i1imm:$slc, i1imm:$tfe),
461 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
462 }
463
464 let offen = 1, idxen = 1 in {
465 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
466 (ins SReg_128:$srsrc, VReg_64:$vaddr,
467 SSrc_32:$soffset, i1imm:$glc,
468 i1imm:$slc, i1imm:$tfe),
469 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
470 }
471 }
472
473 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
474 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
475 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
476 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
477 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000478 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000479}
480
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000481class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
482 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
483 i16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000484 name#" $vdata, $srsrc + $vaddr + $offset",
485 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000486
487 let mayLoad = 0;
488 let mayStore = 1;
489
490 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000491 let offen = 0;
492 let idxen = 0;
493 let glc = 0;
494 let addr64 = 1;
495 let lds = 0;
496 let slc = 0;
497 let tfe = 0;
498 let soffset = 128; // ZERO
499}
500
Christian Konig72d5d5c2013-02-21 15:16:44 +0000501class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
502 op,
503 (outs regClass:$dst),
504 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000505 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000506 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000507 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
508 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000509 []> {
510 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000511 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000512}
513
Tom Stellard682bfbc2013-10-10 17:11:24 +0000514class MIMG_Mask <string op, int channels> {
515 string Op = op;
516 int Channels = channels;
517}
518
Tom Stellard16a9a202013-08-14 23:24:17 +0000519class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000520 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000521 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000522 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000523 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000524 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000525 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000526 SReg_256:$srsrc),
527 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
528 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
529 []> {
530 let SSAMP = 0;
531 let mayLoad = 1;
532 let mayStore = 0;
533 let hasPostISelHook = 1;
534}
535
Tom Stellard682bfbc2013-10-10 17:11:24 +0000536multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
537 RegisterClass dst_rc,
538 int channels> {
539 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
540 MIMG_Mask<asm#"_V1", channels>;
541 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
542 MIMG_Mask<asm#"_V2", channels>;
543 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
544 MIMG_Mask<asm#"_V4", channels>;
545}
546
Tom Stellard16a9a202013-08-14 23:24:17 +0000547multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000548 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
549 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
550 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
551 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000552}
553
554class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000555 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000556 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000557 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000558 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000559 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000560 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000561 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000562 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
563 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000564 []> {
565 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000566 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000567 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000568}
569
Tom Stellard682bfbc2013-10-10 17:11:24 +0000570multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
571 RegisterClass dst_rc,
572 int channels> {
573 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
574 MIMG_Mask<asm#"_V1", channels>;
575 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
576 MIMG_Mask<asm#"_V2", channels>;
577 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
578 MIMG_Mask<asm#"_V4", channels>;
579 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
580 MIMG_Mask<asm#"_V8", channels>;
581 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
582 MIMG_Mask<asm#"_V16", channels>;
583}
584
Tom Stellard16a9a202013-08-14 23:24:17 +0000585multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000586 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
587 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
588 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
589 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000590}
591
Christian Konigf741fbf2013-02-26 17:52:42 +0000592//===----------------------------------------------------------------------===//
593// Vector instruction mappings
594//===----------------------------------------------------------------------===//
595
596// Maps an opcode in e32 form to its e64 equivalent
597def getVOPe64 : InstrMapping {
598 let FilterClass = "VOP";
599 let RowFields = ["OpName"];
600 let ColFields = ["Size"];
601 let KeyCol = ["4"];
602 let ValueCols = [["8"]];
603}
604
Christian Konig3c145802013-03-27 09:12:59 +0000605// Maps an original opcode to its commuted version
606def getCommuteRev : InstrMapping {
607 let FilterClass = "VOP2_REV";
608 let RowFields = ["RevOp"];
609 let ColFields = ["IsOrig"];
610 let KeyCol = ["1"];
611 let ValueCols = [["0"]];
612}
613
Tom Stellard682bfbc2013-10-10 17:11:24 +0000614def getMaskedMIMGOp : InstrMapping {
615 let FilterClass = "MIMG_Mask";
616 let RowFields = ["Op"];
617 let ColFields = ["Channels"];
618 let KeyCol = ["4"];
619 let ValueCols = [["1"], ["2"], ["3"] ];
620}
621
Christian Konig3c145802013-03-27 09:12:59 +0000622// Maps an commuted opcode to its original version
623def getCommuteOrig : InstrMapping {
624 let FilterClass = "VOP2_REV";
625 let RowFields = ["RevOp"];
626 let ColFields = ["IsOrig"];
627 let KeyCol = ["0"];
628 let ValueCols = [["1"]];
629}
630
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000631def isDS : InstrMapping {
632 let FilterClass = "DS";
633 let RowFields = ["Inst"];
634 let ColFields = ["Size"];
635 let KeyCol = ["8"];
636 let ValueCols = [["8"]];
637}
638
Tom Stellard75aadc22012-12-11 21:25:42 +0000639include "SIInstructions.td"