blob: df6d99410d9beda9c6502743505a4281b77775fb [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 Stellard26075d52013-02-07 19:39:38 +000019// Transformation function, extract the lower 32bit of a 64bit immediate
20def LO32 : SDNodeXForm<imm, [{
21 return CurDAG->getTargetConstant(N->getZExtValue() & 0xffffffff, MVT::i32);
22}]>;
23
Tom Stellardab8a8c82013-07-12 18:15:02 +000024def LO32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000025 APInt V = N->getValueAPF().bitcastToAPInt().trunc(32);
26 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000027}]>;
28
Tom Stellard26075d52013-02-07 19:39:38 +000029// Transformation function, extract the upper 32bit of a 64bit immediate
30def HI32 : SDNodeXForm<imm, [{
31 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
32}]>;
33
Tom Stellardab8a8c82013-07-12 18:15:02 +000034def HI32f : SDNodeXForm<fpimm, [{
Benjamin Kramerc22c7902013-07-12 20:18:05 +000035 APInt V = N->getValueAPF().bitcastToAPInt().lshr(32).trunc(32);
36 return CurDAG->getTargetConstantFP(APFloat(APFloat::IEEEsingle, V), MVT::f32);
Tom Stellardab8a8c82013-07-12 18:15:02 +000037}]>;
38
Tom Stellard89093802013-02-07 19:39:40 +000039def IMM8bitDWORD : ImmLeaf <
40 i32, [{
41 return (Imm & ~0x3FC) == 0;
42 }], SDNodeXForm<imm, [{
43 return CurDAG->getTargetConstant(
44 N->getZExtValue() >> 2, MVT::i32);
45 }]>
46>;
47
Tom Stellard07a10a32013-06-03 17:39:43 +000048def as_i16imm : SDNodeXForm<imm, [{
49 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
50}]>;
51
52def IMM12bit : PatLeaf <(imm),
53 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +000054>;
55
Christian Konigf82901a2013-02-26 17:52:23 +000056class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Bill Wendlinga3cd3502013-06-19 21:36:55 +000057 return
58 (*(const SITargetLowering *)getTargetLowering()).analyzeImmediate(N) == 0;
Christian Konigb559b072013-02-16 11:28:36 +000059}]>;
60
Tom Stellarddf94dc32013-08-14 23:24:24 +000061class SGPRImm <dag frag> : PatLeaf<frag, [{
62 if (TM.getSubtarget<AMDGPUSubtarget>().getGeneration() <
63 AMDGPUSubtarget::SOUTHERN_ISLANDS) {
64 return false;
65 }
66 const SIRegisterInfo *SIRI =
67 static_cast<const SIRegisterInfo*>(TM.getRegisterInfo());
68 for (SDNode::use_iterator U = N->use_begin(), E = SDNode::use_end();
69 U != E; ++U) {
70 if (SIRI->isSGPRClass(getOperandRegClass(*U, U.getOperandNo()))) {
71 return true;
72 }
73 }
74 return false;
75}]>;
76
Christian Konig72d5d5c2013-02-21 15:16:44 +000077//===----------------------------------------------------------------------===//
78// SI assembler operands
79//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +000080
Christian Konigeabf8332013-02-21 15:16:49 +000081def SIOperand {
82 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +000083 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +000084}
85
Christian Konig72d5d5c2013-02-21 15:16:44 +000086include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +000087
Christian Konig72d5d5c2013-02-21 15:16:44 +000088//===----------------------------------------------------------------------===//
89//
90// SI Instruction multiclass helpers.
91//
92// Instructions with _32 take 32-bit operands.
93// Instructions with _64 take 64-bit operands.
94//
95// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
96// encoding is the standard encoding, but instruction that make use of
97// any of the instruction modifiers must use the 64-bit encoding.
98//
99// Instructions with _e32 use the 32-bit encoding.
100// Instructions with _e64 use the 64-bit encoding.
101//
102//===----------------------------------------------------------------------===//
103
104//===----------------------------------------------------------------------===//
105// Scalar classes
106//===----------------------------------------------------------------------===//
107
Christian Konige0130a22013-02-21 15:17:13 +0000108class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
109 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
110 opName#" $dst, $src0", pattern
111>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000112
Christian Konige0130a22013-02-21 15:17:13 +0000113class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
114 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
115 opName#" $dst, $src0", pattern
116>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000117
Christian Konige0130a22013-02-21 15:17:13 +0000118class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
119 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
120 opName#" $dst, $src0, $src1", pattern
121>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000122
Christian Konige0130a22013-02-21 15:17:13 +0000123class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
124 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
125 opName#" $dst, $src0, $src1", pattern
126>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000127
Christian Konige0130a22013-02-21 15:17:13 +0000128class SOPC_32 <bits<7> op, string opName, list<dag> pattern> : SOPC <
129 op, (outs SCCReg:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
130 opName#" $dst, $src0, $src1", pattern
131>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000132
Christian Konige0130a22013-02-21 15:17:13 +0000133class SOPC_64 <bits<7> op, string opName, list<dag> pattern> : SOPC <
134 op, (outs SCCReg:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
135 opName#" $dst, $src0, $src1", pattern
136>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000137
Christian Konige0130a22013-02-21 15:17:13 +0000138class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
139 op, (outs SReg_32:$dst), (ins i16imm:$src0),
140 opName#" $dst, $src0", pattern
141>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000142
Christian Konige0130a22013-02-21 15:17:13 +0000143class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
144 op, (outs SReg_64:$dst), (ins i16imm:$src0),
145 opName#" $dst, $src0", pattern
146>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000147
Christian Konig9c7afd12013-03-18 11:33:50 +0000148multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
149 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000150 def _IMM : SMRD <
151 op, 1, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000152 (ins baseClass:$sbase, i32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000153 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000154 >;
155
156 def _SGPR : SMRD <
157 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000158 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000159 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000160 >;
161}
162
163//===----------------------------------------------------------------------===//
164// Vector ALU classes
165//===----------------------------------------------------------------------===//
166
Christian Konigf741fbf2013-02-26 17:52:42 +0000167class VOP <string opName> {
168 string OpName = opName;
169}
170
Christian Konig3c145802013-03-27 09:12:59 +0000171class VOP2_REV <string revOp, bit isOrig> {
172 string RevOp = revOp;
173 bit IsOrig = isOrig;
174}
175
Christian Konig3da70172013-02-21 15:16:53 +0000176multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
177 string opName, list<dag> pattern> {
178
Christian Konigf741fbf2013-02-26 17:52:42 +0000179 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000180 op, (outs drc:$dst), (ins src:$src0),
181 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000182 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000183
Christian Konig3da70172013-02-21 15:16:53 +0000184 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000185 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000186 (outs drc:$dst),
187 (ins src:$src0,
188 i32imm:$abs, i32imm:$clamp,
189 i32imm:$omod, i32imm:$neg),
190 opName#"_e64 $dst, $src0, $abs, $clamp, $omod, $neg", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000191 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000192 let src1 = SIOperand.ZERO;
193 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000194 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000195}
196
Christian Konig3da70172013-02-21 15:16:53 +0000197multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
198 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
199
200multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
201 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
202
Niels Ole Salscheider4715d882013-08-08 16:06:08 +0000203multiclass VOP1_32_64 <bits<8> op, string opName, list<dag> pattern>
204 : VOP1_Helper <op, VReg_32, VSrc_64, opName, pattern>;
205
206multiclass VOP1_64_32 <bits<8> op, string opName, list<dag> pattern>
207 : VOP1_Helper <op, VReg_64, VSrc_32, opName, pattern>;
208
Christian Konigae034e62013-02-21 15:16:58 +0000209multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000210 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000211 def _e32 : VOP2 <
212 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
213 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000214 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000215
Christian Konigae034e62013-02-21 15:16:58 +0000216 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000217 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000218 (outs vrc:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000219 (ins arc:$src0, arc:$src1,
Christian Konigae034e62013-02-21 15:16:58 +0000220 i32imm:$abs, i32imm:$clamp,
221 i32imm:$omod, i32imm:$neg),
222 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000223 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000224 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000225 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000226}
227
Christian Konig3c145802013-03-27 09:12:59 +0000228multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
229 string revOp = opName>
230 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000231
Christian Konig3c145802013-03-27 09:12:59 +0000232multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
233 string revOp = opName>
234 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000235
Christian Konig3c145802013-03-27 09:12:59 +0000236multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
237 string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000238
239 def _e32 : VOP2 <
240 op, (outs VReg_32:$dst), (ins VSrc_32:$src0, VReg_32:$src1),
241 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000242 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000243
244 def _e64 : VOP3b <
245 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
246 (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000247 (ins VSrc_32:$src0, VSrc_32:$src1,
Christian Konigd3039962013-02-26 17:52:09 +0000248 i32imm:$abs, i32imm:$clamp,
249 i32imm:$omod, i32imm:$neg),
250 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000251 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000252 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000253 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
254 can write it into any SGPR. We currently don't use the carry out,
255 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000256 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000257 }
258}
259
Christian Konig72d5d5c2013-02-21 15:16:44 +0000260multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000261 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000262
Christian Konigb19849a2013-02-21 15:17:04 +0000263 def _e32 : VOPC <
264 op, (ins arc:$src0, vrc:$src1),
265 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000266 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000267
Christian Konig72d5d5c2013-02-21 15:16:44 +0000268 def _e64 : VOP3 <
269 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
270 (outs SReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000271 (ins arc:$src0, arc:$src1,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000272 InstFlag:$abs, InstFlag:$clamp,
273 InstFlag:$omod, InstFlag:$neg),
Christian Konigb19849a2013-02-21 15:17:04 +0000274 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg",
275 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000276 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000277 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000278 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000279 let src2 = SIOperand.ZERO;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000280 }
281}
282
Christian Konigb19849a2013-02-21 15:17:04 +0000283multiclass VOPC_32 <bits<8> op, string opName,
284 ValueType vt = untyped, PatLeaf cond = COND_NULL>
285 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000286
Christian Konigb19849a2013-02-21 15:17:04 +0000287multiclass VOPC_64 <bits<8> op, string opName,
288 ValueType vt = untyped, PatLeaf cond = COND_NULL>
289 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000290
Christian Konigf5754a02013-02-21 15:17:09 +0000291class VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
292 op, (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000293 (ins VSrc_32:$src0, VSrc_32:$src1, VSrc_32:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000294 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000295 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000296>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000297
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000298class VOP3_64_Shift <bits <9> op, string opName, list<dag> pattern> : VOP3 <
299 op, (outs VReg_64:$dst),
300 (ins VSrc_64:$src0, VSrc_32:$src1),
301 opName#" $dst, $src0, $src1", pattern
302>, VOP <opName> {
303
304 let src2 = SIOperand.ZERO;
305 let abs = 0;
306 let clamp = 0;
307 let omod = 0;
308 let neg = 0;
309}
310
Christian Konigf5754a02013-02-21 15:17:09 +0000311class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
312 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000313 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$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
Christian Konig72d5d5c2013-02-21 15:16:44 +0000318//===----------------------------------------------------------------------===//
319// Vector I/O classes
320//===----------------------------------------------------------------------===//
321
Michel Danzer1c454302013-07-10 16:36:43 +0000322class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
323 op,
324 (outs regClass:$vdst),
325 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
326 i8imm:$offset0, i8imm:$offset1),
327 asm#" $vdst, $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
328 []> {
329 let mayLoad = 1;
330 let mayStore = 0;
331}
332
333class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
334 op,
335 (outs),
336 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
337 i8imm:$offset0, i8imm:$offset1),
338 asm#" $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
339 []> {
340 let mayStore = 1;
341 let mayLoad = 0;
342 let vdst = 0;
343}
344
Christian Konig72d5d5c2013-02-21 15:16:44 +0000345class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
346 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000347 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000348 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
349 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000350 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000351 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
352 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000353 []> {
354 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000355 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000356}
Tom Stellard75aadc22012-12-11 21:25:42 +0000357
Tom Stellardf1ee7162013-05-20 15:02:31 +0000358multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
359
360 let glc = 0, lds = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */,
361 mayLoad = 1 in {
362
363 let offen = 1, idxen = 0, addr64 = 0, offset = 0 in {
364 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
365 (ins SReg_128:$srsrc, VReg_32:$vaddr),
366 asm#" $vdata, $srsrc + $vaddr", []>;
367 }
368
369 let offen = 0, idxen = 1, addr64 = 0 in {
370 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
371 (ins SReg_128:$srsrc, VReg_32:$vaddr, i16imm:$offset),
372 asm#" $vdata, $srsrc[$vaddr] + $offset", []>;
373 }
374
375 let offen = 0, idxen = 0, addr64 = 1 in {
376 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
377 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
378 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
379 }
380 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000381}
382
Tom Stellard754f80f2013-04-05 23:31:51 +0000383class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
384 ValueType VT> :
Tom Stellard556d9aa2013-06-03 17:39:37 +0000385 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
386 name#" $vdata, $srsrc + $vaddr + $offset",
387 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000388
389 let mayLoad = 0;
390 let mayStore = 1;
391
392 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000393 let offen = 0;
394 let idxen = 0;
395 let glc = 0;
396 let addr64 = 1;
397 let lds = 0;
398 let slc = 0;
399 let tfe = 0;
400 let soffset = 128; // ZERO
401}
402
Christian Konig72d5d5c2013-02-21 15:16:44 +0000403class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
404 op,
405 (outs regClass:$dst),
406 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000407 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000408 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000409 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
410 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000411 []> {
412 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000413 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000414}
415
Tom Stellard16a9a202013-08-14 23:24:17 +0000416class MIMG_NoSampler_Helper <bits<7> op, string asm,
417 RegisterClass src_rc> : MIMG <
Tom Stellard353b3362013-05-06 23:02:12 +0000418 op,
419 (outs VReg_128:$vdata),
420 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000421 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Tom Stellard353b3362013-05-06 23:02:12 +0000422 SReg_256:$srsrc),
423 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
424 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
425 []> {
426 let SSAMP = 0;
427 let mayLoad = 1;
428 let mayStore = 0;
429 let hasPostISelHook = 1;
430}
431
Tom Stellard16a9a202013-08-14 23:24:17 +0000432multiclass MIMG_NoSampler <bits<7> op, string asm> {
433 def _V1 : MIMG_NoSampler_Helper <op, asm, VReg_32>;
434 def _V2 : MIMG_NoSampler_Helper <op, asm, VReg_64>;
435 def _V4 : MIMG_NoSampler_Helper <op, asm, VReg_128>;
436}
437
438class MIMG_Sampler_Helper <bits<7> op, string asm,
439 RegisterClass src_rc> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000440 op,
441 (outs VReg_128:$vdata),
442 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Tom Stellard16a9a202013-08-14 23:24:17 +0000443 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, src_rc:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000444 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000445 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
446 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000447 []> {
448 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000449 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000450 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000451}
452
Tom Stellard16a9a202013-08-14 23:24:17 +0000453multiclass MIMG_Sampler <bits<7> op, string asm> {
454 def _V1 : MIMG_Sampler_Helper <op, asm, VReg_32>;
455 def _V2 : MIMG_Sampler_Helper <op, asm, VReg_64>;
456 def _V4 : MIMG_Sampler_Helper <op, asm, VReg_128>;
457 def _V8 : MIMG_Sampler_Helper <op, asm, VReg_256>;
458 def _V16 : MIMG_Sampler_Helper <op, asm, VReg_512>;
459}
460
Christian Konigf741fbf2013-02-26 17:52:42 +0000461//===----------------------------------------------------------------------===//
462// Vector instruction mappings
463//===----------------------------------------------------------------------===//
464
465// Maps an opcode in e32 form to its e64 equivalent
466def getVOPe64 : InstrMapping {
467 let FilterClass = "VOP";
468 let RowFields = ["OpName"];
469 let ColFields = ["Size"];
470 let KeyCol = ["4"];
471 let ValueCols = [["8"]];
472}
473
Christian Konig3c145802013-03-27 09:12:59 +0000474// Maps an original opcode to its commuted version
475def getCommuteRev : InstrMapping {
476 let FilterClass = "VOP2_REV";
477 let RowFields = ["RevOp"];
478 let ColFields = ["IsOrig"];
479 let KeyCol = ["1"];
480 let ValueCols = [["0"]];
481}
482
483// Maps an commuted opcode to its original version
484def getCommuteOrig : InstrMapping {
485 let FilterClass = "VOP2_REV";
486 let RowFields = ["RevOp"];
487 let ColFields = ["IsOrig"];
488 let KeyCol = ["0"];
489 let ValueCols = [["1"]];
490}
491
Tom Stellard75aadc22012-12-11 21:25:42 +0000492include "SIInstructions.td"