blob: 655a8b1641ab0976316d386cc2f82e75f30293e4 [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
24// Transformation function, extract the upper 32bit of a 64bit immediate
25def HI32 : SDNodeXForm<imm, [{
26 return CurDAG->getTargetConstant(N->getZExtValue() >> 32, MVT::i32);
27}]>;
28
Tom Stellard89093802013-02-07 19:39:40 +000029def IMM8bitDWORD : ImmLeaf <
30 i32, [{
31 return (Imm & ~0x3FC) == 0;
32 }], SDNodeXForm<imm, [{
33 return CurDAG->getTargetConstant(
34 N->getZExtValue() >> 2, MVT::i32);
35 }]>
36>;
37
Tom Stellard07a10a32013-06-03 17:39:43 +000038def as_i16imm : SDNodeXForm<imm, [{
39 return CurDAG->getTargetConstant(N->getSExtValue(), MVT::i16);
40}]>;
41
42def IMM12bit : PatLeaf <(imm),
43 [{return isUInt<12>(N->getZExtValue());}]
Tom Stellard89093802013-02-07 19:39:40 +000044>;
45
Christian Konigf82901a2013-02-26 17:52:23 +000046class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
Bill Wendlinga3cd3502013-06-19 21:36:55 +000047 return
48 (*(const SITargetLowering *)getTargetLowering()).analyzeImmediate(N) == 0;
Christian Konigb559b072013-02-16 11:28:36 +000049}]>;
50
Christian Konig72d5d5c2013-02-21 15:16:44 +000051//===----------------------------------------------------------------------===//
52// SI assembler operands
53//===----------------------------------------------------------------------===//
Tom Stellard75aadc22012-12-11 21:25:42 +000054
Christian Konigeabf8332013-02-21 15:16:49 +000055def SIOperand {
56 int ZERO = 0x80;
Christian Konigd3039962013-02-26 17:52:09 +000057 int VCC = 0x6A;
Tom Stellard75aadc22012-12-11 21:25:42 +000058}
59
Christian Konig72d5d5c2013-02-21 15:16:44 +000060include "SIInstrFormats.td"
Tom Stellard75aadc22012-12-11 21:25:42 +000061
Christian Konig72d5d5c2013-02-21 15:16:44 +000062//===----------------------------------------------------------------------===//
63//
64// SI Instruction multiclass helpers.
65//
66// Instructions with _32 take 32-bit operands.
67// Instructions with _64 take 64-bit operands.
68//
69// VOP_* instructions can use either a 32-bit or 64-bit encoding. The 32-bit
70// encoding is the standard encoding, but instruction that make use of
71// any of the instruction modifiers must use the 64-bit encoding.
72//
73// Instructions with _e32 use the 32-bit encoding.
74// Instructions with _e64 use the 64-bit encoding.
75//
76//===----------------------------------------------------------------------===//
77
78//===----------------------------------------------------------------------===//
79// Scalar classes
80//===----------------------------------------------------------------------===//
81
Christian Konige0130a22013-02-21 15:17:13 +000082class SOP1_32 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
83 op, (outs SReg_32:$dst), (ins SSrc_32:$src0),
84 opName#" $dst, $src0", pattern
85>;
Christian Konig72d5d5c2013-02-21 15:16:44 +000086
Christian Konige0130a22013-02-21 15:17:13 +000087class SOP1_64 <bits<8> op, string opName, list<dag> pattern> : SOP1 <
88 op, (outs SReg_64:$dst), (ins SSrc_64:$src0),
89 opName#" $dst, $src0", pattern
90>;
Christian Konig72d5d5c2013-02-21 15:16:44 +000091
Christian Konige0130a22013-02-21 15:17:13 +000092class SOP2_32 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
93 op, (outs SReg_32:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
94 opName#" $dst, $src0, $src1", pattern
95>;
Christian Konig72d5d5c2013-02-21 15:16:44 +000096
Christian Konige0130a22013-02-21 15:17:13 +000097class SOP2_64 <bits<7> op, string opName, list<dag> pattern> : SOP2 <
98 op, (outs SReg_64:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
99 opName#" $dst, $src0, $src1", pattern
100>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000101
Christian Konige0130a22013-02-21 15:17:13 +0000102class SOPC_32 <bits<7> op, string opName, list<dag> pattern> : SOPC <
103 op, (outs SCCReg:$dst), (ins SSrc_32:$src0, SSrc_32:$src1),
104 opName#" $dst, $src0, $src1", pattern
105>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000106
Christian Konige0130a22013-02-21 15:17:13 +0000107class SOPC_64 <bits<7> op, string opName, list<dag> pattern> : SOPC <
108 op, (outs SCCReg:$dst), (ins SSrc_64:$src0, SSrc_64:$src1),
109 opName#" $dst, $src0, $src1", pattern
110>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000111
Christian Konige0130a22013-02-21 15:17:13 +0000112class SOPK_32 <bits<5> op, string opName, list<dag> pattern> : SOPK <
113 op, (outs SReg_32:$dst), (ins i16imm:$src0),
114 opName#" $dst, $src0", pattern
115>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000116
Christian Konige0130a22013-02-21 15:17:13 +0000117class SOPK_64 <bits<5> op, string opName, list<dag> pattern> : SOPK <
118 op, (outs SReg_64:$dst), (ins i16imm:$src0),
119 opName#" $dst, $src0", pattern
120>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000121
Christian Konig9c7afd12013-03-18 11:33:50 +0000122multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass baseClass,
123 RegisterClass dstClass> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000124 def _IMM : SMRD <
125 op, 1, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000126 (ins baseClass:$sbase, i32imm:$offset),
Christian Konige0130a22013-02-21 15:17:13 +0000127 asm#" $dst, $sbase, $offset", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000128 >;
129
130 def _SGPR : SMRD <
131 op, 0, (outs dstClass:$dst),
Christian Konig9c7afd12013-03-18 11:33:50 +0000132 (ins baseClass:$sbase, SReg_32:$soff),
Christian Konige0130a22013-02-21 15:17:13 +0000133 asm#" $dst, $sbase, $soff", []
Christian Konig72d5d5c2013-02-21 15:16:44 +0000134 >;
135}
136
137//===----------------------------------------------------------------------===//
138// Vector ALU classes
139//===----------------------------------------------------------------------===//
140
Christian Konigf741fbf2013-02-26 17:52:42 +0000141class VOP <string opName> {
142 string OpName = opName;
143}
144
Christian Konig3c145802013-03-27 09:12:59 +0000145class VOP2_REV <string revOp, bit isOrig> {
146 string RevOp = revOp;
147 bit IsOrig = isOrig;
148}
149
Christian Konig3da70172013-02-21 15:16:53 +0000150multiclass VOP1_Helper <bits<8> op, RegisterClass drc, RegisterClass src,
151 string opName, list<dag> pattern> {
152
Christian Konigf741fbf2013-02-26 17:52:42 +0000153 def _e32 : VOP1 <
Christian Konig3da70172013-02-21 15:16:53 +0000154 op, (outs drc:$dst), (ins src:$src0),
155 opName#"_e32 $dst, $src0", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000156 >, VOP <opName>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000157
Christian Konig3da70172013-02-21 15:16:53 +0000158 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000159 {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konig3da70172013-02-21 15:16:53 +0000160 (outs drc:$dst),
161 (ins src:$src0,
162 i32imm:$abs, i32imm:$clamp,
163 i32imm:$omod, i32imm:$neg),
164 opName#"_e64 $dst, $src0, $abs, $clamp, $omod, $neg", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000165 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000166 let src1 = SIOperand.ZERO;
167 let src2 = SIOperand.ZERO;
Christian Konig3da70172013-02-21 15:16:53 +0000168 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000169}
170
Christian Konig3da70172013-02-21 15:16:53 +0000171multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern>
172 : VOP1_Helper <op, VReg_32, VSrc_32, opName, pattern>;
173
174multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern>
175 : VOP1_Helper <op, VReg_64, VSrc_64, opName, pattern>;
176
Christian Konigae034e62013-02-21 15:16:58 +0000177multiclass VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
Christian Konig3c145802013-03-27 09:12:59 +0000178 string opName, list<dag> pattern, string revOp> {
Christian Konigae034e62013-02-21 15:16:58 +0000179 def _e32 : VOP2 <
180 op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1),
181 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000182 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000183
Christian Konigae034e62013-02-21 15:16:58 +0000184 def _e64 : VOP3 <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000185 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
Christian Konigae034e62013-02-21 15:16:58 +0000186 (outs vrc:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000187 (ins arc:$src0, arc:$src1,
Christian Konigae034e62013-02-21 15:16:58 +0000188 i32imm:$abs, i32imm:$clamp,
189 i32imm:$omod, i32imm:$neg),
190 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000191 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000192 let src2 = SIOperand.ZERO;
Christian Konigae034e62013-02-21 15:16:58 +0000193 }
Christian Konig72d5d5c2013-02-21 15:16:44 +0000194}
195
Christian Konig3c145802013-03-27 09:12:59 +0000196multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern,
197 string revOp = opName>
198 : VOP2_Helper <op, VReg_32, VSrc_32, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000199
Christian Konig3c145802013-03-27 09:12:59 +0000200multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern,
201 string revOp = opName>
202 : VOP2_Helper <op, VReg_64, VSrc_64, opName, pattern, revOp>;
Christian Konigae034e62013-02-21 15:16:58 +0000203
Christian Konig3c145802013-03-27 09:12:59 +0000204multiclass VOP2b_32 <bits<6> op, string opName, list<dag> pattern,
205 string revOp = opName> {
Christian Konigd3039962013-02-26 17:52:09 +0000206
207 def _e32 : VOP2 <
208 op, (outs VReg_32:$dst), (ins VSrc_32:$src0, VReg_32:$src1),
209 opName#"_e32 $dst, $src0, $src1", pattern
Christian Konig3c145802013-03-27 09:12:59 +0000210 >, VOP <opName>, VOP2_REV<revOp#"_e32", !eq(revOp, opName)>;
Christian Konigd3039962013-02-26 17:52:09 +0000211
212 def _e64 : VOP3b <
213 {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
214 (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000215 (ins VSrc_32:$src0, VSrc_32:$src1,
Christian Konigd3039962013-02-26 17:52:09 +0000216 i32imm:$abs, i32imm:$clamp,
217 i32imm:$omod, i32imm:$neg),
218 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg", []
Christian Konig3c145802013-03-27 09:12:59 +0000219 >, VOP <opName>, VOP2_REV<revOp#"_e64", !eq(revOp, opName)> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000220 let src2 = SIOperand.ZERO;
Christian Konigd3039962013-02-26 17:52:09 +0000221 /* the VOP2 variant puts the carry out into VCC, the VOP3 variant
222 can write it into any SGPR. We currently don't use the carry out,
223 so for now hardcode it to VCC as well */
Tom Stellard459a79a2013-05-20 15:02:08 +0000224 let sdst = SIOperand.VCC;
Christian Konigd3039962013-02-26 17:52:09 +0000225 }
226}
227
Christian Konig72d5d5c2013-02-21 15:16:44 +0000228multiclass VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
Christian Konigb19849a2013-02-21 15:17:04 +0000229 string opName, ValueType vt, PatLeaf cond> {
Christian Konig72d5d5c2013-02-21 15:16:44 +0000230
Christian Konigb19849a2013-02-21 15:17:04 +0000231 def _e32 : VOPC <
232 op, (ins arc:$src0, vrc:$src1),
233 opName#"_e32 $dst, $src0, $src1", []
Christian Konigf741fbf2013-02-26 17:52:42 +0000234 >, VOP <opName>;
Christian Konigb19849a2013-02-21 15:17:04 +0000235
Christian Konig72d5d5c2013-02-21 15:16:44 +0000236 def _e64 : VOP3 <
237 {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
238 (outs SReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000239 (ins arc:$src0, arc:$src1,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000240 InstFlag:$abs, InstFlag:$clamp,
241 InstFlag:$omod, InstFlag:$neg),
Christian Konigb19849a2013-02-21 15:17:04 +0000242 opName#"_e64 $dst, $src0, $src1, $abs, $clamp, $omod, $neg",
243 !if(!eq(!cast<string>(cond), "COND_NULL"), []<dag>,
Christian Konigf82901a2013-02-26 17:52:23 +0000244 [(set SReg_64:$dst, (i1 (setcc (vt arc:$src0), arc:$src1, cond)))]
Christian Konigb19849a2013-02-21 15:17:04 +0000245 )
Christian Konigf741fbf2013-02-26 17:52:42 +0000246 >, VOP <opName> {
Tom Stellard459a79a2013-05-20 15:02:08 +0000247 let src2 = SIOperand.ZERO;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000248 }
249}
250
Christian Konigb19849a2013-02-21 15:17:04 +0000251multiclass VOPC_32 <bits<8> op, string opName,
252 ValueType vt = untyped, PatLeaf cond = COND_NULL>
253 : VOPC_Helper <op, VReg_32, VSrc_32, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000254
Christian Konigb19849a2013-02-21 15:17:04 +0000255multiclass VOPC_64 <bits<8> op, string opName,
256 ValueType vt = untyped, PatLeaf cond = COND_NULL>
257 : VOPC_Helper <op, VReg_64, VSrc_64, opName, vt, cond>;
Christian Konig72d5d5c2013-02-21 15:16:44 +0000258
Christian Konigf5754a02013-02-21 15:17:09 +0000259class VOP3_32 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
260 op, (outs VReg_32:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000261 (ins VSrc_32:$src0, VSrc_32:$src1, VSrc_32:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000262 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000263 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000264>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000265
Tom Stellard1cfd7a52013-05-20 15:02:12 +0000266class VOP3_64_Shift <bits <9> op, string opName, list<dag> pattern> : VOP3 <
267 op, (outs VReg_64:$dst),
268 (ins VSrc_64:$src0, VSrc_32:$src1),
269 opName#" $dst, $src0, $src1", pattern
270>, VOP <opName> {
271
272 let src2 = SIOperand.ZERO;
273 let abs = 0;
274 let clamp = 0;
275 let omod = 0;
276 let neg = 0;
277}
278
Christian Konigf5754a02013-02-21 15:17:09 +0000279class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
280 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000281 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$src2,
Tom Stellardea977bc2013-04-19 02:11:00 +0000282 InstFlag:$abs, InstFlag:$clamp, InstFlag:$omod, InstFlag:$neg),
Christian Konigf5754a02013-02-21 15:17:09 +0000283 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000284>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000285
Christian Konig72d5d5c2013-02-21 15:16:44 +0000286//===----------------------------------------------------------------------===//
287// Vector I/O classes
288//===----------------------------------------------------------------------===//
289
Michel Danzer1c454302013-07-10 16:36:43 +0000290class DS_Load_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
291 op,
292 (outs regClass:$vdst),
293 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
294 i8imm:$offset0, i8imm:$offset1),
295 asm#" $vdst, $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
296 []> {
297 let mayLoad = 1;
298 let mayStore = 0;
299}
300
301class DS_Store_Helper <bits<8> op, string asm, RegisterClass regClass> : DS <
302 op,
303 (outs),
304 (ins i1imm:$gds, VReg_32:$addr, VReg_32:$data0, VReg_32:$data1,
305 i8imm:$offset0, i8imm:$offset1),
306 asm#" $gds, $addr, $data0, $data1, $offset0, $offset1, [M0]",
307 []> {
308 let mayStore = 1;
309 let mayLoad = 0;
310 let vdst = 0;
311}
312
Christian Konig72d5d5c2013-02-21 15:16:44 +0000313class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
314 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000315 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000316 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
317 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000318 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000319 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
320 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000321 []> {
322 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000323 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000324}
Tom Stellard75aadc22012-12-11 21:25:42 +0000325
Tom Stellardf1ee7162013-05-20 15:02:31 +0000326multiclass MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> {
327
328 let glc = 0, lds = 0, slc = 0, tfe = 0, soffset = 128 /* ZERO */,
329 mayLoad = 1 in {
330
331 let offen = 1, idxen = 0, addr64 = 0, offset = 0 in {
332 def _OFFEN : MUBUF <op, (outs regClass:$vdata),
333 (ins SReg_128:$srsrc, VReg_32:$vaddr),
334 asm#" $vdata, $srsrc + $vaddr", []>;
335 }
336
337 let offen = 0, idxen = 1, addr64 = 0 in {
338 def _IDXEN : MUBUF <op, (outs regClass:$vdata),
339 (ins SReg_128:$srsrc, VReg_32:$vaddr, i16imm:$offset),
340 asm#" $vdata, $srsrc[$vaddr] + $offset", []>;
341 }
342
343 let offen = 0, idxen = 0, addr64 = 1 in {
344 def _ADDR64 : MUBUF <op, (outs regClass:$vdata),
345 (ins SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
346 asm#" $vdata, $srsrc + $vaddr + $offset", []>;
347 }
348 }
Tom Stellard75aadc22012-12-11 21:25:42 +0000349}
350
Tom Stellard754f80f2013-04-05 23:31:51 +0000351class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
352 ValueType VT> :
Tom Stellard556d9aa2013-06-03 17:39:37 +0000353 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr, i16imm:$offset),
354 name#" $vdata, $srsrc + $vaddr + $offset",
355 []> {
Tom Stellard754f80f2013-04-05 23:31:51 +0000356
357 let mayLoad = 0;
358 let mayStore = 1;
359
360 // Encoding
Tom Stellard754f80f2013-04-05 23:31:51 +0000361 let offen = 0;
362 let idxen = 0;
363 let glc = 0;
364 let addr64 = 1;
365 let lds = 0;
366 let slc = 0;
367 let tfe = 0;
368 let soffset = 128; // ZERO
369}
370
Christian Konig72d5d5c2013-02-21 15:16:44 +0000371class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
372 op,
373 (outs regClass:$dst),
374 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000375 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000376 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000377 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
378 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000379 []> {
380 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000381 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000382}
383
Tom Stellard353b3362013-05-06 23:02:12 +0000384class MIMG_NoSampler_Helper <bits<7> op, string asm> : MIMG <
385 op,
386 (outs VReg_128:$vdata),
387 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
388 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, unknown:$vaddr,
389 SReg_256:$srsrc),
390 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
391 #" $tfe, $lwe, $slc, $vaddr, $srsrc",
392 []> {
393 let SSAMP = 0;
394 let mayLoad = 1;
395 let mayStore = 0;
396 let hasPostISelHook = 1;
397}
398
399class MIMG_Sampler_Helper <bits<7> op, string asm> : MIMG <
Christian Konig72d5d5c2013-02-21 15:16:44 +0000400 op,
401 (outs VReg_128:$vdata),
402 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Christian Konig25ce3e92013-03-26 14:04:07 +0000403 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, unknown:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000404 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000405 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
406 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000407 []> {
408 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000409 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000410 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000411}
412
Christian Konigf741fbf2013-02-26 17:52:42 +0000413//===----------------------------------------------------------------------===//
414// Vector instruction mappings
415//===----------------------------------------------------------------------===//
416
417// Maps an opcode in e32 form to its e64 equivalent
418def getVOPe64 : InstrMapping {
419 let FilterClass = "VOP";
420 let RowFields = ["OpName"];
421 let ColFields = ["Size"];
422 let KeyCol = ["4"];
423 let ValueCols = [["8"]];
424}
425
Christian Konig3c145802013-03-27 09:12:59 +0000426// Maps an original opcode to its commuted version
427def getCommuteRev : InstrMapping {
428 let FilterClass = "VOP2_REV";
429 let RowFields = ["RevOp"];
430 let ColFields = ["IsOrig"];
431 let KeyCol = ["1"];
432 let ValueCols = [["0"]];
433}
434
435// Maps an commuted opcode to its original version
436def getCommuteOrig : InstrMapping {
437 let FilterClass = "VOP2_REV";
438 let RowFields = ["RevOp"];
439 let ColFields = ["IsOrig"];
440 let KeyCol = ["0"];
441 let ValueCols = [["1"]];
442}
443
Christian Konig8b1ed282013-04-10 08:39:16 +0000444// Test if the supplied opcode is an MIMG instruction
Christian Konig8e06e2a2013-04-10 08:39:08 +0000445def isMIMG : InstrMapping {
Tom Stellard353b3362013-05-06 23:02:12 +0000446 let FilterClass = "MIMG";
Christian Konig8e06e2a2013-04-10 08:39:08 +0000447 let RowFields = ["Inst"];
448 let ColFields = ["Size"];
449 let KeyCol = ["8"];
450 let ValueCols = [["8"]];
451}
452
Tom Stellard75aadc22012-12-11 21:25:42 +0000453include "SIInstructions.td"