1 /*
2 * Copyright © 2020 Valve Corporation
3 *
4 * SPDX-License-Identifier: MIT
5 */
6 #include "helpers.h"
7 #include "sid.h"
8
9 using namespace aco;
10
11 static void
create_mubuf(Temp desc=Temp (0,s8))12 create_mubuf(Temp desc = Temp(0, s8))
13 {
14 Operand desc_op(desc);
15 desc_op.setFixed(PhysReg(0));
16 bld.mubuf(aco_opcode::buffer_load_dword, Definition(PhysReg(256), v1), desc_op,
17 Operand(PhysReg(256), v1), Operand::zero(), 0, false);
18 }
19
20 static void
create_mubuf_store()21 create_mubuf_store()
22 {
23 bld.mubuf(aco_opcode::buffer_store_dword, Operand(PhysReg(0), s4), Operand(PhysReg(256), v1),
24 Operand(PhysReg(256), v1), Operand::zero(), 0, false);
25 }
26
27 static void
create_mtbuf(Temp desc=Temp (0,s8))28 create_mtbuf(Temp desc = Temp(0, s8))
29 {
30 Operand desc_op(desc);
31 desc_op.setFixed(PhysReg(0));
32 bld.mtbuf(aco_opcode::tbuffer_load_format_x, Definition(PhysReg(256), v1), desc_op,
33 Operand(PhysReg(256), v1), Operand::zero(), V_008F0C_BUF_DATA_FORMAT_32,
34 V_008F0C_BUF_NUM_FORMAT_FLOAT, 0, false);
35 }
36
37 static void
create_flat()38 create_flat()
39 {
40 bld.flat(aco_opcode::flat_load_dword, Definition(PhysReg(256), v1), Operand(PhysReg(256), v2),
41 Operand(s2));
42 }
43
44 static void
create_global()45 create_global()
46 {
47 bld.global(aco_opcode::global_load_dword, Definition(PhysReg(256), v1),
48 Operand(PhysReg(256), v2), Operand(s2));
49 }
50
51 static void
create_mimg(bool nsa,Temp desc=Temp (0,s8))52 create_mimg(bool nsa, Temp desc = Temp(0, s8))
53 {
54 aco_ptr<Instruction> mimg{create_instruction(aco_opcode::image_sample, Format::MIMG, 5, 1)};
55 mimg->definitions[0] = Definition(PhysReg(256), v1);
56 mimg->operands[0] = Operand(desc);
57 mimg->operands[0].setFixed(PhysReg(0));
58 mimg->operands[1] = Operand(PhysReg(0), s4);
59 mimg->operands[2] = Operand(v1);
60 for (unsigned i = 0; i < 2; i++)
61 mimg->operands[3 + i] = Operand(PhysReg(256 + (nsa ? i * 2 : i)), v1);
62 mimg->mimg().dmask = 0x1;
63 mimg->mimg().dim = ac_image_2d;
64
65 bld.insert(std::move(mimg));
66 }
67
68 static void
create_smem()69 create_smem()
70 {
71 bld.smem(aco_opcode::s_load_dword, Definition(PhysReg(0), s1), Operand(PhysReg(0), s2),
72 Operand::zero());
73 }
74
75 static void
create_smem_buffer(Temp desc=Temp (0,s4))76 create_smem_buffer(Temp desc = Temp(0, s4))
77 {
78 Operand desc_op(desc);
79 desc_op.setFixed(PhysReg(0));
80 bld.smem(aco_opcode::s_buffer_load_dword, Definition(PhysReg(0), s1), desc_op, Operand::zero());
81 }
82
83 BEGIN_TEST(form_hard_clauses.type_restrictions)
84 if (!setup_cs(NULL, GFX10))
85 return;
86
87 //>> p_unit_test 0
88 //! s_clause imm:1
89 //; search_re('image_sample')
90 //; search_re('image_sample')
91 bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
92 create_mimg(false);
93 create_mimg(false);
94
95 //>> p_unit_test 1
96 //! s_clause imm:1
97 //; search_re('buffer_load_dword')
98 //; search_re('buffer_load_dword')
99 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
100 create_mubuf();
101 create_mubuf();
102
103 //>> p_unit_test 2
104 //! s_clause imm:1
105 //; search_re('global_load_dword')
106 //; search_re('global_load_dword')
107 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
108 create_global();
109 create_global();
110
111 //>> p_unit_test 3
112 //! s_clause imm:1
113 //; search_re('flat_load_dword')
114 //; search_re('flat_load_dword')
115 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
116 create_flat();
117 create_flat();
118
119 //>> p_unit_test 4
120 //! s_clause imm:1
121 //; search_re('s_load_dword')
122 //; search_re('s_load_dword')
123 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));
124 create_smem();
125 create_smem();
126
127 //>> p_unit_test 5
128 //; search_re('buffer_load_dword')
129 //; search_re('flat_load_dword')
130 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));
131 create_mubuf();
132 create_flat();
133
134 //>> p_unit_test 6
135 //; search_re('buffer_load_dword')
136 //; search_re('s_load_dword')
137 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));
138 create_mubuf();
139 create_smem();
140
141 //>> p_unit_test 7
142 //; search_re('flat_load_dword')
143 //; search_re('s_load_dword')
144 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));
145 create_flat();
146 create_smem();
147
148 finish_form_hard_clause_test();
149 END_TEST
150
151 BEGIN_TEST(form_hard_clauses.size)
152 if (!setup_cs(NULL, GFX10))
153 return;
154
155 //>> p_unit_test 0
156 //; search_re('s_load_dword')
157 bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
158 create_smem();
159
160 //>> p_unit_test 1
161 //! s_clause imm:62
162 //; for i in range(63):
163 //; search_re('s_load_dword')
164 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
165 for (unsigned i = 0; i < 63; i++)
166 create_smem();
167
168 //>> p_unit_test 2
169 //! s_clause imm:62
170 //; for i in range(64):
171 //; search_re('s_load_dword')
172 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
173 for (unsigned i = 0; i < 64; i++)
174 create_smem();
175
176 //>> p_unit_test 3
177 //! s_clause imm:62
178 //; for i in range(63):
179 //; search_re('s_load_dword')
180 //! s_clause imm:1
181 //; search_re('s_load_dword')
182 //; search_re('s_load_dword')
183 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
184 for (unsigned i = 0; i < 65; i++)
185 create_smem();
186
187 finish_form_hard_clause_test();
188 END_TEST
189
190 BEGIN_TEST(form_hard_clauses.nsa)
191 for (unsigned i = GFX10; i <= GFX10_3; i++) {
192 if (!setup_cs(NULL, (amd_gfx_level)i))
193 continue;
194
195 //>> p_unit_test 0
196 //! s_clause imm:1
197 //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
198 //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
199 bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
200 create_mimg(false);
201 create_mimg(false);
202
203 //>> p_unit_test 1
204 //~gfx10_3! s_clause imm:1
205 //; search_re(r'image_sample .* %0:v\[0\], %0:v\[1\]')
206 //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
207 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
208 create_mimg(false);
209 create_mimg(true);
210
211 //>> p_unit_test 2
212 //~gfx10_3! s_clause imm:1
213 //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
214 //; search_re(r'image_sample .* %0:v\[0\], %0:v\[2\]')
215 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
216 create_mimg(true);
217 create_mimg(true);
218
219 finish_form_hard_clause_test();
220 }
221 END_TEST
222
223 BEGIN_TEST(form_hard_clauses.heuristic)
224 if (!setup_cs(NULL, GFX10))
225 return;
226
227 Temp img_desc0 = bld.tmp(s8);
228 Temp img_desc1 = bld.tmp(s8);
229 Temp buf_desc0 = bld.tmp(s4);
230 Temp buf_desc1 = bld.tmp(s4);
231
232 /* Don't form clause with different descriptors */
233 //>> p_unit_test 0
234 //! s_clause imm:1
235 //; search_re('image_sample')
236 //; search_re('image_sample')
237 bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
238 create_mimg(false, img_desc0);
239 create_mimg(false, img_desc0);
240
241 //>> p_unit_test 1
242 //; search_re('image_sample')
243 //; search_re('image_sample')
244 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
245 create_mimg(false, img_desc0);
246 create_mimg(false, img_desc1);
247
248 //>> p_unit_test 2
249 //! s_clause imm:1
250 //; search_re('buffer_load_dword')
251 //; search_re('buffer_load_dword')
252 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
253 create_mubuf(buf_desc0);
254 create_mubuf(buf_desc0);
255
256 //>> p_unit_test 3
257 //; search_re('buffer_load_dword')
258 //; search_re('buffer_load_dword')
259 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
260 create_mubuf(buf_desc0);
261 create_mubuf(buf_desc1);
262
263 //>> p_unit_test 4
264 //! s_clause imm:1
265 //; search_re('s_buffer_load_dword')
266 //; search_re('s_buffer_load_dword')
267 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(4u));
268 create_smem_buffer(buf_desc0);
269 create_smem_buffer(buf_desc0);
270
271 //>> p_unit_test 5
272 //; search_re('s_buffer_load_dword')
273 //; search_re('s_buffer_load_dword')
274 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(5u));
275 create_smem_buffer(buf_desc0);
276 create_smem_buffer(buf_desc1);
277
278 //>> p_unit_test 6
279 //; search_re('s_buffer_load_dword')
280 //; search_re('s_load_dword')
281 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(6u));
282 create_smem_buffer(buf_desc0);
283 create_smem();
284
285 /* Only form clause between MUBUF and MTBUF if they load from the same binding. Ignore descriptor
286 * if they're te same binding.
287 */
288 //>> p_unit_test 7
289 //; search_re('buffer_load_dword')
290 //; search_re('tbuffer_load_format_x')
291 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(7u));
292 create_mubuf(buf_desc0);
293 create_mtbuf(buf_desc0);
294
295 finish_form_hard_clause_test();
296 END_TEST
297
298 BEGIN_TEST(form_hard_clauses.stores)
299 for (amd_gfx_level gfx : {GFX10, GFX11}) {
300 if (!setup_cs(NULL, gfx))
301 continue;
302
303 //>> p_unit_test 0
304 //~gfx11! s_clause imm:1
305 //; search_re('buffer_store_dword')
306 //; search_re('buffer_store_dword')
307 bld.pseudo(aco_opcode::p_unit_test, Operand::zero());
308 create_mubuf_store();
309 create_mubuf_store();
310
311 //>> p_unit_test 1
312 //! s_clause imm:1
313 //; search_re('buffer_load_dword')
314 //; search_re('buffer_load_dword')
315 //; search_re('buffer_store_dword')
316 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(1u));
317 create_mubuf();
318 create_mubuf();
319 create_mubuf_store();
320
321 //>> p_unit_test 2
322 //; search_re('buffer_store_dword')
323 //! s_clause imm:1
324 //; search_re('buffer_load_dword')
325 //; search_re('buffer_load_dword')
326 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(2u));
327 create_mubuf_store();
328 create_mubuf();
329 create_mubuf();
330
331 /* Unclear whether this is the best behaviour */
332 //>> p_unit_test 3
333 //; search_re('buffer_load_dword')
334 //; search_re('buffer_store_dword')
335 //; search_re('buffer_load_dword')
336 bld.pseudo(aco_opcode::p_unit_test, Operand::c32(3u));
337 create_mubuf();
338 create_mubuf_store();
339 create_mubuf();
340
341 finish_form_hard_clause_test();
342 }
343 END_TEST
344