blob: b7419782d34253e8d523b24797b8c3ebac97b634 [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
24def SIload_input : SDNode<"AMDGPUISD::LOAD_INPUT",
25 SDTypeProfile<1, 3, [SDTCisVT<0, v4f32>, SDTCisVT<1, i128>, SDTCisVT<2, i16>,
26 SDTCisVT<3, i32>]>
27>;
28
29class SDSample<string opcode> : SDNode <opcode,
30 SDTypeProfile<1, 4, [SDTCisVT<0, v4f32>, SDTCisVec<1>, SDTCisVT<2, v32i8>,
31 SDTCisVT<3, i128>, SDTCisVT<4, i32>]>
32>;
33
34def SIsample : SDSample<"AMDGPUISD::SAMPLE">;
35def SIsampleb : SDSample<"AMDGPUISD::SAMPLEB">;
36def SIsampled : SDSample<"AMDGPUISD::SAMPLED">;
37def SIsamplel : SDSample<"AMDGPUISD::SAMPLEL">;
38
Tom Stellard26075d52013-02-07 19:39:38 +000039// Transformation function, extract the lower 32bit of a 64bit immediate
40def LO32 : SDNodeXForm<imm, [{
41 return CurDAG->getTargetConstant(N->getZExtValue() & 0xffffffff, MVT::i32);
42}]>;
43
Tom Stellardab8a8c82013-07-12 18:15:02 +000044def LO32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000045 APInt V = N->getValueAPF().bitcastToAPInt().trunc(32);
46 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000047}]>;
48
Tom Stellard26075d52013-02-07 19:39:38 +000049// Transformation function, extract the upper 32bit of a 64bit immediate
50def HI32 : SDNodeXForm<imm, [{
51 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
52}]>;
53
Tom Stellardab8a8c82013-07-12 18:15:02 +000054def HI32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000055 APInt V = N->getValueAPF().bitcastToAPInt().lshr(32).trunc(32);
56 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000057}]>;
58
Tom Stellard89093802013-02-07 19:39:40 +000059def IMM8bitDWORD : ImmLeaf <
60 i32, [{
61 return (Imm & ~0x3FC) == 0;
62 }], SDNodeXForm<imm, [{
63 return CurDAG->getTargetConstant(
64 N->getZExtValue() >> 2, MVT::i32);
65 }]>
66>;
67
Tom Stellard07a10a32013-06-03 17:39:43 +000068def as_i16imm : SDNodeXForm<imm, [{
69 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
70}]>;
71
72def IMM12bit : PatLeaf <(imm),
73 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +000074>;
75
Christian Konigf82901a2013-02-26 17:52:23 +000076class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Bill Wendlinga3cd3502013-06-19 21:36:55 +000077 return
78 (*(const SITargetLowering *)getTargetLowering()).analyzeImmediate(N) == 0;
Christian Konigb559b072013-02-16 11:28:36 +000079}]>;
80
Tom Stellarddf94dc32013-08-14 23:24:24 +000081class SGPRImm <dag frag> : PatLeaf<frag, [{
82 if (TM.getSubtarget<AMDGPUSubtarget>().getGeneration() <
83 AMDGPUSubtarget::SOUTHERN_ISLANDS) {
84 return false;
85 }
86 const SIRegisterInfo *SIRI =
87 static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
88 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
89 U != E; ++U) {
90 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
91 return true;
92 }
93 }
94 return false;
95}]>;
96
Christian Konig72d5d5c2013-02-21 15:16:44 +000097//===----------------------------------------------------------------------===//
98// SI assembler operands
99//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +0000100
Christian Konigeabf8332013-02-21 15:16:49 +0000101def SIOperand {
102 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +0000103 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +0000104}
105
Christian Konig72d5d5c2013-02-21 15:16:44 +0000106include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +0000107
Christian Konig72d5d5c2013-02-21 15:16:44 +0000108//===----------------------------------------------------------------------===//
109//
110// SI Instruction multiclass helpers.
111//
112// Instructions with _32 take 32-bit operands.
113// Instructions with _64 take 64-bit operands.
114//
115// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
116// encoding is the standard encoding, but instruction that make use of
117// any of the instruction modifiers must use the 64-bit encoding.
118//
119// Instructions with _e32 use the 32-bit encoding.
120// Instructions with _e64 use the 64-bit encoding.
121//
122//===----------------------------------------------------------------------===//
123
124//===----------------------------------------------------------------------===//
125// Scalar classes
126//===----------------------------------------------------------------------===//
127
Christian Konige0130a22013-02-21 15:17:13 +0000128class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
129 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
130 opName#" $dst, $src0", pattern
131>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000132
Christian Konige0130a22013-02-21 15:17:13 +0000133class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
134 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
135 opName#" $dst, $src0", pattern
136>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000137
Christian Konige0130a22013-02-21 15:17:13 +0000138class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
139 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
140 opName#" $dst, $src0, $src1", pattern
141>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000142
Christian Konige0130a22013-02-21 15:17:13 +0000143class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
144 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
145 opName#" $dst, $src0, $src1", pattern
146>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000147
Christian Konige0130a22013-02-21 15:17:13 +0000148class SOPC_32 <bits<7> op, string opName, list<dag> pattern> : SOPC <
149 op, (outs SCCReg:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
150 opName#" $dst, $src0, $src1", pattern
151>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000152
Christian Konige0130a22013-02-21 15:17:13 +0000153class SOPC_64 <bits<7> op, string opName, list<dag> pattern> : SOPC <
154 op, (outs SCCReg:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
155 opName#" $dst, $src0, $src1", pattern
156>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000157
Christian Konige0130a22013-02-21 15:17:13 +0000158class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
159 op, (outs SReg_32:$dst), (ins i16imm:$src0),
160 opName#" $dst, $src0", pattern
161>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000162
Christian Konige0130a22013-02-21 15:17:13 +0000163class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
164 op, (outs SReg_64:$dst), (ins i16imm:$src0),
165 opName#" $dst, $src0", pattern
166>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000167
Christian Konig9c7afd12013-03-18 11:33:50 +0000168multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
169 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000170 def _IMM : SMRD <
171 op, 1, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000172 (ins baseClass:$sbase, i32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000173 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000174 >;
175
176 def _SGPR : SMRD <
177 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000178 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000179 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000180 >;
181}
182
183//===----------------------------------------------------------------------===//
184// Vector ALU classes
185//===----------------------------------------------------------------------===//
186
Christian Konigf741fbf2013-02-26 17:52:42 +0000187class VOP <string opName> {
188 string OpName = opName;
189}
190
Christian Konig3c145802013-03-27 09:12:59 +0000191class VOP2_REV <string revOp, bit isOrig> {
192 string RevOp = revOp;
193 bit IsOrig = isOrig;
194}
195
Christian Konig3da70172013-02-21 15:16:53 +0000196multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
197 string opName, list<dag> pattern> {
198
Christian Konigf741fbf2013-02-26 17:52:42 +0000199 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000200 op, (outs drc:$dst), (ins src:$src0),
201 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000202 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000203
Christian Konig3da70172013-02-21 15:16:53 +0000204 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000205 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000206 (outs drc:$dst),
207 (ins src:$src0,
208 i32imm:$abs, i32imm:$clamp,
209 i32imm:$omod, i32imm:$neg),
210 opName#"_e64 $dst, $src0, $abs, $clamp, $omod, $neg", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000211 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000212 let src1 = SIOperand.ZERO;
213 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000214 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000215}
216
Christian Konig3da70172013-02-21 15:16:53 +0000217multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
218 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
219
220multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
221 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
222
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000223multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
224 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
225
226multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
227 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
228
Christian Konigae034e62013-02-21 15:16:58 +0000229multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000230 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000231 def _e32 : VOP2 <
232 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
233 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000234 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000235
Christian Konigae034e62013-02-21 15:16:58 +0000236 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000237 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000238 (outs vrc:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000239 (ins arc:$src0, arc:$src1,
Christian Konigae034e62013-02-21 15:16:58 +0000240 i32imm:$abs, i32imm:$clamp,
241 i32imm:$omod, i32imm:$neg),
242 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000243 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000244 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000245 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000246}
247
Christian Konig3c145802013-03-27 09:12:59 +0000248multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
249 string revOp = opName>
250 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000251
Christian Konig3c145802013-03-27 09:12:59 +0000252multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
253 string revOp = opName>
254 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000255
Christian Konig3c145802013-03-27 09:12:59 +0000256multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
257 string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000258
259 def _e32 : VOP2 <
260 op, (outs VReg_32:$dst), (ins VSrc_32:$src0, VReg_32:$src1),
261 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000262 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000263
264 def _e64 : VOP3b <
265 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
266 (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000267 (ins VSrc_32:$src0, VSrc_32:$src1,
Christian Konigd3039962013-02-26 17:52:09 +0000268 i32imm:$abs, i32imm:$clamp,
269 i32imm:$omod, i32imm:$neg),
270 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000271 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000272 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000273 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
274 can write it into any SGPR. We currently don't use the carry out,
275 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000276 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000277 }
278}
279
Christian Konig72d5d5c2013-02-21 15:16:44 +0000280multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000281 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000282
Christian Konigb19849a2013-02-21 15:17:04 +0000283 def _e32 : VOPC <
284 op, (ins arc:$src0, vrc:$src1),
285 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000286 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000287
Christian Konig72d5d5c2013-02-21 15:16:44 +0000288 def _e64 : VOP3 <
289 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
290 (outs SReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000291 (ins arc:$src0, arc:$src1,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000292 InstFlag:$abs, InstFlag:$clamp,
293 InstFlag:$omod, InstFlag:$neg),
Christian Konigb19849a2013-02-21 15:17:04 +0000294 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg",
295 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000296 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000297 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000298 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000299 let src2 = SIOperand.ZERO;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000300 }
301}
302
Christian Konigb19849a2013-02-21 15:17:04 +0000303multiclass VOPC_32 <bits<8> op, string opName,
304 ValueType vt = untyped, PatLeaf cond = COND_NULL>
305 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000306
Christian Konigb19849a2013-02-21 15:17:04 +0000307multiclass VOPC_64 <bits<8> op, string opName,
308 ValueType vt = untyped, PatLeaf cond = COND_NULL>
309 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000310
Christian Konigf5754a02013-02-21 15:17:09 +0000311class VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
312 op, (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000313 (ins VSrc_32:$src0, VSrc_32:$src1, VSrc_32:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000314 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000315 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000316>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000317
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000318class VOP3_64_Shift <bits <9> op, string opName, list<dag> pattern> : VOP3 <
319 op, (outs VReg_64:$dst),
320 (ins VSrc_64:$src0, VSrc_32:$src1),
321 opName#" $dst, $src0, $src1", pattern
322>, VOP <opName> {
323
324 let src2 = SIOperand.ZERO;
325 let abs = 0;
326 let clamp = 0;
327 let omod = 0;
328 let neg = 0;
329}
330
Christian Konigf5754a02013-02-21 15:17:09 +0000331class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
332 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000333 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000334 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000335 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000336>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000337
Christian Konig72d5d5c2013-02-21 15:16:44 +0000338//===----------------------------------------------------------------------===//
339// Vector I/O classes
340//===----------------------------------------------------------------------===//
341
Michel Danzer1c454302013-07-10 16:36:43 +0000342class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
343 op,
344 (outs regClass:$vdst),
345 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
346 i8imm:$offset0, i8imm:$offset1),
347 asm#" $vdst, $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
348 []> {
349 let mayLoad = 1;
350 let mayStore = 0;
351}
352
353class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
354 op,
355 (outs),
356 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
357 i8imm:$offset0, i8imm:$offset1),
358 asm#" $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
359 []> {
360 let mayStore = 1;
361 let mayLoad = 0;
362 let vdst = 0;
363}
364
Christian Konig72d5d5c2013-02-21 15:16:44 +0000365class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
366 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000367 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000368 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
369 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000370 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000371 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
372 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000373 []> {
374 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000375 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000376}
Tom Stellard75aadc22012-12-11 21:25:42 +0000377
Tom Stellardf1ee7162013-05-20 15:02:31 +0000378multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
379
380 let glc = 0, lds = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */,
381 mayLoad = 1 in {
382
383 let offen = 1, idxen = 0, addr64 = 0, offset = 0 in {
384 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
385 (ins SReg_128:$srsrc, VReg_32:$vaddr),
386 asm#" $vdata, $srsrc + $vaddr", []>;
387 }
388
389 let offen = 0, idxen = 1, addr64 = 0 in {
390 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
391 (ins SReg_128:$srsrc, VReg_32:$vaddr, i16imm:$offset),
392 asm#" $vdata, $srsrc[$vaddr] + $offset", []>;
393 }
394
395 let offen = 0, idxen = 0, addr64 = 1 in {
396 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
397 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
398 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
399 }
400 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000401}
402
Tom Stellard754f80f2013-04-05 23:31:51 +0000403class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
404 ValueType VT> :
Tom Stellard556d9aa2013-06-03 17:39:37 +0000405 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
406 name#" $vdata, $srsrc + $vaddr + $offset",
407 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000408
409 let mayLoad = 0;
410 let mayStore = 1;
411
412 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000413 let offen = 0;
414 let idxen = 0;
415 let glc = 0;
416 let addr64 = 1;
417 let lds = 0;
418 let slc = 0;
419 let tfe = 0;
420 let soffset = 128; // ZERO
421}
422
Christian Konig72d5d5c2013-02-21 15:16:44 +0000423class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
424 op,
425 (outs regClass:$dst),
426 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000427 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000428 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000429 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
430 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000431 []> {
432 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000433 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000434}
435
Tom Stellard16a9a202013-08-14 23:24:17 +0000436class MIMG_NoSampler_Helper <bits<7> op, string asm,
437 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000438 op,
439 (outs VReg_128:$vdata),
440 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000441 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000442 SReg_256:$srsrc),
443 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
444 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
445 []> {
446 let SSAMP = 0;
447 let mayLoad = 1;
448 let mayStore = 0;
449 let hasPostISelHook = 1;
450}
451
Tom Stellard16a9a202013-08-14 23:24:17 +0000452multiclass MIMG_NoSampler <bits<7> op, string asm> {
453 def _V1 : MIMG_NoSampler_Helper <op, asm, VReg_32>;
454 def _V2 : MIMG_NoSampler_Helper <op, asm, VReg_64>;
455 def _V4 : MIMG_NoSampler_Helper <op, asm, VReg_128>;
456}
457
458class MIMG_Sampler_Helper <bits<7> op, string asm,
459 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000460 op,
461 (outs VReg_128:$vdata),
462 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000463 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000464 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000465 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
466 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000467 []> {
468 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000469 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000470 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000471}
472
Tom Stellard16a9a202013-08-14 23:24:17 +0000473multiclass MIMG_Sampler <bits<7> op, string asm> {
474 def _V1 : MIMG_Sampler_Helper <op, asm, VReg_32>;
475 def _V2 : MIMG_Sampler_Helper <op, asm, VReg_64>;
476 def _V4 : MIMG_Sampler_Helper <op, asm, VReg_128>;
477 def _V8 : MIMG_Sampler_Helper <op, asm, VReg_256>;
478 def _V16 : MIMG_Sampler_Helper <op, asm, VReg_512>;
479}
480
Christian Konigf741fbf2013-02-26 17:52:42 +0000481//===----------------------------------------------------------------------===//
482// Vector instruction mappings
483//===----------------------------------------------------------------------===//
484
485// Maps an opcode in e32 form to its e64 equivalent
486def getVOPe64 : InstrMapping {
487 let FilterClass = "VOP";
488 let RowFields = ["OpName"];
489 let ColFields = ["Size"];
490 let KeyCol = ["4"];
491 let ValueCols = [["8"]];
492}
493
Christian Konig3c145802013-03-27 09:12:59 +0000494// Maps an original opcode to its commuted version
495def getCommuteRev : InstrMapping {
496 let FilterClass = "VOP2_REV";
497 let RowFields = ["RevOp"];
498 let ColFields = ["IsOrig"];
499 let KeyCol = ["1"];
500 let ValueCols = [["0"]];
501}
502
503// Maps an commuted opcode to its original version
504def getCommuteOrig : InstrMapping {
505 let FilterClass = "VOP2_REV";
506 let RowFields = ["RevOp"];
507 let ColFields = ["IsOrig"];
508 let KeyCol = ["0"];
509 let ValueCols = [["1"]];
510}
511
Tom Stellard75aadc22012-12-11 21:25:42 +0000512include "SIInstructions.td"