blob: ed42a2ad954161ea363e3cbf5fa4677b315d4178 [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 Stellard89093802013-02-07 19:39:40 +000078def IMM8bitDWORD : ImmLeaf <
79 i32, [{
80 return (Imm & ~0x3FC) == 0;
81 }], SDNodeXForm<imm, [{
82 return CurDAG->getTargetConstant(
83 N->getZExtValue() >> 2, MVT::i32);
84 }]>
85>;
86
Tom Stellardafcf12f2013-09-12 02:55:14 +000087def as_i1imm : SDNodeXForm<imm, [{
88 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i1);
89}]>;
90
91def as_i8imm : SDNodeXForm<imm, [{
92 return CurDAG->getTargetConstant(N->getZExtValue(), MVT::i8);
93}]>;
94
Tom Stellard07a10a32013-06-03 17:39:43 +000095def as_i16imm : SDNodeXForm<imm, [{
96 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
97}]>;
98
99def IMM12bit : PatLeaf <(imm),
100 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +0000101>;
102
Christian Konigf82901a2013-02-26 17:52:23 +0000103class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Bill Wendlinga3cd3502013-06-19 21:36:55 +0000104 return
105 (*(const SITargetLowering *)getTargetLowering()).analyzeImmediate(N) == 0;
Christian Konigb559b072013-02-16 11:28:36 +0000106}]>;
107
Tom Stellarddf94dc32013-08-14 23:24:24 +0000108class SGPRImm <dag frag> : PatLeaf<frag, [{
109 if (TM.getSubtarget<AMDGPUSubtarget>().getGeneration() <
110 AMDGPUSubtarget::SOUTHERN_ISLANDS) {
111 return false;
112 }
113 const SIRegisterInfo *SIRI =
114 static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
115 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
116 U != E; ++U) {
117 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
118 return true;
119 }
120 }
121 return false;
122}]>;
123
Christian Konig72d5d5c2013-02-21 15:16:44 +0000124//===----------------------------------------------------------------------===//
125// SI assembler operands
126//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000127
Christian Konigeabf8332013-02-21 15:16:49 +0000128def SIOperand {
129 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000130 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +0000131}
132
Christian Konig72d5d5c2013-02-21 15:16:44 +0000133include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +0000134
Christian Konig72d5d5c2013-02-21 15:16:44 +0000135//===----------------------------------------------------------------------===//
136//
137// SI Instruction multiclass helpers.
138//
139// Instructions with _32 take 32-bit operands.
140// Instructions with _64 take 64-bit operands.
141//
142// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
143// encoding is the standard encoding, but instruction that make use of
144// any of the instruction modifiers must use the 64-bit encoding.
145//
146// Instructions with _e32 use the 32-bit encoding.
147// Instructions with _e64 use the 64-bit encoding.
148//
149//===----------------------------------------------------------------------===//
150
151//===----------------------------------------------------------------------===//
152// Scalar classes
153//===----------------------------------------------------------------------===//
154
Christian Konige0130a22013-02-21 15:17:13 +0000155class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
156 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
157 opName#" $dst, $src0", pattern
158>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000159
Christian Konige0130a22013-02-21 15:17:13 +0000160class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
161 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
162 opName#" $dst, $src0", pattern
163>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000164
Christian Konige0130a22013-02-21 15:17:13 +0000165class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
166 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
167 opName#" $dst, $src0, $src1", pattern
168>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000169
Christian Konige0130a22013-02-21 15:17:13 +0000170class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
171 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
172 opName#" $dst, $src0, $src1", pattern
173>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000174
Christian Konige0130a22013-02-21 15:17:13 +0000175class SOPC_32 <bits<7> op, string opName, list<dag> pattern> : SOPC <
176 op, (outs SCCReg:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
177 opName#" $dst, $src0, $src1", pattern
178>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000179
Christian Konige0130a22013-02-21 15:17:13 +0000180class SOPC_64 <bits<7> op, string opName, list<dag> pattern> : SOPC <
181 op, (outs SCCReg:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
182 opName#" $dst, $src0, $src1", pattern
183>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000184
Christian Konige0130a22013-02-21 15:17:13 +0000185class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
186 op, (outs SReg_32:$dst), (ins i16imm:$src0),
187 opName#" $dst, $src0", pattern
188>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000189
Christian Konige0130a22013-02-21 15:17:13 +0000190class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
191 op, (outs SReg_64:$dst), (ins i16imm:$src0),
192 opName#" $dst, $src0", pattern
193>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000194
Christian Konig9c7afd12013-03-18 11:33:50 +0000195multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
196 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000197 def _IMM : SMRD <
198 op, 1, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000199 (ins baseClass:$sbase, i32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000200 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000201 >;
202
203 def _SGPR : SMRD <
204 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000205 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000206 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000207 >;
208}
209
210//===----------------------------------------------------------------------===//
211// Vector ALU classes
212//===----------------------------------------------------------------------===//
213
Christian Konigf741fbf2013-02-26 17:52:42 +0000214class VOP <string opName> {
215 string OpName = opName;
216}
217
Christian Konig3c145802013-03-27 09:12:59 +0000218class VOP2_REV <string revOp, bit isOrig> {
219 string RevOp = revOp;
220 bit IsOrig = isOrig;
221}
222
Christian Konig3da70172013-02-21 15:16:53 +0000223multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
224 string opName, list<dag> pattern> {
225
Christian Konigf741fbf2013-02-26 17:52:42 +0000226 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000227 op, (outs drc:$dst), (ins src:$src0),
228 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000229 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000230
Christian Konig3da70172013-02-21 15:16:53 +0000231 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000232 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000233 (outs drc:$dst),
234 (ins src:$src0,
235 i32imm:$abs, i32imm:$clamp,
236 i32imm:$omod, i32imm:$neg),
237 opName#"_e64 $dst, $src0, $abs, $clamp, $omod, $neg", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000238 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000239 let src1 = SIOperand.ZERO;
240 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000241 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000242}
243
Christian Konig3da70172013-02-21 15:16:53 +0000244multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
245 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
246
247multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
248 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
249
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000250multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
251 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
252
253multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
254 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
255
Christian Konigae034e62013-02-21 15:16:58 +0000256multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000257 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000258 def _e32 : VOP2 <
259 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
260 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000261 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000262
Christian Konigae034e62013-02-21 15:16:58 +0000263 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000264 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000265 (outs vrc:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000266 (ins arc:$src0, arc:$src1,
Christian Konigae034e62013-02-21 15:16:58 +0000267 i32imm:$abs, i32imm:$clamp,
268 i32imm:$omod, i32imm:$neg),
269 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000270 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000271 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000272 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000273}
274
Christian Konig3c145802013-03-27 09:12:59 +0000275multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
276 string revOp = opName>
277 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000278
Christian Konig3c145802013-03-27 09:12:59 +0000279multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
280 string revOp = opName>
281 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000282
Christian Konig3c145802013-03-27 09:12:59 +0000283multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
284 string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000285
286 def _e32 : VOP2 <
287 op, (outs VReg_32:$dst), (ins VSrc_32:$src0, VReg_32:$src1),
288 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000289 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000290
291 def _e64 : VOP3b <
292 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
293 (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000294 (ins VSrc_32:$src0, VSrc_32:$src1,
Christian Konigd3039962013-02-26 17:52:09 +0000295 i32imm:$abs, i32imm:$clamp,
296 i32imm:$omod, i32imm:$neg),
297 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000298 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000299 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000300 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
301 can write it into any SGPR. We currently don't use the carry out,
302 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000303 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000304 }
305}
306
Christian Konig72d5d5c2013-02-21 15:16:44 +0000307multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000308 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000309
Christian Konigb19849a2013-02-21 15:17:04 +0000310 def _e32 : VOPC <
311 op, (ins arc:$src0, vrc:$src1),
312 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000313 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000314
Christian Konig72d5d5c2013-02-21 15:16:44 +0000315 def _e64 : VOP3 <
316 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
317 (outs SReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000318 (ins arc:$src0, arc:$src1,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000319 InstFlag:$abs, InstFlag:$clamp,
320 InstFlag:$omod, InstFlag:$neg),
Christian Konigb19849a2013-02-21 15:17:04 +0000321 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg",
322 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000323 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000324 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000325 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000326 let src2 = SIOperand.ZERO;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000327 }
328}
329
Christian Konigb19849a2013-02-21 15:17:04 +0000330multiclass VOPC_32 <bits<8> op, string opName,
331 ValueType vt = untyped, PatLeaf cond = COND_NULL>
332 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000333
Christian Konigb19849a2013-02-21 15:17:04 +0000334multiclass VOPC_64 <bits<8> op, string opName,
335 ValueType vt = untyped, PatLeaf cond = COND_NULL>
336 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000337
Christian Konigf5754a02013-02-21 15:17:09 +0000338class VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
339 op, (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000340 (ins VSrc_32:$src0, VSrc_32:$src1, VSrc_32:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000341 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000342 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000343>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000344
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000345class VOP3_64_Shift <bits <9> op, string opName, list<dag> pattern> : VOP3 <
346 op, (outs VReg_64:$dst),
347 (ins VSrc_64:$src0, VSrc_32:$src1),
348 opName#" $dst, $src0, $src1", pattern
349>, VOP <opName> {
350
351 let src2 = SIOperand.ZERO;
352 let abs = 0;
353 let clamp = 0;
354 let omod = 0;
355 let neg = 0;
356}
357
Christian Konigf5754a02013-02-21 15:17:09 +0000358class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
359 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000360 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000361 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000362 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000363>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000364
Christian Konig72d5d5c2013-02-21 15:16:44 +0000365//===----------------------------------------------------------------------===//
366// Vector I/O classes
367//===----------------------------------------------------------------------===//
368
Michel Danzer1c454302013-07-10 16:36:43 +0000369class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
370 op,
371 (outs regClass:$vdst),
Tom Stellarddba25712013-08-16 01:18:43 +0000372 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
373 i8imm:$offset0, i8imm:$offset1),
Michel Danzer1c454302013-07-10 16:36:43 +0000374 asm#" $vdst, $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
375 []> {
376 let mayLoad = 1;
377 let mayStore = 0;
378}
379
380class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
381 op,
382 (outs),
Tom Stellarddba25712013-08-16 01:18:43 +0000383 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
384 i8imm:$offset0, i8imm:$offset1),
Michel Danzer1c454302013-07-10 16:36:43 +0000385 asm#" $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
386 []> {
387 let mayStore = 1;
388 let mayLoad = 0;
389 let vdst = 0;
390}
391
Tom Stellard13c68ef2013-09-05 18:38:09 +0000392class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS <
393 op,
394 (outs rc:$vdst),
395 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, i8imm:$offset0,
396 i8imm:$offset1),
397 asm#" $gds, $vdst, $addr, $data0, $offset0, $offset1, [M0]",
398 []> {
399 let mayStore = 1;
400 let mayLoad = 1;
401 let data1 = 0;
402}
403
Christian Konig72d5d5c2013-02-21 15:16:44 +0000404class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
405 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000406 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000407 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
408 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000409 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000410 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
411 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000412 []> {
413 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000414 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000415}
Tom Stellard75aadc22012-12-11 21:25:42 +0000416
Tom Stellardf1ee7162013-05-20 15:02:31 +0000417multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
418
419 let glc = 0, lds = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */,
420 mayLoad = 1 in {
421
422 let offen = 1, idxen = 0, addr64 = 0, offset = 0 in {
423 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
424 (ins SReg_128:$srsrc, VReg_32:$vaddr),
425 asm#" $vdata, $srsrc + $vaddr", []>;
426 }
427
428 let offen = 0, idxen = 1, addr64 = 0 in {
429 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
430 (ins SReg_128:$srsrc, VReg_32:$vaddr, i16imm:$offset),
431 asm#" $vdata, $srsrc[$vaddr] + $offset", []>;
432 }
433
434 let offen = 0, idxen = 0, addr64 = 1 in {
435 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
436 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
437 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
438 }
439 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000440}
441
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000442class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
443 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
444 i16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000445 name#" $vdata, $srsrc + $vaddr + $offset",
446 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000447
448 let mayLoad = 0;
449 let mayStore = 1;
450
451 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000452 let offen = 0;
453 let idxen = 0;
454 let glc = 0;
455 let addr64 = 1;
456 let lds = 0;
457 let slc = 0;
458 let tfe = 0;
459 let soffset = 128; // ZERO
460}
461
Christian Konig72d5d5c2013-02-21 15:16:44 +0000462class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
463 op,
464 (outs regClass:$dst),
465 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000466 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000467 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000468 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
469 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000470 []> {
471 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000472 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000473}
474
Tom Stellard682bfbc2013-10-10 17:11:24 +0000475class MIMG_Mask <string op, int channels> {
476 string Op = op;
477 int Channels = channels;
478}
479
Tom Stellard16a9a202013-08-14 23:24:17 +0000480class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000481 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000482 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000483 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000484 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000485 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000486 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000487 SReg_256:$srsrc),
488 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
489 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
490 []> {
491 let SSAMP = 0;
492 let mayLoad = 1;
493 let mayStore = 0;
494 let hasPostISelHook = 1;
495}
496
Tom Stellard682bfbc2013-10-10 17:11:24 +0000497multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
498 RegisterClass dst_rc,
499 int channels> {
500 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
501 MIMG_Mask<asm#"_V1", channels>;
502 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
503 MIMG_Mask<asm#"_V2", channels>;
504 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
505 MIMG_Mask<asm#"_V4", channels>;
506}
507
Tom Stellard16a9a202013-08-14 23:24:17 +0000508multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000509 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
510 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
511 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
512 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000513}
514
515class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000516 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000517 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000518 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000519 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000520 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000521 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000522 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000523 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
524 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000525 []> {
526 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000527 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000528 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000529}
530
Tom Stellard682bfbc2013-10-10 17:11:24 +0000531multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
532 RegisterClass dst_rc,
533 int channels> {
534 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
535 MIMG_Mask<asm#"_V1", channels>;
536 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
537 MIMG_Mask<asm#"_V2", channels>;
538 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
539 MIMG_Mask<asm#"_V4", channels>;
540 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
541 MIMG_Mask<asm#"_V8", channels>;
542 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
543 MIMG_Mask<asm#"_V16", channels>;
544}
545
Tom Stellard16a9a202013-08-14 23:24:17 +0000546multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000547 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
548 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
549 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
550 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000551}
552
Christian Konigf741fbf2013-02-26 17:52:42 +0000553//===----------------------------------------------------------------------===//
554// Vector instruction mappings
555//===----------------------------------------------------------------------===//
556
557// Maps an opcode in e32 form to its e64 equivalent
558def getVOPe64 : InstrMapping {
559 let FilterClass = "VOP";
560 let RowFields = ["OpName"];
561 let ColFields = ["Size"];
562 let KeyCol = ["4"];
563 let ValueCols = [["8"]];
564}
565
Christian Konig3c145802013-03-27 09:12:59 +0000566// Maps an original opcode to its commuted version
567def getCommuteRev : InstrMapping {
568 let FilterClass = "VOP2_REV";
569 let RowFields = ["RevOp"];
570 let ColFields = ["IsOrig"];
571 let KeyCol = ["1"];
572 let ValueCols = [["0"]];
573}
574
Tom Stellard682bfbc2013-10-10 17:11:24 +0000575def getMaskedMIMGOp : InstrMapping {
576 let FilterClass = "MIMG_Mask";
577 let RowFields = ["Op"];
578 let ColFields = ["Channels"];
579 let KeyCol = ["4"];
580 let ValueCols = [["1"], ["2"], ["3"] ];
581}
582
Christian Konig3c145802013-03-27 09:12:59 +0000583// Maps an commuted opcode to its original version
584def getCommuteOrig : InstrMapping {
585 let FilterClass = "VOP2_REV";
586 let RowFields = ["RevOp"];
587 let ColFields = ["IsOrig"];
588 let KeyCol = ["0"];
589 let ValueCols = [["1"]];
590}
591
Tom Stellard75aadc22012-12-11 21:25:42 +0000592include "SIInstructions.td"