blob: 57b36b3298aa6cbc1f7d052e3793071cadcfe808 [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,
Tom Stellarde28859f2014-03-07 20:12:39 +0000301 RegisterClass src0_rc, string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000302
303 def _e32 : VOP2 <
Tom Stellarde28859f2014-03-07 20:12:39 +0000304 op, (outs VReg_32:$dst), (ins src0_rc:$src0, VReg_32:$src1),
Christian Konigd3039962013-02-26 17:52:09 +0000305 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
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000386class DS_1A <bits<8> op, dag outs, dag ins, string asm, list<dag> pat> :
387 DS <op, outs, ins, asm, pat> {
388 bits<16> offset;
389
390 let offset0 = offset{7-0};
391 let offset1 = offset{15-8};
392}
393
394class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000395 op,
396 (outs regClass:$vdst),
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000397 (ins i1imm:$gds, VReg_32:$addr, i16imm:$offset),
398 asm#" $gds, $vdst, $addr, $offset, [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000399 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000400 let data0 = 0;
401 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000402 let mayLoad = 1;
403 let mayStore = 0;
404}
405
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000406class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000407 op,
408 (outs),
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000409 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, i16imm:$offset),
410 asm#" $gds, $addr, $data0, $offset [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000411 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000412 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000413 let mayStore = 1;
414 let mayLoad = 0;
415 let vdst = 0;
416}
417
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000418class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
Tom Stellard13c68ef2013-09-05 18:38:09 +0000419 op,
420 (outs rc:$vdst),
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000421 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, i16imm:$offset),
422 asm#" $gds, $vdst, $addr, $data0, $offset, [M0]",
Tom Stellard13c68ef2013-09-05 18:38:09 +0000423 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000424
425 let data1 = 0;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000426 let mayStore = 1;
427 let mayLoad = 1;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000428}
429
Christian Konig72d5d5c2013-02-21 15:16:44 +0000430class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
431 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000432 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000433 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
434 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000435 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000436 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
437 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000438 []> {
439 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000440 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000441}
Tom Stellard75aadc22012-12-11 21:25:42 +0000442
Tom Stellardf1ee7162013-05-20 15:02:31 +0000443multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
444
Michel Danzer13736222014-01-27 07:20:51 +0000445 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000446
Michel Danzer13736222014-01-27 07:20:51 +0000447 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000448
Michel Danzer13736222014-01-27 07:20:51 +0000449 let offen = 0, idxen = 0 in {
450 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
451 (ins SReg_128:$srsrc, VReg_32:$vaddr,
452 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
453 i1imm:$slc, i1imm:$tfe),
454 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
455 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000456
Michel Danzer13736222014-01-27 07:20:51 +0000457 let offen = 1, idxen = 0, offset = 0 in {
458 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
459 (ins SReg_128:$srsrc, VReg_32:$vaddr,
460 SSrc_32:$soffset, i1imm:$glc, i1imm:$slc,
461 i1imm:$tfe),
462 asm#" $vdata, $srsrc + $vaddr + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
463 }
464
465 let offen = 0, idxen = 1 in {
466 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
467 (ins SReg_128:$srsrc, VReg_32:$vaddr,
468 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
469 i1imm:$slc, i1imm:$tfe),
470 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
471 }
472
473 let offen = 1, idxen = 1 in {
474 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
475 (ins SReg_128:$srsrc, VReg_64:$vaddr,
476 SSrc_32:$soffset, i1imm:$glc,
477 i1imm:$slc, i1imm:$tfe),
478 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
479 }
480 }
481
482 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
483 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
484 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
485 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
486 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000487 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000488}
489
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000490class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
491 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
492 i16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000493 name#" $vdata, $srsrc + $vaddr + $offset",
494 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000495
496 let mayLoad = 0;
497 let mayStore = 1;
498
499 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000500 let offen = 0;
501 let idxen = 0;
502 let glc = 0;
503 let addr64 = 1;
504 let lds = 0;
505 let slc = 0;
506 let tfe = 0;
507 let soffset = 128; // ZERO
508}
509
Christian Konig72d5d5c2013-02-21 15:16:44 +0000510class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
511 op,
512 (outs regClass:$dst),
513 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000514 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000515 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000516 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
517 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000518 []> {
519 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000520 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000521}
522
Tom Stellard682bfbc2013-10-10 17:11:24 +0000523class MIMG_Mask <string op, int channels> {
524 string Op = op;
525 int Channels = channels;
526}
527
Tom Stellard16a9a202013-08-14 23:24:17 +0000528class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000529 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000530 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000531 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000532 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000533 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000534 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000535 SReg_256:$srsrc),
536 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
537 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
538 []> {
539 let SSAMP = 0;
540 let mayLoad = 1;
541 let mayStore = 0;
542 let hasPostISelHook = 1;
543}
544
Tom Stellard682bfbc2013-10-10 17:11:24 +0000545multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
546 RegisterClass dst_rc,
547 int channels> {
548 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
549 MIMG_Mask<asm#"_V1", channels>;
550 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
551 MIMG_Mask<asm#"_V2", channels>;
552 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
553 MIMG_Mask<asm#"_V4", channels>;
554}
555
Tom Stellard16a9a202013-08-14 23:24:17 +0000556multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000557 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
558 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
559 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
560 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000561}
562
563class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000564 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000565 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000566 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000567 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000568 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000569 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000570 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000571 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
572 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000573 []> {
574 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000575 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000576 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000577}
578
Tom Stellard682bfbc2013-10-10 17:11:24 +0000579multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
580 RegisterClass dst_rc,
581 int channels> {
582 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
583 MIMG_Mask<asm#"_V1", channels>;
584 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
585 MIMG_Mask<asm#"_V2", channels>;
586 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
587 MIMG_Mask<asm#"_V4", channels>;
588 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
589 MIMG_Mask<asm#"_V8", channels>;
590 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
591 MIMG_Mask<asm#"_V16", channels>;
592}
593
Tom Stellard16a9a202013-08-14 23:24:17 +0000594multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000595 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
596 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
597 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
598 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000599}
600
Christian Konigf741fbf2013-02-26 17:52:42 +0000601//===----------------------------------------------------------------------===//
602// Vector instruction mappings
603//===----------------------------------------------------------------------===//
604
605// Maps an opcode in e32 form to its e64 equivalent
606def getVOPe64 : InstrMapping {
607 let FilterClass = "VOP";
608 let RowFields = ["OpName"];
609 let ColFields = ["Size"];
610 let KeyCol = ["4"];
611 let ValueCols = [["8"]];
612}
613
Christian Konig3c145802013-03-27 09:12:59 +0000614// Maps an original opcode to its commuted version
615def getCommuteRev : InstrMapping {
616 let FilterClass = "VOP2_REV";
617 let RowFields = ["RevOp"];
618 let ColFields = ["IsOrig"];
619 let KeyCol = ["1"];
620 let ValueCols = [["0"]];
621}
622
Tom Stellard682bfbc2013-10-10 17:11:24 +0000623def getMaskedMIMGOp : InstrMapping {
624 let FilterClass = "MIMG_Mask";
625 let RowFields = ["Op"];
626 let ColFields = ["Channels"];
627 let KeyCol = ["4"];
628 let ValueCols = [["1"], ["2"], ["3"] ];
629}
630
Christian Konig3c145802013-03-27 09:12:59 +0000631// Maps an commuted opcode to its original version
632def getCommuteOrig : InstrMapping {
633 let FilterClass = "VOP2_REV";
634 let RowFields = ["RevOp"];
635 let ColFields = ["IsOrig"];
636 let KeyCol = ["0"];
637 let ValueCols = [["1"]];
638}
639
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000640def isDS : InstrMapping {
641 let FilterClass = "DS";
642 let RowFields = ["Inst"];
643 let ColFields = ["Size"];
644 let KeyCol = ["8"];
645 let ValueCols = [["8"]];
646}
647
Tom Stellard75aadc22012-12-11 21:25:42 +0000648include "SIInstructions.td"