blob: 173f9bbd21ca4db1466994e2333a8e729304d801 [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
Matt Arsenault99ed7892014-03-19 22:19:49 +0000102def IMM8bit : PatLeaf <(imm),
103 [{return isUInt<8>(N->getZExtValue());}]
104>;
105
Tom Stellard07a10a32013-06-03 17:39:43 +0000106def IMM12bit : PatLeaf <(imm),
107 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +0000108>;
109
Matt Arsenault99ed7892014-03-19 22:19:49 +0000110def IMM16bit : PatLeaf <(imm),
111 [{return isUInt<16>(N->getZExtValue());}]
112>;
113
Tom Stellarde2367942014-02-06 18:36:41 +0000114def mubuf_vaddr_offset : PatFrag<
115 (ops node:$ptr, node:$offset, node:$imm_offset),
116 (add (add node:$ptr, node:$offset), node:$imm_offset)
117>;
118
Christian Konigf82901a2013-02-26 17:52:23 +0000119class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Bill Wendlinga3cd3502013-06-19 21:36:55 +0000120 return
121 (*(const SITargetLowering *)getTargetLowering()).analyzeImmediate(N) == 0;
Christian Konigb559b072013-02-16 11:28:36 +0000122}]>;
123
Tom Stellarddf94dc32013-08-14 23:24:24 +0000124class SGPRImm <dag frag> : PatLeaf<frag, [{
125 if (TM.getSubtarget<AMDGPUSubtarget>().getGeneration() <
126 AMDGPUSubtarget::SOUTHERN_ISLANDS) {
127 return false;
128 }
129 const SIRegisterInfo *SIRI =
130 static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
131 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
132 U != E; ++U) {
133 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
134 return true;
135 }
136 }
137 return false;
138}]>;
139
Matt Arsenaulta98cd6a2013-12-19 05:32:55 +0000140def FRAMEri32 : Operand<iPTR> {
Tom Stellard81d871d2013-11-13 23:36:50 +0000141 let MIOperandInfo = (ops SReg_32:$ptr, i32imm:$index);
142}
143
Christian Konig72d5d5c2013-02-21 15:16:44 +0000144//===----------------------------------------------------------------------===//
145// SI assembler operands
146//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000147
Christian Konigeabf8332013-02-21 15:16:49 +0000148def SIOperand {
149 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000150 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +0000151}
152
Christian Konig72d5d5c2013-02-21 15:16:44 +0000153include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +0000154
Christian Konig72d5d5c2013-02-21 15:16:44 +0000155//===----------------------------------------------------------------------===//
156//
157// SI Instruction multiclass helpers.
158//
159// Instructions with _32 take 32-bit operands.
160// Instructions with _64 take 64-bit operands.
161//
162// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
163// encoding is the standard encoding, but instruction that make use of
164// any of the instruction modifiers must use the 64-bit encoding.
165//
166// Instructions with _e32 use the 32-bit encoding.
167// Instructions with _e64 use the 64-bit encoding.
168//
169//===----------------------------------------------------------------------===//
170
171//===----------------------------------------------------------------------===//
172// Scalar classes
173//===----------------------------------------------------------------------===//
174
Christian Konige0130a22013-02-21 15:17:13 +0000175class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
176 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
177 opName#" $dst, $src0", pattern
178>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000179
Christian Konige0130a22013-02-21 15:17:13 +0000180class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
181 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
182 opName#" $dst, $src0", pattern
183>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000184
Christian Konige0130a22013-02-21 15:17:13 +0000185class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
186 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
187 opName#" $dst, $src0, $src1", pattern
188>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000189
Christian Konige0130a22013-02-21 15:17:13 +0000190class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
191 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
192 opName#" $dst, $src0, $src1", pattern
193>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000194
Tom Stellard82166022013-11-13 23:36:37 +0000195class SOP2_SHIFT_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
196 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_32:$src1),
197 opName#" $dst, $src0, $src1", pattern
198>;
199
Christian Konige0130a22013-02-21 15:17:13 +0000200class SOPC_32 <bits<7> op, string opName, list<dag> pattern> : SOPC <
201 op, (outs SCCReg:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
202 opName#" $dst, $src0, $src1", pattern
203>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000204
Christian Konige0130a22013-02-21 15:17:13 +0000205class SOPC_64 <bits<7> op, string opName, list<dag> pattern> : SOPC <
206 op, (outs SCCReg:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
207 opName#" $dst, $src0, $src1", pattern
208>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000209
Christian Konige0130a22013-02-21 15:17:13 +0000210class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
211 op, (outs SReg_32:$dst), (ins i16imm:$src0),
212 opName#" $dst, $src0", pattern
213>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000214
Christian Konige0130a22013-02-21 15:17:13 +0000215class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
216 op, (outs SReg_64:$dst), (ins i16imm:$src0),
217 opName#" $dst, $src0", pattern
218>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000219
Christian Konig9c7afd12013-03-18 11:33:50 +0000220multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
221 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000222 def _IMM : SMRD <
223 op, 1, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000224 (ins baseClass:$sbase, i32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000225 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000226 >;
227
228 def _SGPR : SMRD <
229 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000230 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000231 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000232 >;
233}
234
235//===----------------------------------------------------------------------===//
236// Vector ALU classes
237//===----------------------------------------------------------------------===//
238
Christian Konigf741fbf2013-02-26 17:52:42 +0000239class VOP <string opName> {
240 string OpName = opName;
241}
242
Christian Konig3c145802013-03-27 09:12:59 +0000243class VOP2_REV <string revOp, bit isOrig> {
244 string RevOp = revOp;
245 bit IsOrig = isOrig;
246}
247
Christian Konig3da70172013-02-21 15:16:53 +0000248multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
249 string opName, list<dag> pattern> {
250
Christian Konigf741fbf2013-02-26 17:52:42 +0000251 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000252 op, (outs drc:$dst), (ins src:$src0),
253 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000254 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000255
Christian Konig3da70172013-02-21 15:16:53 +0000256 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000257 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000258 (outs drc:$dst),
259 (ins src:$src0,
260 i32imm:$abs, i32imm:$clamp,
261 i32imm:$omod, i32imm:$neg),
262 opName#"_e64 $dst, $src0, $abs, $clamp, $omod, $neg", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000263 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000264 let src1 = SIOperand.ZERO;
265 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000266 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000267}
268
Christian Konig3da70172013-02-21 15:16:53 +0000269multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
270 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
271
272multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
273 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
274
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000275multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
276 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
277
278multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
279 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
280
Christian Konigae034e62013-02-21 15:16:58 +0000281multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000282 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000283 def _e32 : VOP2 <
284 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
285 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000286 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000287
Christian Konigae034e62013-02-21 15:16:58 +0000288 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000289 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000290 (outs vrc:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000291 (ins arc:$src0, arc:$src1,
Christian Konigae034e62013-02-21 15:16:58 +0000292 i32imm:$abs, i32imm:$clamp,
293 i32imm:$omod, i32imm:$neg),
294 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000295 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000296 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000297 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000298}
299
Christian Konig3c145802013-03-27 09:12:59 +0000300multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
301 string revOp = opName>
302 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000303
Christian Konig3c145802013-03-27 09:12:59 +0000304multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
305 string revOp = opName>
306 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000307
Christian Konig3c145802013-03-27 09:12:59 +0000308multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
Tom Stellarde28859f2014-03-07 20:12:39 +0000309 RegisterClass src0_rc, string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000310
311 def _e32 : VOP2 <
Tom Stellarde28859f2014-03-07 20:12:39 +0000312 op, (outs VReg_32:$dst), (ins src0_rc:$src0, VReg_32:$src1),
Christian Konigd3039962013-02-26 17:52:09 +0000313 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000314 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000315
316 def _e64 : VOP3b <
317 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
318 (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000319 (ins VSrc_32:$src0, VSrc_32:$src1,
Christian Konigd3039962013-02-26 17:52:09 +0000320 i32imm:$abs, i32imm:$clamp,
321 i32imm:$omod, i32imm:$neg),
322 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000323 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000324 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000325 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
326 can write it into any SGPR. We currently don't use the carry out,
327 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000328 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000329 }
330}
331
Christian Konig72d5d5c2013-02-21 15:16:44 +0000332multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000333 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000334
Christian Konigb19849a2013-02-21 15:17:04 +0000335 def _e32 : VOPC <
336 op, (ins arc:$src0, vrc:$src1),
337 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000338 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000339
Christian Konig72d5d5c2013-02-21 15:16:44 +0000340 def _e64 : VOP3 <
341 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
342 (outs SReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000343 (ins arc:$src0, arc:$src1,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000344 InstFlag:$abs, InstFlag:$clamp,
345 InstFlag:$omod, InstFlag:$neg),
Christian Konigb19849a2013-02-21 15:17:04 +0000346 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg",
347 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000348 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000349 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000350 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000351 let src2 = SIOperand.ZERO;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000352 }
353}
354
Christian Konigb19849a2013-02-21 15:17:04 +0000355multiclass VOPC_32 <bits<8> op, string opName,
356 ValueType vt = untyped, PatLeaf cond = COND_NULL>
357 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000358
Christian Konigb19849a2013-02-21 15:17:04 +0000359multiclass VOPC_64 <bits<8> op, string opName,
360 ValueType vt = untyped, PatLeaf cond = COND_NULL>
361 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000362
Christian Konigf5754a02013-02-21 15:17:09 +0000363class VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
364 op, (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000365 (ins VSrc_32:$src0, VSrc_32:$src1, VSrc_32:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000366 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000367 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000368>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000369
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000370class VOP3_64_Shift <bits <9> op, string opName, list<dag> pattern> : VOP3 <
371 op, (outs VReg_64:$dst),
372 (ins VSrc_64:$src0, VSrc_32:$src1),
373 opName#" $dst, $src0, $src1", pattern
374>, VOP <opName> {
375
376 let src2 = SIOperand.ZERO;
377 let abs = 0;
378 let clamp = 0;
379 let omod = 0;
380 let neg = 0;
381}
382
Christian Konigf5754a02013-02-21 15:17:09 +0000383class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
384 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000385 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000386 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000387 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000388>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000389
Christian Konig72d5d5c2013-02-21 15:16:44 +0000390//===----------------------------------------------------------------------===//
391// Vector I/O classes
392//===----------------------------------------------------------------------===//
393
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000394class DS_1A <bits<8> op, dag outs, dag ins, string asm, list<dag> pat> :
395 DS <op, outs, ins, asm, pat> {
396 bits<16> offset;
397
Matt Arsenault99ed7892014-03-19 22:19:49 +0000398 // Single load interpret the 2 i8imm operands as a single i16 offset.
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000399 let offset0 = offset{7-0};
400 let offset1 = offset{15-8};
401}
402
403class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000404 op,
405 (outs regClass:$vdst),
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000406 (ins i1imm:$gds, VReg_32:$addr, i16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000407 asm#" $vdst, $addr, $offset, [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000408 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000409 let data0 = 0;
410 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000411 let mayLoad = 1;
412 let mayStore = 0;
413}
414
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000415class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000416 op,
417 (outs),
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000418 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, i16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000419 asm#" $addr, $data0, $offset [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000420 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000421 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000422 let mayStore = 1;
423 let mayLoad = 0;
424 let vdst = 0;
425}
426
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000427class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
Tom Stellard13c68ef2013-09-05 18:38:09 +0000428 op,
429 (outs rc:$vdst),
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000430 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, i16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000431 asm#" $vdst, $addr, $data0, $offset, [M0]",
Tom Stellard13c68ef2013-09-05 18:38:09 +0000432 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000433
434 let data1 = 0;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000435 let mayStore = 1;
436 let mayLoad = 1;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000437}
438
Christian Konig72d5d5c2013-02-21 15:16:44 +0000439class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
440 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000441 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000442 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
443 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000444 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000445 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
446 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000447 []> {
448 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000449 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000450}
Tom Stellard75aadc22012-12-11 21:25:42 +0000451
Tom Stellardf1ee7162013-05-20 15:02:31 +0000452multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
453
Michel Danzer13736222014-01-27 07:20:51 +0000454 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000455
Michel Danzer13736222014-01-27 07:20:51 +0000456 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000457
Michel Danzer13736222014-01-27 07:20:51 +0000458 let offen = 0, idxen = 0 in {
459 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
460 (ins SReg_128:$srsrc, VReg_32:$vaddr,
461 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
462 i1imm:$slc, i1imm:$tfe),
463 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
464 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000465
Michel Danzer13736222014-01-27 07:20:51 +0000466 let offen = 1, idxen = 0, offset = 0 in {
467 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
468 (ins SReg_128:$srsrc, VReg_32:$vaddr,
469 SSrc_32:$soffset, i1imm:$glc, i1imm:$slc,
470 i1imm:$tfe),
471 asm#" $vdata, $srsrc + $vaddr + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
472 }
473
474 let offen = 0, idxen = 1 in {
475 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
476 (ins SReg_128:$srsrc, VReg_32:$vaddr,
477 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
478 i1imm:$slc, i1imm:$tfe),
479 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
480 }
481
482 let offen = 1, idxen = 1 in {
483 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
484 (ins SReg_128:$srsrc, VReg_64:$vaddr,
485 SSrc_32:$soffset, i1imm:$glc,
486 i1imm:$slc, i1imm:$tfe),
487 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
488 }
489 }
490
491 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
492 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
493 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
494 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
495 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000496 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000497}
498
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000499class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
500 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
501 i16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000502 name#" $vdata, $srsrc + $vaddr + $offset",
503 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000504
505 let mayLoad = 0;
506 let mayStore = 1;
507
508 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000509 let offen = 0;
510 let idxen = 0;
511 let glc = 0;
512 let addr64 = 1;
513 let lds = 0;
514 let slc = 0;
515 let tfe = 0;
516 let soffset = 128; // ZERO
517}
518
Christian Konig72d5d5c2013-02-21 15:16:44 +0000519class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
520 op,
521 (outs regClass:$dst),
522 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000523 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000524 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000525 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
526 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000527 []> {
528 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000529 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000530}
531
Tom Stellard682bfbc2013-10-10 17:11:24 +0000532class MIMG_Mask <string op, int channels> {
533 string Op = op;
534 int Channels = channels;
535}
536
Tom Stellard16a9a202013-08-14 23:24:17 +0000537class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000538 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000539 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000540 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000541 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000542 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000543 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000544 SReg_256:$srsrc),
545 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
546 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
547 []> {
548 let SSAMP = 0;
549 let mayLoad = 1;
550 let mayStore = 0;
551 let hasPostISelHook = 1;
552}
553
Tom Stellard682bfbc2013-10-10 17:11:24 +0000554multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
555 RegisterClass dst_rc,
556 int channels> {
557 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
558 MIMG_Mask<asm#"_V1", channels>;
559 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
560 MIMG_Mask<asm#"_V2", channels>;
561 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
562 MIMG_Mask<asm#"_V4", channels>;
563}
564
Tom Stellard16a9a202013-08-14 23:24:17 +0000565multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000566 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
567 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
568 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
569 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000570}
571
572class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000573 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000574 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000575 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000576 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000577 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000578 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000579 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000580 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
581 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000582 []> {
583 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000584 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000585 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000586}
587
Tom Stellard682bfbc2013-10-10 17:11:24 +0000588multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
589 RegisterClass dst_rc,
590 int channels> {
591 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
592 MIMG_Mask<asm#"_V1", channels>;
593 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
594 MIMG_Mask<asm#"_V2", channels>;
595 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
596 MIMG_Mask<asm#"_V4", channels>;
597 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
598 MIMG_Mask<asm#"_V8", channels>;
599 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
600 MIMG_Mask<asm#"_V16", channels>;
601}
602
Tom Stellard16a9a202013-08-14 23:24:17 +0000603multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000604 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
605 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
606 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
607 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000608}
609
Christian Konigf741fbf2013-02-26 17:52:42 +0000610//===----------------------------------------------------------------------===//
611// Vector instruction mappings
612//===----------------------------------------------------------------------===//
613
614// Maps an opcode in e32 form to its e64 equivalent
615def getVOPe64 : InstrMapping {
616 let FilterClass = "VOP";
617 let RowFields = ["OpName"];
618 let ColFields = ["Size"];
619 let KeyCol = ["4"];
620 let ValueCols = [["8"]];
621}
622
Christian Konig3c145802013-03-27 09:12:59 +0000623// Maps an original opcode to its commuted version
624def getCommuteRev : InstrMapping {
625 let FilterClass = "VOP2_REV";
626 let RowFields = ["RevOp"];
627 let ColFields = ["IsOrig"];
628 let KeyCol = ["1"];
629 let ValueCols = [["0"]];
630}
631
Tom Stellard682bfbc2013-10-10 17:11:24 +0000632def getMaskedMIMGOp : InstrMapping {
633 let FilterClass = "MIMG_Mask";
634 let RowFields = ["Op"];
635 let ColFields = ["Channels"];
636 let KeyCol = ["4"];
637 let ValueCols = [["1"], ["2"], ["3"] ];
638}
639
Christian Konig3c145802013-03-27 09:12:59 +0000640// Maps an commuted opcode to its original version
641def getCommuteOrig : InstrMapping {
642 let FilterClass = "VOP2_REV";
643 let RowFields = ["RevOp"];
644 let ColFields = ["IsOrig"];
645 let KeyCol = ["0"];
646 let ValueCols = [["1"]];
647}
648
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000649def isDS : InstrMapping {
650 let FilterClass = "DS";
651 let RowFields = ["Inst"];
652 let ColFields = ["Size"];
653 let KeyCol = ["8"];
654 let ValueCols = [["8"]];
655}
656
Tom Stellard75aadc22012-12-11 21:25:42 +0000657include "SIInstructions.td"