xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/r600/sfn/tests/sfn_test_shaders.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 #include "sfn_test_shaders.h"
2 
3 #include "../sfn_memorypool.h"
4 #include "../sfn_shader_fs.h"
5 #include "../sfn_shader_gs.h"
6 #include "../sfn_shader_tess.h"
7 #include "../sfn_shader_vs.h"
8 
9 namespace r600 {
10 
11 using std::istringstream;
12 using std::ostringstream;
13 using std::string;
14 
15 void
check(Shader * s,const char * expect_orig)16 TestShaderFromNir::check(Shader *s, const char *expect_orig)
17 {
18    ostringstream test_str;
19    s->print(test_str);
20 
21    auto expect = from_string(expect_orig);
22 
23    ostringstream expect_str;
24    expect->print(expect_str);
25 
26    EXPECT_EQ(test_str.str(), expect_str.str());
27 }
28 
29 void
ra_check(Shader * s,const char * expect_orig)30 TestShaderFromNir::ra_check(Shader *s, const char *expect_orig)
31 {
32    s->value_factory().clear_pins();
33    ostringstream test_str;
34    s->print(test_str);
35 
36    auto expect = from_string(expect_orig);
37    expect->value_factory().clear_pins();
38 
39    ostringstream expect_str;
40    expect->print(expect_str);
41 
42    EXPECT_EQ(test_str.str(), expect_str.str());
43 }
44 
45 const char *red_triangle_fs_nir =
46    R"(shader: MESA_SHADER_FRAGMENT
47 name: TTN
48 inputs: 0
49 outputs: 1
50 uniforms: 0
51 shared: 0
52 decl_function main (0 params)
53 
54 impl main {
55    decl_var  INTERP_MODE_FLAT vec4 out@out_0-temp
56    block block_0:
57    /* preds: */
58    vec4 32 ssa_0 = load_const (0x3f800000 /* 1.000000 */, 0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x3f800000 /* 1.000000 */)
59    vec1 32 ssa_1 = load_const (0x00000000 /* 0.000000 */)
60    intrinsic store_output (ssa_0, ssa_1) (0, 15, 0, 160, 132) /* base=0 */ /* wrmask=xyz */ /* component=0 */ /* src_type=float32 */ /* location=4 slots=1 */
61    /* succs: block_1 */
62    block block_1:
63 })";
64 
65 const char *red_triangle_fs_expect_from_nir = R"(
66 FS
67 CHIPCLASS EVERGREEN
68 PROP MAX_COLOR_EXPORTS:1
69 PROP COLOR_EXPORTS:1
70 PROP COLOR_EXPORT_MASK:15
71 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
72 SHADER
73 ALU MOV S0.x@group : I[1.0] {W}
74 ALU MOV S0.y@group : I[0] {W}
75 ALU MOV S0.z@group : I[0] {W}
76 ALU MOV S0.w@group : I[1.0] {WL}
77 ALU MOV S1.x@free : I[0] {WL}
78 EXPORT_DONE PIXEL 0 S0.xyzw
79 )";
80 
81 const char *red_triangle_fs_expect_from_nir_dce = R"(FS
82 CHIPCLASS EVERGREEN
83 PROP MAX_COLOR_EXPORTS:1
84 PROP COLOR_EXPORTS:1
85 PROP COLOR_EXPORT_MASK:15
86 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
87 SHADER
88 ALU MOV S0.x@group : I[1.0] {W}
89 ALU MOV S0.y@group : I[0] {W}
90 ALU MOV S0.z@group : I[0] {W}
91 ALU MOV S0.w@group : I[1.0] {WL}
92 EXPORT_DONE PIXEL 0 S0.xyzw
93 )";
94 
95 const char *add_add_1_nir =
96    R"(shader: MESA_SHADER_FRAGMENT
97 name: GLSL3
98 inputs: 0
99 outputs: 1
100 uniforms: 1
101 shared: 0
102 decl_var uniform INTERP_MODE_NONE vec4 color (0, 0, 0)
103 decl_function main (0 params)
104 
105 impl main {
106      decl_var  INTERP_MODE_NONE vec4 out@gl_FragColor-temp
107      block block_0:
108      /* preds: */
109      vec1 32 ssa_0 = load_const (0xbf000000 /* -0.500000 */)
110      vec1 32 ssa_1 = load_const (0x00000000 /* 0.000000 */)
111      vec4 32 ssa_2 = intrinsic load_uniform (ssa_1) (0, 1, 160) /* base=0 */ /* range=1 */ /* dest_type=float32 */   /* color */
112      vec1 32 ssa_3 = fadd ssa_0, ssa_2.x
113      vec4 32 ssa_4 = vec4 ssa_3, ssa_2.y, ssa_2.z, ssa_2.w
114      intrinsic store_output (ssa_4, ssa_1) (0, 15, 0, 160, 130) /* base=0 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=2 slots=1 */
115      /* succs: block_1 */
116      block block_1:
117 })";
118 
119 const char *add_add_1_expect_from_nir =
120    R"(FS
121 CHIPCLASS EVERGREEN
122 PROP MAX_COLOR_EXPORTS:1
123 PROP COLOR_EXPORTS:1
124 PROP WRITE_ALL_COLORS:1
125 PROP COLOR_EXPORT_MASK:15
126 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
127 SHADER
128 ALU MOV S0.x@free : L[0xbf000000] {WL}
129 ALU MOV S1.x@free : I[0] {WL}
130 ALU MOV S2.x : KC0[0].x {W}
131 ALU MOV S2.y : KC0[0].y {W}
132 ALU MOV S2.z : KC0[0].z {W}
133 ALU MOV S2.w : KC0[0].w {WL}
134 ALU ADD S3.x@free : S0.x@free S2.x {WL}
135 ALU MOV S4.x@group : S3.x@free {W}
136 ALU MOV S4.y@group : S2.y {W}
137 ALU MOV S4.z@group : S2.z {W}
138 ALU MOV S4.w@group : S2.w {WL}
139 EXPORT_DONE PIXEL 0 S4.xyzw
140 )";
141 
142 const char *add_add_1_expect_from_nir_copy_prop_fwd =
143    R"(
144 FS
145 CHIPCLASS EVERGREEN
146 PROP MAX_COLOR_EXPORTS:1
147 PROP COLOR_EXPORTS:1
148 PROP WRITE_ALL_COLORS:1
149 PROP COLOR_EXPORT_MASK:15
150 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
151 SHADER
152 ALU MOV S0.x@free : L[0xbf000000] {WL}
153 ALU MOV S1.x@free : I[0] {WL}
154 ALU MOV S2.x : KC0[0].x {W}
155 ALU MOV S2.y : KC0[0].y {W}
156 ALU MOV S2.z : KC0[0].z {W}
157 ALU MOV S2.w : KC0[0].w {WL}
158 ALU ADD S3.x@free : L[0xbf000000] KC0[0].x {WL}
159 ALU MOV S4.x@group : S3.x@free {W}
160 ALU MOV S4.y@group : KC0[0].y {W}
161 ALU MOV S4.z@group : KC0[0].z {W}
162 ALU MOV S4.w@group : KC0[0].w {WL}
163 EXPORT_DONE PIXEL 0 S4.xyzw
164 )";
165 
166 const char *add_add_1_expect_from_nir_copy_prop_fwd_dce =
167    R"(
168 FS
169 CHIPCLASS EVERGREEN
170 PROP MAX_COLOR_EXPORTS:1
171 PROP COLOR_EXPORTS:1
172 PROP WRITE_ALL_COLORS:1
173 PROP COLOR_EXPORT_MASK:15
174 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
175 SHADER
176 ALU ADD S3.x@free : L[0xbf000000] KC0[0].x {WL}
177 ALU MOV S4.x@group : S3.x@free {W}
178 ALU MOV S4.y@group : KC0[0].y {W}
179 ALU MOV S4.z@group : KC0[0].z {W}
180 ALU MOV S4.w@group : KC0[0].w {WL}
181 EXPORT_DONE PIXEL 0 S4.xyzw
182 )";
183 
184 const char *add_add_1_expect_from_nir_copy_prop_fwd_dce_bwd =
185    R"(
186 FS
187 CHIPCLASS EVERGREEN
188 PROP MAX_COLOR_EXPORTS:1
189 PROP COLOR_EXPORTS:1
190 PROP WRITE_ALL_COLORS:1
191 PROP COLOR_EXPORT_MASK:15
192 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
193 SYSVALUES R0.xy__
194 SHADER
195 ALU ADD S4.x@group : L[0xbf000000] KC0[0].x {W}
196 ALU MOV S4.y@group : KC0[0].y {W}
197 ALU MOV S4.z@group : KC0[0].z {W}
198 ALU MOV S4.w@group : KC0[0].w {WL}
199 EXPORT_DONE PIXEL 0 S4.xyzw
200 )";
201 
202 const char *basic_interpolation_nir =
203    R"(shader: MESA_SHADER_FRAGMENT
204 name: TTN
205 inputs: 1
206 outputs: 1
207 uniforms: 0
208 shared: 0
209 decl_var uniform INTERP_MODE_NONE sampler2D sampler (0, 0, 0)
210 decl_function main (0 params)
211 
212 impl main {
213         decl_var  INTERP_MODE_NOPERSPECTIVE vec4 in@in_0-temp
214         decl_var  INTERP_MODE_FLAT vec4 out@out_0-temp
215         block block_0:
216         /* preds: */
217         vec2 32 ssa_0 = intrinsic load_barycentric_pixel () (3) /* interp_mode=3 */
218         vec1 32 ssa_1 = load_const (0x00000000 /* 0.000000 */)
219         vec4 32 ssa_2 = intrinsic load_interpolated_input (ssa_0, ssa_1) (0, 0, 160, 160) /* base=0 */ /* component=0 */ /* dest_type=float32 */ /* location=32 slots=1 */
220         vec3 32 ssa_3 = f2i32 ssa_2.xyw
221         vec1 32 ssa_4 = mov ssa_3.z
222         vec2 32 ssa_5 = vec2 ssa_3.x, ssa_3.y
223         vec4 32 ssa_6 = (float32)txf ssa_5 (coord), ssa_4 (lod), 0 (texture), 0 (sampler)
224         intrinsic store_output (ssa_6, ssa_1) (0, 15, 0, 160, 132) /* base=0 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=4 slots=1 */
225         /* succs: block_1 */
226         block block_1:
227 })";
228 
229 const char *basic_interpolation_expect_from_nir =
230    R"(FS
231 CHIPCLASS EVERGREEN
232 PROP MAX_COLOR_EXPORTS:1
233 PROP COLOR_EXPORTS:1
234 PROP COLOR_EXPORT_MASK:15
235 #PROP RAT_BASE:1
236 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
237 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
238 SYSVALUES R0.xy__
239 SHADER
240 ALU MOV S1.x@free : I[0] {WL}
241 ALU_GROUP_BEGIN
242 ALU INTERP_ZW  __.x@chan : R0.y@fully Param0.x VEC_210 {}
243 ALU INTERP_ZW  __.y@chan : R0.x@fully Param0.y VEC_210 {}
244 ALU INTERP_ZW  S2.z@chan : R0.y@fully Param0.z VEC_210 {W}
245 ALU INTERP_ZW  S2.w@chan : R0.x@fully Param0.w VEC_210 {WL}
246 ALU_GROUP_END
247 ALU_GROUP_BEGIN
248 ALU INTERP_XY  S2.x@chan : R0.y@fully Param0.x VEC_210 {W}
249 ALU INTERP_XY  S2.y@chan : R0.x@fully Param0.y VEC_210 {W}
250 ALU INTERP_XY  __.z@chan : R0.y@fully Param0.z VEC_210 {}
251 ALU INTERP_XY  __.w@chan : R0.x@fully Param0.w VEC_210 {L}
252 ALU_GROUP_END
253 
254 ALU TRUNC S3.x@free : S2.x@chan {WL}
255 ALU TRUNC S4.y@free : S2.y@chan {WL}
256 ALU TRUNC S5.z@free : S2.w@chan {WL}
257 
258 ALU FLT_TO_INT S6.x : S3.x@free {W}
259 ALU FLT_TO_INT S6.y : S4.y@free {W}
260 ALU FLT_TO_INT S6.z : S5.z@free {WL}
261 
262 ALU MOV S7.x@free : S6.z {WL}
263 ALU MOV S8.x : S6.x {W}
264 ALU MOV S8.y : S6.y {WL}
265 ALU MOV S9.x@group : S8.x {W}
266 ALU MOV S9.y@group : S8.y {W}
267 ALU MOV S9.w@group : S7.x@free {WL}
268 TEX LD S10.xyzw : S9.xy_w RID:18 SID:0 NNNN
269 EXPORT_DONE PIXEL 0 S10.xyzw)";
270 
271 const char *basic_interpolation_translated_1 =
272    R"(FS
273 CHIPCLASS EVERGREEN
274 PROP MAX_COLOR_EXPORTS:1
275 PROP COLOR_EXPORTS:1
276 PROP COLOR_EXPORT_MASK:15
277 #PROP RAT_BASE:1
278 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
279 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
280 SYSVALUES R0.xy__
281 SHADER
282 ALU MOV S1.x@free : I[0] {WL}
283 ALU_GROUP_BEGIN
284 ALU INTERP_ZW  __.x@chan : R0.y@fully Param0.x VEC_210 {}
285 ALU INTERP_ZW  __.y@chan : R0.x@fully Param0.y VEC_210 {}
286 ALU INTERP_ZW  S2.z@chan : R0.y@fully Param0.z VEC_210 {W}
287 ALU INTERP_ZW  S2.w@chan : R0.x@fully Param0.w VEC_210 {WL}
288 ALU_GROUP_END
289 ALU_GROUP_BEGIN
290 ALU INTERP_XY  S2.x@chan : R0.y@fully Param0.x VEC_210 {W}
291 ALU INTERP_XY  S2.y@chan : R0.x@fully Param0.y VEC_210 {W}
292 ALU INTERP_XY  __.z@chan : R0.y@fully Param0.z VEC_210 {}
293 ALU INTERP_XY  __.w@chan : R0.x@fully Param0.w VEC_210 {L}
294 ALU_GROUP_END
295 
296 ALU FLT_TO_INT S3.x : S2.x@free {W}
297 ALU FLT_TO_INT S3.y : S2.y@free {W}
298 ALU FLT_TO_INT S3.z : S2.w@free {WL}
299 ALU MOV S4.x : S3.x {W}
300 ALU MOV S4.y : S3.y {WL}
301 ALU MOV S5.x@group : S4.x {W}
302 ALU MOV S5.y@group : S4.y {W}
303 ALU MOV S5.w@group : S3.z {WL}
304 TEX LD S6.xyzw : S5.xy_w RID:18 SID:0 NNNN
305 EXPORT_DONE PIXEL 0 S6.xyzw)";
306 
307 const char *basic_interpolation_2 =
308    R"(FS
309 CHIPCLASS EVERGREEN
310 PROP MAX_COLOR_EXPORTS:1
311 PROP COLOR_EXPORTS:1
312 PROP COLOR_EXPORT_MASK:15
313 #PROP RAT_BASE:1
314 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
315 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
316 SYSVALUES R0.xy__
317 SHADER
318 ALU_GROUP_BEGIN
319 ALU INTERP_ZW  __.x@chan : R0.y@fully Param0.x VEC_210 {}
320 ALU INTERP_ZW  __.y@chan : R0.x@fully Param0.y VEC_210 {}
321 ALU INTERP_ZW  S2.z@chan : R0.y@fully Param0.z VEC_210 {W}
322 ALU INTERP_ZW  S2.w@chan : R0.x@fully Param0.w VEC_210 {WL}
323 ALU_GROUP_END
324 ALU_GROUP_BEGIN
325 ALU INTERP_XY  S2.x@chan : R0.y@fully Param0.x VEC_210 {W}
326 ALU INTERP_XY  S2.y@chan : R0.x@fully Param0.y VEC_210 {W}
327 ALU INTERP_XY  __.z@chan : R0.y@fully Param0.z VEC_210 {}
328 ALU INTERP_XY  __.w@chan : R0.x@fully Param0.w VEC_210 {L}
329 ALU_GROUP_END
330 EXPORT_DONE PIXEL 0 S2.xyzw
331 )";
332 
333 const char *basic_interpolation_orig =
334    R"(FS
335 CHIPCLASS EVERGREEN
336 PROP MAX_COLOR_EXPORTS:1
337 PROP COLOR_EXPORTS:1
338 PROP COLOR_EXPORT_MASK:15
339 #PROP RAT_BASE:1
340 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
341 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
342 SYSVALUES R0.xy__
343 SHADER
344 ALU MOV S1024.x : I[0] {WL}
345 ALU_GROUP_BEGIN
346 ALU INTERP_ZW  __.x@chan : R0.y@fully Param0.x VEC_210 {}
347 ALU INTERP_ZW  __.y@chan : R0.x@fully Param0.y VEC_210 {}
348 ALU INTERP_ZW  S1025.z@chan : R0.y@fully Param0.z VEC_210 {W}
349 ALU INTERP_ZW  S1025.w@chan : R0.x@fully Param0.w VEC_210 {WL}
350 ALU_GROUP_END
351 ALU_GROUP_BEGIN
352 ALU INTERP_XY  S1025.x@chan : R0.y@fully Param0.x VEC_210 {W}
353 ALU INTERP_XY  S1025.y@chan : R0.x@fully Param0.y VEC_210 {W}
354 ALU INTERP_XY  __.z@chan : R0.y@fully Param0.z VEC_210 {}
355 ALU INTERP_XY  __.w@chan : R0.x@fully Param0.w VEC_210 {L}
356 ALU_GROUP_END
357 
358 ALU FLT_TO_INT S1026.x : S1025.x@chan {W}
359 ALU FLT_TO_INT S1026.y : S1025.y@chan {W}
360 ALU FLT_TO_INT S1026.z : S1025.w@chan {WL}
361 ALU MOV S1027.x : S1026.x {W}
362 ALU MOV S1027.y : S1026.y {WL}
363 ALU MOV S1028.x@group : S1027.x {W}
364 ALU MOV S1028.y@group : S1027.y {W}
365 ALU MOV S1028.w@group : S1026.z {WL}
366 TEX LD S1029.xyzw : S1028.xy_w RID:0 SID:18 NNNN
367 EXPORT_DONE PIXEL 0 S1029.xyzw
368 )";
369 
370 const char *basic_interpolation_expect_from_nir_sched =
371    R"(FS
372 CHIPCLASS EVERGREEN
373 PROP MAX_COLOR_EXPORTS:1
374 PROP COLOR_EXPORTS:1
375 PROP COLOR_EXPORT_MASK:15
376 #PROP RAT_BASE:1
377 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
378 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
379 SYSVALUES R0.xy__
380 SHADER
381 BLOCK_START
382 ALU_GROUP_BEGIN
383 ALU INTERP_ZW  __.x@chan : R0.y@fully Param0.x VEC_210 {}
384 ALU INTERP_ZW  __.y@chan : R0.x@fully Param0.y VEC_210 {}
385 ALU INTERP_ZW  S1025.z@chan : R0.y@fully Param0.z VEC_210 {W}
386 ALU INTERP_ZW  S1025.w@chan : R0.x@fully Param0.w VEC_210 {W}
387 ALU MOV S1024.x : I[0] {WL}
388 ALU_GROUP_END
389 ALU_GROUP_BEGIN
390 ALU INTERP_XY  S1025.x@chan : R0.y@fully Param0.x VEC_210 {W}
391 ALU INTERP_XY  S1025.y@chan : R0.x@fully Param0.y VEC_210 {W}
392 ALU INTERP_XY  __.z@chan : R0.y@fully Param0.z VEC_210 {}
393 ALU INTERP_XY  __.w@chan : R0.x@fully Param0.w VEC_210 {L}
394 ALU_GROUP_END
395 ALU_GROUP_BEGIN
396 ALU FLT_TO_INT S1026.x : S1025.x@chan {W}
397 ALU FLT_TO_INT S1026.y : S1025.y@chan {W}
398 ALU FLT_TO_INT S1026.z : S1025.w@chan {WL}
399 ALU_GROUP_END
400 ALU_GROUP_BEGIN
401 ALU MOV S1027.x : S1026.x {W}
402 ALU MOV S1027.y : S1026.y {W}
403 ALU MOV S1028.w@group : S1026.z {WL}
404 ALU_GROUP_END
405 ALU_GROUP_BEGIN
406 ALU MOV S1028.x@group : S1027.x {W}
407 ALU MOV S1028.y@group : S1027.y {WL}
408 ALU_GROUP_END
409 BLOCK_END
410 BLOCK_START
411 TEX LD S1029.xyzw : S1028.xy_w RID:0 SID:18 NNNN
412 BLOCK_END
413 BLOCK_START
414 EXPORT_DONE PIXEL 0 S1029.xyzw
415 BLOCK_END
416 )";
417 
418 const char *basic_interpolation_orig_cayman =
419    R"(FS
420 CHIPCLASS CAYMAN
421 PROP MAX_COLOR_EXPORTS:1
422 PROP COLOR_EXPORTS:1
423 PROP COLOR_EXPORT_MASK:15
424 #PROP RAT_BASE:1
425 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
426 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
427 SYSVALUES R0.xy__
428 SHADER
429 ALU MOV S1024.x : I[0] {WL}
430 ALU_GROUP_BEGIN
431 ALU INTERP_ZW  __.x@chan : R0.y@fully Param0.x VEC_210 {}
432 ALU INTERP_ZW  __.y@chan : R0.x@fully Param0.y VEC_210 {}
433 ALU INTERP_ZW  S1025.z@chan : R0.y@fully Param0.z VEC_210 {W}
434 ALU INTERP_ZW  S1025.w@chan : R0.x@fully Param0.w VEC_210 {WL}
435 ALU_GROUP_END
436 ALU_GROUP_BEGIN
437 ALU INTERP_XY  S1025.x@chan : R0.y@fully Param0.x VEC_210 {W}
438 ALU INTERP_XY  S1025.y@chan : R0.x@fully Param0.y VEC_210 {W}
439 ALU INTERP_XY  __.z@chan : R0.y@fully Param0.z VEC_210 {}
440 ALU INTERP_XY  __.w@chan : R0.x@fully Param0.w VEC_210 {L}
441 ALU_GROUP_END
442 
443 ALU FLT_TO_INT S1026.x : S1025.x@chan {W}
444 ALU FLT_TO_INT S1026.y : S1025.y@chan {W}
445 ALU FLT_TO_INT S1026.z : S1025.w@chan {WL}
446 ALU MOV S1027.x : S1026.x {W}
447 ALU MOV S1027.y : S1026.y {WL}
448 ALU MOV S1028.x@group : S1027.x {W}
449 ALU MOV S1028.y@group : S1027.y {W}
450 ALU MOV S1028.w@group : S1026.z {WL}
451 TEX LD S1029.xyzw : S1028.xy_w RID:0 SID:18 NNNN
452 EXPORT_DONE PIXEL 0 S1029.xyzw
453 )";
454 
455 const char *basic_interpolation_expect_from_nir_sched_cayman =
456    R"(FS
457 CHIPCLASS CAYMAN
458 PROP MAX_COLOR_EXPORTS:1
459 PROP COLOR_EXPORTS:1
460 PROP COLOR_EXPORT_MASK:15
461 #PROP RAT_BASE:1
462 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
463 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
464 SYSVALUES R0.xy__
465 SHADER
466 BLOCK_START
467 ALU_GROUP_BEGIN
468 ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
469 ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
470 ALU INTERP_ZW S1025.z@chan : R0.y@fully Param0.z {W} VEC_210
471 ALU INTERP_ZW S1025.w@chan : R0.x@fully Param0.w {WL} VEC_210
472 ALU_GROUP_END
473 ALU_GROUP_BEGIN
474 ALU INTERP_XY S1025.x@chan : R0.y@fully Param0.x {W} VEC_210
475 ALU INTERP_XY S1025.y@chan : R0.x@fully Param0.y {W} VEC_210
476 ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
477 ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
478 ALU_GROUP_END
479 ALU_GROUP_BEGIN
480 ALU FLT_TO_INT S1026.x : S1025.x@chan {W}
481 ALU FLT_TO_INT S1026.y : S1025.y@chan {W}
482 ALU FLT_TO_INT S1026.z : S1025.w@chan {WL}
483 ALU_GROUP_END
484 ALU_GROUP_BEGIN
485 ALU MOV S1027.x : S1026.x {W}
486 ALU MOV S1027.y : S1026.y {W}
487 ALU MOV S1028.w@group : S1026.z {WL}
488 ALU_GROUP_END
489 ALU_GROUP_BEGIN
490 ALU MOV S1028.x@group : S1027.x {W}
491 ALU MOV S1028.y@group : S1027.y {WL}
492 ALU_GROUP_END
493 ALU_GROUP_BEGIN
494 ALU MOV S1024.x : I[0] {WL}
495 ALU_GROUP_END
496 BLOCK_START
497 BLOCK_END
498 TEX LD S1029.xyzw : S1028.xy_w RID:0 SID:18 NNNN
499 BLOCK_START
500 BLOCK_END
501 EXPORT_DONE PIXEL 0 S1029.xyzw
502 BLOCK_END
503 )";
504 
505 const char *basic_interpolation_expect_opt_sched_cayman =
506    R"(FS
507 CHIPCLASS CAYMAN
508 PROP MAX_COLOR_EXPORTS:1
509 PROP COLOR_EXPORTS:1
510 PROP COLOR_EXPORT_MASK:15
511 #PROP RAT_BASE:1
512 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
513 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
514 SYSVALUES R0.xy__
515 SHADER
516 BLOCK_START
517 ALU_GROUP_BEGIN
518 ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
519 ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
520 ALU INTERP_ZW S1025.z@chan : R0.y@fully Param0.z {W} VEC_210
521 ALU INTERP_ZW S1025.w@chan : R0.x@fully Param0.w {WL} VEC_210
522 ALU_GROUP_END
523 ALU_GROUP_BEGIN
524 ALU INTERP_XY S1025.x@chan : R0.y@fully Param0.x {W} VEC_210
525 ALU INTERP_XY S1025.y@chan : R0.x@fully Param0.y {W} VEC_210
526 ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
527 ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
528 ALU_GROUP_END
529 ALU_GROUP_BEGIN
530 ALU FLT_TO_INT S1026.x@group : S1025.x@chan {W}
531 ALU FLT_TO_INT S1026.y@group : S1025.y@chan {W}
532 ALU FLT_TO_INT S1026.z@group : S1025.w@chan {WL}
533 ALU_GROUP_END
534 BLOCK_END
535 BLOCK_START
536 TEX LD S1029.xyzw : S1026.xy_z RID:0 SID:18 NNNN
537 BLOCK_END
538 BLOCK_START
539 EXPORT_DONE PIXEL 0 S1029.xyzw
540 BLOCK_END
541 )";
542 
543 const char *basic_interpolation_expect_from_nir_opt =
544    R"(FS
545 CHIPCLASS EVERGREEN
546 PROP MAX_COLOR_EXPORTS:1
547 PROP COLOR_EXPORTS:1
548 PROP COLOR_EXPORT_MASK:15
549 #PROP RAT_BASE:1
550 INPUT LOC:0 VARYING_SLOT:32 INTERP:1
551 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
552 SYSVALUES R0.xy__
553 SHADER
554 ALU_GROUP_BEGIN
555 ALU INTERP_ZW  __.x@chan : R0.y@fully Param0.x VEC_210 {}
556 ALU INTERP_ZW  __.y@chan : R0.x@fully Param0.y VEC_210 {}
557 ALU INTERP_ZW  S1025.z@chan : R0.y@fully Param0.z VEC_210 {W}
558 ALU INTERP_ZW  S1025.w@chan : R0.x@fully Param0.w VEC_210 {WL}
559 ALU_GROUP_END
560 ALU_GROUP_BEGIN
561 ALU INTERP_XY  S1025.x@chan : R0.y@fully Param0.x VEC_210 {W}
562 ALU INTERP_XY  S1025.y@chan : R0.x@fully Param0.y VEC_210 {W}
563 ALU INTERP_XY  __.z@chan : R0.y@fully Param0.z VEC_210 {}
564 ALU INTERP_XY  __.w@chan : R0.x@fully Param0.w VEC_210 {L}
565 ALU_GROUP_END
566 ALU FLT_TO_INT S1026.x@group : S1025.x@chan {W}
567 ALU FLT_TO_INT S1026.y@group : S1025.y@chan {W}
568 ALU FLT_TO_INT S1026.z@group : S1025.w@chan {WL}
569 TEX LD S1029.xyzw : S1026.xy_z RID:0 SID:18 NNNN
570 EXPORT_DONE PIXEL 0 S1029.xyzw
571 )";
572 
573 const char *dot4_pre =
574    R"(FS
575 CHIPCLASS EVERGREEN
576 PROP MAX_COLOR_EXPORTS:1
577 PROP COLOR_EXPORTS:1
578 PROP COLOR_EXPORT_MASK:15
579 #PROP RAT_BASE:1
580 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
581 SHADER
582 ALU MOV S1.x : KC0[0].x  {W}
583 ALU MOV S1.y : KC0[0].y  {W}
584 ALU MOV S1.z : KC0[0].z  {W}
585 ALU MOV S1.w : KC0[0].w  {WL}
586 ALU MOV S2.x : KC0[1].x  {W}
587 ALU MOV S2.y : KC0[1].y  {W}
588 ALU MOV S2.z : KC0[1].z  {W}
589 ALU MOV S2.w : KC0[1].w  {WL}
590 ALU DOT4_IEEE S3.x@free : S1.x S2.x + S1.y S2.y + S1.z S2.z + S1.w S2.w  {WL}
591 ALU MOV S4.x : S3.x@free {W}
592 ALU MOV S4.y : S3.x@free {W}
593 ALU MOV S4.z : S3.x@free {W}
594 ALU MOV S4.w : S3.x@free {W}
595 EXPORT_DONE PIXEL 0 S4.xyzw
596 )";
597 
598 const char *dot4_copy_prop_dce =
599    R"(FS
600 CHIPCLASS EVERGREEN
601 PROP MAX_COLOR_EXPORTS:1
602 PROP COLOR_EXPORTS:1
603 PROP COLOR_EXPORT_MASK:15
604 #PROP RAT_BASE:1
605 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
606 SHADER
607 ALU MOV S2.x : KC0[1].x  {W}
608 ALU MOV S2.y : KC0[1].y  {W}
609 ALU MOV S2.z : KC0[1].z  {W}
610 ALU MOV S2.w : KC0[1].w  {WL}
611 ALU DOT4_IEEE S3.x@group : KC0[0].x S2.x + KC0[0].y S2.y + KC0[0].z S2.z + KC0[0].w S2.w  {WL}
612 EXPORT_DONE PIXEL 0 S3.xxxx
613 )";
614 
615 const char *glxgears_vs2_nir =
616    R"(shader: MESA_SHADER_VERTEX
617 name: ARB0
618 inputs: 2
619 outputs: 2
620 uniforms: 11
621 shared: 0
622 decl_var uniform INTERP_MODE_NONE vec4[11] name (0, 0, 0)
623 decl_function main (0 params)
624 
625 impl main {
626         block block_0:
627         /* preds: */
628         vec1 32 ssa_0 = load_const (0x00000000 /* 0.000000 */)
629         vec4 32 ssa_1 = intrinsic load_input (ssa_0) (0, 0, 160, 128) /* base=0 */ /* component=0 */ /* dest_type=float32 */ /* location=0 slots=1 */
630         vec1 32 ssa_2 = load_const (0x00000006 /* 0.000000 */)
631         vec4 32 ssa_3 = intrinsic load_uniform (ssa_2) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */ /*  */
632         vec4 32 ssa_4 = fmul ssa_1.xxxx, ssa_3
633         vec1 32 ssa_5 = load_const (0x00000007 /* 0.000000 */)
634         vec4 32 ssa_6 = intrinsic load_uniform (ssa_5) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */ /*  */
635         vec4 32 ssa_7 = ffma ssa_1.yyyy, ssa_6, ssa_4
636         vec1 32 ssa_8 = load_const (0x00000008 /* 0.000000 */)
637         vec4 32 ssa_9 = intrinsic load_uniform (ssa_8) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */ /*  */
638         vec4 32 ssa_10 = ffma ssa_1.zzzz, ssa_9, ssa_7
639         vec1 32 ssa_11 = load_const (0x00000009 /* 0.000000 */)
640         vec4 32 ssa_12 = intrinsic load_uniform (ssa_11) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */       /*  */
641         vec4 32 ssa_13 = ffma ssa_1.wwww, ssa_12, ssa_10
642         vec4 32 ssa_14 = intrinsic load_input (ssa_0) (1, 0, 160, 129) /* base=1 */ /* component=0 */ /* dest_type=float32 */ /* location=1 slots=1 */
643         vec1 32 ssa_15 = fdot3 ssa_14.xyz, ssa_14.xyz
644         vec1 32 ssa_16 = frsq abs(ssa_15)
645         vec4 32 ssa_17 = fmul ssa_14, ssa_16.xxxx
646         vec1 32 ssa_18 = load_const (0x00000002 /* 0.000000 */)
647         vec4 32 ssa_19 = intrinsic load_uniform (ssa_18) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */       /*  */
648         vec1 32 ssa_20 = load_const (0x0000000a /* 0.000000 */)
649         vec4 32 ssa_21 = intrinsic load_uniform (ssa_20) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */       /*  */
650         vec1 32 ssa_22 = fdot3 ssa_17.xyz, ssa_21.xyz
651         vec4 32 ssa_23 = load_const (0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x3f800000 /* 1.000000 */)
652         vec1 32 ssa_24 = fmax ssa_23.y, ssa_22
653         vec4 32 ssa_25 = load_const (0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */)
654         vec1 32 ssa_26 = slt ssa_25.z, ssa_22
655         vec1 32 ssa_27 = load_const (0x00000003 /* 0.000000 */)
656         vec4 32 ssa_28 = intrinsic load_uniform (ssa_27) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */       /*  */
657         vec3 32 ssa_29 = fadd ssa_28.xyz, ssa_19.xyz
658         vec1 32 ssa_30 = load_const (0x00000004 /* 0.000000 */)
659         vec4 32 ssa_31 = intrinsic load_uniform (ssa_30) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */       /*  */
660         vec3 32 ssa_32 = ffma ssa_24.xxx, ssa_31.xyz, ssa_29
661         vec1 32 ssa_33 = load_const (0x00000005 /* 0.000000 */)
662         vec4 32 ssa_34 = intrinsic load_uniform (ssa_33) (0, 11, 160) /* base=0 */ /* range=11 */ /* dest_type=float32 */       /*  */
663         vec3 32 ssa_35 = ffma.sat ssa_26.xxx, ssa_34.xyz, ssa_32
664         intrinsic store_output (ssa_13, ssa_0) (0, 15, 0, 160, 128) /* base=0 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=0 slots=1 */
665         vec3 32 ssa_36 = mov ssa_35
666         vec1 32 ssa_37 = fsat ssa_19.w
667         vec4 32 ssa_38 = vec4 ssa_36.x, ssa_36.y, ssa_36.z, ssa_37
668         intrinsic store_output (ssa_38, ssa_0) (1, 15, 0, 160, 129) /* base=1 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=1 slots=1 */
669         /* succs: block_1 */
670         block block_1:
671 })";
672 
673 const char *glxgears_vs2_from_nir_expect =
674    R"(VS
675 CHIPCLASS EVERGREEN
676 INPUT LOC:0
677 INPUT LOC:1
678 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
679 OUTPUT LOC:1 VARYING_SLOT:1 MASK:15
680 SYSVALUES R1.xyzw R2.xyzw
681 SHADER
682 ALU MOV S3.x@free : I[0] {WL}
683 ALU MOV S4.x@free : L[0x6] {WL}
684 ALU MOV S5.x : KC0[6].x {W}
685 ALU MOV S5.y : KC0[6].y {W}
686 ALU MOV S5.z : KC0[6].z {W}
687 ALU MOV S5.w : KC0[6].w {WL}
688 ALU MUL_IEEE S6.x : R1.x@fully S5.x {W}
689 ALU MUL_IEEE S6.y : R1.x@fully S5.y {W}
690 ALU MUL_IEEE S6.z : R1.x@fully S5.z {W}
691 ALU MUL_IEEE S6.w : R1.x@fully S5.w {WL}
692 ALU MOV S7.x@free : L[0x7] {WL}
693 ALU MOV S8.x : KC0[7].x {W}
694 ALU MOV S8.y : KC0[7].y {W}
695 ALU MOV S8.z : KC0[7].z {W}
696 ALU MOV S8.w : KC0[7].w {WL}
697 ALU MULADD_IEEE S9.x : R1.y@fully S8.x S6.x {W}
698 ALU MULADD_IEEE S9.y : R1.y@fully S8.y S6.y {W}
699 ALU MULADD_IEEE S9.z : R1.y@fully S8.z S6.z {W}
700 ALU MULADD_IEEE S9.w : R1.y@fully S8.w S6.w {WL}
701 ALU MOV S10.x@free : L[0x8] {WL}
702 ALU MOV S11.x : KC0[8].x {W}
703 ALU MOV S11.y : KC0[8].y {W}
704 ALU MOV S11.z : KC0[8].z {W}
705 ALU MOV S11.w : KC0[8].w {WL}
706 ALU MULADD_IEEE S12.x : R1.z@fully S11.x S9.x {W}
707 ALU MULADD_IEEE S12.y : R1.z@fully S11.y S9.y {W}
708 ALU MULADD_IEEE S12.z : R1.z@fully S11.z S9.z {W}
709 ALU MULADD_IEEE S12.w : R1.z@fully S11.w S9.w {WL}
710 ALU MOV S13.x@free : L[0x9] {WL}
711 ALU MOV S14.x : KC0[9].x {W}
712 ALU MOV S14.y : KC0[9].y {W}
713 ALU MOV S14.z : KC0[9].z {W}
714 ALU MOV S14.w : KC0[9].w {WL}
715 ALU MULADD_IEEE S15.x@group : R1.w@fully S14.x S12.x {W}
716 ALU MULADD_IEEE S15.y@group : R1.w@fully S14.y S12.y {W}
717 ALU MULADD_IEEE S15.z@group : R1.w@fully S14.z S12.z {W}
718 ALU MULADD_IEEE S15.w@group : R1.w@fully S14.w S12.w {WL}
719 ALU DOT4_IEEE S16.x@free : R2.x@fully R2.x@fully + R2.y@fully R2.y@fully + R2.z@fully R2.z@fully + I[0].x I[0].x {WL}
720 ALU RECIPSQRT_IEEE S17.x@free : |S16.x@free| {WL}
721 ALU MUL_IEEE S18.x : R2.x@fully S17.x@free {W}
722 ALU MUL_IEEE S18.y : R2.y@fully S17.x@free {W}
723 ALU MUL_IEEE S18.z : R2.z@fully S17.x@free {W}
724 ALU MUL_IEEE S18.w : R2.w@fully S17.x@free {WL}
725 ALU MOV S19.x@free : L[0x2] {WL}
726 ALU MOV S20.x : KC0[2].x {W}
727 ALU MOV S20.y : KC0[2].y {W}
728 ALU MOV S20.z : KC0[2].z {W}
729 ALU MOV S20.w : KC0[2].w {WL}
730 ALU MOV S21.x@free : L[0xa] {WL}
731 ALU MOV S22.x : KC0[10].x {W}
732 ALU MOV S22.y : KC0[10].y {W}
733 ALU MOV S22.z : KC0[10].z {W}
734 ALU MOV S22.w : KC0[10].w {WL}
735 ALU DOT4_IEEE S23.x@free : S18.x S22.x + S18.y S22.y + S18.z S22.z + I[0].x I[0].x {WL}
736 ALU MOV S24.x : I[0] {W}
737 ALU MOV S24.y : I[0] {W}
738 ALU MOV S24.z : I[0] {W}
739 ALU MOV S24.w : I[1.0] {WL}
740 ALU MAX_DX10 S25.x@free : S24.y S23.x@free {WL}
741 ALU MOV S26.x : I[0] {W}
742 ALU MOV S26.y : I[0] {W}
743 ALU MOV S26.z : I[0] {W}
744 ALU MOV S26.w : I[0] {WL}
745 ALU SETGT S27.x@free : S23.x@free S26.z {WL}
746 ALU MOV S28.x@free : L[0x3] {WL}
747 ALU MOV S29.x : KC0[3].x {W}
748 ALU MOV S29.y : KC0[3].y {W}
749 ALU MOV S29.z : KC0[3].z {W}
750 ALU MOV S29.w : KC0[3].w {WL}
751 ALU ADD S30.x : S29.x S20.x {W}
752 ALU ADD S30.y : S29.y S20.y {W}
753 ALU ADD S30.z : S29.z S20.z {WL}
754 ALU MOV S31.x@free : L[0x4] {WL}
755 ALU MOV S32.x : KC0[4].x {W}
756 ALU MOV S32.y : KC0[4].y {W}
757 ALU MOV S32.z : KC0[4].z {W}
758 ALU MOV S32.w : KC0[4].w {WL}
759 ALU MULADD_IEEE S33.x : S25.x@free S32.x S30.x {W}
760 ALU MULADD_IEEE S33.y : S25.x@free S32.y S30.y {W}
761 ALU MULADD_IEEE S33.z : S25.x@free S32.z S30.z {WL}
762 ALU MOV S34.x@free : L[0x5] {WL}
763 ALU MOV S35.x : KC0[5].x {W}
764 ALU MOV S35.y : KC0[5].y {W}
765 ALU MOV S35.z : KC0[5].z {W}
766 ALU MOV S35.w : KC0[5].w {WL}
767 ALU MULADD_IEEE CLAMP S36.x : S27.x@free S35.x S33.x {W}
768 ALU MULADD_IEEE CLAMP S36.y : S27.x@free S35.y S33.y {W}
769 ALU MULADD_IEEE CLAMP S36.z : S27.x@free S35.z S33.z {WL}
770 EXPORT_DONE POS 0 S15.xyzw
771 ALU MOV S38.x : S36.x {W}
772 ALU MOV S38.y : S36.y {W}
773 ALU MOV S38.z : S36.z {WL}
774 ALU MOV CLAMP S39.x@free : S20.w {WL}
775 ALU MOV S40.x@group : S38.x {W}
776 ALU MOV S40.y@group : S38.y {W}
777 ALU MOV S40.z@group : S38.z {W}
778 ALU MOV S40.w@group : S39.x@free {WL}
779 EXPORT_DONE PARAM 0 S40.xyzw)";
780 
781 const char *glxgears_vs2_from_nir_expect_cayman =
782    R"(VS
783 CHIPCLASS CAYMAN
784 INPUT LOC:0
785 INPUT LOC:1
786 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
787 OUTPUT LOC:1 VARYING_SLOT:1 MASK:15
788 SYSVALUES R1.xyzw R2.xyzw
789 SHADER
790 ALU MOV S3.x@free : I[0] {WL}
791 ALU MOV S4.x@free : L[0x6] {WL}
792 ALU MOV S5.x : KC0[6].x {W}
793 ALU MOV S5.y : KC0[6].y {W}
794 ALU MOV S5.z : KC0[6].z {W}
795 ALU MOV S5.w : KC0[6].w {WL}
796 ALU MUL_IEEE S6.x : R1.x@fully S5.x {W}
797 ALU MUL_IEEE S6.y : R1.x@fully S5.y {W}
798 ALU MUL_IEEE S6.z : R1.x@fully S5.z {W}
799 ALU MUL_IEEE S6.w : R1.x@fully S5.w {WL}
800 ALU MOV S7.x@free : L[0x7] {WL}
801 ALU MOV S8.x : KC0[7].x {W}
802 ALU MOV S8.y : KC0[7].y {W}
803 ALU MOV S8.z : KC0[7].z {W}
804 ALU MOV S8.w : KC0[7].w {WL}
805 ALU MULADD_IEEE S9.x : R1.y@fully S8.x S6.x {W}
806 ALU MULADD_IEEE S9.y : R1.y@fully S8.y S6.y {W}
807 ALU MULADD_IEEE S9.z : R1.y@fully S8.z S6.z {W}
808 ALU MULADD_IEEE S9.w : R1.y@fully S8.w S6.w {WL}
809 ALU MOV S10.x@free : L[0x8] {WL}
810 ALU MOV S11.x : KC0[8].x {W}
811 ALU MOV S11.y : KC0[8].y {W}
812 ALU MOV S11.z : KC0[8].z {W}
813 ALU MOV S11.w : KC0[8].w {WL}
814 ALU MULADD_IEEE S12.x : R1.z@fully S11.x S9.x {W}
815 ALU MULADD_IEEE S12.y : R1.z@fully S11.y S9.y {W}
816 ALU MULADD_IEEE S12.z : R1.z@fully S11.z S9.z {W}
817 ALU MULADD_IEEE S12.w : R1.z@fully S11.w S9.w {WL}
818 ALU MOV S13.x@free : L[0x9] {WL}
819 ALU MOV S14.x : KC0[9].x {W}
820 ALU MOV S14.y : KC0[9].y {W}
821 ALU MOV S14.z : KC0[9].z {W}
822 ALU MOV S14.w : KC0[9].w {WL}
823 ALU MULADD_IEEE S15.x@group : R1.w@fully S14.x S12.x {W}
824 ALU MULADD_IEEE S15.y@group : R1.w@fully S14.y S12.y {W}
825 ALU MULADD_IEEE S15.z@group : R1.w@fully S14.z S12.z {W}
826 ALU MULADD_IEEE S15.w@group : R1.w@fully S14.w S12.w {WL}
827 ALU DOT4_IEEE S16.x@free : R2.x@fully R2.x@fully + R2.y@fully R2.y@fully + R2.z@fully R2.z@fully + I[0].x I[0].x {WL}
828 ALU RECIPSQRT_IEEE S17.x@chan : |S16.x@free| + |S16.x@free| + S16.x@free {WL}
829 ALU MUL_IEEE S18.x : R2.x@fully S17.x@free {W}
830 ALU MUL_IEEE S18.y : R2.y@fully S17.x@free {W}
831 ALU MUL_IEEE S18.z : R2.z@fully S17.x@free {W}
832 ALU MUL_IEEE S18.w : R2.w@fully S17.x@free {WL}
833 ALU MOV S19.x@free : L[0x2] {WL}
834 ALU MOV S20.x : KC0[2].x {W}
835 ALU MOV S20.y : KC0[2].y {W}
836 ALU MOV S20.z : KC0[2].z {W}
837 ALU MOV S20.w : KC0[2].w {WL}
838 ALU MOV S21.x@free : L[0xa] {WL}
839 ALU MOV S22.x : KC0[10].x {W}
840 ALU MOV S22.y : KC0[10].y {W}
841 ALU MOV S22.z : KC0[10].z {W}
842 ALU MOV S22.w : KC0[10].w {WL}
843 ALU DOT4_IEEE S23.x@free : S18.x S22.x + S18.y S22.y + S18.z S22.z + I[0].x I[0].x {WL}
844 ALU MOV S24.x : I[0] {W}
845 ALU MOV S24.y : I[0] {W}
846 ALU MOV S24.z : I[0] {W}
847 ALU MOV S24.w : I[1.0] {WL}
848 ALU MAX_DX10 S25.x@free : S24.y S23.x@free {WL}
849 ALU MOV S26.x : I[0] {W}
850 ALU MOV S26.y : I[0] {W}
851 ALU MOV S26.z : I[0] {W}
852 ALU MOV S26.w : I[0] {WL}
853 ALU SETGT S27.x@free : S23.x@free S26.z {WL}
854 ALU MOV S28.x@free : L[0x3] {WL}
855 ALU MOV S29.x : KC0[3].x {W}
856 ALU MOV S29.y : KC0[3].y {W}
857 ALU MOV S29.z : KC0[3].z {W}
858 ALU MOV S29.w : KC0[3].w {WL}
859 ALU ADD S30.x : S29.x S20.x {W}
860 ALU ADD S30.y : S29.y S20.y {W}
861 ALU ADD S30.z : S29.z S20.z {WL}
862 ALU MOV S31.x@free : L[0x4] {WL}
863 ALU MOV S32.x : KC0[4].x {W}
864 ALU MOV S32.y : KC0[4].y {W}
865 ALU MOV S32.z : KC0[4].z {W}
866 ALU MOV S32.w : KC0[4].w {WL}
867 ALU MULADD_IEEE S33.x : S25.x@free S32.x S30.x {W}
868 ALU MULADD_IEEE S33.y : S25.x@free S32.y S30.y {W}
869 ALU MULADD_IEEE S33.z : S25.x@free S32.z S30.z {WL}
870 ALU MOV S34.x@free : L[0x5] {WL}
871 ALU MOV S35.x : KC0[5].x {W}
872 ALU MOV S35.y : KC0[5].y {W}
873 ALU MOV S35.z : KC0[5].z {W}
874 ALU MOV S35.w : KC0[5].w {WL}
875 ALU MULADD_IEEE CLAMP S36.x : S27.x@free S35.x S33.x {W}
876 ALU MULADD_IEEE CLAMP S36.y : S27.x@free S35.y S33.y {W}
877 ALU MULADD_IEEE CLAMP S36.z : S27.x@free S35.z S33.z {WL}
878 EXPORT_DONE POS 0 S15.xyzw
879 ALU MOV S38.x : S36.x {W}
880 ALU MOV S38.y : S36.y {W}
881 ALU MOV S38.z : S36.z {WL}
882 ALU MOV CLAMP S39.x@free : S20.w {WL}
883 ALU MOV S40.x@group : S38.x {W}
884 ALU MOV S40.y@group : S38.y {W}
885 ALU MOV S40.z@group : S38.z {W}
886 ALU MOV S40.w@group : S39.x@free {WL}
887 EXPORT_DONE PARAM 0 S40.xyzw)";
888 
889 const char *glxgears_vs2_from_nir_expect_optimized =
890    R"(VS
891 CHIPCLASS EVERGREEN
892 INPUT LOC:0
893 INPUT LOC:1
894 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
895 OUTPUT LOC:1 VARYING_SLOT:1 MASK:15
896 SYSVALUES R1.xyzw R2.xyzw
897 SHADER
898 ALU MUL_IEEE S6.x : R1.x@fully KC0[6].x {W}
899 ALU MUL_IEEE S6.y : R1.x@fully KC0[6].y {W}
900 ALU MUL_IEEE S6.z : R1.x@fully KC0[6].z {W}
901 ALU MUL_IEEE S6.w : R1.x@fully KC0[6].w {WL}
902 ALU MULADD_IEEE S9.x : R1.y@fully KC0[7].x S6.x {W}
903 ALU MULADD_IEEE S9.y : R1.y@fully KC0[7].y S6.y {W}
904 ALU MULADD_IEEE S9.z : R1.y@fully KC0[7].z S6.z {W}
905 ALU MULADD_IEEE S9.w : R1.y@fully KC0[7].w S6.w {WL}
906 ALU MULADD_IEEE S12.x : R1.z@fully KC0[8].x S9.x {W}
907 ALU MULADD_IEEE S12.y : R1.z@fully KC0[8].y S9.y {W}
908 ALU MULADD_IEEE S12.z : R1.z@fully KC0[8].z S9.z {W}
909 ALU MULADD_IEEE S12.w : R1.z@fully KC0[8].w S9.w {WL}
910 ALU MULADD_IEEE S15.x@group : R1.w@fully KC0[9].x S12.x {W}
911 ALU MULADD_IEEE S15.y@group : R1.w@fully KC0[9].y S12.y {W}
912 ALU MULADD_IEEE S15.z@group : R1.w@fully KC0[9].z S12.z {W}
913 ALU MULADD_IEEE S15.w@group : R1.w@fully KC0[9].w S12.w {WL}
914 ALU DOT4_IEEE S16.x@free : R2.x@fully R2.x@fully + R2.y@fully R2.y@fully + R2.z@fully R2.z@fully + I[0].x I[0].x {WL}
915 ALU RECIPSQRT_IEEE S17.x@free : |S16.x@free| {WL}
916 ALU MUL_IEEE S18.x : R2.x@fully S17.x@free {W}
917 ALU MUL_IEEE S18.y : R2.y@fully S17.x@free {W}
918 ALU MUL_IEEE S18.z : R2.z@fully S17.x@free {W}
919 ALU DOT4_IEEE S23.x@free : S18.x KC0[10].x + S18.y KC0[10].y + S18.z KC0[10].z + I[0].x I[0].x {WL}
920 ALU MAX_DX10 S25.x@free : I[0] S23.x@free {WL}
921 ALU SETGT S27.x@free : S23.x@free I[0] {WL}
922 ALU ADD S30.x : KC0[3].x KC0[2].x {W}
923 ALU ADD S30.y : KC0[3].y KC0[2].y {W}
924 ALU ADD S30.z : KC0[3].z KC0[2].z {WL}
925 ALU MULADD_IEEE S33.x : S25.x@free KC0[4].x S30.x {W}
926 ALU MULADD_IEEE S33.y : S25.x@free KC0[4].y S30.y {W}
927 ALU MULADD_IEEE S33.z : S25.x@free KC0[4].z S30.z {WL}
928 ALU MULADD_IEEE CLAMP S1024.x@group : S27.x@free KC0[5].x S33.x {W}
929 ALU MULADD_IEEE CLAMP S1024.y@group : S27.x@free KC0[5].y S33.y {W}
930 ALU MULADD_IEEE CLAMP S1024.z@group : S27.x@free KC0[5].z S33.z {WL}
931 EXPORT_DONE POS 0 S15.xyzw
932 ALU MOV CLAMP S1024.w@group : KC0[2].w {WL}
933 EXPORT_DONE PARAM 0 S1024.xyzw)";
934 
935 const char *vs_nexted_loop_nir =
936    R"(shader: MESA_SHADER_VERTEX
937 name: GLSL3
938 inputs: 1
939 outputs: 2
940 uniforms: 3
941 shared: 0
942 decl_var uniform INTERP_MODE_NONE int a (0, 0, 0)
943 decl_var uniform INTERP_MODE_NONE int b (1, 1, 0)
944 decl_var uniform INTERP_MODE_NONE int c (2, 2, 0)
945 decl_function main (0 params)
946 
947 impl main {
948    decl_var  INTERP_MODE_NONE vec4 out@gl_Position-temp
949    decl_var  INTERP_MODE_NONE vec4 out@gl_FrontColor-temp
950    decl_reg vec1 32 r2
951    decl_reg vec1 32 r3
952    decl_reg vec1 32 r4
953    decl_reg vec1 32 r5
954    decl_reg vec1 32 r6
955    decl_reg vec1 32 r7
956    decl_reg vec1 32 r8
957    block block_0:
958    /* preds: */
959    vec1 32 ssa_0 = load_const (0x00000000 /* 0.000000 */)
960    vec4 32 ssa_1 = intrinsic load_input (ssa_0) (0, 0, 160, 128) /* base=0 */ /* component=0 */ /* dest_type=float32 */ /* location=0 slots=1 */
961    vec1 32 ssa_2 = load_const (0xffffffff /* -nan */)
962    vec1 32 ssa_3 = load_const (0x00000000 /* 0.000000 */)
963    vec1 32 ssa_4 = load_const (0x00000001 /* 0.000000 */)
964    vec4 32 ssa_5 = load_const (0x3f800000 /* 1.000000 */, 0x3f800000 /* 1.000000 */, 0x00000000 /* 0.000000 */, 0x3f800000 /* 1.000000 */)
965    vec1 32 ssa_6 = load_const (0x00000002 /* 0.000000 */)
966    vec1 32 ssa_7 = intrinsic load_uniform (ssa_0) (0, 1, 34) /* base=0 */ /* range=1 */ /* dest_type=int32 */	/* a */
967    vec1 32 ssa_8 = ieq32 ssa_7, ssa_4
968    /* succs: block_1 block_10 */
969    if ssa_8 {
970       block block_1:
971       /* preds: block_0 */
972       vec1 32 ssa_9 = intrinsic load_uniform (ssa_0) (2, 1, 34) /* base=2 */ /* range=1 */ /* dest_type=int32 */	/* c */
973       vec1 32 ssa_10 = ine32 ssa_9, ssa_4
974       /* succs: block_2 block_8 */
975       if ssa_10 {
976          block block_2:
977          /* preds: block_1 */
978          r3 = mov ssa_4
979          r2 = mov ssa_0
980          /* succs: block_3 */
981          loop {
982             block block_3:
983             /* preds: block_2 block_6 */
984             r4 = i2f32 r2
985             vec1 32 ssa_11 = intrinsic load_uniform (ssa_0) (1, 1, 34) /* base=1 */ /* range=1 */ /* dest_type=int32 */	/* b */
986             vec1 32 ssa_12 = ine32 ssa_11, ssa_6
987             /* succs: block_4 block_5 */
988             if ssa_12 {
989                block block_4:
990                /* preds: block_3 */
991                break
992                /* succs: block_7 */
993             } else {
994                block block_5:
995                /* preds: block_3 */
996                /* succs: block_6 */
997             }
998             block block_6:
999             /* preds: block_5 */
1000             r5 = iadd r3, ssa_4
1001             r2 = mov r3
1002             r3 = mov r5
1003             /* succs: block_3 */
1004          }
1005          block block_7:
1006          /* preds: block_4 */
1007          vec1 32 ssa_13 = load_const (0x3f800000 /* 1.000000 */)
1008          r8 = mov ssa_13
1009          r7 = mov r8
1010          r6 = mov ssa_2
1011          /* succs: block_9 */
1012       } else {
1013          block block_8:
1014          /* preds: block_1 */
1015          vec1 32 ssa_14 = load_const (0x3f800000 /* 1.000000 */)
1016          r8 = mov ssa_14
1017          r7 = mov ssa_0
1018          r4 = mov r8
1019          r6 = mov ssa_3
1020          /* succs: block_9 */
1021       }
1022       block block_9:
1023       /* preds: block_7 block_8 */
1024       /* succs: block_11 */
1025    } else {
1026       block block_10:
1027       /* preds: block_0 */
1028       vec1 32 ssa_15 = load_const (0x3f800000 /* 1.000000 */)
1029       r8 = mov ssa_15
1030       r7 = mov ssa_0
1031       r4 = mov r8
1032       r6 = mov ssa_2
1033       /* succs: block_11 */
1034    }
1035    block block_11:
1036    /* preds: block_9 block_10 */
1037    vec1 32 ssa_16 = b32csel r6, r4, ssa_5.x
1038    vec1 32 ssa_17 = b32csel r6, r7, ssa_5.y
1039    vec1 32 ssa_18 = b32csel r6, r8, ssa_5.w
1040    intrinsic store_output (ssa_1, ssa_0) (0, 15, 0, 160, 128) /* base=0 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=0 slots=1 */
1041    vec1 32 ssa_19 = fsat ssa_16
1042    vec1 32 ssa_20 = fsat ssa_17
1043    vec1 32 ssa_21 = fsat ssa_18
1044    vec4 32 ssa_22 = vec4 ssa_19, ssa_20, ssa_0, ssa_21
1045    intrinsic store_output (ssa_22, ssa_0) (1, 15, 0, 160, 129) /* base=1 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=1 slots=1 */
1046    /* succs: block_12 */
1047    block block_12:
1048 })";
1049 
1050 const char *vs_nexted_loop_from_nir_expect =
1051    R"(VS
1052 CHIPCLASS EVERGREEN
1053 INPUT LOC:0
1054 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
1055 OUTPUT LOC:1 VARYING_SLOT:1 MASK:15
1056 SYSVALUES R1.xyzw
1057 REGISTERS R2.x R3.x R4.x R5.x R6.x R7.x R8.x
1058 SHADER
1059 ALU MOV S9.x@free : I[0] {WL}
1060 ALU MOV S10.x@free : I[-1] {WL}
1061 ALU MOV S11.x@free : I[0] {WL}
1062 ALU MOV S12.x@free : I[1] {WL}
1063 ALU MOV S13.x : I[1.0] {W}
1064 ALU MOV S13.y : I[1.0] {W}
1065 ALU MOV S13.z : I[0] {W}
1066 ALU MOV S13.w : I[1.0] {WL}
1067 ALU MOV S14.x@free : L[0x2] {WL}
1068 ALU MOV S15.x@free : KC0[0].x {WL}
1069 ALU SETE_INT S16.x@free : S15.x@free S12.x@free {WL}
1070 IF (( ALU PRED_SETNE_INT __.x@free : S16.x@free I[0] {LEP} PUSH_BEFORE ))
1071   ALU MOV S18.x@free : KC0[2].x {WL}
1072   ALU SETNE_INT S19.x@free : S18.x@free S12.x {WL}
1073   IF (( ALU PRED_SETNE_INT __.y@free : S19.x@free I[0] {LEP} PUSH_BEFORE ))
1074     ALU MOV R3.x : S12.x@free {WL}
1075     ALU MOV R2.x : S9.x@free {WL}
1076     LOOP_BEGIN
1077       ALU INT_TO_FLT R4.x : R2.x {WL}
1078       ALU MOV S21.x@free : KC0[1].x {WL}
1079       ALU SETNE_INT S22.x@free : S21.x@free S14.x@free {WL}
1080       IF (( ALU PRED_SETNE_INT __.z@free : S22.x@free I[0] {LEP} PUSH_BEFORE ))
1081         BREAK
1082       ENDIF
1083       ALU ADD_INT R5.x@free : R3.x S12.x@free {WL}
1084       ALU MOV R2.x : R3.x {WL}
1085       ALU MOV R3.x : R5.x {WL}
1086     LOOP_END
1087     ALU MOV S24.x@free : I[1.0] {WL}
1088     ALU MOV R8.x : S24.x@free {WL}
1089     ALU MOV R7.x : R8.x {WL}
1090     ALU MOV R6.x : S10.x@free {WL}
1091   ELSE
1092     ALU MOV S25.x@free : I[1.0] {WL}
1093     ALU MOV R8.x : S25.x@free {WL}
1094     ALU MOV R7.x : S9.x {WL}
1095     ALU MOV R4.x : R8.x {WL}
1096     ALU MOV R6.x : S11.x@free {WL}
1097   ENDIF
1098 ELSE
1099   ALU MOV S26.x@free : I[1.0] {WL}
1100   ALU MOV R8.x : S26.x@free {WL}
1101   ALU MOV R7.x : S9.x {WL}
1102   ALU MOV R4.x : R8.x {WL}
1103   ALU MOV R6.x : S10.x@free {WL}
1104 ENDIF
1105 ALU CNDE_INT S27.x@free : R6.x S13.x R4.x {WL}
1106 ALU CNDE_INT S28.x@free : R6.x S13.y R7.x {WL}
1107 ALU CNDE_INT S29.x@free : R6.x S13.w R8.x {WL}
1108 EXPORT_DONE POS 0 R1.xyzw
1109 ALU MOV CLAMP S31.x@free : S27.x@free {WL}
1110 ALU MOV CLAMP S32.x@free : S28.x@free {WL}
1111 ALU MOV CLAMP S33.x@free : S29.x@free {WL}
1112 ALU MOV S34.x@group : S31.x@free {W}
1113 ALU MOV S34.y@group : S32.x@free {W}
1114 ALU MOV S34.z@group : S9.x@free {W}
1115 ALU MOV S34.w@group : S33.x@free {WL}
1116 EXPORT_DONE PARAM 0 S34.xyzw
1117 )";
1118 
1119 const char *vs_nexted_loop_from_nir_expect_opt =
1120    R"(
1121 VS
1122 CHIPCLASS EVERGREEN
1123 INPUT LOC:0
1124 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
1125 OUTPUT LOC:1 VARYING_SLOT:1 MASK:15
1126 SYSVALUES R1.xyzw
1127 REGISTERS R2.x@free R3.x@free R4.x@free R5.x@free R6.x@free R7.x@free R8.x@free
1128 SHADER
1129 IF (( ALU PREDE_INT __.x@free : KC0[0].x I[1] {LEP} PUSH_BEFORE ))
1130   IF (( ALU PRED_SETNE_INT __.y@free : KC0[2].x I[1]  {LEP} PUSH_BEFORE ))
1131     ALU MOV R3.x : I[1] {WL}
1132     ALU MOV R2.x : I[0] {WL}
1133     LOOP_BEGIN
1134       ALU INT_TO_FLT R4.x : R2.x {WL}
1135       IF (( ALU PRED_SETNE_INT __.z@free : KC0[1].x L[0x2] {LEP} PUSH_BEFORE ))
1136         BREAK
1137       ENDIF
1138       ALU ADD_INT R5.x : R3.x I[1] {WL}
1139       ALU MOV R2.x : R3.x {WL}
1140       ALU MOV R3.x : R5.x {WL}
1141     LOOP_END
1142     ALU MOV R8.x : I[1.0] {WL}
1143     ALU MOV R7.x : I[1.0] {WL}
1144     ALU MOV R6.x : I[-1] {WL}
1145   ELSE
1146     ALU MOV R8.x : I[1.0] {WL}
1147     ALU MOV R7.x : I[0] {WL}
1148     ALU MOV R4.x : I[1.0] {WL}
1149     ALU MOV R6.x : I[0] {WL}
1150   ENDIF
1151 ELSE
1152   ALU MOV R8.x : I[1.0] {WL}
1153   ALU MOV R7.x : I[0] {WL}
1154   ALU MOV R4.x : I[1.0] {WL}
1155   ALU MOV R6.x : I[-1] {WL}
1156 ENDIF
1157 ALU CNDE_INT S27.x@free : R6.x I[1.0] R4.x {WL}
1158 ALU CNDE_INT S28.x@free : R6.x I[1.0] R7.x {WL}
1159 ALU CNDE_INT S29.x@free : R6.x I[1.0] R8.x {WL}
1160 EXPORT_DONE POS 0 R1.xyzw
1161 ALU MOV CLAMP S34.x@group : S27.x@free {W}
1162 ALU MOV CLAMP S34.y@group : S28.x@free {W}
1163 ALU MOV CLAMP S34.w@group : S29.x@free {WL}
1164 EXPORT_DONE PARAM 0 S34.xy0w
1165 )";
1166 
1167 const char *shader_with_local_array_nir =
1168    R"(
1169 shader: MESA_SHADER_FRAGMENT
1170 name: GLSL3
1171 inputs: 2
1172 outputs: 1
1173 uniforms: 2
1174 shared: 0
1175 decl_var uniform INTERP_MODE_NONE int index (1, 0, 0)
1176 decl_var uniform INTERP_MODE_NONE float expect (2, 1, 0)
1177 decl_function main (0 params)
1178 
1179 impl main {
1180 	decl_var  INTERP_MODE_NONE float[4] m1
1181 	decl_var  INTERP_MODE_NONE float[4] m2
1182 	decl_var  INTERP_MODE_NONE vec4 in@packed:m1[0],m1[1],m1[2],m1[3]-temp
1183 	decl_var  INTERP_MODE_NONE vec4 in@packed:m2[0],m2[1],m2[2],m2[3]-temp
1184 	decl_var  INTERP_MODE_NONE vec4 out@gl_FragColor-temp
1185 	decl_reg vec1 32 r0[4]
1186 	decl_reg vec1 32 r1[4]
1187 	decl_reg vec1 32 r2
1188 	block block_0:
1189 	/* preds: */
1190 	vec2 32 ssa_0 = intrinsic load_barycentric_pixel () (0) /* interp_mode=0 */
1191 	vec1 32 ssa_1 = load_const (0x00000000 /* 0.000000 */)
1192 	vec4 32 ssa_2 = intrinsic load_interpolated_input (ssa_0, ssa_1) (0, 0, 160, 160) /* base=0 */ /* component=0 */ /* location=32 slots=1 */
1193 	vec4 32 ssa_3 = intrinsic load_interpolated_input (ssa_0, ssa_1) (1, 0, 160, 161) /* base=1 */ /* component=0 */ /* location=33 slots=1 */
1194 	vec1 32 ssa_4 = load_const (0x00000004 /* 0.000000 */)
1195 	vec1 32 ssa_5 = load_const (0xfffffffc /* -nan */)
1196 	vec4 32 ssa_6 = load_const (0x00000000 /* 0.000000 */, 0x3f800000 /* 1.000000 */, 0x00000000 /* 0.000000 */, 0x3f800000 /* 1.000000 */)
1197 	vec4 32 ssa_7 = load_const (0x3f800000 /* 1.000000 */, 0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x3f800000 /* 1.000000 */)
1198 	vec1 32 ssa_8 = mov ssa_2.x
1199 	r0[0] = mov ssa_8
1200 	vec1 32 ssa_9 = mov ssa_2.y
1201 	r0[1] = mov ssa_9
1202 	vec1 32 ssa_10 = mov ssa_2.z
1203 	r0[2] = mov ssa_10
1204 	vec1 32 ssa_11 = mov ssa_2.w
1205 	r0[3] = mov ssa_11
1206 	vec1 32 ssa_12 = mov ssa_3.x
1207 	r1[0] = mov ssa_12
1208 	vec1 32 ssa_13 = mov ssa_3.y
1209 	r1[1] = mov ssa_13
1210 	vec1 32 ssa_14 = mov ssa_3.z
1211 	r1[2] = mov ssa_14
1212 	vec1 32 ssa_15 = mov ssa_3.w
1213 	r1[3] = mov ssa_15
1214 	vec1 32 ssa_16 = intrinsic load_uniform (ssa_1) (0, 1, 34) /* base=0 */ /* range=1 */ /* dest_type=int32 */	/* index */
1215 	vec1 32 ssa_17 = ige32 ssa_16, ssa_4
1216 	/* succs: block_1 block_2 */
1217 	if ssa_17 {
1218 		block block_1:
1219 		/* preds: block_0 */
1220 		vec1 32 ssa_18 = iadd ssa_16, ssa_5
1221 		vec1 32 ssa_19 = load_const (0x00000000 /* 0.000000 */)
1222 		vec1 32 ssa_20 = iadd ssa_19, ssa_18
1223 		r2 = mov r1[0 + ssa_20]
1224 		/* succs: block_3 */
1225 	} else {
1226 		block block_2:
1227 		/* preds: block_0 */
1228 		vec1 32 ssa_21 = load_const (0x00000000 /* 0.000000 */)
1229 		vec1 32 ssa_22 = iadd ssa_21, ssa_16
1230 		r2 = mov r0[0 + ssa_22]
1231 		/* succs: block_3 */
1232 	}
1233 	block block_3:
1234 	/* preds: block_1 block_2 */
1235 	vec1 32 ssa_23 = intrinsic load_uniform (ssa_1) (1, 1, 160) /* base=1 */ /* range=1 */ /* dest_type=float32 */	/* expect */
1236 	vec1 32 ssa_24 = feq32 r2, ssa_23
1237 	vec1 32 ssa_25 = fneu32 r2, ssa_23
1238 	vec1 32 ssa_26 = b2f32 ssa_25
1239 	vec1 32 ssa_27 = b2f32 ssa_24
1240 	vec2 32 ssa_28 = b32csel ssa_24.xx, ssa_6.zw, ssa_7.zw
1241 	vec4 32 ssa_29 = vec4 ssa_26, ssa_27, ssa_28.x, ssa_28.y
1242 	intrinsic store_output (ssa_29, ssa_1) (0, 15, 0, 160, 130) /* base=0 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=2 slots=1 */
1243 	/* succs: block_4 */
1244 	block block_4:
1245 }
1246 )";
1247 
1248 const char *shader_with_local_array_expect =
1249    R"(FS
1250 CHIPCLASS EVERGREEN
1251 CHIPCLASS EVERGREEN
1252 PROP MAX_COLOR_EXPORTS:1
1253 PROP COLOR_EXPORTS:1
1254 PROP COLOR_EXPORT_MASK:15
1255 PROP WRITE_ALL_COLORS:1
1256 #PROP RAT_BASE:1
1257 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
1258 INPUT LOC:1 VARYING_SLOT:33 INTERP:2
1259 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
1260 REGISTERS R0.x@fully R0.y@fully R1.x
1261 ARRAYS A1[4].x A1[4].y
1262 SHADER
1263 ALU MOV S6.x@free : I[0] {WL}
1264 ALU_GROUP_BEGIN
1265   ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
1266   ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
1267   ALU INTERP_ZW S7.z@chan : R0.y@fully Param0.z {W} VEC_210
1268   ALU INTERP_ZW S7.w@chan : R0.x@fully Param0.w {WL} VEC_210
1269 ALU_GROUP_END
1270 ALU_GROUP_BEGIN
1271   ALU INTERP_XY S7.x@chan : R0.y@fully Param0.x {W} VEC_210
1272   ALU INTERP_XY S7.y@chan : R0.x@fully Param0.y {W} VEC_210
1273   ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
1274   ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
1275 ALU_GROUP_END
1276 ALU_GROUP_BEGIN
1277   ALU INTERP_ZW __.x@chan : R0.y@fully Param1.x {} VEC_210
1278   ALU INTERP_ZW __.y@chan : R0.x@fully Param1.y {} VEC_210
1279   ALU INTERP_ZW S8.z@chan : R0.y@fully Param1.z {W} VEC_210
1280   ALU INTERP_ZW S8.w@chan : R0.x@fully Param1.w {WL} VEC_210
1281 ALU_GROUP_END
1282 ALU_GROUP_BEGIN
1283   ALU INTERP_XY S8.x@chan : R0.y@fully Param1.x {W} VEC_210
1284   ALU INTERP_XY S8.y@chan : R0.x@fully Param1.y {W} VEC_210
1285   ALU INTERP_XY __.z@chan : R0.y@fully Param1.z {} VEC_210
1286   ALU INTERP_XY __.w@chan : R0.x@fully Param1.w {L} VEC_210
1287 ALU_GROUP_END
1288 ALU MOV S9.x@free : L[0x4] {WL}
1289 ALU MOV S10.x@free : L[0xfffffffc] {WL}
1290 ALU MOV S11.x : I[0] {W}
1291 ALU MOV S11.y : I[1.0] {W}
1292 ALU MOV S11.z : I[0] {W}
1293 ALU MOV S11.w : I[1.0] {WL}
1294 ALU MOV S12.x : I[1.0] {W}
1295 ALU MOV S12.y : I[0] {W}
1296 ALU MOV S12.z : I[0] {W}
1297 ALU MOV S12.w : I[1.0] {WL}
1298 ALU MOV S13.x@free : S7.x@chan {WL}
1299 ALU MOV A1[0].x : S13.x@free {WL}
1300 ALU MOV S14.x@free : S7.y@chan {WL}
1301 ALU MOV A1[1].x : S14.x@free {WL}
1302 ALU MOV S15.x@free : S7.z@chan {WL}
1303 ALU MOV A1[2].x : S15.x@free {WL}
1304 ALU MOV S16.x@free : S7.w@chan {WL}
1305 ALU MOV A1[3].x : S16.x@free {WL}
1306 ALU MOV S17.x@free : S8.x@chan {WL}
1307 ALU MOV A1[0].y : S17.x@free {WL}
1308 ALU MOV S18.x@free : S8.y@chan {WL}
1309 ALU MOV A1[1].y : S18.x@free {WL}
1310 ALU MOV S19.x@free : S8.z@chan {WL}
1311 ALU MOV A1[2].y : S19.x@free {WL}
1312 ALU MOV S20.x@free : S8.w@chan {WL}
1313 ALU MOV A1[3].y : S20.x@free {WL}
1314 ALU MOV S21.x@free : KC0[0].x {WL}
1315 ALU SETGE_INT S22.x@free : S21.x@free S9.x@free {WL}
1316 IF (( ALU PRED_SETNE_INT __.x@free : S22.x@free I[0] {LEP} PUSH_BEFORE ))
1317   ALU ADD_INT S24.x@free : S21.x@free S10.x@free {WL}
1318   ALU MOV S25.x@free : I[0] {WL}
1319   ALU ADD_INT S26.x@free : S25.x@free S24.x@free {WL}
1320   ALU MOV R5.x@free : A1[S26.x@free].y {WL}
1321 ELSE
1322   ALU MOV S27.x@free : I[0] {WL}
1323   ALU ADD_INT S28.x@free : S27.x@free S21.x@free {WL}
1324   ALU MOV R5.x@free : A1[S28.x@free].x {WL}
1325 ENDIF
1326 ALU MOV S29.x@free : KC0[1].x {WL}
1327 ALU SETE_DX10 S30.x@free : R5.x@free S29.x@free {WL}
1328 ALU SETNE_DX10 S31.x@free : R5.x@free S29.x@free {WL}
1329 ALU AND_INT S32.x@free : S31.x@free I[1.0] {WL}
1330 ALU AND_INT S33.x@free : S30.x@free I[1.0] {WL}
1331 ALU CNDE_INT S34.x : S30.x@free S12.z S11.z {W}
1332 ALU CNDE_INT S34.y : S30.x@free S12.w S11.w {WL}
1333 ALU MOV S35.x@group : S32.x@free {W}
1334 ALU MOV S35.y@group : S33.x@free {W}
1335 ALU MOV S35.z@group : S34.x {W}
1336 ALU MOV S35.w@group : S34.y {WL}
1337 EXPORT_DONE PIXEL 0 S35.xyzw)";
1338 
1339 const char *test_schedule_group =
1340    R"(FS
1341 CHIPCLASS EVERGREEN
1342 PROP MAX_COLOR_EXPORTS:1
1343 PROP COLOR_EXPORTS:1
1344 PROP COLOR_EXPORT_MASK:15
1345 PROP WRITE_ALL_COLORS:1
1346 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
1347 SHADER
1348 ALU MOV S0.x : I[0] {WL}
1349 ALU MOV S1.x : I[1.0] {WL}
1350 ALU MOV S2.x : KC0[0].x {W}
1351 ALU MOV S2.y : KC0[0].y {WL}
1352 ALU MOV S3.x : KC0[2].x {W}
1353 ALU MOV S3.y : KC0[2].y {WL}
1354 ALU ADD S4.x : |S2.x| -S3.x {W}
1355 ALU ADD S4.y : |S2.y| -S3.y {WL}
1356 ALU DOT4_IEEE S5.x : S4.x S4.x + S4.y S4.y + I[0] I[0] + I[0] I[0] {WL}
1357 ALU SQRT_IEEE S6.x : S5.x {WL}
1358 ALU MOV S7.x : KC0[1].x {WL}
1359 ALU SETGE_DX10 S8.x : S7.x S6.x {WL}
1360 ALU NOT_INT S9.x : S8.x {WL}
1361 ALU AND_INT S10.x : S9.x I[1.0] {WL}
1362 ALU AND_INT S11.x : S8.x I[1.0] {WL}
1363 ALU MOV S12.x@group : S10.x {W}
1364 ALU MOV S12.y@group : S11.x {W}
1365 ALU MOV S12.z@group : S0.x {W}
1366 ALU MOV S12.w@group : S1.x {WL}
1367 EXPORT_DONE PIXEL 0 S12.xyzw
1368 )";
1369 
1370 const char *test_schedule_group_expect =
1371    R"(FS
1372 CHIPCLASS EVERGREEN
1373 PROP MAX_COLOR_EXPORTS:1
1374 PROP COLOR_EXPORTS:1
1375 PROP COLOR_EXPORT_MASK:15
1376 PROP WRITE_ALL_COLORS:1
1377 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
1378 SHADER
1379 BLOCK_START
1380 ALU_GROUP_BEGIN
1381   ALU ADD S4.x@chan : |KC0[0].x| -KC0[2].x {W}
1382   ALU ADD S4.y@chan : |KC0[0].y| -KC0[2].y {WL}
1383 ALU_GROUP_END
1384 ALU_GROUP_BEGIN
1385   ALU DOT4_IEEE S5.x@chan : S4.x@chan S4.x@chan {W}
1386   ALU DOT4_IEEE __.y@chan : S4.y@chan S4.y@chan {}
1387   ALU DOT4_IEEE __.z@chan : I[0] I[0] {}
1388   ALU DOT4_IEEE __.w@chan : I[0] I[0] {L}
1389 ALU_GROUP_END
1390 ALU_GROUP_BEGIN
1391   ALU SQRT_IEEE S6.x : S5.x@chan {WL}
1392 ALU_GROUP_END
1393 ALU_GROUP_BEGIN
1394   ALU SETGE_DX10 S8.x : KC0[1].x S6.x {WL}
1395 ALU_GROUP_END
1396 ALU_GROUP_BEGIN
1397   ALU NOT_INT S9.x : S8.x {W}
1398   ALU AND_INT S12.y@group : S8.x I[1.0] {WL}
1399 ALU_GROUP_END
1400 ALU_GROUP_BEGIN
1401   ALU AND_INT S12.x@group : S9.x I[1.0] {WL}
1402 ALU_GROUP_END
1403 BLOCK_END
1404 BLOCK_START
1405 EXPORT_DONE PIXEL 0 S12.xy01
1406 BLOCK_END
1407 )";
1408 
1409 const char *shader_with_bany_nir =
1410    R"(shader: MESA_SHADER_FRAGMENT
1411 source_sha1: {0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000}
1412 name: GLSL3
1413 inputs: 0
1414 outputs: 1
1415 uniforms: 8
1416 shared: 0
1417 ray queries: 0
1418 decl_var uniform INTERP_MODE_NONE mat4 arg0 (0, 0, 0)
1419 decl_var uniform INTERP_MODE_NONE mat4 arg1 (1, 4, 0)
1420 decl_function main (0 params)
1421 
1422 impl main {
1423 	decl_var  INTERP_MODE_NONE vec4 out@gl_FragColor-temp
1424 	block block_0:
1425 	/* preds: */
1426 	vec1 32 ssa_0 = load_const (0x00000000 /* 0.000000 */)
1427 	vec1 32 ssa_1 = load_const (0x00000001 /* 0.000000 */)
1428 	vec1 32 ssa_2 = load_const (0x00000002 /* 0.000000 */)
1429 	vec1 32 ssa_3 = load_const (0x00000003 /* 0.000000 */)
1430 	vec4 32 ssa_4 = intrinsic load_uniform (ssa_0) (4, 4, 160) /* base=4 */ /* range=4 */ /* dest_type=float32 */	/* arg1 */
1431 	vec4 32 ssa_5 = intrinsic load_uniform (ssa_0) (0, 4, 160) /* base=0 */ /* range=4 */ /* dest_type=float32 */	/* arg0 */
1432 	vec1 32 ssa_6 = b32any_fnequal4 ssa_4, ssa_5
1433 	vec4 32 ssa_7 = intrinsic load_uniform (ssa_1) (4, 4, 160) /* base=4 */ /* range=4 */ /* dest_type=float32 */	/* arg1 */
1434 	vec4 32 ssa_8 = intrinsic load_uniform (ssa_1) (0, 4, 160) /* base=0 */ /* range=4 */ /* dest_type=float32 */	/* arg0 */
1435 	vec1 32 ssa_9 = b32any_fnequal4 ssa_7, ssa_8
1436 	vec4 32 ssa_10 = intrinsic load_uniform (ssa_2) (4, 4, 160) /* base=4 */ /* range=4 */ /* dest_type=float32 */	/* arg1 */
1437 	vec4 32 ssa_11 = intrinsic load_uniform (ssa_2) (0, 4, 160) /* base=0 */ /* range=4 */ /* dest_type=float32 */	/* arg0 */
1438 	vec1 32 ssa_12 = b32any_fnequal4 ssa_10, ssa_11
1439 	vec4 32 ssa_13 = intrinsic load_uniform (ssa_3) (4, 4, 160) /* base=4 */ /* range=4 */ /* dest_type=float32 */	/* arg1 */
1440 	vec4 32 ssa_14 = intrinsic load_uniform (ssa_3) (0, 4, 160) /* base=0 */ /* range=4 */ /* dest_type=float32 */	/* arg0 */
1441 	vec1 32 ssa_15 = b32any_fnequal4 ssa_13, ssa_14
1442 	vec4 32 ssa_16 = vec4 ssa_6, ssa_9, ssa_12, ssa_15
1443 	vec4 32 ssa_17 = load_const (0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */, 0x00000000 /* 0.000000 */)
1444 	vec1 32 ssa_18 = b32any_inequal4 ssa_16, ssa_17
1445 	vec1 32 ssa_19 = inot ssa_18
1446 	vec1 32 ssa_20 = b2f32 ssa_19
1447 	vec4 32 ssa_21 = vec4 ssa_20, ssa_0, ssa_0, ssa_0
1448 	intrinsic store_output (ssa_21, ssa_0) (0, 15, 0, 160, 130) /* base=0 */ /* wrmask=xyzw */ /* component=0 */ /* src_type=float32 */ /* location=2 slots=1 */
1449 	/* succs: block_1 */
1450 	block block_1:
1451 })";
1452 
1453 const char *shader_with_bany_expect_eg =
1454    R"(FS
1455 CHIPCLASS EVERGREEN
1456 PROP MAX_COLOR_EXPORTS:1
1457 PROP COLOR_EXPORTS:1
1458 PROP COLOR_EXPORT_MASK:15
1459 PROP WRITE_ALL_COLORS:1
1460 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
1461 SHADER
1462 ALU MOV S0.x@free : I[0] {WL}
1463 ALU MOV S1.x@free : I[1] {WL}
1464 ALU MOV S2.x@free : L[0x2] {WL}
1465 ALU MOV S3.x@free : L[0x3] {WL}
1466 ALU MOV S4.x : KC0[4].x {W}
1467 ALU MOV S4.y : KC0[4].y {W}
1468 ALU MOV S4.z : KC0[4].z {W}
1469 ALU MOV S4.w : KC0[4].w {WL}
1470 ALU MOV S5.x : KC0[0].x {W}
1471 ALU MOV S5.y : KC0[0].y {W}
1472 ALU MOV S5.z : KC0[0].z {W}
1473 ALU MOV S5.w : KC0[0].w {WL}
1474 ALU SETNE S6.x@group : S4.x S5.x {W}
1475 ALU SETNE S6.y@group : S4.y S5.y {W}
1476 ALU SETNE S6.z@group : S4.z S5.z {W}
1477 ALU SETNE S6.w@group : S4.w S5.w {WL}
1478 ALU MAX4 S7.x@free : S6.x@group + S6.y@group + S6.z@group + S6.w@group {WL}
1479 ALU SETE_DX10 S8.x@free : S7.x@free I[1.0] {WL}
1480 ALU MOV S9.x : KC0[5].x {W}
1481 ALU MOV S9.y : KC0[5].y {W}
1482 ALU MOV S9.z : KC0[5].z {W}
1483 ALU MOV S9.w : KC0[5].w {WL}
1484 ALU MOV S10.x : KC0[1].x {W}
1485 ALU MOV S10.y : KC0[1].y {W}
1486 ALU MOV S10.z : KC0[1].z {W}
1487 ALU MOV S10.w : KC0[1].w {WL}
1488 ALU SETNE S11.x@group : S9.x S10.x {W}
1489 ALU SETNE S11.y@group : S9.y S10.y {W}
1490 ALU SETNE S11.z@group : S9.z S10.z {W}
1491 ALU SETNE S11.w@group : S9.w S10.w {WL}
1492 ALU MAX4 S12.y@free : S11.x@group + S11.y@group + S11.z@group + S11.w@group {WL}
1493 ALU SETE_DX10 S13.x@free : S12.y@free I[1.0] {WL}
1494 ALU MOV S14.x : KC0[6].x {W}
1495 ALU MOV S14.y : KC0[6].y {W}
1496 ALU MOV S14.z : KC0[6].z {W}
1497 ALU MOV S14.w : KC0[6].w {WL}
1498 ALU MOV S15.x : KC0[2].x {W}
1499 ALU MOV S15.y : KC0[2].y {W}
1500 ALU MOV S15.z : KC0[2].z {W}
1501 ALU MOV S15.w : KC0[2].w {WL}
1502 ALU SETNE S16.x@group : S14.x S15.x {W}
1503 ALU SETNE S16.y@group : S14.y S15.y {W}
1504 ALU SETNE S16.z@group : S14.z S15.z {W}
1505 ALU SETNE S16.w@group : S14.w S15.w {WL}
1506 ALU MAX4 S17.z@free : S16.x@group + S16.y@group + S16.z@group + S16.w@group {WL}
1507 ALU SETE_DX10 S18.x@free : S17.z@free I[1.0] {WL}
1508 ALU MOV S19.x : KC0[7].x {W}
1509 ALU MOV S19.y : KC0[7].y {W}
1510 ALU MOV S19.z : KC0[7].z {W}
1511 ALU MOV S19.w : KC0[7].w {WL}
1512 ALU MOV S20.x : KC0[3].x {W}
1513 ALU MOV S20.y : KC0[3].y {W}
1514 ALU MOV S20.z : KC0[3].z {W}
1515 ALU MOV S20.w : KC0[3].w {WL}
1516 ALU SETNE S21.x@group : S19.x S20.x {W}
1517 ALU SETNE S21.y@group : S19.y S20.y {W}
1518 ALU SETNE S21.z@group : S19.z S20.z {W}
1519 ALU SETNE S21.w@group : S19.w S20.w {WL}
1520 ALU MAX4 S22.w@free : S21.x@group + S21.y@group + S21.z@group + S21.w@group {WL}
1521 ALU SETE_DX10 S23.x@free : S22.w@free I[1.0] {WL}
1522 ALU MOV S24.x : S8.x@free {W}
1523 ALU MOV S24.y : S13.x@free {W}
1524 ALU MOV S24.z : S18.x@free {W}
1525 ALU MOV S24.w : S23.x@free {WL}
1526 ALU MOV S25.x : I[0] {W}
1527 ALU MOV S25.y : I[0] {W}
1528 ALU MOV S25.z : I[0] {W}
1529 ALU MOV S25.w : I[0] {WL}
1530 ALU SETNE_INT S27.x@free : S24.x S25.x {W}
1531 ALU SETNE_INT S28.y@free : S24.y S25.y {W}
1532 ALU SETNE_INT S29.z@free : S24.z S25.z {W}
1533 ALU SETNE_INT S30.w@free : S24.w S25.w {WL}
1534 ALU OR_INT S31.x@free : S27.x@free S28.y@free {W}
1535 ALU OR_INT S32.y@free : S29.z@free S30.w@free {WL}
1536 ALU OR_INT S26.x@free : S31.x@free S32.y@free {WL}
1537 ALU NOT_INT S33.x@free : S26.x@free {WL}
1538 ALU AND_INT S34.x@free : S33.x@free I[1.0] {WL}
1539 ALU MOV S35.x@group : S34.x@free {W}
1540 ALU MOV S35.y@group : S0.x@free {W}
1541 ALU MOV S35.z@group : S0.x@free {W}
1542 ALU MOV S35.w@group : S0.x@free {WL}
1543 EXPORT_DONE PIXEL 0 S35.xyzw
1544 )";
1545 
1546 const char *shader_with_bany_expect_opt_sched_eg =
1547    R"(FS
1548 CHIPCLASS EVERGREEN
1549 PROP MAX_COLOR_EXPORTS:1
1550 PROP COLOR_EXPORTS:1
1551 PROP COLOR_EXPORT_MASK:15
1552 PROP WRITE_ALL_COLORS:1
1553 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
1554 SHADER
1555 BLOCK_START
1556 ALU_GROUP_BEGIN
1557   ALU SETNE S6.x@chgr : KC0[4].x KC0[0].x {W}
1558   ALU SETNE S6.y@chgr : KC0[4].y KC0[0].y {WL}
1559 ALU_GROUP_END
1560 ALU_GROUP_BEGIN
1561   ALU SETNE S6.z@chgr : KC0[4].z KC0[0].z {W}
1562   ALU SETNE S6.w@chgr : KC0[4].w KC0[0].w {WL}
1563 ALU_GROUP_END
1564 ALU_GROUP_BEGIN
1565   ALU MAX4 S7.x@chan : S6.x@chgr {W}
1566   ALU MAX4 __.y@chan : S6.y@chgr {}
1567   ALU MAX4 __.z@chan : S6.z@chgr {}
1568   ALU MAX4 __.w@chan : S6.w@chgr {}
1569   ALU SETNE S11.x@chgr : KC0[5].x KC0[1].x {WL}
1570 ALU_GROUP_END
1571 ALU_GROUP_BEGIN
1572   ALU SETE_DX10 S8.x@free : S7.x@chan I[1.0] {W}
1573   ALU SETNE S11.y@chgr : KC0[5].y KC0[1].y {WL}
1574 ALU_GROUP_END
1575 ALU_GROUP_BEGIN
1576   ALU SETNE_INT S27.x@chan : S8.x@free I[0] {W}
1577   ALU SETNE S11.z@chgr : KC0[5].z KC0[1].z {W}
1578   ALU SETNE S11.w@chgr : KC0[5].w KC0[1].w {WL}
1579 ALU_GROUP_END
1580 ALU_GROUP_BEGIN
1581   ALU MAX4 __.x@chan : S11.x@chgr {}
1582   ALU MAX4 S12.y@chan : S11.y@chgr {W}
1583   ALU MAX4 __.z@chan : S11.z@chgr {}
1584   ALU MAX4 __.w@chan : S11.w@chgr {}
1585   ALU SETNE S16.x@chgr : KC0[6].x KC0[2].x {WL}
1586 ALU_GROUP_END
1587 ALU_GROUP_BEGIN
1588   ALU SETE_DX10 S13.x@free : S12.y@chan I[1.0] {W}
1589   ALU SETNE S16.y@chgr : KC0[6].y KC0[2].y {WL}
1590 ALU_GROUP_END
1591 ALU_GROUP_BEGIN
1592   ALU SETNE_INT S28.y@chan : S13.x@free I[0] {W}
1593   ALU SETNE S16.z@chgr : KC0[6].z KC0[2].z {W}
1594   ALU SETNE S16.w@chgr : KC0[6].w KC0[2].w {WL}
1595 ALU_GROUP_END
1596 ALU_GROUP_BEGIN
1597   ALU MAX4 __.x@chan : S16.x@chgr {}
1598   ALU MAX4 __.y@chan : S16.y@chgr {}
1599   ALU MAX4 S17.z@chan : S16.z@chgr {W}
1600   ALU MAX4 __.w@chan : S16.w@chgr {}
1601   ALU SETNE S21.x@chgr : KC0[7].x KC0[3].x {WL}
1602 ALU_GROUP_END
1603 ALU_GROUP_BEGIN
1604   ALU OR_INT S31.x@chan : S27.x@chan S28.y@chan {W}
1605   ALU SETNE S21.y@chgr : KC0[7].y KC0[3].y {W}
1606   ALU SETE_DX10 S18.z@chan : S17.z@chan I[1.0] {WL}
1607 ALU_GROUP_END
1608 ALU_GROUP_BEGIN
1609   ALU SETNE_INT S29.x@chan : S18.z@chan I[0] {W}
1610   ALU SETNE S21.z@chgr : KC0[7].z KC0[3].z {W}
1611   ALU SETNE S21.w@chgr : KC0[7].w KC0[3].w {WL}
1612 ALU_GROUP_END
1613 ALU_GROUP_BEGIN
1614   ALU MAX4 __.x@chan : S21.x@chgr {}
1615   ALU MAX4 __.y@chan : S21.y@chgr {}
1616   ALU MAX4 __.z@chan : S21.z@chgr {}
1617   ALU MAX4 S22.w@chan : S21.w@chgr {WL}
1618 ALU_GROUP_END
1619 ALU_GROUP_BEGIN
1620   ALU SETE_DX10 S23.x@free : S22.w@chan I[1.0] {WL}
1621 ALU_GROUP_END
1622 ALU_GROUP_BEGIN
1623   ALU SETNE_INT S30.w@chan : S23.x@free I[0] {WL}
1624 ALU_GROUP_END
1625 ALU_GROUP_BEGIN
1626   ALU OR_INT S32.y@chan : S29.x@chan S30.w@chan {WL}
1627 ALU_GROUP_END
1628 ALU_GROUP_BEGIN
1629   ALU OR_INT S26.x@chan : S31.x@chan S32.y@chan {WL}
1630 ALU_GROUP_END
1631 ALU_GROUP_BEGIN
1632   ALU NOT_INT S33.x@free : S26.x@chan {WL}
1633 ALU_GROUP_END
1634 ALU_GROUP_BEGIN
1635   ALU AND_INT S35.x@group : S33.x@free I[1.0] {WL}
1636 ALU_GROUP_END
1637 BLOCK_END
1638 BLOCK_START
1639 EXPORT_DONE PIXEL 0 S35.x000
1640 BLOCK_END
1641 )";
1642 
1643 const char *shader_copy_prop_dont_kill_double_use =
1644    R"(FS
1645 CHIPCLASS EVERGREEN
1646 PROP MAX_COLOR_EXPORTS:1
1647 PROP COLOR_EXPORTS:1
1648 PROP COLOR_EXPORT_MASK:15
1649 PROP WRITE_ALL_COLORS:1
1650 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
1651 SHADER
1652 ALU MOV S0.x : I[0] {WL}
1653 ALU MOV S1.x : I[1] {WL}
1654 ALU MOV S2.x : I[1.0] {WL}
1655 ALU MOV S3.x : KC0[2].x {W}
1656 ALU MOV S3.y : KC0[2].y {WL}
1657 ALU MOV S4.x : KC0[0].x {W}
1658 ALU MOV S4.y : KC0[0].y {WL}
1659 ALU SETNE_DX10 S5.x : S3.y S4.y {W}
1660 ALU SETNE_DX10 S5.y : S3.x S4.x {WL}
1661 ALU OR_INT S6.x : S5.x S5.y {WL}
1662 ALU MOV S7.x : KC0[3].x {W}
1663 ALU MOV S7.y : KC0[3].y {WL}
1664 ALU MOV S8.x : KC0[1].x {W}
1665 ALU MOV S8.y : KC0[1].y {WL}
1666 ALU SETNE_DX10 S9.x : S7.y S8.y {W}
1667 ALU SETNE_DX10 S9.y : S7.x S8.x {WL}
1668 ALU OR_INT S10.x : S9.x S9.y {WL}
1669 ALU OR_INT S11.x : S10.x S6.x {WL}
1670 ALU NOT_INT S12.x : S11.x {WL}
1671 ALU AND_INT S13.x : S12.x I[1.0] {WL}
1672 ALU AND_INT S14.x : S11.x I[1.0] {WL}
1673 ALU MOV S15.x@group : S13.x {W}
1674 ALU MOV S15.y@group : S13.x {W}
1675 ALU MOV S15.z@group : S14.x {W}
1676 ALU MOV S15.w@group : S2.x {WL}
1677 EXPORT_DONE PIXEL 0 S15.xyzw
1678 )";
1679 
1680 const char *shader_copy_prop_dont_kill_double_use_expect =
1681    R"(
1682 FS
1683 CHIPCLASS EVERGREEN
1684 PROP MAX_COLOR_EXPORTS:1
1685 PROP COLOR_EXPORTS:1
1686 PROP COLOR_EXPORT_MASK:15
1687 PROP WRITE_ALL_COLORS:1
1688 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
1689 SHADER
1690 BLOCK_START
1691 ALU_GROUP_BEGIN
1692   ALU SETNE_DX10 S5.x : KC0[2].y KC0[0].y {W}
1693   ALU SETNE_DX10 S5.y : KC0[2].x KC0[0].x {WL}
1694 ALU_GROUP_END
1695 ALU_GROUP_BEGIN
1696   ALU SETNE_DX10 S9.x : KC0[3].y KC0[1].y {W}
1697   ALU SETNE_DX10 S9.y : KC0[3].x KC0[1].x {W}
1698   ALU OR_INT S6.x : S5.x S5.y {WL}
1699 ALU_GROUP_END
1700 ALU_GROUP_BEGIN
1701   ALU OR_INT S10.x : S9.x S9.y {WL}
1702 ALU_GROUP_END
1703 ALU_GROUP_BEGIN
1704   ALU OR_INT S11.x : S10.x S6.x {WL}
1705 ALU_GROUP_END
1706 ALU_GROUP_BEGIN
1707   ALU NOT_INT S12.x : S11.x {W}
1708   ALU AND_INT S15.z@group : S11.x I[1.0] {WL}
1709 ALU_GROUP_END
1710 ALU_GROUP_BEGIN
1711   ALU AND_INT S13.x : S12.x I[1.0] {WL}
1712 ALU_GROUP_END
1713 ALU_GROUP_BEGIN
1714   ALU MOV S15.x@group : S13.x {W}
1715   ALU MOV S15.y@group : S13.x {WL}
1716 ALU_GROUP_END
1717 BLOCK_END
1718 BLOCK_START
1719 EXPORT_DONE PIXEL 0 S15.xyz1
1720 BLOCK_END
1721 )";
1722 
1723 const char *shader_with_dest_array =
1724    R"(VS
1725 CHIPCLASS EVERGREEN
1726 INPUT LOC:0
1727 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
1728 OUTPUT LOC:1 VARYING_SLOT:32 MASK:15
1729 OUTPUT LOC:2 VARYING_SLOT:33 MASK:15
1730 OUTPUT LOC:3 VARYING_SLOT:34 MASK:15
1731 OUTPUT LOC:4 VARYING_SLOT:35 MASK:15
1732 REGISTERS R1.xyzw
1733 ARRAYS A2[4].xy A2[4].zw
1734 SHADER
1735 ALU MOV S6.x : I[0] {WL}
1736 ALU MOV S7.x : I[1] {WL}
1737 ALU MOV S8.x : L[0x2] {WL}
1738 ALU MOV S9.x : L[0x3] {WL}
1739 ALU MOV S10.x : L[0x4] {WL}
1740 ALU MOV S11.x : L[0xfffffffc] {WL}
1741 ALU MOV S12.x : KC0[1].x {W}
1742 ALU MOV S12.y : KC0[1].y {W}
1743 ALU MOV S12.z : KC0[1].z {W}
1744 ALU MOV S12.w : KC0[1].w {WL}
1745 ALU MOV S13.x : KC0[2].x {W}
1746 ALU MOV S13.y : KC0[2].y {W}
1747 ALU MOV S13.z : KC0[2].z {W}
1748 ALU MOV S13.w : KC0[2].w {WL}
1749 ALU MUL_IEEE S14.x : S13.x R1.y@fully {W}
1750 ALU MUL_IEEE S14.y : S13.y R1.y@fully {W}
1751 ALU MUL_IEEE S14.z : S13.z R1.y@fully {W}
1752 ALU MUL_IEEE S14.w : S13.w R1.y@fully {WL}
1753 ALU MULADD_IEEE S15.x : S12.x R1.x@fully S14.x {W}
1754 ALU MULADD_IEEE S15.y : S12.y R1.x@fully S14.y {W}
1755 ALU MULADD_IEEE S15.z : S12.z R1.x@fully S14.z {W}
1756 ALU MULADD_IEEE S15.w : S12.w R1.x@fully S14.w {WL}
1757 ALU MOV S16.x : KC0[3].x {W}
1758 ALU MOV S16.y : KC0[3].y {W}
1759 ALU MOV S16.z : KC0[3].z {W}
1760 ALU MOV S16.w : KC0[3].w {WL}
1761 ALU MULADD_IEEE S17.x : S16.x R1.z@fully S15.x {W}
1762 ALU MULADD_IEEE S17.y : S16.y R1.z@fully S15.y {W}
1763 ALU MULADD_IEEE S17.z : S16.z R1.z@fully S15.z {W}
1764 ALU MULADD_IEEE S17.w : S16.w R1.z@fully S15.w {WL}
1765 ALU MOV S18.x : KC0[4].x {W}
1766 ALU MOV S18.y : KC0[4].y {W}
1767 ALU MOV S18.z : KC0[4].z {W}
1768 ALU MOV S18.w : KC0[4].w {WL}
1769 ALU MULADD_IEEE S19.x@group : S18.x R1.w@fully S17.x {W}
1770 ALU MULADD_IEEE S19.y@group : S18.y R1.w@fully S17.y {W}
1771 ALU MULADD_IEEE S19.z@group : S18.z R1.w@fully S17.z {W}
1772 ALU MULADD_IEEE S19.w@group : S18.w R1.w@fully S17.w {WL}
1773 ALU MOV S20.x : I[1.0] {W}
1774 ALU MOV S20.y : L[0x3f8ccccd] {WL}
1775 ALU MOV A2[0].x : S20.x {W}
1776 ALU MOV A2[0].y : S20.y {WL}
1777 ALU MOV S21.x : L[0x40000000] {W}
1778 ALU MOV S21.y : L[0x40066666] {WL}
1779 ALU MOV A2[1].x : S21.x {W}
1780 ALU MOV A2[1].y : S21.y {WL}
1781 ALU MOV S22.x : L[0x40400000] {W}
1782 ALU MOV S22.y : L[0x40466666] {WL}
1783 ALU MOV A2[2].x : S22.x {W}
1784 ALU MOV A2[2].y : S22.y {WL}
1785 ALU MOV S23.x : L[0x40800000] {W}
1786 ALU MOV S23.y : L[0x40833333] {WL}
1787 ALU MOV A2[3].x : S23.x {W}
1788 ALU MOV A2[3].y : S23.y {WL}
1789 ALU MOV S24.x : L[0x40a00000] {W}
1790 ALU MOV S24.y : L[0x40a33333] {WL}
1791 ALU MOV A2[0].z : S24.x {W}
1792 ALU MOV A2[0].w : S24.y {WL}
1793 ALU MOV S25.x : L[0x40c00000] {W}
1794 ALU MOV S25.y : L[0x40c33333] {WL}
1795 ALU MOV A2[1].z : S25.x {W}
1796 ALU MOV A2[1].w : S25.y {WL}
1797 ALU MOV S26.x : L[0x40e00000] {W}
1798 ALU MOV S26.y : L[0x40e33333] {WL}
1799 ALU MOV A2[2].z : S26.x {W}
1800 ALU MOV A2[2].w : S26.y {WL}
1801 ALU MOV S27.x : L[0x41000000] {W}
1802 ALU MOV S27.y : L[0x4101999a] {WL}
1803 ALU MOV A2[3].z : S27.x {W}
1804 ALU MOV A2[3].w : S27.y {WL}
1805 ALU MOV S28.x : KC0[0].x {WL}
1806 ALU SETGE_INT S29.x : S28.x S10.x {WL}
1807 IF (( ALU PRED_SETNE_INT __.x@free : S29.x I[0] {LEP} PUSH_BEFORE ))
1808   ALU ADD_INT S31.x : S28.x S11.x {WL}
1809   ALU MOV S32.x : I[0] {W}
1810   ALU MOV S32.y : L[0x3dcccccd] {WL}
1811   ALU MOV S33.x : I[0] {WL}
1812   ALU ADD_INT S34.x : S33.x S31.x {WL}
1813   ALU MOV A2[S34.x].z : S32.x {W}
1814   ALU MOV A2[S34.x].w : S32.y {WL}
1815 ELSE
1816   ALU MOV S35.x : I[0] {W}
1817   ALU MOV S35.y : L[0x3dcccccd] {WL}
1818   ALU MOV S36.x : I[0] {WL}
1819   ALU ADD_INT S37.x : S36.x S28.x {WL}
1820   ALU MOV A2[S37.x].x : S35.x {W}
1821   ALU MOV A2[S37.x].y : S35.y {WL}
1822 ENDIF
1823 ALU MOV S38.x : A2[0].x {W}
1824 ALU MOV S38.y : A2[0].y {WL}
1825 ALU MOV S39.x : A2[1].x {W}
1826 ALU MOV S39.y : A2[1].y {WL}
1827 ALU MOV S40.x : A2[2].x {W}
1828 ALU MOV S40.y : A2[2].y {WL}
1829 ALU MOV S41.x : A2[3].x {W}
1830 ALU MOV S41.y : A2[3].y {WL}
1831 ALU MOV S42.x : A2[0].z {W}
1832 ALU MOV S42.y : A2[0].w {WL}
1833 ALU MOV S43.x : A2[1].z {W}
1834 ALU MOV S43.y : A2[1].w {WL}
1835 ALU MOV S44.x : A2[2].z {W}
1836 ALU MOV S44.y : A2[2].w {WL}
1837 ALU MOV S45.x : A2[3].z {W}
1838 ALU MOV S45.y : A2[3].w {WL}
1839 EXPORT_DONE POS 0 S19.xyzw
1840 ALU MOV S46.x@group : S38.x {W}
1841 ALU MOV S46.y@group : S38.y {W}
1842 ALU MOV S46.z@group : S39.x {W}
1843 ALU MOV S46.w@group : S39.y {WL}
1844 EXPORT PARAM 0 S46.xyzw
1845 ALU MOV S47.x@group : S40.x {W}
1846 ALU MOV S47.y@group : S40.y {W}
1847 ALU MOV S47.z@group : S41.x {W}
1848 ALU MOV S47.w@group : S41.y {WL}
1849 EXPORT PARAM 1 S47.xyzw
1850 ALU MOV S48.x@group : S42.x {W}
1851 ALU MOV S48.y@group : S42.y {W}
1852 ALU MOV S48.z@group : S43.x {W}
1853 ALU MOV S48.w@group : S43.y {WL}
1854 EXPORT PARAM 2 S48.xyzw
1855 ALU MOV S49.x@group : S44.x {W}
1856 ALU MOV S49.y@group : S44.y {W}
1857 ALU MOV S49.z@group : S45.x {W}
1858 ALU MOV S49.w@group : S45.y {WL}
1859 EXPORT_DONE PARAM 3 S49.xyzw
1860 )";
1861 
1862 const char *shader_with_dest_array_opt_expect =
1863    R"(VS
1864 CHIPCLASS EVERGREEN
1865 INPUT LOC:0
1866 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
1867 OUTPUT LOC:1 VARYING_SLOT:32 MASK:15
1868 OUTPUT LOC:2 VARYING_SLOT:33 MASK:15
1869 OUTPUT LOC:3 VARYING_SLOT:34 MASK:15
1870 OUTPUT LOC:4 VARYING_SLOT:35 MASK:15
1871 REGISTERS R1.xyzw
1872 ARRAYS A2[4].xy A2[4].zw
1873 SHADER
1874 ALU MUL_IEEE S14.x : KC0[2].x R1.y@fully {W}
1875 ALU MUL_IEEE S14.y : KC0[2].y R1.y@fully {W}
1876 ALU MUL_IEEE S14.z : KC0[2].z R1.y@fully {W}
1877 ALU MUL_IEEE S14.w : KC0[2].w R1.y@fully {WL}
1878 ALU MULADD_IEEE S15.x : KC0[1].x R1.x@fully S14.x {W}
1879 ALU MULADD_IEEE S15.y : KC0[1].y R1.x@fully S14.y {W}
1880 ALU MULADD_IEEE S15.z : KC0[1].z R1.x@fully S14.z {W}
1881 ALU MULADD_IEEE S15.w : KC0[1].w R1.x@fully S14.w {WL}
1882 ALU MULADD_IEEE S17.x : KC0[3].x R1.z@fully S15.x {W}
1883 ALU MULADD_IEEE S17.y : KC0[3].y R1.z@fully S15.y {W}
1884 ALU MULADD_IEEE S17.z : KC0[3].z R1.z@fully S15.z {W}
1885 ALU MULADD_IEEE S17.w : KC0[3].w R1.z@fully S15.w {WL}
1886 ALU MULADD_IEEE S19.x@group : KC0[4].x R1.w@fully S17.x {W}
1887 ALU MULADD_IEEE S19.y@group : KC0[4].y R1.w@fully S17.y {W}
1888 ALU MULADD_IEEE S19.z@group : KC0[4].z R1.w@fully S17.z {W}
1889 ALU MULADD_IEEE S19.w@group : KC0[4].w R1.w@fully S17.w {WL}
1890 ALU MOV A2[0].x : I[1.0] {W}
1891 ALU MOV A2[0].y : L[0x3f8ccccd] {WL}
1892 ALU MOV A2[1].x : L[0x40000000] {W}
1893 ALU MOV A2[1].y : L[0x40066666] {WL}
1894 ALU MOV A2[2].x : L[0x40400000] {W}
1895 ALU MOV A2[2].y : L[0x40466666] {WL}
1896 ALU MOV A2[3].x : L[0x40800000] {W}
1897 ALU MOV A2[3].y : L[0x40833333] {WL}
1898 ALU MOV A2[0].z : L[0x40a00000] {W}
1899 ALU MOV A2[0].w : L[0x40a33333] {WL}
1900 ALU MOV A2[1].z : L[0x40c00000] {W}
1901 ALU MOV A2[1].w : L[0x40c33333] {WL}
1902 ALU MOV A2[2].z : L[0x40e00000] {W}
1903 ALU MOV A2[2].w : L[0x40e33333] {WL}
1904 ALU MOV A2[3].z : L[0x41000000] {W}
1905 ALU MOV A2[3].w : L[0x4101999a] {WL}
1906 IF (( ALU PRED_SETGE_INT __.x@free : KC0[0].x L[0x4] {LEP} PUSH_BEFORE ))
1907   ALU ADD_INT S34.x : KC0[0].x L[0xfffffffc]  {WL}
1908   ALU MOV A2[S34.x].z : I[0] {W}
1909   ALU MOV A2[S34.x].w : L[0x3dcccccd] {WL}
1910 ELSE
1911      ALU MOV S37.x : KC0[0].x {WL}
1912      ALU MOV A2[S37.x].x : I[0] {W}
1913      ALU MOV A2[S37.x].y : L[0x3dcccccd] {WL}
1914 ENDIF
1915 EXPORT_DONE POS 0 S19.xyzw
1916 ALU MOV S46.x@group{s} : A2[0].x {W}
1917 ALU MOV S46.y@group{s} : A2[0].y {W}
1918 ALU MOV S46.z@group{s} : A2[1].x {W}
1919 ALU MOV S46.w@group{s} : A2[1].y {WL}
1920 EXPORT PARAM 0 S46.xyzw
1921 ALU MOV S47.x@group{s} : A2[2].x {W}
1922 ALU MOV S47.y@group{s} : A2[2].y {W}
1923 ALU MOV S47.z@group{s} : A2[3].x {W}
1924 ALU MOV S47.w@group{s} : A2[3].y {WL}
1925 EXPORT PARAM 1 S47.xyzw
1926 ALU MOV S48.x@group{s} : A2[0].z {W}
1927 ALU MOV S48.y@group{s} : A2[0].w {W}
1928 ALU MOV S48.z@group{s} : A2[1].z {W}
1929 ALU MOV S48.w@group{s} : A2[1].w {WL}
1930 EXPORT PARAM 2 S48.xyzw
1931 ALU MOV S49.x@group{s} : A2[2].z {W}
1932 ALU MOV S49.y@group{s} : A2[2].w {W}
1933 ALU MOV S49.z@group{s} : A2[3].z {W}
1934 ALU MOV S49.w@group{s} : A2[3].w {WL}
1935 EXPORT_DONE PARAM 3 S49.xyzw
1936 )";
1937 
1938 const char *shader_with_dest_array_opt_scheduled =
1939    R"(VS
1940 CHIPCLASS EVERGREEN
1941 INPUT LOC:0
1942 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
1943 OUTPUT LOC:1 VARYING_SLOT:32 MASK:15
1944 OUTPUT LOC:2 VARYING_SLOT:33 MASK:15
1945 OUTPUT LOC:3 VARYING_SLOT:34 MASK:15
1946 OUTPUT LOC:4 VARYING_SLOT:35 MASK:15
1947 REGISTERS R1.xyzw
1948 ARRAYS A2[4].xy A2[4].zw
1949 SHADER
1950 BLOCK_START
1951 ALU_GROUP_BEGIN
1952   ALU MOV A2[0].x : I[1.0] {W}
1953   ALU MOV A2[0].y : L[0x3f8ccccd] {W}
1954   ALU MOV A2[0].z : L[0x40a00000] {W}
1955   ALU MOV A2[0].w : L[0x40a33333] {W}
1956   ALU MOV A2[1].x : L[0x40000000] {WL}
1957 ALU_GROUP_END
1958 ALU_GROUP_BEGIN
1959   ALU MOV A2[2].x : L[0x40400000] {W}
1960   ALU MOV A2[1].y : L[0x40066666] {W}
1961   ALU MOV A2[1].z : L[0x40c00000] {W}
1962   ALU MOV A2[1].w : L[0x40c33333] {W}
1963   ALU MUL_IEEE S14.x : KC0[2].x R1.y@fully {WL}
1964 ALU_GROUP_END
1965 ALU_GROUP_BEGIN
1966   ALU MOV A2[3].x : L[0x40800000] {W}
1967   ALU MOV A2[2].y : L[0x40466666] {W}
1968   ALU MOV A2[2].z : L[0x40e00000] {W}
1969   ALU MOV A2[2].w : L[0x40e33333] {W}
1970   ALU MULADD_IEEE S15.x : KC0[1].x R1.x@fully S14.x {WL}
1971 ALU_GROUP_END
1972 ALU_GROUP_BEGIN
1973   ALU MULADD_IEEE S17.x : KC0[3].x R1.z@fully S15.x {W}
1974   ALU MOV A2[3].y : L[0x40833333] {W}
1975   ALU MOV A2[3].z : L[0x41000000] {W}
1976   ALU MOV A2[3].w : L[0x4101999a] {W}
1977   ALU MUL_IEEE S14.y : KC0[2].y R1.y@fully {WL}
1978 ALU_GROUP_END
1979 ALU_GROUP_BEGIN
1980   ALU MULADD_IEEE S19.x@group : KC0[4].x R1.w@fully S17.x {W}
1981   ALU MULADD_IEEE S15.y : KC0[1].y R1.x@fully S14.y {WL}
1982 ALU_GROUP_END
1983 ALU_GROUP_BEGIN
1984   ALU MULADD_IEEE S17.y : KC0[3].y R1.z@fully S15.y {W}
1985   ALU MUL_IEEE S14.z : KC0[2].z R1.y@fully {W}
1986   ALU MUL_IEEE S14.w : KC0[2].w R1.y@fully {WL}
1987 ALU_GROUP_END
1988 ALU_GROUP_BEGIN
1989   ALU MULADD_IEEE S19.y@group : KC0[4].y R1.w@fully S17.y {W}
1990   ALU MULADD_IEEE S15.z : KC0[1].z R1.x@fully S14.z {W}
1991   ALU MULADD_IEEE S15.w : KC0[1].w R1.x@fully S14.w {WL}
1992 ALU_GROUP_END
1993 ALU_GROUP_BEGIN
1994   ALU MULADD_IEEE S17.z : KC0[3].z R1.z@fully S15.z {W}
1995   ALU MULADD_IEEE S17.w : KC0[3].w R1.z@fully S15.w {WL}
1996 ALU_GROUP_END
1997 ALU_GROUP_BEGIN
1998   ALU MULADD_IEEE S19.z@group : KC0[4].z R1.w@fully S17.z {W}
1999   ALU MULADD_IEEE S19.w@group : KC0[4].w R1.w@fully S17.w {WL}
2000 ALU_GROUP_END
2001 IF (( ALU PRED_SETGE_INT __.x@free : KC0[0].x L[0x4] {LEP} PUSH_BEFORE ))
2002   ALU_GROUP_BEGIN
2003     ALU ADD_INT S34.x : KC0[0].x L[0xfffffffc] {WL}
2004   ALU_GROUP_END
2005   ALU_GROUP_BEGIN
2006      ALU MOVA_INT AR : S34.x {L}
2007   ALU_GROUP_END
2008   ALU_GROUP_BEGIN
2009     ALU MOV A2[AR].z : I[0] {W}
2010     ALU MOV A2[AR].w : L[0x3dcccccd] {WL}
2011   ALU_GROUP_END
2012 ELSE
2013   ALU_GROUP_BEGIN
2014      ALU MOV S37.x : KC0[0].x {WL}
2015   ALU_GROUP_END
2016   ALU_GROUP_BEGIN
2017      ALU MOVA_INT AR : S37.x {L}
2018   ALU_GROUP_END
2019   ALU_GROUP_BEGIN
2020     ALU MOV A2[AR].x : I[0] {W}
2021     ALU MOV A2[AR].y : L[0x3dcccccd] {WL}
2022   ALU_GROUP_END
2023 ENDIF
2024   ALU_GROUP_BEGIN
2025     ALU MOV S46.x@chgr : A2[0].x {W}
2026     ALU MOV S46.y@chgr : A2[0].y {W}
2027     ALU MOV S46.z@chgr : A2[1].x {W}
2028     ALU MOV S46.w@chgr : A2[1].y {W}
2029     ALU MOV S47.x@group : A2[2].x {WL}
2030  ALU_GROUP_END
2031  ALU_GROUP_BEGIN
2032    ALU MOV S48.x@chgr : A2[0].z {W}
2033    ALU MOV S47.y@chgr : A2[2].y {W}
2034    ALU MOV S47.z@chgr : A2[3].x {W}
2035    ALU MOV S47.w@chgr : A2[3].y {W}
2036    ALU MOV S48.y@group : A2[0].w {WL}
2037  ALU_GROUP_END
2038  ALU_GROUP_BEGIN
2039   ALU MOV S49.x@chgr : A2[2].z {W}
2040   ALU MOV S49.y@chgr : A2[2].w {W}
2041   ALU MOV S48.z@chgr : A2[1].z {W}
2042   ALU MOV S48.w@chgr : A2[1].w {W}
2043   ALU MOV S49.z@group : A2[3].z {WL}
2044  ALU_GROUP_END
2045  ALU_GROUP_BEGIN
2046    ALU MOV S49.w@chgr : A2[3].w {WL}
2047 ALU_GROUP_END
2048 BLOCK_END
2049 BLOCK_START
2050 EXPORT_DONE POS 0 S19.xyzw
2051 EXPORT PARAM 0 S46.xyzw
2052 EXPORT PARAM 1 S47.xyzw
2053 EXPORT PARAM 2 S48.xyzw
2054 EXPORT_DONE PARAM 3 S49.xyzw
2055 BLOCK END\n
2056 )";
2057 
2058 const char *shader_with_dest_array2 =
2059    R"(FS
2060 CHIPCLASS EVERGREEN
2061 PROP MAX_COLOR_EXPORTS:1
2062 PROP COLOR_EXPORTS:1
2063 PROP COLOR_EXPORT_MASK:15
2064 PROP WRITE_ALL_COLORS:1
2065 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2066 ARRAYS A0[2].xy
2067 SHADER
2068 BLOCK_START
2069 ALU MOV A0[0].x : KC0[0].x {W}
2070 ALU MOV A0[0].y : KC0[0].y {WL}
2071 ALU MOV A0[1].x : KC0[1].x {W}
2072 ALU MOV A0[1].y : KC0[1].y {WL}
2073 ALU MOV S1.x : KC0[2].x {WL}
2074 ALU MOV A0[S1.x].x : I[1.0] {W}
2075 ALU MOV A0[S1.x].y : L[2.0] {WL}
2076 ALU MOV S2.x : A0[0].x {W}
2077 ALU MOV S2.y : A0[0].y {WL}
2078 ALU MUL_IEEE S3.x@group : S2.x KC0[2].y {W}
2079 ALU MUL_IEEE S3.y@group : S2.y KC0[2].y {WL}
2080 BLOCK_END
2081 BLOCK_START
2082 EXPORT_DONE PIXEL 0 S3.xy01
2083 BLOCK_END
2084 )";
2085 
2086 const char *shader_with_dest_array2_scheduled =
2087    R"(FS
2088 CHIPCLASS EVERGREEN
2089 PROP MAX_COLOR_EXPORTS:1
2090 PROP COLOR_EXPORTS:1
2091 PROP COLOR_EXPORT_MASK:15
2092 PROP WRITE_ALL_COLORS:1
2093 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2094 ARRAYS A0[2].xy
2095 SHADER
2096 BLOCK_START
2097 ALU_GROUP_BEGIN
2098   ALU MOV A0[0].x : KC0[0].x {W}
2099   ALU MOV A0[0].y : KC0[0].y {W}
2100   ALU MOV A0[1].x : KC0[1].x {WL}
2101 ALU_GROUP_END
2102 ALU_GROUP_BEGIN
2103   ALU MOV S1.x : KC0[2].x {W}
2104   ALU MOV A0[1].y : KC0[1].y {WL}
2105 ALU_GROUP_END
2106 ALU_GROUP_BEGIN
2107   ALU MOVA_INT AR : S1.x {L}
2108 ALU_GROUP_END
2109 ALU_GROUP_BEGIN
2110   ALU MOV A0[AR].x : I[1.0] {W}
2111   ALU MOV A0[AR].y : L[2.0] {WL}
2112 ALU_GROUP_END
2113 ALU_GROUP_BEGIN
2114   ALU MOV S2.x : A0[0].x {W}
2115   ALU MOV S2.y : A0[0].y {WL}
2116 ALU_GROUP_END
2117 ALU_GROUP_BEGIN
2118   ALU MUL_IEEE S3.x@group : S2.x KC0[2].y {W}
2119   ALU MUL_IEEE S3.y@group : S2.y KC0[2].y {WL}
2120 ALU_GROUP_END
2121 BLOCK_END
2122 BLOCK_START
2123 EXPORT_DONE PIXEL 0 S3.xy01
2124 BLOCK_END
2125 )";
2126 
2127 const char *shader_with_dest_array2_scheduled_ra =
2128    R"(FS
2129 CHIPCLASS EVERGREEN
2130 PROP MAX_COLOR_EXPORTS:1
2131 PROP COLOR_EXPORTS:1
2132 PROP COLOR_EXPORT_MASK:15
2133 PROP WRITE_ALL_COLORS:1
2134 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2135 ARRAYS A0[2].xy
2136 SHADER
2137 BLOCK_START
2138 ALU_GROUP_BEGIN
2139   ALU MOV A0[0].x : KC0[0].x {W}
2140   ALU MOV A0[0].y : KC0[0].y {W}
2141   ALU MOV A0[1].x : KC0[1].x {WL}
2142 ALU_GROUP_END
2143 ALU_GROUP_BEGIN
2144   ALU MOV R2.x : KC0[2].x {W}
2145   ALU MOV A0[1].y : KC0[1].y {WL}
2146 ALU_GROUP_END
2147 ALU_GROUP_BEGIN
2148   ALU MOVA_INT AR : R2.x {L}
2149 ALU_GROUP_END
2150 ALU_GROUP_BEGIN
2151   ALU MOV A0[AR].x : I[1.0] {W}
2152   ALU MOV A0[AR].y : L[2.0] {WL}
2153 ALU_GROUP_END
2154 ALU_GROUP_BEGIN
2155   ALU MOV R1.x : A0[0].x {W}
2156   ALU MOV R1.y : A0[0].y {WL}
2157 ALU_GROUP_END
2158 ALU_GROUP_BEGIN
2159   ALU MUL_IEEE R0.x : R1.x KC0[2].y {W}
2160   ALU MUL_IEEE R0.y : R1.y KC0[2].y {WL}
2161 ALU_GROUP_END
2162 BLOCK_END
2163 BLOCK_START
2164 EXPORT_DONE PIXEL 0 R0.xy01
2165 BLOCK_END
2166 )";
2167 
2168 const char *shader_group_chan_pin_to_combine =
2169    R"(FS
2170 CHIPCLASS EVERGREEN
2171 PROP MAX_COLOR_EXPORTS:1
2172 PROP COLOR_EXPORTS:1
2173 PROP COLOR_EXPORT_MASK:15
2174 PROP WRITE_ALL_COLORS:1
2175 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2176 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2177 REGISTERS R0.xy__
2178 SHADER
2179 ALU_GROUP_BEGIN
2180 ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
2181 ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
2182 ALU INTERP_ZW S1.z@chan : R0.y@fully Param0.z {W} VEC_210
2183 ALU INTERP_ZW S1.w@chan : R0.x@fully Param0.w {WL} VEC_210
2184 ALU_GROUP_END
2185 ALU_GROUP_BEGIN
2186 ALU INTERP_XY S1.x@chan : R0.y@fully Param0.x {W} VEC_210
2187 ALU INTERP_XY S1.y@chan : R0.x@fully Param0.y {W} VEC_210
2188 ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2189 ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2190 ALU_GROUP_END
2191 ALU MOV S2.x@group : S1.x@chan {W} VEC_210
2192 ALU MOV S2.y@group : S1.y@chan {W} VEC_210
2193 ALU MOV S2.z@group : S1.z@chan {W} VEC_210
2194 ALU MOV S2.w@group : S1.w@chan {WL} VEC_210
2195 EXPORT_DONE PIXEL 0 S2.xyzw
2196 )";
2197 
2198 const char *shader_group_chan_pin_combined =
2199    R"(FS
2200 CHIPCLASS EVERGREEN
2201 PROP MAX_COLOR_EXPORTS:1
2202 PROP COLOR_EXPORTS:1
2203 PROP COLOR_EXPORT_MASK:15
2204 PROP WRITE_ALL_COLORS:1
2205 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2206 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2207 REGISTERS R0.x R0.y
2208 SHADER
2209 ALU_GROUP_BEGIN
2210 ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
2211 ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
2212 ALU INTERP_ZW S1.z@chgr : R0.y@fully Param0.z {W} VEC_210
2213 ALU INTERP_ZW S1.w@chgr : R0.x@fully Param0.w {WL} VEC_210
2214 ALU_GROUP_END
2215 ALU_GROUP_BEGIN
2216 ALU INTERP_XY S1.x@chgr : R0.y@fully Param0.x {W} VEC_210
2217 ALU INTERP_XY S1.y@chgr : R0.x@fully Param0.y {W} VEC_210
2218 ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2219 ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2220 ALU_GROUP_END
2221 EXPORT_DONE PIXEL 0 S1.xyzw
2222 )";
2223 
2224 const char *shader_group_chan_pin_combined_scheduled =
2225    R"(FS
2226 CHIPCLASS EVERGREEN
2227 PROP MAX_COLOR_EXPORTS:1
2228 PROP COLOR_EXPORTS:1
2229 PROP COLOR_EXPORT_MASK:15
2230 PROP WRITE_ALL_COLORS:1
2231 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2232 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2233 REGISTERS R0.x@fully R0.y@fully
2234 SHADER
2235 ALU_GROUP_BEGIN
2236 ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
2237 ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
2238 ALU INTERP_ZW S2.z@chgr : R0.y@fully Param0.z {W} VEC_210
2239 ALU INTERP_ZW S2.w@chgr : R0.x@fully Param0.w {WL} VEC_210
2240 ALU_GROUP_END
2241 ALU_GROUP_BEGIN
2242 ALU INTERP_XY S2.x@chgr : R0.y@fully Param0.x {W} VEC_210
2243 ALU INTERP_XY S2.y@chgr : R0.x@fully Param0.y {W} VEC_210
2244 ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2245 ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2246 ALU_GROUP_END
2247 EXPORT_DONE PIXEL 0 S2.xyzw
2248 )";
2249 
2250 const char *shader_group_chan_pin_combined_scheduled_ra =
2251    R"(FS
2252 CHIPCLASS EVERGREEN
2253 PROP MAX_COLOR_EXPORTS:1
2254 PROP COLOR_EXPORTS:1
2255 PROP COLOR_EXPORT_MASK:15
2256 PROP WRITE_ALL_COLORS:1
2257 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2258 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2259 REGISTERS R0.x@fully R0.y@fully R1.xyzw
2260 SHADER
2261 ALU_GROUP_BEGIN
2262 ALU INTERP_ZW __.x : R0.y Param0.x {} VEC_210
2263 ALU INTERP_ZW __.y : R0.x Param0.y {} VEC_210
2264 ALU INTERP_ZW R1.z : R0.y Param0.z {W} VEC_210
2265 ALU INTERP_ZW R1.w : R0.x Param0.w {WL} VEC_210
2266 ALU_GROUP_END
2267 ALU_GROUP_BEGIN
2268 ALU INTERP_XY R1.x : R0.y Param0.x {W} VEC_210
2269 ALU INTERP_XY R1.y : R0.x Param0.y {W} VEC_210
2270 ALU INTERP_XY __.z : R0.y Param0.z {} VEC_210
2271 ALU INTERP_XY __.w : R0.x Param0.w {L} VEC_210
2272 ALU_GROUP_END
2273 EXPORT_DONE PIXEL 0 R1.xyzw
2274 )";
2275 
2276 const char *shader_group_chan_pin_to_combine_2 =
2277    R"(FS
2278 CHIPCLASS EVERGREEN
2279 PROP MAX_COLOR_EXPORTS:1
2280 PROP COLOR_EXPORTS:1
2281 PROP COLOR_EXPORT_MASK:15
2282 PROP WRITE_ALL_COLORS:1
2283 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2284 SHADER
2285 ALU MOV S0.x@free : I[0] {WL}
2286 ALU MOV S1.x : KC0[0].x {W}
2287 ALU MOV S1.y : KC0[0].y {W}
2288 ALU MOV S1.z : KC0[0].z {W}
2289 ALU MOV S1.w : KC0[0].w {WL}
2290 ALU DOT4_IEEE S2.x@free : S1.y S1.y + S1.y S1.y + I[0] I[0] + I[0] I[0] {WL}
2291 ALU DOT4_IEEE S3.x@free : S1.x S1.z + S1.x S1.w + I[0] I[0] + I[0] I[0] {WL}
2292 ALU DOT4_IEEE S4.x@free : S1.y S1.w + S1.w S1.y + I[0] I[0] + I[0] I[0] {WL}
2293 ALU MOV S5.x@group : S2.x@free {W}
2294 ALU MOV S5.y@group : S3.x@free {W}
2295 ALU MOV S5.z@group : S3.x@free {W}
2296 ALU MOV S5.w@group : S4.x@free {WL}
2297 EXPORT_DONE PIXEL 0 S5.xyzw
2298 )";
2299 
2300 const char *shader_group_chan_pin_to_combine_2_opt =
2301    R"(FS
2302 CHIPCLASS EVERGREEN
2303 PROP MAX_COLOR_EXPORTS:1
2304 PROP COLOR_EXPORTS:1
2305 PROP COLOR_EXPORT_MASK:15
2306 PROP WRITE_ALL_COLORS:1
2307 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2308 SHADER
2309 ALU DOT4_IEEE S1026.x@group : KC0[0].y KC0[0].y + KC0[0].y KC0[0].y + I[0] I[0] + I[0] I[0] {WL}
2310 ALU DOT4_IEEE S1026.z@group : KC0[0].x KC0[0].z + KC0[0].x KC0[0].w + I[0] I[0] + I[0] I[0] {WL}
2311 ALU DOT4_IEEE S1026.w@group : KC0[0].y KC0[0].w + KC0[0].w KC0[0].y + I[0] I[0] + I[0] I[0] {WL}
2312 EXPORT_DONE PIXEL 0 S1026.xzzw
2313 )";
2314 
2315 const char *fs_with_grand_and_abs =
2316    R"(FS
2317 CHIPCLASS EVERGREEN
2318 PROP MAX_COLOR_EXPORTS:1
2319 PROP COLOR_EXPORTS:1
2320 PROP COLOR_EXPORT_MASK:15
2321 PROP WRITE_ALL_COLORS:1
2322 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2323 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2324 SHADER
2325 ALU MOV S1.x@free : I[0] {WL}
2326 ALU_GROUP_BEGIN
2327   x: ALU INTERP_XY S2.x@chgr : R0.y@fully Param0.x {W} VEC_210
2328   y: ALU INTERP_XY S2.y@chan : R0.x@fully Param0.y {W} VEC_210
2329   z: ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2330   w: ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2331 ALU_GROUP_END
2332 ALU MOV S3.x@free : L[0xbf800000] {WL}
2333 ALU MOV S4.x@free : I[1.0] {WL}
2334 ALU MOV S5.x@free : L[0x41a00000] {WL}
2335 ALU MOV S6.x@free : L[0x41200000] {WL}
2336 ALU SETGT_DX10 S7.x : S2.x@chgr S1.x@free {W}
2337 ALU SETGT_DX10 S7.y : S2.y@chan S1.x@free {WL}
2338 ALU AND_INT S8.x : S7.x I[1.0] {W}
2339 ALU AND_INT S8.y : S7.y I[1.0] {WL}
2340 ALU SETGT_DX10 S9.x : S1.x@free S2.x@chgr {W}
2341 ALU SETGT_DX10 S9.y : S1.x@free S2.y@chan {WL}
2342 ALU AND_INT S10.x : S9.x I[1.0] {W}
2343 ALU AND_INT S10.y : S9.y I[1.0] {WL}
2344 ALU ADD S11.x : S8.x -S10.x {W}
2345 ALU ADD S11.y : S8.y -S10.y {WL}
2346 ALU SETE_DX10 S12.x : S11.x S3.x@free {W}
2347 ALU SETE_DX10 S12.y : S11.y S3.x@free {WL}
2348 ALU MOV S13.x@group : |S2.x@chgr| {WL}
2349 TEX GET_GRADIENTS_H S14.x___ : S2.x___ RID:18 SID:0 NNNN
2350 ALU MUL_IEEE S15.x@free : S14.x@group S5.x@free {WL}
2351 ALU MOV S16.x@free : -S15.x@free {WL}
2352 ALU CNDE_INT S17.x@free : S12.x S15.x@free S16.x@free {WL}
2353 ALU MOV S18.x : KC0[0].x {W}
2354 ALU MOV S18.y : KC0[0].y {W}
2355 ALU MOV S18.z : KC0[0].z {W}
2356 ALU MOV S18.w : KC0[0].w {WL}
2357 ALU MUL_IEEE S19.x@group : |S2.y@chan| S18.x {WL}
2358 ALU MOV S20.x@group : S19.x@group {WL}
2359 TEX GET_GRADIENTS_V S21.x___ : S19.x___ RID:18 SID:0 NNNN
2360 ALU MUL_IEEE S22.x@free : S21.x@group S6.x@free {WL}
2361 ALU MOV S23.x@free : -S22.x@free {WL}
2362 ALU CNDE_INT S24.x@free : S12.y S22.x@free S23.x@free {WL}
2363 ALU MOV S25.x@group : S17.x@free {W}
2364 ALU MOV S25.y@group : S24.x@free {W}
2365 ALU MOV S25.z@group : S1.x@free {W}
2366 ALU MOV S25.w@group : S4.x@free {WL}
2367 EXPORT_DONE PIXEL 0 S25.xyzw
2368 )";
2369 
2370 const char *fs_opt_tex_coord_init =
2371    R"(FS
2372 CHIPCLASS EVERGREEN
2373 PROP MAX_COLOR_EXPORTS:1
2374 PROP COLOR_EXPORTS:1
2375 PROP COLOR_EXPORT_MASK:15
2376 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2377 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2378 REGISTERS R0.x@fully R0.y@fully
2379 SHADER
2380 ALU_GROUP_BEGIN
2381   ALU INTERP_XY S1.x@chan : R0.y@fully Param0.x {W} VEC_210
2382   ALU INTERP_XY S1.y@chan : R0.x@fully Param0.y {W} VEC_210
2383   ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2384   ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2385 ALU_GROUP_END
2386 ALU_GROUP_BEGIN
2387   ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
2388   ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
2389   ALU INTERP_ZW S1.z@chan : R0.y@fully Param0.z {W} VEC_210
2390   ALU INTERP_ZW S1.w@chan : R0.x@fully Param0.w {WL} VEC_210
2391 ALU_GROUP_END
2392 ALU MOV S2.x@group : S1.z@chan {W}
2393 ALU MOV S2.y@group : S1.w@chan {WL}
2394 TEX SAMPLE S3.xyzw : S1.xy__ RID:18 SID:0 NNNN
2395 TEX SAMPLE S4.xyzw : S2.xy__ RID:18 SID:0 NNNN
2396 ALU ADD S5.x@group : S3.x@group S4.x@group {W}
2397 ALU ADD S5.y@group : S3.y@group S4.y@group {W}
2398 ALU ADD S5.z@group : S3.z@group S4.z@group {W}
2399 ALU ADD S5.w@group : S3.w@group S4.w@group {W}
2400 EXPORT_DONE PIXEL 0 S5.xyzw)";
2401 
2402 const char *fs_opt_tex_coord_expect =
2403    R"(FS
2404 CHIPCLASS EVERGREEN
2405 PROP MAX_COLOR_EXPORTS:1
2406 PROP COLOR_EXPORTS:1
2407 PROP COLOR_EXPORT_MASK:15
2408 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2409 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2410 REGISTERS R0.x@fully R0.y@fully
2411 SHADER
2412 ALU_GROUP_BEGIN
2413    ALU INTERP_XY S1.x@chan : R0.y@fully Param0.x {W} VEC_210
2414    ALU INTERP_XY S1.y@chan : R0.x@fully Param0.y {W} VEC_210
2415    ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2416    ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2417 ALU_GROUP_END
2418 ALU_GROUP_BEGIN
2419    ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
2420    ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
2421    ALU INTERP_ZW S1.z@chgr : R0.y@fully Param0.z {W} VEC_210
2422    ALU INTERP_ZW S1.w@chgr : R0.x@fully Param0.w {WL} VEC_210
2423 ALU_GROUP_END
2424 TEX SAMPLE S3.xyzw : S1.xy__ RID:18 SID:0 NNNN
2425 TEX SAMPLE S4.xyzw : S1.zw__ RID:18 SID:0 NNNN
2426 ALU ADD S5.x@group : S3.x@group S4.x@group {W}
2427 ALU ADD S5.y@group : S3.y@group S4.y@group {W}
2428 ALU ADD S5.z@group : S3.z@group S4.z@group {W}
2429 ALU ADD S5.w@group : S3.w@group S4.w@group {W}
2430 EXPORT_DONE PIXEL 0 S5.xyzw)";
2431 
2432 const char *fs_sched_tex_coord_init =
2433    R"(FS
2434 CHIPCLASS EVERGREEN
2435 PROP MAX_COLOR_EXPORTS:1
2436 PROP COLOR_EXPORTS:1
2437 PROP COLOR_EXPORT_MASK:15
2438 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2439 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2440 REGISTERS R0.x@fully R0.y@fully
2441 SHADER
2442 ALU_GROUP_BEGIN
2443   ALU INTERP_XY S1.x@chan : R0.y@fully Param0.x {W} VEC_210
2444   ALU INTERP_XY S1.y@chan : R0.x@fully Param0.y {W} VEC_210
2445   ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2446   ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2447 ALU_GROUP_END
2448 ALU_GROUP_BEGIN
2449   ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
2450   ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
2451   ALU INTERP_ZW S1.z@chan : R0.y@fully Param0.z {W} VEC_210
2452   ALU INTERP_ZW S1.w@chan : R0.x@fully Param0.w {WL} VEC_210
2453 ALU_GROUP_END
2454 ALU ADD S2.x@group : S1.x@chan S1.z@chan {W}
2455 ALU ADD S2.y@group : S1.y@chan S1.w@chan {WL}
2456 ALU MUL_IEEE S3.x@group : S1.x@chan S1.z@chan {W}
2457 ALU MUL_IEEE S3.y@group : S1.y@chan S1.w@chan {WL}
2458 
2459 TEX SAMPLE S4.xyzw : S2.xy__ RID:18 SID:0 NNNN
2460 TEX SAMPLE S5.xyzw : S3.xy__ RID:18 SID:0 NNNN
2461 ALU ADD S6.x@group : S5.x@group S4.x@group {W}
2462 ALU ADD S6.y@group : S5.y@group S4.y@group {W}
2463 ALU ADD S6.z@group : S5.z@group S4.z@group {W}
2464 ALU ADD S6.w@group : S5.w@group S4.w@group {W}
2465 EXPORT_DONE PIXEL 0 S5.xyzw)";
2466 
2467 const char *fs_sched_tex_coord_expect =
2468    R"(FS
2469 CHIPCLASS EVERGREEN
2470 PROP MAX_COLOR_EXPORTS:1
2471 PROP COLOR_EXPORTS:1
2472 PROP COLOR_EXPORT_MASK:15
2473 INPUT LOC:0 VARYING_SLOT:32 INTERP:2
2474 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2475 REGISTERS R0.x@fully R0.y@fully
2476 SHADER
2477 BLOCK_START
2478 ALU_GROUP_BEGIN
2479   ALU INTERP_XY S1.x@chan : R0.y@fully Param0.x {W} VEC_210
2480   ALU INTERP_XY S1.y@chan : R0.x@fully Param0.y {W} VEC_210
2481   ALU INTERP_XY __.z@chan : R0.y@fully Param0.z {} VEC_210
2482   ALU INTERP_XY __.w@chan : R0.x@fully Param0.w {L} VEC_210
2483 ALU_GROUP_END
2484 ALU_GROUP_BEGIN
2485   ALU INTERP_ZW __.x@chan : R0.y@fully Param0.x {} VEC_210
2486   ALU INTERP_ZW __.y@chan : R0.x@fully Param0.y {} VEC_210
2487   ALU INTERP_ZW S1.z@chan : R0.y@fully Param0.z {W} VEC_210
2488   ALU INTERP_ZW S1.w@chan : R0.x@fully Param0.w {WL} VEC_210
2489 ALU_GROUP_END
2490 ALU_GROUP_BEGIN
2491   ALU ADD S2.x@group : S1.x@chan S1.z@chan {W}
2492   ALU ADD S2.y@group : S1.y@chan S1.w@chan {W}
2493   ALU MUL_IEEE S3.z@chgr : S1.x@chan S1.z@chan {W}
2494   ALU MUL_IEEE S3.w@chgr : S1.y@chan S1.w@chan {WL}
2495 ALU_GROUP_END
2496 BLOCK_END
2497 BLOCK_START
2498 TEX SAMPLE S4.xyzw : S2.xy__ RID:18 SID:0 NNNN
2499 TEX SAMPLE S5.xyzw : S3.zw__ RID:18 SID:0 NNNN
2500 BLOCK_END
2501 BLOCK_START
2502 ALU_GROUP_BEGIN
2503 ALU ADD S6.x@group : S5.x@group S4.x@group {W}
2504 ALU ADD S6.y@group : S5.y@group S4.y@group {W}
2505 ALU ADD S6.z@group : S5.z@group S4.z@group {W}
2506 ALU ADD S6.w@group : S5.w@group S4.w@group {WL}
2507 ALU_GROUP_END
2508 BLOCK_END
2509 BLOCK_START
2510 EXPORT_DONE PIXEL 0 S5.xyzw
2511 BLOCK_END)";
2512 
2513 const char *fs_with_loop_multislot_reuse =
2514    R"(FS
2515 CHIPCLASS CAYMAN
2516 PROP MAX_COLOR_EXPORTS:1
2517 PROP COLOR_EXPORTS:1
2518 PROP COLOR_EXPORT_MASK:15
2519 PROP WRITE_ALL_COLORS:1
2520 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2521 SHADER
2522 ALU MOV R1.x@free : I[0] {WL}
2523 ALU MOV S2.x@free : L[0x38f00000] {WL}
2524 LOOP_BEGIN
2525 ALU RECIPSQRT_IEEE S3.x@free : |R1.x@free| + |R1.x@free| + |R1.x@free| {WL}
2526 ALU SETGT_DX10 S4.x@free : S3.x@free S2.x@free {W}
2527   IF (( ALU PRED_SETNE_INT __.x@free : S4.x@free I[0] {LEP} PUSH_BEFORE ))
2528      BREAK
2529   ENDIF
2530   ALU ADD S5.x@free : S3.x@chan  L[0x38f00000] {WL}
2531   ALU MUL R1.x@free : S5.x@free  L[0x38f00000] {WL}
2532 LOOP_END
2533 EXPORT_DONE PIXEL 0 R1.xxxx
2534 )";
2535 
2536 const char *fs_with_loop_multislot_reuse_scheduled =
2537    R"(FS
2538 CHIPCLASS CAYMAN
2539 PROP MAX_COLOR_EXPORTS:1
2540 PROP COLOR_EXPORTS:1
2541 PROP COLOR_EXPORT_MASK:15
2542 PROP WRITE_ALL_COLORS:1
2543 OUTPUT LOC:0 FRAG_RESULT:2 MASK:15
2544 SHADER
2545 ALU_GROUP_BEGIN
2546   ALU MOV R1.x@free : I[0] {W}
2547   ALU MOV S2.y@chan : L[0x38f00000] {WL}
2548 ALU_GROUP_END
2549 LOOP_BEGIN
2550   ALU_GROUP_BEGIN
2551     ALU RECIPSQRT_IEEE S3.x@chan : |R1.x@free| {W}
2552     ALU RECIPSQRT_IEEE __.y@chan : |R1.x@free| {}
2553     ALU RECIPSQRT_IEEE __.z@chan : |R1.x@free| {L}
2554   ALU_GROUP_END
2555   ALU_GROUP_BEGIN
2556     ALU SETGT_DX10 S4.x@chan : S3.x@chgr S2.y@free {WL}
2557   ALU_GROUP_END
2558   IF (( ALU PRED_SETNE_INT __.x@free : S4.x@chan I[0] {LEP} PUSH_BEFORE ))
2559      BREAK
2560   ENDIF
2561   ALU_GROUP_BEGIN
2562     ALU ADD S5.x@free : S3.x@chan  L[0x38f00000] {WL}
2563   ALU_GROUP_END
2564   ALU_GROUP_BEGIN
2565     ALU MUL R1.x@free : S5.x@free  L[0x38f00000] {WL}
2566   ALU_GROUP_END
2567 LOOP_END
2568 EXPORT_DONE PIXEL 0 R1.xxxx
2569 )";
2570 
2571 const char *gs_abs_float_nir =
2572    R"(shader: MESA_SHADER_GEOMETRY
2573 source_sha1: {0xdfd2ba73, 0x5eff5b0c, 0x577ee695, 0xb65ae49e, 0xecc34679}
2574 name: GLSL4
2575 inputs: 1
2576 outputs: 2
2577 uniforms: 3
2578 shared: 0
2579 ray queries: 0
2580 invocations: 1
2581 vertices in: 3
2582 vertices out: 3
2583 input primitive: TRIANGLES
2584 output primitive: TRIANGLE_STRIP
2585 active_stream_mask: 0x1
2586 uses_end_primitive: 0
2587 decl_var uniform INTERP_MODE_NONE float arg0 (0, 0, 0)
2588 decl_var uniform INTERP_MODE_NONE float tolerance (1, 1, 0)
2589 decl_var uniform INTERP_MODE_NONE float expected (2, 2, 0)
2590 decl_function main (0 params)
2591 
2592 impl main {
2593 	block block_0:
2594 	/* preds: */
2595 	vec1 32 ssa_0 = load_const (0x00000000 = 0.000000)
2596 	vec4 32 ssa_1 = intrinsic load_per_vertex_input (ssa_0, ssa_0) (0, 0, 160, 160)
2597 	vec1 32 ssa_2 = load_const (0x00000001 = 0.000000)
2598 	vec4 32 ssa_3 = intrinsic load_per_vertex_input (ssa_2, ssa_0) (0, 0, 160, 160)
2599 	vec1 32 ssa_4 = load_const (0x00000002 = 0.000000)
2600 	vec4 32 ssa_5 = intrinsic load_per_vertex_input (ssa_4, ssa_0) (0, 0, 160, 160)
2601 	vec1 32 ssa_6 = load_const (0x3f800000 = 1.000000)
2602 	vec1 32 ssa_7 = intrinsic load_uniform (ssa_0) (0, 1, 160)	/* arg0 */
2603 	vec1 32 ssa_8 = intrinsic load_uniform (ssa_0) (2, 1, 160)	/* expected */
2604 	vec1 32 ssa_9 = fsub abs(ssa_7), ssa_8
2605 	vec1 32 ssa_10 = intrinsic load_uniform (ssa_0) (1, 1, 160)	/* tolerance */
2606 	vec1 32 ssa_11 = fge32 ssa_10, abs(ssa_9)
2607 	vec1 32 ssa_12 = inot ssa_11
2608 	vec1 32 ssa_13 = b2f32 ssa_12
2609 	vec1 32 ssa_14 = b2f32 ssa_11
2610 	intrinsic store_output (ssa_1, ssa_0) (0, 15, 0,  160, 128)
2611 	vec4 32 ssa_15 = vec4 ssa_13, ssa_14, ssa_0, ssa_6
2612 	intrinsic store_output (ssa_15, ssa_0) (1, 15, 0, 160, 160)
2613 	intrinsic emit_vertex () (0)
2614 	intrinsic store_output (ssa_3, ssa_0) (0, 15, 0, 160, 128)
2615 	intrinsic store_output (ssa_15, ssa_0) (1,15, 0, 160, 160)
2616 	intrinsic emit_vertex () (0)
2617 	intrinsic store_output (ssa_5, ssa_0) (0, 15, 0, 160, 128)
2618 	intrinsic store_output (ssa_15, ssa_0) (1,15, 0, 160, 160)
2619 	intrinsic emit_vertex () (0)
2620 	/* succs: block_1 */
2621 	block block_1:
2622 })";
2623 
2624 const char *gs_abs_float_expect =
2625    R"(GS
2626 CHIPCLASS EVERGREEN
2627 INPUT LOC:0 VARYING_SLOT:32
2628 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
2629 OUTPUT LOC:1 VARYING_SLOT:32 MASK:15
2630 REGISTERS R0.x@fully R0.y@fully R0.w@fully
2631 SHADER
2632 ALU MOV S2.x@chan : I[0] {WL}
2633 ALU MOV S3.x@chan : I[0] {WL}
2634 ALU MOV S4.x@chan : I[0] {WL}
2635 ALU MOV S5.x@chan : I[0] {WL}
2636 ALU MOV S6.x@free : I[0] {WL}
2637 LOAD_BUF S7.xyzw : R0.x@fully RID:17
2638 ALU MOV S8.x@free : I[1] {WL}
2639 LOAD_BUF S9.xyzw : R0.y@fully RID:17
2640 ALU MOV S10.x@free : L[0x2] {WL}
2641 LOAD_BUF S11.xyzw : R0.w@fully RID:17
2642 ALU MOV S12.x@free : I[1.0] {WL}
2643 ALU MOV S13.x@free : KC0[0].x {WL}
2644 ALU MOV S14.x@free : KC0[2].x {WL}
2645 ALU ADD S15.x@free : |S13.x@free| -S14.x@free {WL}
2646 ALU MOV S16.x@free : KC0[1].x {WL}
2647 ALU SETGE_DX10 S17.x@free : S16.x@free |S15.x@free| {WL}
2648 ALU NOT_INT S18.x@free : S17.x@free {WL}
2649 ALU AND_INT S19.x@free : S18.x@free I[1.0] {WL}
2650 ALU AND_INT S20.x@free : S17.x@free I[1.0] {WL}
2651 ALU MOV S21.x@group : S19.x@free {W}
2652 ALU MOV S21.y@group : S20.x@free {W}
2653 ALU MOV S21.z@group : S6.x@free {W}
2654 ALU MOV S21.w@group : S12.x@free {WL}
2655 MEM_RING 0 WRITE_IDX 0 S7.xyzw @S2.x@chan ES:4
2656 MEM_RING 0 WRITE_IDX 4 S21.xyzw @S2.x@chan ES:4
2657 EMIT_VERTEX @0
2658 ALU ADD_INT S22.x@chan : S2.x@chan L[0x2] {WL}
2659 MEM_RING 0 WRITE_IDX 0 S9.xyzw @S22.x@chan ES:4
2660 MEM_RING 0 WRITE_IDX 4 S21.xyzw @S22.x@chan ES:4
2661 EMIT_VERTEX @0
2662 ALU ADD_INT S23.x@chan : S22.x@chan L[0x2] {WL}
2663 MEM_RING 0 WRITE_IDX 0 S11.xyzw @S23.x@chan ES:4
2664 MEM_RING 0 WRITE_IDX 4 S21.xyzw @S23.x@chan ES:4
2665 EMIT_VERTEX @0
2666 ALU ADD_INT S24.x@chan : S23.x@chan L[0x2] {WL}
2667 )";
2668 
2669 const char *vtx_for_tcs_nir =
2670    R"(shader: MESA_SHADER_VERTEX
2671 source_sha1: {0xbd6100f2, 0xc71e7b0e, 0x74662024, 0x261073d8, 0xeae01762}
2672 name: GLSL5
2673 inputs: 0
2674 outputs: 1
2675 uniforms: 10
2676 shared: 0
2677 ray queries: 0
2678 decl_var uniform INTERP_MODE_NONE int[6] constarray_1_0 (0, 0, 0) = { { 0x00000000 }, { 0x00000001 }, { 0x00000002 }, { 0x00000000 }, { 0x00000002 }, { 0x00000003 } }
2679 decl_var uniform INTERP_MODE_NONE vec2[4] constarray_0_0 (1, 6, 0) = { { -1.000000, 1.000000 }, { -1.000000, -1.000000 }, { 1.000000, -1.000000 }, { 1.000000, 1.000000 } }
2680 decl_function main (0 params)
2681 
2682 impl main {
2683         block block_0:
2684         /* preds: */
2685         vec1 32 ssa_0 = load_const (0x00000000 = 0.000000)
2686         vec1 32 ssa_1 = load_const (0x3f800000 = 1.000000)
2687         vec1 32 ssa_2 = intrinsic load_vertex_id () ()
2688         vec1 32 ssa_3 = intrinsic load_uniform (ssa_2) (0, 6, 34)
2689         vec2 32 ssa_4 = intrinsic load_uniform (ssa_3) (6, 4, 160)
2690         vec4 32 ssa_5 = vec4 ssa_4.x, ssa_4.y, ssa_0, ssa_1
2691         vec4 32 ssa_6 = intrinsic load_tcs_in_param_base_r600 () ()
2692         vec1 32 ssa_7 = intrinsic load_tcs_rel_patch_id_r600 () ()
2693         vec1 32 ssa_8 = umul24 ssa_6.y, ssa_7
2694         intrinsic store_local_shared_r600 (ssa_5, ssa_8) (3)
2695         vec1 32 ssa_9 = load_const (0x00000008 = 0.000000)
2696         vec1 32 ssa_10 = iadd ssa_9, ssa_8
2697         intrinsic store_local_shared_r600 (ssa_5, ssa_10) (12)
2698         /* succs: block_1 */
2699         block block_1:
2700 })";
2701 
2702 const char *vtx_for_tcs_from_nir_expect =
2703    R"(VS
2704 CHIPCLASS EVERGREEN
2705 REGISTERS R0.x@fully R0.y@fully
2706 SHADER
2707 ALU MOV S1.x@free : I[0] {WL}
2708 ALU MOV S2.x@free : I[1.0] {WL}
2709 ALU MOV S3.x@free : R0.x@fully {WL}
2710 LOAD_BUF S4.xyzw : S3.x@free RID:0
2711 LOAD_BUF S5.xyzw : S4.x@group + 96b RID:0
2712 ALU MOV S6.x : S5.x@group {W}
2713 ALU MOV S6.y : S5.y@group {W}
2714 ALU MOV S6.z : S1.x@free {W}
2715 ALU MOV S6.w : S2.x@free {WL}
2716 ALU MOV S7.x@free : I[0] {WL}
2717 LOAD_BUF S8.xyzw : S7.x@free RID:16 SRF
2718 ALU MOV S9.x@free : R0.y@fully {WL}
2719 ALU MUL_UINT24 S10.x@free : S8.y@group S9.x@free {WL}
2720 LDS WRITE_REL __.x [ S10.x@free ] : S6.x S6.y
2721 ALU MOV S11.x@free : L[0x8] {WL}
2722 ALU ADD_INT S12.x@free : S11.x@free S10.x@free {WL}
2723 LDS WRITE_REL __.x [ S12.x@free ] : S6.z S6.w)";
2724 
2725 const char *vtx_for_tcs_inp =
2726    R"(VS
2727 CHIPCLASS EVERGREEN
2728 REGISTERS R0.x@fully R0.y@fully
2729 SHADER
2730 ALU MOV S1.x@free : I[0] {WL}
2731 ALU MOV S2.x@free : I[1.0] {WL}
2732 ALU MOV S3.x@free : R0.x@fully {WL}
2733 LOAD_BUF S4.xyzw : S3.x@free RID:0
2734 LOAD_BUF S5.xyzw : S4.x@group + 96b RID:0
2735 ALU MOV S6.x : S5.x@group {W}
2736 ALU MOV S6.y : S5.y@group {W}
2737 ALU MOV S6.z : S1.x@free {W}
2738 ALU MOV S6.w : S2.x@free {WL}
2739 ALU MOV S7.x@free : I[0] {WL}
2740 LOAD_BUF S8.xyzw : S7.x@free RID:16 SRF
2741 ALU MOV S9.x@free : R0.y@fully {WL}
2742 ALU MUL_UINT24 S10.x@free : S8.y@group S9.x@free {WL}
2743 LDS WRITE_REL __.x [ S10.x@free ] : S6.x S6.y
2744 ALU MOV S11.x@free : L[0x8] {WL}
2745 ALU ADD_INT S12.x@free : S11.x@free S10.x@free {WL}
2746 LDS WRITE_REL __.x [ S12.x@free ] : S6.z S6.w)";
2747 
2748 const char *vtx_for_tcs_opt =
2749    R"(VS
2750 CHIPCLASS EVERGREEN
2751 REGISTERS R0.x@fully R0.y@fully
2752 SHADER
2753 LOAD_BUF S4.x___ : R0.x@fully RID:0
2754 LOAD_BUF S5.xy__ : S4.x@group + 96b RID:0
2755 ALU MOV S7.x@free : I[0] {WL}
2756 LOAD_BUF S8._y__ : S7.x@free RID:16 SRF
2757 ALU MUL_UINT24 S10.x@free : S8.y@group R0.y@fully {WL}
2758 LDS WRITE_REL __.x [ S10.x@free ] : S5.x@group S5.y@group
2759 ALU ADD_INT S12.x@free : L[0x8] S10.x@free {WL}
2760 LDS WRITE_REL __.x [ S12.x@free ] : I[0] I[1.0])";
2761 
2762 const char *vtx_for_tcs_pre_sched =
2763    R"(VS
2764 CHIPCLASS EVERGREEN
2765 REGISTERS R0.x@fully R0.y@fully
2766 SHADER
2767 ALU MOV S3.x@free : R0.x@fully {WL}
2768 LOAD_BUF S4.xyzw : S3.x@free RID:0
2769 LOAD_BUF S5.xyzw : S4.x@group + 96b RID:0
2770 ALU MOV S7.y@free : I[0] {WL}
2771 LOAD_BUF S8.xyzw : S7.y@free RID:16 SRF
2772 ALU MUL_UINT24 S10.x@free : S8.y@group R0.y@fully {WL}
2773 LDS WRITE_REL __.x [ S10.x@free ] : S5.x@group S5.y@group
2774 ALU ADD_INT S12.x@free : L[0x8] S10.x@free {WL}
2775 LDS WRITE_REL __.x [ S12.x@free ] : I[0] I[1.0])";
2776 
2777 const char *vtx_for_tcs_sched =
2778    R"(VS
2779 CHIPCLASS EVERGREEN
2780 REGISTERS R0.x@fully R0.y@fully
2781 SHADER
2782 BLOCK_START
2783 ALU_GROUP_BEGIN
2784   ALU MOV S3.x@free : R0.x@fully {W}
2785   ALU MOV S7.y@free : I[0] {WL}
2786 ALU_GROUP_END
2787 BLOCK_END
2788 BLOCK_START
2789 LOAD_BUF S4.xyzw : S3.x@free RID:0
2790 LOAD_BUF S8.xyzw : S7.y@free RID:16 SRF
2791 BLOCK_END
2792 BLOCK_START
2793 ALU_GROUP_BEGIN
2794   ALU MUL_UINT24 S10.x@free : S8.y@group R0.y@fully {WL}
2795 ALU_GROUP_END
2796 ALU_GROUP_BEGIN
2797   ALU ADD_INT S12.x@chan : L[0x8] S10.x@free {WL}
2798 ALU_GROUP_END
2799 BLOCK_END
2800 BLOCK_START
2801 LOAD_BUF S5.xyzw : S4.x@group + 96b RID:0
2802 BLOCK_END
2803 BLOCK_START
2804 ALU_GROUP_BEGIN
2805   ALU LDS WRITE_REL __.x : S10.x@free S5.x@group S5.y@group {L}
2806 ALU_GROUP_END
2807 ALU_GROUP_BEGIN
2808   ALU LDS WRITE_REL __.x : S12.x@chan I[0] I[1.0] {L}
2809 ALU_GROUP_END
2810 BLOCK_END)";
2811 
2812 const char *tcs_nir =
2813    R"(shader: MESA_SHADER_TESS_CTRL
2814 source_sha1: {0xc83b0de6, 0x36934b97, 0xccddb436, 0xb0952cb0, 0x07a450a1}
2815 name: GLSL5
2816 inputs: 1
2817 outputs: 3
2818 uniforms: 0
2819 shared: 0
2820 ray queries: 0
2821 decl_function main (0 params)
2822 
2823 impl main {
2824    block block_0:
2825    /* preds: */
2826    vec1 32 ssa_0 = undefined
2827    vec2 32 ssa_1 = load_const (0x3f800000, 0x3f800000)
2828    vec1 32 ssa_2 = load_const (0x00000000)
2829    vec4 32 ssa_3 = intrinsic load_tcs_out_param_base_r600 () ()
2830    vec1 32 ssa_4 = intrinsic load_tcs_rel_patch_id_r600 () ()
2831    vec2 32 ssa_5 = umad24 ssa_3.xx, ssa_4.xx, ssa_3.wz
2832    vec1 32 ssa_6 = mov ssa_5.x
2833    vec1 32 ssa_7 = load_const (0x00000010)
2834    vec4 32 ssa_8 = load_const (0x00000010, 0x00000000, 0x00000004, 0x00000008)
2835    vec4 32 ssa_9 = iadd ssa_5.xxxx, ssa_8
2836    vec1 32 ssa_10 = mov ssa_9.x
2837    vec3 32 ssa_11 = mov ssa_9.yzw
2838    intrinsic store_local_shared_r600 (ssa_1, ssa_10) (3)
2839    vec4 32 ssa_12 = load_const (0x3f800000, 0x3f800000, 0x3f800000, 0x3f800000)
2840    vec4 32 ssa_13 = vec4 ssa_12.x, ssa_12.y, ssa_12.z, ssa_0
2841    intrinsic store_local_shared_r600 (ssa_13, ssa_6) (3)
2842    vec1 32 ssa_14 = load_const (0x00000008)
2843    vec1 32 ssa_15 = iadd ssa_14, ssa_5.x
2844    intrinsic store_local_shared_r600 (ssa_13, ssa_15) (12)
2845    vec1 32 ssa_16 = intrinsic load_invocation_id () ()
2846    vec4 32 ssa_17 = intrinsic load_tcs_in_param_base_r600 () ()
2847    vec1 32 ssa_18 = umul24 ssa_17.x, ssa_4
2848    vec1 32 ssa_19 = umad24 ssa_17.y, ssa_16, ssa_18
2849    vec4 32 ssa_20 = load_const (0x00000000, 0x00000004, 0x00000008, 0x0000000c)
2850    vec4 32 ssa_21 = iadd ssa_20, ssa_19.xxxx
2851    vec4 32 ssa_22 = intrinsic load_local_shared_r600 (ssa_21) ()
2852    vec1 32 ssa_23 = umad24 ssa_3.y, ssa_16, ssa_5.y
2853    intrinsic store_local_shared_r600 (ssa_22, ssa_23) (3)
2854    vec1 32 ssa_24 = iadd ssa_14, ssa_23
2855    intrinsic store_local_shared_r600 (ssa_22, ssa_24) (12)
2856    vec1 32 ssa_25 = ieq32 ssa_16, ssa_2
2857    /* succs: block_1 block_2 */
2858    if ssa_25 {
2859       block block_1:
2860       /* preds: block_0 */
2861       vec3 32 ssa_26 = intrinsic load_local_shared_r600 (ssa_11) ()
2862       vec1 32 ssa_27 = intrinsic load_tcs_tess_factor_base_r600 () ()
2863       vec1 32 ssa_28 = umad24 ssa_4, ssa_7, ssa_27
2864       vec3 32 ssa_29 = load_const (0x00000004, 0x00000008, 0x0000000c)
2865       vec3 32 ssa_30 = iadd ssa_28.xxx, ssa_29
2866       vec4 32 ssa_31 = vec4 ssa_28, ssa_26.x, ssa_30.x, ssa_26.y
2867       vec2 32 ssa_32 = vec2 ssa_30.y, ssa_26.z
2868       vec1 32 ssa_33 = intrinsic load_local_shared_r600 (ssa_10) ()
2869       vec2 32 ssa_34 = vec2 ssa_30.z, ssa_33
2870       intrinsic store_tf_r600 (ssa_31) ()
2871       intrinsic store_tf_r600 (ssa_32) ()
2872       intrinsic store_tf_r600 (ssa_34) ()
2873       /* succs: block_3 */
2874    } else {
2875       block block_2:
2876       /* preds: block_0 */
2877       /* succs: block_3 */
2878    }
2879    block block_3:
2880    /* preds: block_1 block_2 */
2881    /* succs: block_4 */
2882    block block_4:
2883 })";
2884 
2885 const char *tcs_from_nir_expect =
2886    R"(TCS
2887 CHIPCLASS EVERGREEN
2888 PROP TCS_PRIM_MODE:4
2889 REGISTERS R0.x@fully R0.y@fully R0.z@fully R0.w@fully
2890 SHADER
2891 ALU MOV S1.x@free : I[0] {WL}
2892 ALU MOV S2.x : I[1.0] {W}
2893 ALU MOV S2.y : I[1.0] {WL}
2894 ALU MOV S3.x@free : I[0] {WL}
2895 ALU MOV S4.x@free : I[0] {WL}
2896 LOAD_BUF S5.xyzw : S4.x@free + 16b RID:16 SRF
2897 ALU MOV S6.x@free : R0.y@fully {WL}
2898 ALU MULADD_UINT24 S7.x : S5.x@group S6.x@free S5.w@group {W}
2899 ALU MULADD_UINT24 S7.y : S5.x@group S6.x@free S5.z@group {WL}
2900 ALU MOV S8.x@free : S7.x {WL}
2901 ALU MOV S9.x@free : L[0x10] {WL}
2902 ALU MOV S10.x : L[0x10] {W}
2903 ALU MOV S10.y : I[0] {W}
2904 ALU MOV S10.z : L[0x4] {W}
2905 ALU MOV S10.w : L[0x8] {WL}
2906 ALU ADD_INT S11.x : S7.x S10.x {W}
2907 ALU ADD_INT S11.y : S7.x S10.y {W}
2908 ALU ADD_INT S11.z : S7.x S10.z {W}
2909 ALU ADD_INT S11.w : S7.x S10.w {WL}
2910 ALU MOV S12.x@free : S11.x {WL}
2911 ALU MOV S13.x : S11.y {W}
2912 ALU MOV S13.y : S11.z {W}
2913 ALU MOV S13.z : S11.w {WL}
2914 LDS WRITE_REL __.x [ S12.x@free ] : S2.x S2.y
2915 ALU MOV S14.x : I[1.0] {W}
2916 ALU MOV S14.y : I[1.0] {W}
2917 ALU MOV S14.z : I[1.0] {W}
2918 ALU MOV S14.w : I[1.0] {WL}
2919 ALU MOV S15.x : S14.x {W}
2920 ALU MOV S15.y : S14.y {W}
2921 ALU MOV S15.z : S14.z {W}
2922 ALU MOV S15.w : S1.x@free {WL}
2923 LDS WRITE_REL __.x [ S8.x@free ] : S15.x S15.y
2924 ALU MOV S16.x@free : L[0x8] {WL}
2925 ALU ADD_INT S17.x@free : S16.x@free S7.x {WL}
2926 LDS WRITE_REL __.x [ S17.x@free ] : S15.z S15.w
2927 ALU MOV S18.x@free : R0.z@fully {WL}
2928 ALU MOV S19.y@free : I[0] {WL}
2929 LOAD_BUF S20.xyzw : S19.y@free RID:16 SRF
2930 ALU MUL_UINT24 S21.x@free : S20.x@group S6.x@free {WL}
2931 ALU MULADD_UINT24 S22.x@free : S20.y@group S18.x@free S21.x@free {WL}
2932 ALU MOV S23.x : I[0] {W}
2933 ALU MOV S23.y : L[0x4] {W}
2934 ALU MOV S23.z : L[0x8] {W}
2935 ALU MOV S23.w : L[0xc] {WL}
2936 ALU ADD_INT S24.x : S23.x S22.x@free {W}
2937 ALU ADD_INT S24.y : S23.y S22.x@free {W}
2938 ALU ADD_INT S24.z : S23.z S22.x@free {W}
2939 ALU ADD_INT S24.w : S23.w S22.x@free {WL}
2940 LDS_READ [ S25.x@free S25.y@free S25.z@free S25.w@free ] : [ S24.x S24.y S24.z S24.w ]
2941 ALU MULADD_UINT24 S26.x@free : S5.y@group S18.x@free S7.y {WL}
2942 LDS WRITE_REL __.x [ S26.x@free ] : S25.x@free S25.y@free
2943 ALU ADD_INT S27.x@free : S16.x@free S26.x@free {WL}
2944 LDS WRITE_REL __.x [ S27.x@free ] : S25.z@free S25.w@free
2945 ALU SETE_INT S28.x@free : S18.x@free S3.x@free {WL}
2946 IF (( ALU PRED_SETNE_INT __.z@free : S28.x@free I[0] {LEP} PUSH_BEFORE ))
2947   LDS_READ [ S30.x@free S30.y@free S30.z@free ] : [ S13.x S13.y S13.z ]
2948   ALU MOV S31.x@free : R0.w@fully {WL}
2949   ALU MULADD_UINT24 S32.x@free : S6.x@free S9.x@free S31.x@free {WL}
2950   ALU MOV S33.x : L[0x4] {W}
2951   ALU MOV S33.y : L[0x8] {W}
2952   ALU MOV S33.z : L[0xc] {WL}
2953   ALU ADD_INT S34.x : S32.x@free S33.x {W}
2954   ALU ADD_INT S34.y : S32.x@free S33.y {W}
2955   ALU ADD_INT S34.z : S32.x@free S33.z {WL}
2956   ALU MOV S35.x : S32.x@free {W}
2957   ALU MOV S35.y : S30.x@free {W}
2958   ALU MOV S35.z : S34.x {W}
2959   ALU MOV S35.w : S30.y@free {WL}
2960   ALU MOV S36.x : S34.y {W}
2961   ALU MOV S36.y : S30.z@free {WL}
2962   LDS_READ [ S37.x@free ] : [ S12.x@free ]
2963   ALU MOV S38.x : S34.z {W}
2964   ALU MOV S38.y : S37.x@free {WL}
2965   ALU MOV S39.x@group : S35.x {W}
2966   ALU MOV S39.y@group : S35.y {W}
2967   ALU MOV S40.z@group : S35.z {W}
2968   ALU MOV S40.w@group : S35.w {WL}
2969   WRITE_TF S40.zw__
2970   WRITE_TF S39.xy__
2971   ALU MOV S41.x@group : S36.x {W}
2972   ALU MOV S41.y@group : S36.y {WL}
2973   WRITE_TF S41.xy__
2974   ALU MOV S42.x@group : S38.x {W}
2975   ALU MOV S42.y@group : S38.y {WL}
2976   WRITE_TF S42.xy__
2977 ENDIF)";
2978 
2979 const char *tes_nir =
2980    R"(shader: MESA_SHADER_TESS_EVAL
2981 source_sha1: {0x2db04154, 0x4884cf59, 0x50e43ee6, 0x4bb239d7, 0x0b502229}
2982 name: GLSL5
2983 inputs: 1
2984 outputs: 1
2985 uniforms: 0
2986 shared: 0
2987 ray queries: 0
2988 decl_function main (0 params)
2989 
2990 impl main {
2991    block block_0:
2992    /* preds: */
2993    vec1 32 ssa_0 = load_const (0x40000000)
2994    vec2 32 ssa_1 = intrinsic load_tess_coord_xy () ()
2995    vec1 32 ssa_2 = fadd ssa_1.x, ssa_1.y
2996    vec1 32 ssa_3 = load_const (0x3f800000)
2997    vec1 32 ssa_4 = fsub ssa_3, ssa_2
2998    vec1 32 ssa_5 = ffma ssa_0, ssa_4, ssa_1.y
2999    vec1 32 ssa_6 = f2i32 ssa_5
3000    vec1 32 ssa_7 = load_const (0x00000000)
3001    vec4 32 ssa_8 = intrinsic load_tcs_out_param_base_r600 () ()
3002    vec1 32 ssa_9 = intrinsic load_tcs_rel_patch_id_r600 () ()
3003    vec1 32 ssa_10 = umad24 ssa_8.x, ssa_9, ssa_8.z
3004    vec1 32 ssa_11 = umad24 ssa_8.y, ssa_6, ssa_10
3005    vec4 32 ssa_12 = load_const (0x00000000, 0x00000004, 0x00000008, 0x0000000c)
3006    vec4 32 ssa_13 = iadd ssa_12, ssa_11.xxxx
3007    vec4 32 ssa_14 = intrinsic load_local_shared_r600 (ssa_13) ()
3008    intrinsic store_output (ssa_14, ssa_7) (0, 15, 0, 160, 128)
3009     /* succs: block_1 */
3010     block block_1:
3011 })";
3012 
3013 const char *tes_from_nir_expect =
3014    R"(TES
3015 CHIPCLASS EVERGREEN
3016 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
3017 REGISTERS R0.x@fully R0.y@fully R0.z@fully
3018 SHADER
3019 ALU MOV S1.x@free : L[0x40000000] {WL}
3020 ALU MOV S2.x@free : R0.x@fully {WL}
3021 ALU MOV S2.y@free : R0.y@fully {WL}
3022 ALU ADD S3.x@free : S2.x@free S2.y@free {WL}
3023 ALU MOV S4.x@free : I[1.0] {WL}
3024 ALU ADD S5.x@free : S4.x@free -S3.x@free {WL}
3025 ALU MULADD_IEEE S6.x@free : S1.x@free S5.x@free S2.y@free {WL}
3026 ALU TRUNC S7.x@free : S6.x@free {WL}
3027 ALU FLT_TO_INT S8.x@free : S7.x@free {WL}
3028 ALU MOV S9.x@free : I[0] {WL}
3029 ALU MOV S10.y@free : I[0] {WL}
3030 LOAD_BUF S11.xyzw : S10.y@free + 16b RID:16 SRF
3031 ALU MOV S12.x@free : R0.z@fully {WL}
3032 ALU MULADD_UINT24 S13.x@free : S11.x@group S12.x@free S11.z@group {WL}
3033 ALU MULADD_UINT24 S14.x@free : S11.y@group S8.x@free S13.x@free {WL}
3034 ALU MOV S15.x : I[0] {W}
3035 ALU MOV S15.y : L[0x4] {W}
3036 ALU MOV S15.z : L[0x8] {W}
3037 ALU MOV S15.w : L[0xc] {WL}
3038 ALU ADD_INT S16.x : S15.x S14.x@free {W}
3039 ALU ADD_INT S16.y : S15.y S14.x@free {W}
3040 ALU ADD_INT S16.z : S15.z S14.x@free {W}
3041 ALU ADD_INT S16.w : S15.w S14.x@free {WL}
3042 LDS_READ [ S17.x@group S17.y@group S17.z@group S17.w@group ] : [ S16.x S16.y S16.z S16.w ]
3043 EXPORT_DONE POS 0 S17.xyzw
3044 EXPORT_DONE PARAM 0 R0.____)";
3045 
3046 const char *tes_pre_op =
3047    R"(TES
3048 CHIPCLASS EVERGREEN
3049 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
3050 REGISTERS R0.x@fully R0.y@fully R0.z@fully
3051 SHADER
3052 ALU MOV S1024.x@free : L[0x40000000] {WL}
3053 ALU MOV S1025.x@free : R0.x@fully {WL}
3054 ALU MOV S1025.y@free : R0.y@fully {WL}
3055 ALU ADD S1026.x@free : S1025.x@free S1025.y@free {WL}
3056 ALU MOV S1027.x@free : I[1.0] {WL}
3057 ALU ADD S1028.x@free : S1027.x@free -S1026.x@free {WL}
3058 ALU MULADD_IEEE S1029.x@free : S1024.x@free S1028.x@free S1025.y@free {WL}
3059 ALU TRUNC S1030.x@free : S1029.x@free {WL}
3060 ALU FLT_TO_INT S1031.x@free : S1030.x@free {WL}
3061 ALU MOV S1032.x@free : I[0] {WL}
3062 ALU MOV S1033.y@free : I[0] {WL}
3063 LOAD_BUF S1034.xyzw : S1033.y@free RID:16 SRF
3064 ALU MOV S1035.x@free : R0.z@fully {WL}
3065 ALU MULADD_UINT24 S1036.x@free : S1034.x@group S1035.x@free S1034.z@group {WL}
3066 ALU MULADD_UINT24 S1037.x@free : S1034.y@group S1031.x@free S1036.x@free {WL}
3067 ALU MOV S1038.x : I[0] {W}
3068 ALU MOV S1038.y : L[0x4] {W}
3069 ALU MOV S1038.z : L[0x8] {W}
3070 ALU MOV S1038.w : L[0xc] {WL}
3071 ALU ADD_INT S1039.x : S1038.x S1037.x@free {W}
3072 ALU ADD_INT S1039.y : S1038.y S1037.x@free {W}
3073 ALU ADD_INT S1039.z : S1038.z S1037.x@free {W}
3074 ALU ADD_INT S1039.w : S1038.w S1037.x@free {WL}
3075 LDS_READ [ S1040.x@group S1040.y@group S1040.z@group S1040.w@group ] : [ S1039.x S1039.y S1039.z S1039.w ]
3076 EXPORT_DONE POS 0 S1040.xyzw
3077 EXPORT_DONE PARAM 0 R0.____)";
3078 
3079 const char *tes_optimized =
3080    R"(TES
3081 CHIPCLASS EVERGREEN
3082 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
3083 REGISTERS R0.x@fully R0.y@fully R0.z@fully
3084 SHADER
3085 ALU ADD S1026.x@free : R0.x@fully R0.y@fully {WL}
3086 ALU ADD S1028.x@free : I[1.0] -S1026.x@free {WL}
3087 ALU MULADD_IEEE S1029.x@free : L[0x40000000] S1028.x@free R0.y@fully {WL}
3088 ALU TRUNC S1030.x@free : S1029.x@free {WL}
3089 ALU FLT_TO_INT S1031.x@free : S1030.x@free {WL}
3090 ALU MOV S1033.y@free : I[0] {WL}
3091 LOAD_BUF S1034.xyz_ : S1033.y@free RID:16 SRF
3092 ALU MULADD_UINT24 S1036.x@free : S1034.x@group R0.z@fully S1034.z@group {WL}
3093 ALU MULADD_UINT24 S1037.x@free : S1034.y@group S1031.x@free S1036.x@free {WL}
3094 ALU MOV S1039.x : S1037.x@free {W}
3095 ALU ADD_INT S1039.y : L[0x4] S1037.x@free {W}
3096 ALU ADD_INT S1039.z : L[0x8] S1037.x@free {W}
3097 ALU ADD_INT S1039.w : L[0xc] S1037.x@free {WL}
3098 LDS_READ [ S1040.x@group S1040.y@group S1040.z@group S1040.w@group ] : [ S1039.x S1039.y S1039.z S1039.w ]
3099 EXPORT_DONE POS 0 S1040.xyzw
3100 EXPORT_DONE PARAM 0 R0.____)";
3101 
3102 const char *tes_optimized_pre_sched =
3103    R"(TES
3104 CHIPCLASS EVERGREEN
3105 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
3106 REGISTERS R0.x@fully R0.y@fully R0.z@fully
3107 SHADER
3108 ALU ADD S1026.x@free : R0.x@fully R0.y@fully {WL}
3109 ALU ADD S1028.x@free : I[1.0] -S1026.x@free {WL}
3110 ALU MULADD_IEEE S1029.x@free : L[0x40000000] S1028.x@free R0.y@fully {WL}
3111 ALU TRUNC S1030.x@free : S1029.x@free {WL}
3112 ALU FLT_TO_INT S1031.x@free : S1030.x@free {WL}
3113 ALU MOV S1033.y@free : I[0] {WL}
3114 LOAD_BUF S1034.xyzw : S1033.y@free RID:16 SRF
3115 ALU MULADD_UINT24 S1036.x@free : S1034.x@group R0.z@fully S1034.z@group {WL}
3116 ALU MULADD_UINT24 S1037.x@free : S1034.y@group S1031.x@free S1036.x@free {WL}
3117 ALU ADD_INT S1039.x : I[0] S1037.x@free {W}
3118 ALU ADD_INT S1039.y : L[0x4] S1037.x@free {W}
3119 ALU ADD_INT S1039.z : L[0x8] S1037.x@free {W}
3120 ALU ADD_INT S1039.w : L[0xc] S1037.x@free {WL}
3121 LDS_READ [ S1040.x@group S1040.y@group S1040.z@group S1040.w@group ] : [ S1039.x S1039.y S1039.z S1039.w ]
3122 EXPORT_DONE POS 0 S1040.xyzw
3123 EXPORT_DONE PARAM 0 R0.____)";
3124 
3125 const char *tes_optimized_sched =
3126    R"(TES
3127 CHIPCLASS EVERGREEN
3128 OUTPUT LOC:0 VARYING_SLOT:0 MASK:15
3129 REGISTERS R0.x@fully R0.y@fully R0.z@fully
3130 SHADER
3131 BLOCK_START
3132 ALU_GROUP_BEGIN
3133   ALU ADD S1026.x@chan : R0.x@fully R0.y@fully {W}
3134    ALU MOV S1033.y@chan : I[0] {WL}
3135 ALU_GROUP_END
3136 ALU_GROUP_BEGIN
3137    ALU ADD S1028.x@chan : I[1.0] -S1026.x@chan {WL}
3138 ALU_GROUP_END
3139 ALU_GROUP_BEGIN
3140    ALU MULADD_IEEE S1029.x@chan : L[0x40000000] S1028.x@chan R0.y@fully {WL}
3141 ALU_GROUP_END
3142 ALU_GROUP_BEGIN
3143    ALU TRUNC S1030.x@chan : S1029.x@chan {WL}
3144 ALU_GROUP_END
3145 ALU_GROUP_BEGIN
3146    ALU FLT_TO_INT S1031.x@chan : S1030.x@chan {WL}
3147 ALU_GROUP_END
3148 BLOCK_START
3149 BLOCK_END
3150 LOAD_BUF S1034.xyzw : S1033.y@chan RID:16 SRF
3151 BLOCK_START
3152 BLOCK_END
3153 ALU_GROUP_BEGIN
3154    ALU MULADD_UINT24 S1036.x@chan : S1034.x@group R0.z@fully S1034.z@group {WL}
3155 ALU_GROUP_END
3156 ALU_GROUP_BEGIN
3157    ALU MULADD_UINT24 S1037.x@chan : S1034.y@group S1031.x@chan S1036.x@chan {WL}
3158 ALU_GROUP_END
3159 ALU_GROUP_BEGIN
3160    ALU ADD_INT S1039.x : I[0] S1037.x@chan {W}
3161    ALU ADD_INT S1039.y : L[0x4] S1037.x@chan {W}
3162    ALU ADD_INT S1039.z : L[0x8] S1037.x@chan {W}
3163    ALU ADD_INT S1039.w : L[0xc] S1037.x@chan {WL}
3164 ALU_GROUP_END
3165 ALU_GROUP_BEGIN
3166    ALU LDS READ_RET __.x@chan : S1039.x {L}
3167 ALU_GROUP_END
3168 ALU_GROUP_BEGIN
3169    ALU LDS READ_RET __.x@chan : S1039.y {L}
3170 ALU_GROUP_END
3171 ALU_GROUP_BEGIN
3172    ALU LDS READ_RET __.x@chan : S1039.z {L}
3173 ALU_GROUP_END
3174 ALU_GROUP_BEGIN
3175    ALU LDS READ_RET __.x@chan : S1039.w {L}
3176 ALU_GROUP_END
3177 ALU_GROUP_BEGIN
3178    ALU MOV S1040.x@group : I[LDS_OQ_A_POP] {WL}
3179 ALU_GROUP_END
3180 ALU_GROUP_BEGIN
3181    ALU MOV S1040.y@group : I[LDS_OQ_A_POP] {WL}
3182 ALU_GROUP_END
3183 ALU_GROUP_BEGIN
3184    ALU MOV S1040.z@group : I[LDS_OQ_A_POP] {WL}
3185 ALU_GROUP_END
3186 ALU_GROUP_BEGIN
3187    ALU MOV S1040.w@group : I[LDS_OQ_A_POP] {WL}
3188 ALU_GROUP_END
3189 BLOCK_START
3190 BLOCK_END
3191 EXPORT_DONE POS 0 S1040.xyzw
3192 EXPORT_DONE PARAM 0 R0.____
3193 BLOCK_END)";
3194 
3195 void
SetUp()3196 TestShader::SetUp()
3197 {
3198    init_pool();
3199    SetUpMore();
3200 }
3201 
3202 void
TearDown()3203 TestShader::TearDown()
3204 {
3205    TearDownMore();
3206    release_pool();
3207 }
3208 
3209 void
SetUpMore()3210 TestShader::SetUpMore()
3211 {
3212 }
3213 
3214 void
TearDownMore()3215 TestShader::TearDownMore()
3216 {
3217 }
3218 
3219 Shader *
from_string(const std::string & s)3220 TestShader::from_string(const std::string& s)
3221 {
3222    istringstream is(s);
3223    string line;
3224 
3225    r600_shader_key key = {{0}};
3226    key.ps.nr_cbufs = 1;
3227 
3228    do {
3229       std::getline(is, line);
3230    } while (line.empty());
3231 
3232    Shader *shader = nullptr;
3233 
3234    if (line.substr(0, 2) == "FS")
3235       shader = new FragmentShaderEG(key);
3236    else if (line.substr(0, 2) == "VS")
3237       shader = new VertexShader(nullptr, nullptr, key);
3238    else if (line.substr(0, 2) == "GS")
3239       shader = new GeometryShader(key);
3240    else if (line.substr(0, 3) == "TCS")
3241       shader = new TCSShader(key);
3242    else if (line.substr(0, 3) == "TES")
3243       shader = new TESShader(nullptr, nullptr, key);
3244    else
3245       return nullptr;
3246 
3247    shader->reset_shader_id();
3248 
3249    while (std::getline(is, line)) {
3250       if (line.find_first_not_of(" \t") == std::string::npos)
3251          continue;
3252       if (line[0] == '#')
3253          continue;
3254 
3255       if (line.substr(0, 6) == "SHADER")
3256          break;
3257 
3258       istringstream ls(line);
3259       if (!shader->add_info_from_string(ls)) {
3260          std::cerr << "Don't understand '" << line << "\n";
3261          return nullptr;
3262       }
3263    }
3264 
3265    while (std::getline(is, line)) {
3266       if (line.find_first_not_of(" \t") == std::string::npos)
3267          continue;
3268       if (line[0] == '#')
3269          continue;
3270 
3271       shader->emit_instruction_from_string(line);
3272    }
3273 
3274    return shader;
3275 }
3276 
3277 } // namespace r600
3278