blob: e05ab65e8b66cbda3b4535a601b319508777834e [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 Arsenaultdd78b802014-03-19 22:19:56 +0000415class DS_Load2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
416 op,
417 (outs regClass:$vdst),
418 (ins i1imm:$gds, VReg_32:$addr, i8imm:$offset0, i8imm:$offset1),
419 asm#" $gds, $vdst, $addr, $offset0, $offset1, [M0]",
420 []> {
421 let data0 = 0;
422 let data1 = 0;
423 let mayLoad = 1;
424 let mayStore = 0;
425}
426
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000427class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
Michel Danzer1c454302013-07-10 16:36:43 +0000428 op,
429 (outs),
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000430 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, i16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000431 asm#" $addr, $data0, $offset [M0]",
Michel Danzer1c454302013-07-10 16:36:43 +0000432 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000433 let data1 = 0;
Michel Danzer1c454302013-07-10 16:36:43 +0000434 let mayStore = 1;
435 let mayLoad = 0;
436 let vdst = 0;
437}
438
Matt Arsenaultdd78b802014-03-19 22:19:56 +0000439class DS_Store2_Helper <bits<8> op, string asm, RegisterClass regClass> : DS_1A <
440 op,
441 (outs),
442 (ins i1imm:$gds, VReg_32:$addr, regClass:$data0, i8imm:$offset0, i8imm:$offset1),
443 asm#" $addr, $data0, $data1, $offset0, $offset1 [M0]",
444 []> {
445 let mayStore = 1;
446 let mayLoad = 0;
447 let vdst = 0;
448}
449
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000450class DS_1A1D_RET <bits<8> op, string asm, RegisterClass rc> : DS_1A <
Tom Stellard13c68ef2013-09-05 18:38:09 +0000451 op,
452 (outs rc:$vdst),
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000453 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, i16imm:$offset),
Matt Arsenault547aff22014-03-19 22:19:43 +0000454 asm#" $vdst, $addr, $data0, $offset, [M0]",
Tom Stellard13c68ef2013-09-05 18:38:09 +0000455 []> {
Matt Arsenault9cd8c382014-03-19 22:19:39 +0000456
457 let data1 = 0;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000458 let mayStore = 1;
459 let mayLoad = 1;
Tom Stellard13c68ef2013-09-05 18:38:09 +0000460}
461
Christian Konig72d5d5c2013-02-21 15:16:44 +0000462class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
463 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000464 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000465 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
466 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000467 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000468 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
469 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000470 []> {
471 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000472 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000473}
Tom Stellard75aadc22012-12-11 21:25:42 +0000474
Tom Stellardf1ee7162013-05-20 15:02:31 +0000475multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
476
Michel Danzer13736222014-01-27 07:20:51 +0000477 let lds = 0, mayLoad = 1 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000478
Michel Danzer13736222014-01-27 07:20:51 +0000479 let addr64 = 0 in {
Tom Stellardf1ee7162013-05-20 15:02:31 +0000480
Michel Danzer13736222014-01-27 07:20:51 +0000481 let offen = 0, idxen = 0 in {
482 def _OFFSET : MUBUF <op, (outs regClass:$vdata),
483 (ins SReg_128:$srsrc, VReg_32:$vaddr,
484 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
485 i1imm:$slc, i1imm:$tfe),
486 asm#" $vdata, $srsrc + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
487 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000488
Michel Danzer13736222014-01-27 07:20:51 +0000489 let offen = 1, idxen = 0, offset = 0 in {
490 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
491 (ins SReg_128:$srsrc, VReg_32:$vaddr,
492 SSrc_32:$soffset, i1imm:$glc, i1imm:$slc,
493 i1imm:$tfe),
494 asm#" $vdata, $srsrc + $vaddr + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
495 }
496
497 let offen = 0, idxen = 1 in {
498 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
499 (ins SReg_128:$srsrc, VReg_32:$vaddr,
500 i16imm:$offset, SSrc_32:$soffset, i1imm:$glc,
501 i1imm:$slc, i1imm:$tfe),
502 asm#" $vdata, $srsrc[$vaddr] + $offset + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
503 }
504
505 let offen = 1, idxen = 1 in {
506 def _BOTHEN : MUBUF <op, (outs regClass:$vdata),
507 (ins SReg_128:$srsrc, VReg_64:$vaddr,
508 SSrc_32:$soffset, i1imm:$glc,
509 i1imm:$slc, i1imm:$tfe),
510 asm#" $vdata, $srsrc[$vaddr[0]] + $vaddr[1] + $soffset, glc=$glc, slc=$slc, tfe=$tfe", []>;
511 }
512 }
513
514 let offen = 0, idxen = 0, addr64 = 1, glc = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */ in {
515 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
516 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
517 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
518 }
Tom Stellardf1ee7162013-05-20 15:02:31 +0000519 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000520}
521
Tom Stellardd3ee8c12013-08-16 01:12:06 +0000522class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass> :
523 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr,
524 i16imm:$offset),
Tom Stellard556d9aa2013-06-03 17:39:37 +0000525 name#" $vdata, $srsrc + $vaddr + $offset",
526 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000527
528 let mayLoad = 0;
529 let mayStore = 1;
530
531 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000532 let offen = 0;
533 let idxen = 0;
534 let glc = 0;
535 let addr64 = 1;
536 let lds = 0;
537 let slc = 0;
538 let tfe = 0;
539 let soffset = 128; // ZERO
540}
541
Christian Konig72d5d5c2013-02-21 15:16:44 +0000542class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
543 op,
544 (outs regClass:$dst),
545 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000546 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000547 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000548 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
549 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000550 []> {
551 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000552 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000553}
554
Tom Stellard682bfbc2013-10-10 17:11:24 +0000555class MIMG_Mask <string op, int channels> {
556 string Op = op;
557 int Channels = channels;
558}
559
Tom Stellard16a9a202013-08-14 23:24:17 +0000560class MIMG_NoSampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000561 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000562 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000563 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000564 (outs dst_rc:$vdata),
Tom Stellard353b3362013-05-06 23:02:12 +0000565 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000566 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000567 SReg_256:$srsrc),
568 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
569 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
570 []> {
571 let SSAMP = 0;
572 let mayLoad = 1;
573 let mayStore = 0;
574 let hasPostISelHook = 1;
575}
576
Tom Stellard682bfbc2013-10-10 17:11:24 +0000577multiclass MIMG_NoSampler_Src_Helper <bits<7> op, string asm,
578 RegisterClass dst_rc,
579 int channels> {
580 def _V1 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_32>,
581 MIMG_Mask<asm#"_V1", channels>;
582 def _V2 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_64>,
583 MIMG_Mask<asm#"_V2", channels>;
584 def _V4 : MIMG_NoSampler_Helper <op, asm, dst_rc, VReg_128>,
585 MIMG_Mask<asm#"_V4", channels>;
586}
587
Tom Stellard16a9a202013-08-14 23:24:17 +0000588multiclass MIMG_NoSampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000589 defm _V1 : MIMG_NoSampler_Src_Helper <op, asm, VReg_32, 1>;
590 defm _V2 : MIMG_NoSampler_Src_Helper <op, asm, VReg_64, 2>;
591 defm _V3 : MIMG_NoSampler_Src_Helper <op, asm, VReg_96, 3>;
592 defm _V4 : MIMG_NoSampler_Src_Helper <op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000593}
594
595class MIMG_Sampler_Helper <bits<7> op, string asm,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000596 RegisterClass dst_rc,
Tom Stellard16a9a202013-08-14 23:24:17 +0000597 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000598 op,
Tom Stellard682bfbc2013-10-10 17:11:24 +0000599 (outs dst_rc:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000600 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000601 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000602 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000603 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
604 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000605 []> {
606 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000607 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000608 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000609}
610
Tom Stellard682bfbc2013-10-10 17:11:24 +0000611multiclass MIMG_Sampler_Src_Helper <bits<7> op, string asm,
612 RegisterClass dst_rc,
613 int channels> {
614 def _V1 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_32>,
615 MIMG_Mask<asm#"_V1", channels>;
616 def _V2 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_64>,
617 MIMG_Mask<asm#"_V2", channels>;
618 def _V4 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_128>,
619 MIMG_Mask<asm#"_V4", channels>;
620 def _V8 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_256>,
621 MIMG_Mask<asm#"_V8", channels>;
622 def _V16 : MIMG_Sampler_Helper <op, asm, dst_rc, VReg_512>,
623 MIMG_Mask<asm#"_V16", channels>;
624}
625
Tom Stellard16a9a202013-08-14 23:24:17 +0000626multiclass MIMG_Sampler <bits<7> op, string asm> {
Tom Stellard682bfbc2013-10-10 17:11:24 +0000627 defm _V1 : MIMG_Sampler_Src_Helper<op, asm, VReg_32, 1>;
628 defm _V2 : MIMG_Sampler_Src_Helper<op, asm, VReg_64, 2>;
629 defm _V3 : MIMG_Sampler_Src_Helper<op, asm, VReg_96, 3>;
630 defm _V4 : MIMG_Sampler_Src_Helper<op, asm, VReg_128, 4>;
Tom Stellard16a9a202013-08-14 23:24:17 +0000631}
632
Christian Konigf741fbf2013-02-26 17:52:42 +0000633//===----------------------------------------------------------------------===//
634// Vector instruction mappings
635//===----------------------------------------------------------------------===//
636
637// Maps an opcode in e32 form to its e64 equivalent
638def getVOPe64 : InstrMapping {
639 let FilterClass = "VOP";
640 let RowFields = ["OpName"];
641 let ColFields = ["Size"];
642 let KeyCol = ["4"];
643 let ValueCols = [["8"]];
644}
645
Christian Konig3c145802013-03-27 09:12:59 +0000646// Maps an original opcode to its commuted version
647def getCommuteRev : InstrMapping {
648 let FilterClass = "VOP2_REV";
649 let RowFields = ["RevOp"];
650 let ColFields = ["IsOrig"];
651 let KeyCol = ["1"];
652 let ValueCols = [["0"]];
653}
654
Tom Stellard682bfbc2013-10-10 17:11:24 +0000655def getMaskedMIMGOp : InstrMapping {
656 let FilterClass = "MIMG_Mask";
657 let RowFields = ["Op"];
658 let ColFields = ["Channels"];
659 let KeyCol = ["4"];
660 let ValueCols = [["1"], ["2"], ["3"] ];
661}
662
Christian Konig3c145802013-03-27 09:12:59 +0000663// Maps an commuted opcode to its original version
664def getCommuteOrig : InstrMapping {
665 let FilterClass = "VOP2_REV";
666 let RowFields = ["RevOp"];
667 let ColFields = ["IsOrig"];
668 let KeyCol = ["0"];
669 let ValueCols = [["1"]];
670}
671
Tom Stellard5d7aaae2014-02-10 16:58:30 +0000672def isDS : InstrMapping {
673 let FilterClass = "DS";
674 let RowFields = ["Inst"];
675 let ColFields = ["Size"];
676 let KeyCol = ["8"];
677 let ValueCols = [["8"]];
678}
679
Tom Stellard75aadc22012-12-11 21:25:42 +0000680include "SIInstructions.td"