]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/Target/AMDGPU/VIInstrFormats.td
Upgrade to OpenSSH 7.3p1.
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / Target / AMDGPU / VIInstrFormats.td
1 //===-- VIInstrFormats.td - VI Instruction Encodings ----------------------===//
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 // VI Instruction format definitions.
11 //
12 //===----------------------------------------------------------------------===//
13
14 class DSe_vi <bits<8> op> : Enc64 {
15   bits<8> vdst;
16   bits<1> gds;
17   bits<8> addr;
18   bits<8> data0;
19   bits<8> data1;
20   bits<8> offset0;
21   bits<8> offset1;
22
23   let Inst{7-0} = offset0;
24   let Inst{15-8} = offset1;
25   let Inst{16} = gds;
26   let Inst{24-17} = op;
27   let Inst{31-26} = 0x36; //encoding
28   let Inst{39-32} = addr;
29   let Inst{47-40} = data0;
30   let Inst{55-48} = data1;
31   let Inst{63-56} = vdst;
32 }
33
34 class MUBUFe_vi <bits<7> op> : Enc64 {
35   bits<12> offset;
36   bits<1> offen;
37   bits<1> idxen;
38   bits<1> glc;
39   bits<1> lds;
40   bits<8> vaddr;
41   bits<8> vdata;
42   bits<7> srsrc;
43   bits<1> slc;
44   bits<1> tfe;
45   bits<8> soffset;
46
47   let Inst{11-0} = offset;
48   let Inst{12} = offen;
49   let Inst{13} = idxen;
50   let Inst{14} = glc;
51   let Inst{16} = lds;
52   let Inst{17} = slc;
53   let Inst{24-18} = op;
54   let Inst{31-26} = 0x38; //encoding
55   let Inst{39-32} = vaddr;
56   let Inst{47-40} = vdata;
57   let Inst{52-48} = srsrc{6-2};
58   let Inst{55} = tfe;
59   let Inst{63-56} = soffset;
60 }
61
62 class MTBUFe_vi <bits<4> op> : Enc64 {
63   bits<12> offset;
64   bits<1>  offen;
65   bits<1>  idxen;
66   bits<1>  glc;
67   bits<4>  dfmt;
68   bits<3>  nfmt;
69   bits<8>  vaddr;
70   bits<8>  vdata;
71   bits<7>  srsrc;
72   bits<1>  slc;
73   bits<1>  tfe;
74   bits<8>  soffset;
75
76   let Inst{11-0}  = offset;
77   let Inst{12}    = offen;
78   let Inst{13}    = idxen;
79   let Inst{14}    = glc;
80   let Inst{18-15} = op;
81   let Inst{22-19} = dfmt;
82   let Inst{25-23} = nfmt;
83   let Inst{31-26} = 0x3a; //encoding
84   let Inst{39-32} = vaddr;
85   let Inst{47-40} = vdata;
86   let Inst{52-48} = srsrc{6-2};
87   let Inst{54}    = slc;
88   let Inst{55}    = tfe;
89   let Inst{63-56} = soffset;
90 }
91
92 class SMEMe_vi <bits<8> op, bit imm> : Enc64 {
93   bits<7>  sbase;
94   bits<7>  sdst;
95   bits<1>  glc;
96
97   let Inst{5-0}   = sbase{6-1};
98   let Inst{12-6}  = sdst;
99   let Inst{16}    = glc;
100   let Inst{17}    = imm;
101   let Inst{25-18} = op;
102   let Inst{31-26} = 0x30; //encoding
103 }
104
105 class SMEM_IMMe_vi <bits<8> op> : SMEMe_vi<op, 1> {
106   bits<20> offset;
107   let Inst{51-32} = offset;
108 }
109
110 class SMEM_SOFFe_vi <bits<8> op> : SMEMe_vi<op, 0> {
111   bits<20> soff;
112   let Inst{51-32} = soff;
113 }
114
115 class VOP3a_vi <bits<10> op> : Enc64 {
116   bits<2> src0_modifiers;
117   bits<9> src0;
118   bits<2> src1_modifiers;
119   bits<9> src1;
120   bits<2> src2_modifiers;
121   bits<9> src2;
122   bits<1> clamp;
123   bits<2> omod;
124
125   let Inst{8}     = src0_modifiers{1};
126   let Inst{9}     = src1_modifiers{1};
127   let Inst{10}    = src2_modifiers{1};
128   let Inst{15}    = clamp;
129   let Inst{25-16} = op;
130   let Inst{31-26} = 0x34; //encoding
131   let Inst{40-32} = src0;
132   let Inst{49-41} = src1;
133   let Inst{58-50} = src2;
134   let Inst{60-59} = omod;
135   let Inst{61} = src0_modifiers{0};
136   let Inst{62} = src1_modifiers{0};
137   let Inst{63} = src2_modifiers{0};
138 }
139
140 class VOP3e_vi <bits<10> op> : VOP3a_vi <op> {
141   bits<8> vdst;
142
143   let Inst{7-0} = vdst;
144 }
145
146 // Encoding used for VOPC instructions encoded as VOP3
147 // Differs from VOP3e by destination name (sdst) as VOPC doesn't have vector dst
148 class VOP3ce_vi <bits<10> op> : VOP3a_vi <op> {
149   bits<8> sdst;
150
151   let Inst{7-0} = sdst;
152 }
153
154 class VOP3be_vi <bits<10> op> : Enc64 {
155   bits<8> vdst;
156   bits<2> src0_modifiers;
157   bits<9> src0;
158   bits<2> src1_modifiers;
159   bits<9> src1;
160   bits<2> src2_modifiers;
161   bits<9> src2;
162   bits<7> sdst;
163   bits<2> omod;
164   bits<1> clamp;
165
166   let Inst{7-0} = vdst;
167   let Inst{14-8} = sdst;
168   let Inst{15} = clamp;
169   let Inst{25-16} = op;
170   let Inst{31-26} = 0x34; //encoding
171   let Inst{40-32} = src0;
172   let Inst{49-41} = src1;
173   let Inst{58-50} = src2;
174   let Inst{60-59} = omod;
175   let Inst{61} = src0_modifiers{0};
176   let Inst{62} = src1_modifiers{0};
177   let Inst{63} = src2_modifiers{0};
178 }
179
180 class VOP_DPP <dag outs, dag ins, string asm, list<dag> pattern, bit HasMods = 0> :
181     VOPAnyCommon <outs, ins, asm, pattern> {
182   let DPP = 1;
183   let Size = 8;
184
185   let AsmMatchConverter = !if(!eq(HasMods,1), "cvtDPP", "");
186 }
187
188 class VOP_DPPe : Enc64 {
189   bits<2> src0_modifiers;
190   bits<8> src0;
191   bits<2> src1_modifiers;
192   bits<9> dpp_ctrl;
193   bits<1> bound_ctrl;
194   bits<4> bank_mask;
195   bits<4> row_mask;
196
197   let Inst{39-32} = src0;
198   let Inst{48-40} = dpp_ctrl;
199   let Inst{51}    = bound_ctrl;
200   let Inst{52}    = src0_modifiers{0}; // src0_neg
201   let Inst{53}    = src0_modifiers{1}; // src0_abs
202   let Inst{54}    = src1_modifiers{0}; // src1_neg
203   let Inst{55}    = src1_modifiers{1}; // src1_abs
204   let Inst{59-56} = bank_mask;
205   let Inst{63-60} = row_mask;
206 }
207
208 class VOP1_DPPe <bits<8> op> : VOP_DPPe {
209   bits<8> vdst;
210
211   let Inst{8-0} = 0xfa; // dpp
212   let Inst{16-9} = op;
213   let Inst{24-17} = vdst;
214   let Inst{31-25} = 0x3f; //encoding
215 }
216
217 class VOP2_DPPe <bits<6> op> : VOP_DPPe {
218   bits<8> vdst;
219   bits<8> src1;
220
221   let Inst{8-0} = 0xfa; //dpp
222   let Inst{16-9} = src1;
223   let Inst{24-17} = vdst;
224   let Inst{30-25} = op;
225   let Inst{31} = 0x0; //encoding
226 }
227
228 class VOP_SDWA <dag outs, dag ins, string asm, list<dag> pattern, bit HasMods = 0> :
229     VOPAnyCommon <outs, ins, asm, pattern> {
230   let SDWA = 1;
231   let Size = 8;
232 }
233
234 class VOP_SDWAe : Enc64 {
235   bits<8> src0;
236   bits<3> src0_sel;
237   bits<2> src0_fmodifiers; // {abs,neg}
238   bits<1> src0_imodifiers; // sext
239   bits<3> src1_sel;
240   bits<2> src1_fmodifiers;
241   bits<1> src1_imodifiers;
242   bits<3> dst_sel;
243   bits<2> dst_unused;
244   bits<1> clamp;
245
246   let Inst{39-32} = src0;
247   let Inst{42-40} = dst_sel;
248   let Inst{44-43} = dst_unused;
249   let Inst{45} = clamp;
250   let Inst{50-48} = src0_sel;
251   let Inst{53-52} = src0_fmodifiers;
252   let Inst{51} = src0_imodifiers;
253   let Inst{58-56} = src1_sel;
254   let Inst{61-60} = src1_fmodifiers;
255   let Inst{59} = src1_imodifiers;
256 }
257
258 class VOP1_SDWAe <bits<8> op> : VOP_SDWAe {
259   bits<8> vdst;
260
261   let Inst{8-0} = 0xf9; // sdwa
262   let Inst{16-9} = op;
263   let Inst{24-17} = vdst;
264   let Inst{31-25} = 0x3f; // encoding
265 }
266
267 class VOP2_SDWAe <bits<6> op> : VOP_SDWAe {
268   bits<8> vdst;
269   bits<8> src1;
270
271   let Inst{8-0} = 0xf9; // sdwa
272   let Inst{16-9} = src1;
273   let Inst{24-17} = vdst;
274   let Inst{30-25} = op;
275   let Inst{31} = 0x0; // encoding
276 }
277
278 class VOPC_SDWAe <bits<8> op> : VOP_SDWAe {
279   bits<8> src1;
280
281   let Inst{8-0} = 0xf9; // sdwa
282   let Inst{16-9} = src1;
283   let Inst{24-17} = op;
284   let Inst{31-25} = 0x3e; // encoding
285
286   // VOPC disallows dst_sel and dst_unused as they have no effect on destination
287   let Inst{42-40} = 0x6;
288   let Inst{44-43} = 0x2;
289 }
290
291 class EXPe_vi : EXPe {
292   let Inst{31-26} = 0x31; //encoding
293 }
294
295 class VINTRPe_vi <bits<2> op> : VINTRPe <op> {
296   let Inst{31-26} = 0x35; // encoding
297 }