blob: a97dbaae77800ccc0a67a7920bf4158f27fb4002 [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 Stellard754f80f2013-04-05 23:31:51 +000029def SIbuffer_store : SDNode<"AMDGPUISD::BUFFER_STORE",
30 SDTypeProfile<0, 3, [SDTCisPtrTy<1>, SDTCisInt<2>]>,
31 [SDNPHasChain, SDNPMayStore]>;
32
Tom Stellard89093802013-02-07 19:39:40 +000033def IMM8bitDWORD : ImmLeaf <
34 i32, [{
35 return (Imm & ~0x3FC) == 0;
36 }], SDNodeXForm<imm, [{
37 return CurDAG->getTargetConstant(
38 N->getZExtValue() >> 2, MVT::i32);
39 }]>
40>;
41
42def IMM12bit : ImmLeaf <
43 i16,
44 [{return isUInt<12>(Imm);}]
45>;
46
Christian Konigf82901a2013-02-26 17:52:23 +000047class InlineImm <ValueType vt> : PatLeaf <(vt imm), [{
48 return ((const SITargetLowering &)TLI).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> {
Christian Konig3da70172013-02-21 15:16:53 +0000166 let SRC1 = SIOperand.ZERO;
167 let SRC2 = SIOperand.ZERO;
168 }
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)> {
Christian Konigae034e62013-02-21 15:16:58 +0000192 let SRC2 = SIOperand.ZERO;
193 }
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)> {
Christian Konigd3039962013-02-26 17:52:09 +0000220 let SRC2 = SIOperand.ZERO;
221 /* 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 */
224 let SDST = SIOperand.VCC;
225 }
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> {
Christian Konigeabf8332013-02-21 15:16:49 +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,
Christian Konigf5754a02013-02-21 15:17:09 +0000262 i32imm:$abs, i32imm:$clamp, i32imm:$omod, i32imm:$neg),
263 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
266class VOP3_64 <bits<9> op, string opName, list<dag> pattern> : VOP3 <
267 op, (outs VReg_64:$dst),
Christian Konigf82901a2013-02-26 17:52:23 +0000268 (ins VSrc_64:$src0, VSrc_64:$src1, VSrc_64:$src2,
Christian Konigf5754a02013-02-21 15:17:09 +0000269 i32imm:$abs, i32imm:$clamp, i32imm:$omod, i32imm:$neg),
270 opName#" $dst, $src0, $src1, $src2, $abs, $clamp, $omod, $neg", pattern
Christian Konigf741fbf2013-02-26 17:52:42 +0000271>, VOP <opName>;
Christian Konigf5754a02013-02-21 15:17:09 +0000272
Christian Konig72d5d5c2013-02-21 15:16:44 +0000273//===----------------------------------------------------------------------===//
274// Vector I/O classes
275//===----------------------------------------------------------------------===//
276
277class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
278 op,
Tom Stellard75aadc22012-12-11 21:25:42 +0000279 (outs),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000280 (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
281 i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000282 SReg_128:$srsrc, i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000283 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
284 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000285 []> {
286 let mayStore = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000287 let mayLoad = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000288}
Tom Stellard75aadc22012-12-11 21:25:42 +0000289
Christian Konig72d5d5c2013-02-21 15:16:44 +0000290class MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> : MUBUF <
291 op,
Tom Stellard6db08eb2013-04-05 23:31:44 +0000292 (outs regClass:$vdata),
Christian Konig72d5d5c2013-02-21 15:16:44 +0000293 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000294 i1imm:$lds, VReg_32:$vaddr, SReg_128:$srsrc, i1imm:$slc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000295 i1imm:$tfe, SSrc_32:$soffset),
Tom Stellard6db08eb2013-04-05 23:31:44 +0000296 asm#" $vdata, $offset, $offen, $idxen, $glc, $addr64, "
Christian Konig08e768b2013-02-21 15:17:17 +0000297 #"$lds, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000298 []> {
Tom Stellard75aadc22012-12-11 21:25:42 +0000299 let mayLoad = 1;
300 let mayStore = 0;
301}
302
Tom Stellard754f80f2013-04-05 23:31:51 +0000303class MUBUF_Store_Helper <bits<7> op, string name, RegisterClass vdataClass,
304 ValueType VT> :
305 MUBUF <op, (outs), (ins vdataClass:$vdata, SReg_128:$srsrc, VReg_64:$vaddr),
306 name#" $vdata, $srsrc + $vaddr",
307 [(SIbuffer_store (VT vdataClass:$vdata), (i128 SReg_128:$srsrc),
308 (i64 VReg_64:$vaddr))]> {
309
310 let mayLoad = 0;
311 let mayStore = 1;
312
313 // Encoding
314 let offset = 0;
315 let offen = 0;
316 let idxen = 0;
317 let glc = 0;
318 let addr64 = 1;
319 let lds = 0;
320 let slc = 0;
321 let tfe = 0;
322 let soffset = 128; // ZERO
323}
324
Christian Konig72d5d5c2013-02-21 15:16:44 +0000325class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
326 op,
327 (outs regClass:$dst),
328 (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
Christian Konig84652962013-03-01 09:46:17 +0000329 i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, SReg_128:$srsrc,
Christian Konig72d5d5c2013-02-21 15:16:44 +0000330 i1imm:$slc, i1imm:$tfe, SSrc_32:$soffset),
Christian Konig08e768b2013-02-21 15:17:17 +0000331 asm#" $dst, $offset, $offen, $idxen, $glc, $addr64, $dfmt,"
332 #" $nfmt, $vaddr, $srsrc, $slc, $tfe, $soffset",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000333 []> {
334 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000335 let mayStore = 0;
Tom Stellard75aadc22012-12-11 21:25:42 +0000336}
337
Christian Konig72d5d5c2013-02-21 15:16:44 +0000338class MIMG_Load_Helper <bits<7> op, string asm> : MIMG <
339 op,
340 (outs VReg_128:$vdata),
341 (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
Christian Konig25ce3e92013-03-26 14:04:07 +0000342 i1imm:$tfe, i1imm:$lwe, i1imm:$slc, unknown:$vaddr,
Christian Konig84652962013-03-01 09:46:17 +0000343 SReg_256:$srsrc, SReg_128:$ssamp),
Christian Konig08e768b2013-02-21 15:17:17 +0000344 asm#" $vdata, $dmask, $unorm, $glc, $da, $r128,"
345 #" $tfe, $lwe, $slc, $vaddr, $srsrc, $ssamp",
Christian Konig72d5d5c2013-02-21 15:16:44 +0000346 []> {
347 let mayLoad = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000348 let mayStore = 0;
Christian Konig8b1ed282013-04-10 08:39:16 +0000349 let hasPostISelHook = 1;
Tom Stellard75aadc22012-12-11 21:25:42 +0000350}
351
Christian Konigf741fbf2013-02-26 17:52:42 +0000352//===----------------------------------------------------------------------===//
353// Vector instruction mappings
354//===----------------------------------------------------------------------===//
355
356// Maps an opcode in e32 form to its e64 equivalent
357def getVOPe64 : InstrMapping {
358 let FilterClass = "VOP";
359 let RowFields = ["OpName"];
360 let ColFields = ["Size"];
361 let KeyCol = ["4"];
362 let ValueCols = [["8"]];
363}
364
Christian Konig3c145802013-03-27 09:12:59 +0000365// Maps an original opcode to its commuted version
366def getCommuteRev : InstrMapping {
367 let FilterClass = "VOP2_REV";
368 let RowFields = ["RevOp"];
369 let ColFields = ["IsOrig"];
370 let KeyCol = ["1"];
371 let ValueCols = [["0"]];
372}
373
374// Maps an commuted opcode to its original version
375def getCommuteOrig : InstrMapping {
376 let FilterClass = "VOP2_REV";
377 let RowFields = ["RevOp"];
378 let ColFields = ["IsOrig"];
379 let KeyCol = ["0"];
380 let ValueCols = [["1"]];
381}
382
Christian Konig8b1ed282013-04-10 08:39:16 +0000383// Test if the supplied opcode is an MIMG instruction
Christian Konig8e06e2a2013-04-10 08:39:08 +0000384def isMIMG : InstrMapping {
385 let FilterClass = "MIMG_Load_Helper";
386 let RowFields = ["Inst"];
387 let ColFields = ["Size"];
388 let KeyCol = ["8"];
389 let ValueCols = [["8"]];
390}
391
Tom Stellard75aadc22012-12-11 21:25:42 +0000392include "SIInstructions.td"