blob: 067a34bf4793b7aa2a7389574c0182c988cd91b6 [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, [{
25 uint64_t val = N->getValueAPF().bitcastToAPInt().getZExtValue() & 0xffffffff;
26 float *fval = reinterpret_cast<float *>(&val);
27 return CurDAG->getTargetConstantFP(*fval, MVT::f32);
28}]>;
29
Tom Stellard26075d52013-02-07 19:39:38 +000030// Transformation function, extract the upper 32bit of a 64bit immediate
31def HI32 : SDNodeXForm<imm, [{
32 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
33}]>;
34
Tom Stellardab8a8c82013-07-12 18:15:02 +000035def HI32f : SDNodeXForm<fpimm, [{
36 uint64_t val = N->getValueAPF().bitcastToAPInt().getZExtValue() >> 32;
37 float *fval = reinterpret_cast<float *>(&val);
38 return CurDAG->getTargetConstantFP(*fval, MVT::f32);
39}]>;
40
Tom Stellard89093802013-02-07 19:39:40 +000041def IMM8bitDWORD : ImmLeaf <
42 i32, [{
43 return (Imm & ~0x3FC) == 0;
44 }], SDNodeXForm<imm, [{
45 return CurDAG->getTargetConstant(
46 N->getZExtValue() >> 2, MVT::i32);
47 }]>
48>;
49
Tom Stellard07a10a32013-06-03 17:39:43 +000050def as_i16imm : SDNodeXForm<imm, [{
51 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
52}]>;
53
54def IMM12bit : PatLeaf <(imm),
55 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +000056>;
57
Christian Konigf82901a2013-02-26 17:52:23 +000058class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Bill Wendlinga3cd3502013-06-19 21:36:55 +000059 return
60 (*(const SITargetLowering *)getTargetLowering()).analyzeImmediate(N) == 0;
Christian Konigb559b072013-02-16 11:28:36 +000061}]>;
62
Christian Konig72d5d5c2013-02-21 15:16:44 +000063//===----------------------------------------------------------------------===//
64// SI assembler operands
65//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +000066
Christian Konigeabf8332013-02-21 15:16:49 +000067def SIOperand {
68 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +000069 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +000070}
71
Christian Konig72d5d5c2013-02-21 15:16:44 +000072include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +000073
Christian Konig72d5d5c2013-02-21 15:16:44 +000074//===----------------------------------------------------------------------===//
75//
76// SI Instruction multiclass helpers.
77//
78// Instructions with _32 take 32-bit operands.
79// Instructions with _64 take 64-bit operands.
80//
81// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
82// encoding is the standard encoding, but instruction that make use of
83// any of the instruction modifiers must use the 64-bit encoding.
84//
85// Instructions with _e32 use the 32-bit encoding.
86// Instructions with _e64 use the 64-bit encoding.
87//
88//===----------------------------------------------------------------------===//
89
90//===----------------------------------------------------------------------===//
91// Scalar classes
92//===----------------------------------------------------------------------===//
93
Christian Konige0130a22013-02-21 15:17:13 +000094class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
95 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
96 opName#" $dst, $src0", pattern
97>;
Christian Konig72d5d5c2013-02-21 15:16:44 +000098
Christian Konige0130a22013-02-21 15:17:13 +000099class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
100 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
101 opName#" $dst, $src0", pattern
102>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000103
Christian Konige0130a22013-02-21 15:17:13 +0000104class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
105 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
106 opName#" $dst, $src0, $src1", pattern
107>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000108
Christian Konige0130a22013-02-21 15:17:13 +0000109class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
110 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
111 opName#" $dst, $src0, $src1", pattern
112>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000113
Christian Konige0130a22013-02-21 15:17:13 +0000114class SOPC_32 <bits<7> op, string opName, list<dag> pattern> : SOPC <
115 op, (outs SCCReg:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
116 opName#" $dst, $src0, $src1", pattern
117>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000118
Christian Konige0130a22013-02-21 15:17:13 +0000119class SOPC_64 <bits<7> op, string opName, list<dag> pattern> : SOPC <
120 op, (outs SCCReg:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
121 opName#" $dst, $src0, $src1", pattern
122>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000123
Christian Konige0130a22013-02-21 15:17:13 +0000124class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
125 op, (outs SReg_32:$dst), (ins i16imm:$src0),
126 opName#" $dst, $src0", pattern
127>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000128
Christian Konige0130a22013-02-21 15:17:13 +0000129class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
130 op, (outs SReg_64:$dst), (ins i16imm:$src0),
131 opName#" $dst, $src0", pattern
132>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000133
Christian Konig9c7afd12013-03-18 11:33:50 +0000134multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
135 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000136 def _IMM : SMRD <
137 op, 1, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000138 (ins baseClass:$sbase, i32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000139 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000140 >;
141
142 def _SGPR : SMRD <
143 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000144 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000145 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000146 >;
147}
148
149//===----------------------------------------------------------------------===//
150// Vector ALU classes
151//===----------------------------------------------------------------------===//
152
Christian Konigf741fbf2013-02-26 17:52:42 +0000153class VOP <string opName> {
154 string OpName = opName;
155}
156
Christian Konig3c145802013-03-27 09:12:59 +0000157class VOP2_REV <string revOp, bit isOrig> {
158 string RevOp = revOp;
159 bit IsOrig = isOrig;
160}
161
Christian Konig3da70172013-02-21 15:16:53 +0000162multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
163 string opName, list<dag> pattern> {
164
Christian Konigf741fbf2013-02-26 17:52:42 +0000165 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000166 op, (outs drc:$dst), (ins src:$src0),
167 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000168 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000169
Christian Konig3da70172013-02-21 15:16:53 +0000170 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000171 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000172 (outs drc:$dst),
173 (ins src:$src0,
174 i32imm:$abs, i32imm:$clamp,
175 i32imm:$omod, i32imm:$neg),
176 opName#"_e64 $dst, $src0, $abs, $clamp, $omod, $neg", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000177 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000178 let src1 = SIOperand.ZERO;
179 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000180 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000181}
182
Christian Konig3da70172013-02-21 15:16:53 +0000183multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
184 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
185
186multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
187 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
188
Christian Konigae034e62013-02-21 15:16:58 +0000189multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000190 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000191 def _e32 : VOP2 <
192 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
193 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000194 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000195
Christian Konigae034e62013-02-21 15:16:58 +0000196 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000197 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000198 (outs vrc:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000199 (ins arc:$src0, arc:$src1,
Christian Konigae034e62013-02-21 15:16:58 +0000200 i32imm:$abs, i32imm:$clamp,
201 i32imm:$omod, i32imm:$neg),
202 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000203 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000204 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000205 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000206}
207
Christian Konig3c145802013-03-27 09:12:59 +0000208multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
209 string revOp = opName>
210 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000211
Christian Konig3c145802013-03-27 09:12:59 +0000212multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
213 string revOp = opName>
214 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000215
Christian Konig3c145802013-03-27 09:12:59 +0000216multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
217 string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000218
219 def _e32 : VOP2 <
220 op, (outs VReg_32:$dst), (ins VSrc_32:$src0, VReg_32:$src1),
221 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000222 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000223
224 def _e64 : VOP3b <
225 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
226 (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000227 (ins VSrc_32:$src0, VSrc_32:$src1,
Christian Konigd3039962013-02-26 17:52:09 +0000228 i32imm:$abs, i32imm:$clamp,
229 i32imm:$omod, i32imm:$neg),
230 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000231 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000232 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000233 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
234 can write it into any SGPR. We currently don't use the carry out,
235 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000236 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000237 }
238}
239
Christian Konig72d5d5c2013-02-21 15:16:44 +0000240multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000241 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000242
Christian Konigb19849a2013-02-21 15:17:04 +0000243 def _e32 : VOPC <
244 op, (ins arc:$src0, vrc:$src1),
245 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000246 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000247
Christian Konig72d5d5c2013-02-21 15:16:44 +0000248 def _e64 : VOP3 <
249 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
250 (outs SReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000251 (ins arc:$src0, arc:$src1,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000252 InstFlag:$abs, InstFlag:$clamp,
253 InstFlag:$omod, InstFlag:$neg),
Christian Konigb19849a2013-02-21 15:17:04 +0000254 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg",
255 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000256 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000257 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000258 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000259 let src2 = SIOperand.ZERO;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000260 }
261}
262
Christian Konigb19849a2013-02-21 15:17:04 +0000263multiclass VOPC_32 <bits<8> op, string opName,
264 ValueType vt = untyped, PatLeaf cond = COND_NULL>
265 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000266
Christian Konigb19849a2013-02-21 15:17:04 +0000267multiclass VOPC_64 <bits<8> op, string opName,
268 ValueType vt = untyped, PatLeaf cond = COND_NULL>
269 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000270
Christian Konigf5754a02013-02-21 15:17:09 +0000271class VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
272 op, (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000273 (ins VSrc_32:$src0, VSrc_32:$src1, VSrc_32:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000274 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000275 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000276>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000277
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000278class VOP3_64_Shift <bits <9> op, string opName, list<dag> pattern> : VOP3 <
279 op, (outs VReg_64:$dst),
280 (ins VSrc_64:$src0, VSrc_32:$src1),
281 opName#" $dst, $src0, $src1", pattern
282>, VOP <opName> {
283
284 let src2 = SIOperand.ZERO;
285 let abs = 0;
286 let clamp = 0;
287 let omod = 0;
288 let neg = 0;
289}
290
Christian Konigf5754a02013-02-21 15:17:09 +0000291class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
292 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000293 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$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
Christian Konig72d5d5c2013-02-21 15:16:44 +0000298//===----------------------------------------------------------------------===//
299// Vector I/O classes
300//===----------------------------------------------------------------------===//
301
Michel Danzer1c454302013-07-10 16:36:43 +0000302class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
303 op,
304 (outs regClass:$vdst),
305 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
306 i8imm:$offset0, i8imm:$offset1),
307 asm#" $vdst, $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
308 []> {
309 let mayLoad = 1;
310 let mayStore = 0;
311}
312
313class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
314 op,
315 (outs),
316 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
317 i8imm:$offset0, i8imm:$offset1),
318 asm#" $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
319 []> {
320 let mayStore = 1;
321 let mayLoad = 0;
322 let vdst = 0;
323}
324
Christian Konig72d5d5c2013-02-21 15:16:44 +0000325class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
326 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000327 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000328 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
329 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000330 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000331 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
332 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000333 []> {
334 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000335 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000336}
Tom Stellard75aadc22012-12-11 21:25:42 +0000337
Tom Stellardf1ee7162013-05-20 15:02:31 +0000338multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
339
340 let glc = 0, lds = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */,
341 mayLoad = 1 in {
342
343 let offen = 1, idxen = 0, addr64 = 0, offset = 0 in {
344 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
345 (ins SReg_128:$srsrc, VReg_32:$vaddr),
346 asm#" $vdata, $srsrc + $vaddr", []>;
347 }
348
349 let offen = 0, idxen = 1, addr64 = 0 in {
350 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
351 (ins SReg_128:$srsrc, VReg_32:$vaddr, i16imm:$offset),
352 asm#" $vdata, $srsrc[$vaddr] + $offset", []>;
353 }
354
355 let offen = 0, idxen = 0, addr64 = 1 in {
356 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
357 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
358 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
359 }
360 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000361}
362
Tom Stellard754f80f2013-04-05 23:31:51 +0000363class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
364 ValueType VT> :
Tom Stellard556d9aa2013-06-03 17:39:37 +0000365 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
366 name#" $vdata, $srsrc + $vaddr + $offset",
367 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000368
369 let mayLoad = 0;
370 let mayStore = 1;
371
372 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000373 let offen = 0;
374 let idxen = 0;
375 let glc = 0;
376 let addr64 = 1;
377 let lds = 0;
378 let slc = 0;
379 let tfe = 0;
380 let soffset = 128; // ZERO
381}
382
Christian Konig72d5d5c2013-02-21 15:16:44 +0000383class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
384 op,
385 (outs regClass:$dst),
386 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000387 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000388 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000389 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
390 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000391 []> {
392 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000393 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000394}
395
Tom Stellard353b3362013-05-06 23:02:12 +0000396class MIMG_NoSampler_Helper <bits<7> op, string asm> : MIMG <
397 op,
398 (outs VReg_128:$vdata),
399 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
400 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, unknown:$vaddr,
401 SReg_256:$srsrc),
402 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
403 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
404 []> {
405 let SSAMP = 0;
406 let mayLoad = 1;
407 let mayStore = 0;
408 let hasPostISelHook = 1;
409}
410
411class MIMG_Sampler_Helper <bits<7> op, string asm> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000412 op,
413 (outs VReg_128:$vdata),
414 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Christian Konig25ce3e92013-03-26 14:04:07 +0000415 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, unknown:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000416 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000417 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
418 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000419 []> {
420 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000421 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000422 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000423}
424
Christian Konigf741fbf2013-02-26 17:52:42 +0000425//===----------------------------------------------------------------------===//
426// Vector instruction mappings
427//===----------------------------------------------------------------------===//
428
429// Maps an opcode in e32 form to its e64 equivalent
430def getVOPe64 : InstrMapping {
431 let FilterClass = "VOP";
432 let RowFields = ["OpName"];
433 let ColFields = ["Size"];
434 let KeyCol = ["4"];
435 let ValueCols = [["8"]];
436}
437
Christian Konig3c145802013-03-27 09:12:59 +0000438// Maps an original opcode to its commuted version
439def getCommuteRev : InstrMapping {
440 let FilterClass = "VOP2_REV";
441 let RowFields = ["RevOp"];
442 let ColFields = ["IsOrig"];
443 let KeyCol = ["1"];
444 let ValueCols = [["0"]];
445}
446
447// Maps an commuted opcode to its original version
448def getCommuteOrig : InstrMapping {
449 let FilterClass = "VOP2_REV";
450 let RowFields = ["RevOp"];
451 let ColFields = ["IsOrig"];
452 let KeyCol = ["0"];
453 let ValueCols = [["1"]];
454}
455
Christian Konig8b1ed282013-04-10 08:39:16 +0000456// Test if the supplied opcode is an MIMG instruction
Christian Konig8e06e2a2013-04-10 08:39:08 +0000457def isMIMG : InstrMapping {
Tom Stellard353b3362013-05-06 23:02:12 +0000458 let FilterClass = "MIMG";
Christian Konig8e06e2a2013-04-10 08:39:08 +0000459 let RowFields = ["Inst"];
460 let ColFields = ["Size"];
461 let KeyCol = ["8"];
462 let ValueCols = [["8"]];
463}
464
Tom Stellard75aadc22012-12-11 21:25:42 +0000465include "SIInstructions.td"