SIInstrFormats.td revision 7c52866a14e0c928e9be020b9dc8e585f0965212
1//===-- SIInstrFormats.td - SI Instruction Formats ------------------------===//
2//
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// SI Instruction format definitions.
11//
12// Instructions with _32 take 32-bit operands.
13// Instructions with _64 take 64-bit operands.
14//
15// VOP_* instructions can use either a 32-bit or 64-bit encoding.  The 32-bit
16// encoding is the standard encoding, but instruction that make use of
17// any of the instruction modifiers must use the 64-bit encoding.
18//
19// Instructions with _e32 use the 32-bit encoding.
20// Instructions with _e64 use the 64-bit encoding.
21//
22//===----------------------------------------------------------------------===//
23
24class VOP3b_2IN <bits<9> op, string opName, RegisterClass dstClass,
25                 RegisterClass src0Class, RegisterClass src1Class,
26                 list<dag> pattern>
27  : VOP3b <op, (outs dstClass:$vdst),
28               (ins src0Class:$src0, src1Class:$src1, InstFlag:$src2, InstFlag:$sdst,
29                    InstFlag:$omod, InstFlag:$neg),
30           opName, pattern
31>;
32
33
34class VOP3_1_32 <bits<9> op, string opName, list<dag> pattern>
35  : VOP3b_2IN <op, opName, SReg_1, AllReg_32, VReg_32, pattern>;
36
37class VOP3_32 <bits<9> op, string opName, list<dag> pattern>
38  : VOP3 <op, (outs VReg_32:$dst), (ins AllReg_32:$src0, VReg_32:$src1, VReg_32:$src2, i32imm:$src3, i32imm:$src4, i32imm:$src5, i32imm:$src6), opName, pattern>;
39
40class VOP3_64 <bits<9> op, string opName, list<dag> pattern>
41  : VOP3 <op, (outs VReg_64:$dst), (ins AllReg_64:$src0, VReg_64:$src1, VReg_64:$src2, i32imm:$src3, i32imm:$src4, i32imm:$src5, i32imm:$src6), opName, pattern>;
42
43
44class SOP1_32 <bits<8> op, string opName, list<dag> pattern>
45  : SOP1 <op, (outs SReg_32:$dst), (ins SReg_32:$src0), opName, pattern>;
46
47class SOP1_64 <bits<8> op, string opName, list<dag> pattern>
48  : SOP1 <op, (outs SReg_64:$dst), (ins SReg_64:$src0), opName, pattern>;
49
50class SOP2_32 <bits<7> op, string opName, list<dag> pattern>
51  : SOP2 <op, (outs SReg_32:$dst), (ins SReg_32:$src0, SReg_32:$src1), opName, pattern>;
52
53class SOP2_64 <bits<7> op, string opName, list<dag> pattern>
54  : SOP2 <op, (outs SReg_64:$dst), (ins SReg_64:$src0, SReg_64:$src1), opName, pattern>;
55
56class SOP2_VCC <bits<7> op, string opName, list<dag> pattern>
57  : SOP2 <op, (outs SReg_1:$vcc), (ins SReg_64:$src0, SReg_64:$src1), opName, pattern>;
58
59class VOP1_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
60                   string opName, list<dag> pattern> : 
61  VOP1 <
62    op, (outs vrc:$dst), (ins arc:$src0), opName, pattern
63  >;
64
65multiclass VOP1_32 <bits<8> op, string opName, list<dag> pattern> {
66  def _e32: VOP1_Helper <op, VReg_32, AllReg_32, opName, pattern>;
67  def _e64 : VOP3_32 <{1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
68                      opName, []
69  >;
70}
71
72multiclass VOP1_64 <bits<8> op, string opName, list<dag> pattern> {
73
74  def _e32 : VOP1_Helper <op, VReg_64, AllReg_64, opName, pattern>;
75
76  def _e64 : VOP3_64 <
77    {1, 1, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
78    opName, []
79  >;
80}
81
82class VOP2_Helper <bits<6> op, RegisterClass vrc, RegisterClass arc,
83                   string opName, list<dag> pattern> :
84  VOP2 <
85    op, (outs vrc:$dst), (ins arc:$src0, vrc:$src1), opName, pattern
86  >;
87
88multiclass VOP2_32 <bits<6> op, string opName, list<dag> pattern> {
89
90  def _e32 : VOP2_Helper <op, VReg_32, AllReg_32, opName, pattern>;
91
92  def _e64 : VOP3_32 <{1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
93                      opName, []
94  >;
95}
96
97multiclass VOP2_64 <bits<6> op, string opName, list<dag> pattern> {
98  def _e32: VOP2_Helper <op, VReg_64, AllReg_64, opName, pattern>;
99
100  def _e64 : VOP3_64 <
101    {1, 0, 0, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
102    opName, []
103  >;
104}
105
106class SOPK_32 <bits<5> op, string opName, list<dag> pattern>
107  : SOPK <op, (outs SReg_32:$dst), (ins i16imm:$src0), opName, pattern>;
108
109class SOPK_64 <bits<5> op, string opName, list<dag> pattern>
110  : SOPK <op, (outs SReg_64:$dst), (ins i16imm:$src0), opName, pattern>;
111
112class VOPC_Helper <bits<8> op, RegisterClass vrc, RegisterClass arc,
113                 string opName, list<dag> pattern> :
114  VOPC <
115    op, (ins arc:$src0, vrc:$src1), opName, pattern
116  >;
117
118multiclass VOPC_32 <bits<9> op, string opName, list<dag> pattern> {
119
120  def _e32 : VOPC_Helper <
121    {op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
122    VReg_32, AllReg_32, opName, pattern
123  >;
124
125  def _e64 : VOP3_1_32 <
126    op,
127    opName, pattern
128  >;
129}
130
131multiclass VOPC_64 <bits<8> op, string opName, list<dag> pattern> {
132
133  def _e32 : VOPC_Helper <op, VReg_64, AllReg_64, opName, pattern>;
134
135  def _e64 : VOP3_64 <
136    {0, op{7}, op{6}, op{5}, op{4}, op{3}, op{2}, op{1}, op{0}},
137    opName, []
138  >;
139}
140
141class SOPC_32 <bits<7> op, string opName, list<dag> pattern>
142  : SOPC <op, (outs SCCReg:$dst), (ins SReg_32:$src0, SReg_32:$src1), opName, pattern>;
143
144class SOPC_64 <bits<7> op, string opName, list<dag> pattern>
145  : SOPC <op, (outs SCCReg:$dst), (ins SReg_64:$src0, SReg_64:$src1), opName, pattern>;
146
147class MIMG_Load_Helper <bits<7> op, string asm> : MIMG <
148  op,
149  (outs VReg_128:$vdata),
150  (ins i32imm:$dmask, i1imm:$unorm, i1imm:$glc, i1imm:$da, i1imm:$r128,
151       i1imm:$tfe, i1imm:$lwe, i1imm:$slc, VReg_32:$vaddr,
152       GPR4Align<SReg_256>:$srsrc, GPR4Align<SReg_128>:$ssamp),
153  asm,
154  []> {
155  let mayLoad = 1;
156  let mayStore = 0;
157}
158
159class MTBUF_Store_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
160  op,
161  (outs),
162  (ins regClass:$vdata, i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc,
163   i1imm:$addr64, i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr,
164   GPR4Align<SReg_128>:$srsrc, i1imm:$slc, i1imm:$tfe, SReg_32:$soffset),
165  asm,
166  []> {
167  let mayStore = 1;
168  let mayLoad = 0;
169}
170
171class MUBUF_Load_Helper <bits<7> op, string asm, RegisterClass regClass> : MUBUF <
172  op,
173  (outs regClass:$dst),
174  (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
175       i1imm:$lds, VReg_32:$vaddr, GPR4Align<SReg_128>:$srsrc, i1imm:$slc,
176       i1imm:$tfe, SReg_32:$soffset),
177  asm,
178  []> {
179  let mayLoad = 1;
180  let mayStore = 0;
181}
182
183class MTBUF_Load_Helper <bits<3> op, string asm, RegisterClass regClass> : MTBUF <
184  op,
185  (outs regClass:$dst),
186  (ins i16imm:$offset, i1imm:$offen, i1imm:$idxen, i1imm:$glc, i1imm:$addr64,
187       i8imm:$dfmt, i8imm:$nfmt, VReg_32:$vaddr, GPR4Align<SReg_128>:$srsrc,
188       i1imm:$slc, i1imm:$tfe, SReg_32:$soffset),
189  asm,
190  []> {
191  let mayLoad = 1;
192  let mayStore = 0;
193}
194
195multiclass SMRD_Helper <bits<5> op, string asm, RegisterClass dstClass> {
196  def _IMM : SMRD <
197             op, 1,
198             (outs dstClass:$dst),
199             (ins GPR2Align<SReg_64>:$sbase, i32imm:$offset),
200             asm,
201             []
202  >;
203
204  def _SGPR : SMRD <
205              op, 0,
206              (outs dstClass:$dst),
207              (ins GPR2Align<SReg_64>:$sbase, SReg_32:$soff),
208              asm,
209              []
210  >;
211}
212
213