• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright © 2014-2015 Broadcom
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #ifndef NIR_BUILDER_H
25 #define NIR_BUILDER_H
26 
27 #include "util/bitscan.h"
28 #include "util/half_float.h"
29 #include "nir_control_flow.h"
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 struct exec_list;
36 
37 typedef struct nir_builder {
38    nir_cursor cursor;
39 
40    /* Whether new ALU instructions will be marked "exact" */
41    bool exact;
42 
43    /* Whether to run divergence analysis on inserted instructions (loop merge
44     * and header phis are not updated). */
45    bool update_divergence;
46 
47    nir_shader *shader;
48    nir_function_impl *impl;
49 } nir_builder;
50 
51 static inline nir_builder
nir_builder_create(nir_function_impl * impl)52 nir_builder_create(nir_function_impl *impl)
53 {
54    nir_builder b;
55    memset(&b, 0, sizeof(b));
56    b.exact = false;
57    b.impl = impl;
58    b.shader = impl->function->shader;
59    return b;
60 }
61 
62 /* Requires the cursor to be inside a nir_function_impl. */
63 static inline nir_builder
nir_builder_at(nir_cursor cursor)64 nir_builder_at(nir_cursor cursor)
65 {
66    nir_cf_node *current_block = &nir_cursor_current_block(cursor)->cf_node;
67 
68    nir_builder b = nir_builder_create(nir_cf_node_get_function(current_block));
69    b.cursor = cursor;
70    return b;
71 }
72 
73 nir_builder MUST_CHECK PRINTFLIKE(3, 4)
74    nir_builder_init_simple_shader(gl_shader_stage stage,
75                                   const nir_shader_compiler_options *options,
76                                   const char *name, ...);
77 
78 typedef bool (*nir_instr_pass_cb)(struct nir_builder *, nir_instr *, void *);
79 typedef bool (*nir_intrinsic_pass_cb)(struct nir_builder *,
80                                       nir_intrinsic_instr *, void *);
81 
82 /**
83  * Iterates over all the instructions in a NIR function and calls the given pass
84  * on them.
85  *
86  * The pass should return true if it modified the function.  In that case, only
87  * the preserved metadata flags will be preserved in the function impl.
88  *
89  * The builder will be initialized to point at the function impl, but its
90  * cursor is unset.
91  */
92 static inline bool
nir_function_instructions_pass(nir_function_impl * impl,nir_instr_pass_cb pass,nir_metadata preserved,void * cb_data)93 nir_function_instructions_pass(nir_function_impl *impl,
94                                nir_instr_pass_cb pass,
95                                nir_metadata preserved,
96                                void *cb_data)
97 {
98    bool progress = false;
99    nir_builder b = nir_builder_create(impl);
100 
101    nir_foreach_block_safe(block, impl) {
102       nir_foreach_instr_safe(instr, block) {
103          progress |= pass(&b, instr, cb_data);
104       }
105    }
106 
107    if (progress) {
108       nir_metadata_preserve(impl, preserved);
109    } else {
110       nir_metadata_preserve(impl, nir_metadata_all);
111    }
112 
113    return progress;
114 }
115 
116 /**
117  * Iterates over all the instructions in a NIR shader and calls the given pass
118  * on them.
119  *
120  * The pass should return true if it modified the shader.  In that case, only
121  * the preserved metadata flags will be preserved in the function impl.
122  *
123  * The builder will be initialized to point at the function impl, but its
124  * cursor is unset.
125  */
126 static inline bool
nir_shader_instructions_pass(nir_shader * shader,nir_instr_pass_cb pass,nir_metadata preserved,void * cb_data)127 nir_shader_instructions_pass(nir_shader *shader,
128                              nir_instr_pass_cb pass,
129                              nir_metadata preserved,
130                              void *cb_data)
131 {
132    bool progress = false;
133 
134    nir_foreach_function_impl(impl, shader) {
135       progress |= nir_function_instructions_pass(impl, pass,
136                                                  preserved, cb_data);
137    }
138 
139    return progress;
140 }
141 
142 /**
143  * Iterates over all the intrinsics in a NIR shader and calls the given pass on
144  * them.
145  *
146  * The pass should return true if it modified the shader.  In that case, only
147  * the preserved metadata flags will be preserved in the function impl.
148  *
149  * The builder will be initialized to point at the function impl, but its
150  * cursor is unset.
151  */
152 static inline bool
nir_shader_intrinsics_pass(nir_shader * shader,nir_intrinsic_pass_cb pass,nir_metadata preserved,void * cb_data)153 nir_shader_intrinsics_pass(nir_shader *shader,
154                            nir_intrinsic_pass_cb pass,
155                            nir_metadata preserved,
156                            void *cb_data)
157 {
158    bool progress = false;
159 
160    nir_foreach_function_impl(impl, shader) {
161       bool func_progress = false;
162       nir_builder b = nir_builder_create(impl);
163 
164       nir_foreach_block_safe(block, impl) {
165          nir_foreach_instr_safe(instr, block) {
166             if (instr->type == nir_instr_type_intrinsic) {
167                nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
168                func_progress |= pass(&b, intr, cb_data);
169             }
170          }
171       }
172 
173       if (func_progress) {
174          nir_metadata_preserve(impl, preserved);
175          progress = true;
176       } else {
177          nir_metadata_preserve(impl, nir_metadata_all);
178       }
179    }
180 
181    return progress;
182 }
183 
184 void nir_builder_instr_insert(nir_builder *build, nir_instr *instr);
185 
186 static inline nir_instr *
nir_builder_last_instr(nir_builder * build)187 nir_builder_last_instr(nir_builder *build)
188 {
189    assert(build->cursor.option == nir_cursor_after_instr);
190    return build->cursor.instr;
191 }
192 
193 /* General nir_build_alu() taking a variable arg count with NULLs for the rest. */
194 nir_def *
195 nir_build_alu(nir_builder *build, nir_op op, nir_def *src0,
196               nir_def *src1, nir_def *src2, nir_def *src3);
197 
198 /* Fixed-arg-count variants to reduce size of codegen. */
199 nir_def *
200 nir_build_alu1(nir_builder *build, nir_op op, nir_def *src0);
201 nir_def *
202 nir_build_alu2(nir_builder *build, nir_op op, nir_def *src0,
203                nir_def *src1);
204 nir_def *
205 nir_build_alu3(nir_builder *build, nir_op op, nir_def *src0,
206                nir_def *src1, nir_def *src2);
207 nir_def *
208 nir_build_alu4(nir_builder *build, nir_op op, nir_def *src0,
209                nir_def *src1, nir_def *src2, nir_def *src3);
210 
211 nir_def *nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_def **srcs);
212 
213 nir_def *
214 nir_build_tex_deref_instr(nir_builder *build, nir_texop op,
215                           nir_deref_instr *texture,
216                           nir_deref_instr *sampler,
217                           unsigned num_extra_srcs,
218                           const nir_tex_src *extra_srcs);
219 
220 nir_instr *nir_builder_last_instr(nir_builder *build);
221 
222 void nir_builder_cf_insert(nir_builder *build, nir_cf_node *cf);
223 
224 bool nir_builder_is_inside_cf(nir_builder *build, nir_cf_node *cf_node);
225 
226 nir_if *
227 nir_push_if(nir_builder *build, nir_def *condition);
228 
229 nir_if *
230 nir_push_else(nir_builder *build, nir_if *nif);
231 
232 void nir_pop_if(nir_builder *build, nir_if *nif);
233 
234 nir_def *
235 nir_if_phi(nir_builder *build, nir_def *then_def, nir_def *else_def);
236 
237 nir_loop *
238 nir_push_loop(nir_builder *build);
239 
240 nir_loop *
241 nir_push_continue(nir_builder *build, nir_loop *loop);
242 
243 void nir_pop_loop(nir_builder *build, nir_loop *loop);
244 
245 static inline nir_def *
nir_undef(nir_builder * build,unsigned num_components,unsigned bit_size)246 nir_undef(nir_builder *build, unsigned num_components, unsigned bit_size)
247 {
248    nir_undef_instr *undef =
249       nir_undef_instr_create(build->shader, num_components, bit_size);
250    if (!undef)
251       return NULL;
252 
253    nir_instr_insert(nir_before_impl(build->impl), &undef->instr);
254    if (build->update_divergence)
255       nir_update_instr_divergence(build->shader, &undef->instr);
256 
257    return &undef->def;
258 }
259 
260 static inline nir_def *
nir_build_imm(nir_builder * build,unsigned num_components,unsigned bit_size,const nir_const_value * value)261 nir_build_imm(nir_builder *build, unsigned num_components,
262               unsigned bit_size, const nir_const_value *value)
263 {
264    nir_load_const_instr *load_const =
265       nir_load_const_instr_create(build->shader, num_components, bit_size);
266    if (!load_const)
267       return NULL;
268 
269    memcpy(load_const->value, value, sizeof(nir_const_value) * num_components);
270 
271    nir_builder_instr_insert(build, &load_const->instr);
272 
273    return &load_const->def;
274 }
275 
276 static inline nir_def *
nir_imm_zero(nir_builder * build,unsigned num_components,unsigned bit_size)277 nir_imm_zero(nir_builder *build, unsigned num_components, unsigned bit_size)
278 {
279    nir_load_const_instr *load_const =
280       nir_load_const_instr_create(build->shader, num_components, bit_size);
281 
282    /* nir_load_const_instr_create uses rzalloc so it's already zero */
283 
284    nir_builder_instr_insert(build, &load_const->instr);
285 
286    return &load_const->def;
287 }
288 
289 static inline nir_def *
nir_imm_boolN_t(nir_builder * build,bool x,unsigned bit_size)290 nir_imm_boolN_t(nir_builder *build, bool x, unsigned bit_size)
291 {
292    nir_const_value v = nir_const_value_for_bool(x, bit_size);
293    return nir_build_imm(build, 1, bit_size, &v);
294 }
295 
296 static inline nir_def *
nir_imm_bool(nir_builder * build,bool x)297 nir_imm_bool(nir_builder *build, bool x)
298 {
299    return nir_imm_boolN_t(build, x, 1);
300 }
301 
302 static inline nir_def *
nir_imm_true(nir_builder * build)303 nir_imm_true(nir_builder *build)
304 {
305    return nir_imm_bool(build, true);
306 }
307 
308 static inline nir_def *
nir_imm_false(nir_builder * build)309 nir_imm_false(nir_builder *build)
310 {
311    return nir_imm_bool(build, false);
312 }
313 
314 static inline nir_def *
nir_imm_floatN_t(nir_builder * build,double x,unsigned bit_size)315 nir_imm_floatN_t(nir_builder *build, double x, unsigned bit_size)
316 {
317    nir_const_value v = nir_const_value_for_float(x, bit_size);
318    return nir_build_imm(build, 1, bit_size, &v);
319 }
320 
321 static inline nir_def *
nir_imm_float16(nir_builder * build,float x)322 nir_imm_float16(nir_builder *build, float x)
323 {
324    return nir_imm_floatN_t(build, x, 16);
325 }
326 
327 static inline nir_def *
nir_imm_float(nir_builder * build,float x)328 nir_imm_float(nir_builder *build, float x)
329 {
330    return nir_imm_floatN_t(build, x, 32);
331 }
332 
333 static inline nir_def *
nir_imm_double(nir_builder * build,double x)334 nir_imm_double(nir_builder *build, double x)
335 {
336    return nir_imm_floatN_t(build, x, 64);
337 }
338 
339 static inline nir_def *
nir_imm_vec2(nir_builder * build,float x,float y)340 nir_imm_vec2(nir_builder *build, float x, float y)
341 {
342    nir_const_value v[2] = {
343       nir_const_value_for_float(x, 32),
344       nir_const_value_for_float(y, 32),
345    };
346    return nir_build_imm(build, 2, 32, v);
347 }
348 
349 static inline nir_def *
nir_imm_vec3(nir_builder * build,float x,float y,float z)350 nir_imm_vec3(nir_builder *build, float x, float y, float z)
351 {
352    nir_const_value v[3] = {
353       nir_const_value_for_float(x, 32),
354       nir_const_value_for_float(y, 32),
355       nir_const_value_for_float(z, 32),
356    };
357    return nir_build_imm(build, 3, 32, v);
358 }
359 
360 static inline nir_def *
nir_imm_vec4(nir_builder * build,float x,float y,float z,float w)361 nir_imm_vec4(nir_builder *build, float x, float y, float z, float w)
362 {
363    nir_const_value v[4] = {
364       nir_const_value_for_float(x, 32),
365       nir_const_value_for_float(y, 32),
366       nir_const_value_for_float(z, 32),
367       nir_const_value_for_float(w, 32),
368    };
369 
370    return nir_build_imm(build, 4, 32, v);
371 }
372 
373 static inline nir_def *
nir_imm_vec4_16(nir_builder * build,float x,float y,float z,float w)374 nir_imm_vec4_16(nir_builder *build, float x, float y, float z, float w)
375 {
376    nir_const_value v[4] = {
377       nir_const_value_for_float(x, 16),
378       nir_const_value_for_float(y, 16),
379       nir_const_value_for_float(z, 16),
380       nir_const_value_for_float(w, 16),
381    };
382 
383    return nir_build_imm(build, 4, 16, v);
384 }
385 
386 static inline nir_def *
nir_imm_intN_t(nir_builder * build,uint64_t x,unsigned bit_size)387 nir_imm_intN_t(nir_builder *build, uint64_t x, unsigned bit_size)
388 {
389    nir_const_value v = nir_const_value_for_raw_uint(x, bit_size);
390    return nir_build_imm(build, 1, bit_size, &v);
391 }
392 
393 static inline nir_def *
nir_imm_int(nir_builder * build,int x)394 nir_imm_int(nir_builder *build, int x)
395 {
396    return nir_imm_intN_t(build, x, 32);
397 }
398 
399 static inline nir_def *
nir_imm_int64(nir_builder * build,int64_t x)400 nir_imm_int64(nir_builder *build, int64_t x)
401 {
402    return nir_imm_intN_t(build, x, 64);
403 }
404 
405 static inline nir_def *
nir_imm_ivec2(nir_builder * build,int x,int y)406 nir_imm_ivec2(nir_builder *build, int x, int y)
407 {
408    nir_const_value v[2] = {
409       nir_const_value_for_int(x, 32),
410       nir_const_value_for_int(y, 32),
411    };
412 
413    return nir_build_imm(build, 2, 32, v);
414 }
415 
416 static inline nir_def *
nir_imm_ivec3(nir_builder * build,int x,int y,int z)417 nir_imm_ivec3(nir_builder *build, int x, int y, int z)
418 {
419    nir_const_value v[3] = {
420       nir_const_value_for_int(x, 32),
421       nir_const_value_for_int(y, 32),
422       nir_const_value_for_int(z, 32),
423    };
424 
425    return nir_build_imm(build, 3, 32, v);
426 }
427 
428 static inline nir_def *
nir_imm_ivec4(nir_builder * build,int x,int y,int z,int w)429 nir_imm_ivec4(nir_builder *build, int x, int y, int z, int w)
430 {
431    nir_const_value v[4] = {
432       nir_const_value_for_int(x, 32),
433       nir_const_value_for_int(y, 32),
434       nir_const_value_for_int(z, 32),
435       nir_const_value_for_int(w, 32),
436    };
437 
438    return nir_build_imm(build, 4, 32, v);
439 }
440 
441 nir_def *
442 nir_builder_alu_instr_finish_and_insert(nir_builder *build, nir_alu_instr *instr);
443 
444 /* for the couple special cases with more than 4 src args: */
445 nir_def *
446 nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_def **srcs);
447 
448 /* Generic builder for system values. */
449 nir_def *
450 nir_load_system_value(nir_builder *build, nir_intrinsic_op op, int index,
451                       unsigned num_components, unsigned bit_size);
452 
453 #include "nir_builder_opcodes.h"
454 #undef nir_deref_mode_is
455 
456 nir_def *
457 nir_type_convert(nir_builder *b,
458                  nir_def *src,
459                  nir_alu_type src_type,
460                  nir_alu_type dest_type,
461                  nir_rounding_mode rnd);
462 
463 static inline nir_def *
nir_convert_to_bit_size(nir_builder * b,nir_def * src,nir_alu_type type,unsigned bit_size)464 nir_convert_to_bit_size(nir_builder *b,
465                         nir_def *src,
466                         nir_alu_type type,
467                         unsigned bit_size)
468 {
469    return nir_type_convert(b, src, type, (nir_alu_type)(type | bit_size),
470                            nir_rounding_mode_undef);
471 }
472 
473 static inline nir_def *
nir_i2iN(nir_builder * b,nir_def * src,unsigned bit_size)474 nir_i2iN(nir_builder *b, nir_def *src, unsigned bit_size)
475 {
476    return nir_convert_to_bit_size(b, src, nir_type_int, bit_size);
477 }
478 
479 static inline nir_def *
nir_u2uN(nir_builder * b,nir_def * src,unsigned bit_size)480 nir_u2uN(nir_builder *b, nir_def *src, unsigned bit_size)
481 {
482    return nir_convert_to_bit_size(b, src, nir_type_uint, bit_size);
483 }
484 
485 static inline nir_def *
nir_b2bN(nir_builder * b,nir_def * src,unsigned bit_size)486 nir_b2bN(nir_builder *b, nir_def *src, unsigned bit_size)
487 {
488    return nir_convert_to_bit_size(b, src, nir_type_bool, bit_size);
489 }
490 
491 static inline nir_def *
nir_f2fN(nir_builder * b,nir_def * src,unsigned bit_size)492 nir_f2fN(nir_builder *b, nir_def *src, unsigned bit_size)
493 {
494    return nir_convert_to_bit_size(b, src, nir_type_float, bit_size);
495 }
496 
497 static inline nir_def *
nir_i2b(nir_builder * b,nir_def * src)498 nir_i2b(nir_builder *b, nir_def *src)
499 {
500    return nir_ine_imm(b, src, 0);
501 }
502 
503 static inline nir_def *
nir_b2iN(nir_builder * b,nir_def * src,uint32_t bit_size)504 nir_b2iN(nir_builder *b, nir_def *src, uint32_t bit_size)
505 {
506    return nir_type_convert(b, src, nir_type_bool,
507                            (nir_alu_type)(nir_type_int | bit_size),
508                            nir_rounding_mode_undef);
509 }
510 
511 static inline nir_def *
nir_b2fN(nir_builder * b,nir_def * src,uint32_t bit_size)512 nir_b2fN(nir_builder *b, nir_def *src, uint32_t bit_size)
513 {
514    return nir_type_convert(b, src, nir_type_bool,
515                            (nir_alu_type)(nir_type_float | bit_size),
516                            nir_rounding_mode_undef);
517 }
518 
519 static inline nir_def *
nir_i2fN(nir_builder * b,nir_def * src,unsigned bit_size)520 nir_i2fN(nir_builder *b, nir_def *src, unsigned bit_size)
521 {
522    return nir_type_convert(b, src, nir_type_int,
523                            (nir_alu_type)(nir_type_float | bit_size),
524                            nir_rounding_mode_undef);
525 }
526 
527 static inline nir_def *
nir_u2fN(nir_builder * b,nir_def * src,unsigned bit_size)528 nir_u2fN(nir_builder *b, nir_def *src, unsigned bit_size)
529 {
530    return nir_type_convert(b, src, nir_type_uint,
531                            (nir_alu_type)(nir_type_float | bit_size),
532                            nir_rounding_mode_undef);
533 }
534 
535 static inline nir_def *
nir_f2uN(nir_builder * b,nir_def * src,unsigned bit_size)536 nir_f2uN(nir_builder *b, nir_def *src, unsigned bit_size)
537 {
538    return nir_type_convert(b, src, nir_type_float,
539                            (nir_alu_type)(nir_type_uint | bit_size),
540                            nir_rounding_mode_undef);
541 }
542 
543 static inline nir_def *
nir_f2iN(nir_builder * b,nir_def * src,unsigned bit_size)544 nir_f2iN(nir_builder *b, nir_def *src, unsigned bit_size)
545 {
546    return nir_type_convert(b, src, nir_type_float,
547                            (nir_alu_type)(nir_type_int | bit_size),
548                            nir_rounding_mode_undef);
549 }
550 
551 static inline nir_def *
nir_vec(nir_builder * build,nir_def ** comp,unsigned num_components)552 nir_vec(nir_builder *build, nir_def **comp, unsigned num_components)
553 {
554    return nir_build_alu_src_arr(build, nir_op_vec(num_components), comp);
555 }
556 
557 nir_def *
558 nir_vec_scalars(nir_builder *build, nir_scalar *comp, unsigned num_components);
559 
560 static inline nir_def *
nir_mov_alu(nir_builder * build,nir_alu_src src,unsigned num_components)561 nir_mov_alu(nir_builder *build, nir_alu_src src, unsigned num_components)
562 {
563    if (src.src.ssa->num_components == num_components) {
564       bool any_swizzles = false;
565       for (unsigned i = 0; i < num_components; i++) {
566          if (src.swizzle[i] != i)
567             any_swizzles = true;
568       }
569       if (!any_swizzles)
570          return src.src.ssa;
571    }
572 
573    nir_alu_instr *mov = nir_alu_instr_create(build->shader, nir_op_mov);
574    nir_def_init(&mov->instr, &mov->def, num_components,
575                 nir_src_bit_size(src.src));
576    mov->exact = build->exact;
577    mov->src[0] = src;
578    nir_builder_instr_insert(build, &mov->instr);
579 
580    return &mov->def;
581 }
582 
583 /**
584  * Construct a mov that reswizzles the source's components.
585  */
586 static inline nir_def *
nir_swizzle(nir_builder * build,nir_def * src,const unsigned * swiz,unsigned num_components)587 nir_swizzle(nir_builder *build, nir_def *src, const unsigned *swiz,
588             unsigned num_components)
589 {
590    assert(num_components <= NIR_MAX_VEC_COMPONENTS);
591    nir_alu_src alu_src = { NIR_SRC_INIT };
592    alu_src.src = nir_src_for_ssa(src);
593 
594    bool is_identity_swizzle = true;
595    for (unsigned i = 0; i < num_components && i < NIR_MAX_VEC_COMPONENTS; i++) {
596       if (swiz[i] != i)
597          is_identity_swizzle = false;
598       alu_src.swizzle[i] = swiz[i];
599    }
600 
601    if (num_components == src->num_components && is_identity_swizzle)
602       return src;
603 
604    return nir_mov_alu(build, alu_src, num_components);
605 }
606 
607 /* Selects the right fdot given the number of components in each source. */
608 static inline nir_def *
nir_fdot(nir_builder * build,nir_def * src0,nir_def * src1)609 nir_fdot(nir_builder *build, nir_def *src0, nir_def *src1)
610 {
611    assert(src0->num_components == src1->num_components);
612    switch (src0->num_components) {
613    case 1:
614       return nir_fmul(build, src0, src1);
615    case 2:
616       return nir_fdot2(build, src0, src1);
617    case 3:
618       return nir_fdot3(build, src0, src1);
619    case 4:
620       return nir_fdot4(build, src0, src1);
621    case 5:
622       return nir_fdot5(build, src0, src1);
623    case 8:
624       return nir_fdot8(build, src0, src1);
625    case 16:
626       return nir_fdot16(build, src0, src1);
627    default:
628       unreachable("bad component size");
629    }
630 
631    return NULL;
632 }
633 
634 static inline nir_def *
nir_ball_iequal(nir_builder * b,nir_def * src0,nir_def * src1)635 nir_ball_iequal(nir_builder *b, nir_def *src0, nir_def *src1)
636 {
637    switch (src0->num_components) {
638    case 1:
639       return nir_ieq(b, src0, src1);
640    case 2:
641       return nir_ball_iequal2(b, src0, src1);
642    case 3:
643       return nir_ball_iequal3(b, src0, src1);
644    case 4:
645       return nir_ball_iequal4(b, src0, src1);
646    case 5:
647       return nir_ball_iequal5(b, src0, src1);
648    case 8:
649       return nir_ball_iequal8(b, src0, src1);
650    case 16:
651       return nir_ball_iequal16(b, src0, src1);
652    default:
653       unreachable("bad component size");
654    }
655 }
656 
657 static inline nir_def *
nir_ball(nir_builder * b,nir_def * src)658 nir_ball(nir_builder *b, nir_def *src)
659 {
660    return nir_ball_iequal(b, src, nir_imm_true(b));
661 }
662 
663 static inline nir_def *
nir_bany_inequal(nir_builder * b,nir_def * src0,nir_def * src1)664 nir_bany_inequal(nir_builder *b, nir_def *src0, nir_def *src1)
665 {
666    switch (src0->num_components) {
667    case 1:
668       return nir_ine(b, src0, src1);
669    case 2:
670       return nir_bany_inequal2(b, src0, src1);
671    case 3:
672       return nir_bany_inequal3(b, src0, src1);
673    case 4:
674       return nir_bany_inequal4(b, src0, src1);
675    case 5:
676       return nir_bany_inequal5(b, src0, src1);
677    case 8:
678       return nir_bany_inequal8(b, src0, src1);
679    case 16:
680       return nir_bany_inequal16(b, src0, src1);
681    default:
682       unreachable("bad component size");
683    }
684 }
685 
686 static inline nir_def *
nir_bany(nir_builder * b,nir_def * src)687 nir_bany(nir_builder *b, nir_def *src)
688 {
689    return nir_bany_inequal(b, src, nir_imm_false(b));
690 }
691 
692 static inline nir_def *
nir_channel(nir_builder * b,nir_def * def,unsigned c)693 nir_channel(nir_builder *b, nir_def *def, unsigned c)
694 {
695    return nir_swizzle(b, def, &c, 1);
696 }
697 
698 static inline nir_def *
nir_channels(nir_builder * b,nir_def * def,nir_component_mask_t mask)699 nir_channels(nir_builder *b, nir_def *def, nir_component_mask_t mask)
700 {
701    unsigned num_channels = 0, swizzle[NIR_MAX_VEC_COMPONENTS] = { 0 };
702 
703    for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
704       if ((mask & (1 << i)) == 0)
705          continue;
706       swizzle[num_channels++] = i;
707    }
708 
709    return nir_swizzle(b, def, swizzle, num_channels);
710 }
711 
712 static inline nir_def *
_nir_select_from_array_helper(nir_builder * b,nir_def ** arr,nir_def * idx,unsigned start,unsigned end)713 _nir_select_from_array_helper(nir_builder *b, nir_def **arr,
714                               nir_def *idx,
715                               unsigned start, unsigned end)
716 {
717    if (start == end - 1) {
718       return arr[start];
719    } else {
720       unsigned mid = start + (end - start) / 2;
721       return nir_bcsel(b, nir_ilt_imm(b, idx, mid),
722                        _nir_select_from_array_helper(b, arr, idx, start, mid),
723                        _nir_select_from_array_helper(b, arr, idx, mid, end));
724    }
725 }
726 
727 static inline nir_def *
nir_select_from_ssa_def_array(nir_builder * b,nir_def ** arr,unsigned arr_len,nir_def * idx)728 nir_select_from_ssa_def_array(nir_builder *b, nir_def **arr,
729                               unsigned arr_len, nir_def *idx)
730 {
731    return _nir_select_from_array_helper(b, arr, idx, 0, arr_len);
732 }
733 
734 static inline nir_def *
nir_vector_extract(nir_builder * b,nir_def * vec,nir_def * c)735 nir_vector_extract(nir_builder *b, nir_def *vec, nir_def *c)
736 {
737    nir_src c_src = nir_src_for_ssa(c);
738    if (nir_src_is_const(c_src)) {
739       uint64_t c_const = nir_src_as_uint(c_src);
740       if (c_const < vec->num_components)
741          return nir_channel(b, vec, c_const);
742       else
743          return nir_undef(b, 1, vec->bit_size);
744    } else {
745       nir_def *comps[NIR_MAX_VEC_COMPONENTS];
746       for (unsigned i = 0; i < vec->num_components; i++)
747          comps[i] = nir_channel(b, vec, i);
748       return nir_select_from_ssa_def_array(b, comps, vec->num_components, c);
749    }
750 }
751 
752 /** Replaces the component of `vec` specified by `c` with `scalar` */
753 static inline nir_def *
nir_vector_insert_imm(nir_builder * b,nir_def * vec,nir_def * scalar,unsigned c)754 nir_vector_insert_imm(nir_builder *b, nir_def *vec,
755                       nir_def *scalar, unsigned c)
756 {
757    assert(scalar->num_components == 1);
758    assert(c < vec->num_components);
759 
760    nir_op vec_op = nir_op_vec(vec->num_components);
761    nir_alu_instr *vec_instr = nir_alu_instr_create(b->shader, vec_op);
762 
763    for (unsigned i = 0; i < vec->num_components; i++) {
764       if (i == c) {
765          vec_instr->src[i].src = nir_src_for_ssa(scalar);
766          vec_instr->src[i].swizzle[0] = 0;
767       } else {
768          vec_instr->src[i].src = nir_src_for_ssa(vec);
769          vec_instr->src[i].swizzle[0] = i;
770       }
771    }
772 
773    return nir_builder_alu_instr_finish_and_insert(b, vec_instr);
774 }
775 
776 /** Replaces the component of `vec` specified by `c` with `scalar` */
777 static inline nir_def *
nir_vector_insert(nir_builder * b,nir_def * vec,nir_def * scalar,nir_def * c)778 nir_vector_insert(nir_builder *b, nir_def *vec, nir_def *scalar,
779                   nir_def *c)
780 {
781    assert(scalar->num_components == 1);
782    assert(c->num_components == 1);
783 
784    nir_src c_src = nir_src_for_ssa(c);
785    if (nir_src_is_const(c_src)) {
786       uint64_t c_const = nir_src_as_uint(c_src);
787       if (c_const < vec->num_components)
788          return nir_vector_insert_imm(b, vec, scalar, c_const);
789       else
790          return vec;
791    } else {
792       nir_const_value per_comp_idx_const[NIR_MAX_VEC_COMPONENTS];
793       for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++)
794          per_comp_idx_const[i] = nir_const_value_for_int(i, c->bit_size);
795       nir_def *per_comp_idx =
796          nir_build_imm(b, vec->num_components,
797                        c->bit_size, per_comp_idx_const);
798 
799       /* nir_builder will automatically splat out scalars to vectors so an
800        * insert is as simple as "if I'm the channel, replace me with the
801        * scalar."
802        */
803       return nir_bcsel(b, nir_ieq(b, c, per_comp_idx), scalar, vec);
804    }
805 }
806 
807 static inline nir_def *
nir_replicate(nir_builder * b,nir_def * scalar,unsigned num_components)808 nir_replicate(nir_builder *b, nir_def *scalar, unsigned num_components)
809 {
810    assert(scalar->num_components == 1);
811    assert(num_components <= NIR_MAX_VEC_COMPONENTS);
812 
813    nir_def *copies[NIR_MAX_VEC_COMPONENTS] = { NULL };
814    for (unsigned i = 0; i < num_components; ++i)
815       copies[i] = scalar;
816 
817    return nir_vec(b, copies, num_components);
818 }
819 
820 static inline nir_def *
nir_iadd_imm(nir_builder * build,nir_def * x,uint64_t y)821 nir_iadd_imm(nir_builder *build, nir_def *x, uint64_t y)
822 {
823    assert(x->bit_size <= 64);
824    y &= BITFIELD64_MASK(x->bit_size);
825 
826    if (y == 0) {
827       return x;
828    } else {
829       return nir_iadd(build, x, nir_imm_intN_t(build, y, x->bit_size));
830    }
831 }
832 
833 static inline nir_def *
nir_iadd_imm_nuw(nir_builder * b,nir_def * x,uint64_t y)834 nir_iadd_imm_nuw(nir_builder *b, nir_def *x, uint64_t y)
835 {
836    nir_def *d = nir_iadd_imm(b, x, y);
837    if (d != x && d->parent_instr->type == nir_instr_type_alu)
838       nir_instr_as_alu(d->parent_instr)->no_unsigned_wrap = true;
839    return d;
840 }
841 
842 static inline nir_def *
nir_iadd_nuw(nir_builder * b,nir_def * x,nir_def * y)843 nir_iadd_nuw(nir_builder *b, nir_def *x, nir_def *y)
844 {
845    nir_def *d = nir_iadd(b, x, y);
846    nir_instr_as_alu(d->parent_instr)->no_unsigned_wrap = true;
847    return d;
848 }
849 
850 static inline nir_def *
nir_fgt_imm(nir_builder * build,nir_def * src1,double src2)851 nir_fgt_imm(nir_builder *build, nir_def *src1, double src2)
852 {
853    return nir_flt(build, nir_imm_floatN_t(build, src2, src1->bit_size), src1);
854 }
855 
856 static inline nir_def *
nir_fle_imm(nir_builder * build,nir_def * src1,double src2)857 nir_fle_imm(nir_builder *build, nir_def *src1, double src2)
858 {
859    return nir_fge(build, nir_imm_floatN_t(build, src2, src1->bit_size), src1);
860 }
861 
862 /* Use nir_iadd(x, -y) for reversing parameter ordering */
863 static inline nir_def *
nir_isub_imm(nir_builder * build,uint64_t y,nir_def * x)864 nir_isub_imm(nir_builder *build, uint64_t y, nir_def *x)
865 {
866    return nir_isub(build, nir_imm_intN_t(build, y, x->bit_size), x);
867 }
868 
869 static inline nir_def *
_nir_mul_imm(nir_builder * build,nir_def * x,uint64_t y,bool amul)870 _nir_mul_imm(nir_builder *build, nir_def *x, uint64_t y, bool amul)
871 {
872    assert(x->bit_size <= 64);
873    y &= BITFIELD64_MASK(x->bit_size);
874 
875    if (y == 0) {
876       return nir_imm_intN_t(build, 0, x->bit_size);
877    } else if (y == 1) {
878       return x;
879    } else if ((!build->shader->options ||
880                !build->shader->options->lower_bitops) &&
881               util_is_power_of_two_or_zero64(y)) {
882       return nir_ishl(build, x, nir_imm_int(build, ffsll(y) - 1));
883    } else if (amul) {
884       return nir_amul(build, x, nir_imm_intN_t(build, y, x->bit_size));
885    } else {
886       return nir_imul(build, x, nir_imm_intN_t(build, y, x->bit_size));
887    }
888 }
889 
890 static inline nir_def *
nir_imul_imm(nir_builder * build,nir_def * x,uint64_t y)891 nir_imul_imm(nir_builder *build, nir_def *x, uint64_t y)
892 {
893    return _nir_mul_imm(build, x, y, false);
894 }
895 
896 static inline nir_def *
nir_amul_imm(nir_builder * build,nir_def * x,uint64_t y)897 nir_amul_imm(nir_builder *build, nir_def *x, uint64_t y)
898 {
899    return _nir_mul_imm(build, x, y, true);
900 }
901 
902 static inline nir_def *
nir_fadd_imm(nir_builder * build,nir_def * x,double y)903 nir_fadd_imm(nir_builder *build, nir_def *x, double y)
904 {
905    return nir_fadd(build, x, nir_imm_floatN_t(build, y, x->bit_size));
906 }
907 
908 static inline nir_def *
nir_fsub_imm(nir_builder * build,double x,nir_def * y)909 nir_fsub_imm(nir_builder *build, double x, nir_def *y)
910 {
911    return nir_fsub(build, nir_imm_floatN_t(build, x, y->bit_size), y);
912 }
913 
914 static inline nir_def *
nir_fmul_imm(nir_builder * build,nir_def * x,double y)915 nir_fmul_imm(nir_builder *build, nir_def *x, double y)
916 {
917    return nir_fmul(build, x, nir_imm_floatN_t(build, y, x->bit_size));
918 }
919 
920 static inline nir_def *
nir_fdiv_imm(nir_builder * build,nir_def * x,double y)921 nir_fdiv_imm(nir_builder *build, nir_def *x, double y)
922 {
923    return nir_fdiv(build, x, nir_imm_floatN_t(build, y, x->bit_size));
924 }
925 
926 static inline nir_def *
nir_iand_imm(nir_builder * build,nir_def * x,uint64_t y)927 nir_iand_imm(nir_builder *build, nir_def *x, uint64_t y)
928 {
929    assert(x->bit_size <= 64);
930    y &= BITFIELD64_MASK(x->bit_size);
931 
932    if (y == 0) {
933       return nir_imm_intN_t(build, 0, x->bit_size);
934    } else if (y == BITFIELD64_MASK(x->bit_size)) {
935       return x;
936    } else {
937       return nir_iand(build, x, nir_imm_intN_t(build, y, x->bit_size));
938    }
939 }
940 
941 static inline nir_def *
nir_test_mask(nir_builder * build,nir_def * x,uint64_t mask)942 nir_test_mask(nir_builder *build, nir_def *x, uint64_t mask)
943 {
944    assert(mask <= BITFIELD64_MASK(x->bit_size));
945    return nir_ine_imm(build, nir_iand_imm(build, x, mask), 0);
946 }
947 
948 static inline nir_def *
nir_ior_imm(nir_builder * build,nir_def * x,uint64_t y)949 nir_ior_imm(nir_builder *build, nir_def *x, uint64_t y)
950 {
951    assert(x->bit_size <= 64);
952    y &= BITFIELD64_MASK(x->bit_size);
953 
954    if (y == 0) {
955       return x;
956    } else if (y == BITFIELD64_MASK(x->bit_size)) {
957       return nir_imm_intN_t(build, y, x->bit_size);
958    } else
959       return nir_ior(build, x, nir_imm_intN_t(build, y, x->bit_size));
960 }
961 
962 static inline nir_def *
nir_ishl_imm(nir_builder * build,nir_def * x,uint32_t y)963 nir_ishl_imm(nir_builder *build, nir_def *x, uint32_t y)
964 {
965    if (y == 0) {
966       return x;
967    } else {
968       assert(y < x->bit_size);
969       return nir_ishl(build, x, nir_imm_int(build, y));
970    }
971 }
972 
973 static inline nir_def *
nir_ishr_imm(nir_builder * build,nir_def * x,uint32_t y)974 nir_ishr_imm(nir_builder *build, nir_def *x, uint32_t y)
975 {
976    if (y == 0) {
977       return x;
978    } else {
979       return nir_ishr(build, x, nir_imm_int(build, y));
980    }
981 }
982 
983 static inline nir_def *
nir_ushr_imm(nir_builder * build,nir_def * x,uint32_t y)984 nir_ushr_imm(nir_builder *build, nir_def *x, uint32_t y)
985 {
986    if (y == 0) {
987       return x;
988    } else {
989       return nir_ushr(build, x, nir_imm_int(build, y));
990    }
991 }
992 
993 static inline nir_def *
nir_imod_imm(nir_builder * build,nir_def * x,uint64_t y)994 nir_imod_imm(nir_builder *build, nir_def *x, uint64_t y)
995 {
996    return nir_imod(build, x, nir_imm_intN_t(build, y, x->bit_size));
997 }
998 
999 static inline nir_def *
nir_udiv_imm(nir_builder * build,nir_def * x,uint64_t y)1000 nir_udiv_imm(nir_builder *build, nir_def *x, uint64_t y)
1001 {
1002    assert(x->bit_size <= 64);
1003    y &= BITFIELD64_MASK(x->bit_size);
1004 
1005    if (y == 1) {
1006       return x;
1007    } else if (util_is_power_of_two_nonzero64(y)) {
1008       return nir_ushr_imm(build, x, ffsll(y) - 1);
1009    } else {
1010       return nir_udiv(build, x, nir_imm_intN_t(build, y, x->bit_size));
1011    }
1012 }
1013 
1014 static inline nir_def *
nir_umod_imm(nir_builder * build,nir_def * x,uint64_t y)1015 nir_umod_imm(nir_builder *build, nir_def *x, uint64_t y)
1016 {
1017    assert(y > 0 && y <= u_uintN_max(x->bit_size));
1018 
1019    if (util_is_power_of_two_nonzero64(y)) {
1020       return nir_iand_imm(build, x, y - 1);
1021    } else {
1022       return nir_umod(build, x, nir_imm_intN_t(build, y, x->bit_size));
1023    }
1024 }
1025 
1026 static inline nir_def *
nir_ibfe_imm(nir_builder * build,nir_def * x,uint32_t offset,uint32_t size)1027 nir_ibfe_imm(nir_builder *build, nir_def *x, uint32_t offset, uint32_t size)
1028 {
1029    return nir_ibfe(build, x, nir_imm_int(build, offset), nir_imm_int(build, size));
1030 }
1031 
1032 static inline nir_def *
nir_ubfe_imm(nir_builder * build,nir_def * x,uint32_t offset,uint32_t size)1033 nir_ubfe_imm(nir_builder *build, nir_def *x, uint32_t offset, uint32_t size)
1034 {
1035    return nir_ubfe(build, x, nir_imm_int(build, offset), nir_imm_int(build, size));
1036 }
1037 
1038 static inline nir_def *
nir_ubitfield_extract_imm(nir_builder * build,nir_def * x,uint32_t offset,uint32_t size)1039 nir_ubitfield_extract_imm(nir_builder *build, nir_def *x, uint32_t offset, uint32_t size)
1040 {
1041    return nir_ubitfield_extract(build, x, nir_imm_int(build, offset), nir_imm_int(build, size));
1042 }
1043 
1044 static inline nir_def *
nir_extract_u8_imm(nir_builder * b,nir_def * a,unsigned i)1045 nir_extract_u8_imm(nir_builder *b, nir_def *a, unsigned i)
1046 {
1047    return nir_extract_u8(b, a, nir_imm_intN_t(b, i, a->bit_size));
1048 }
1049 
1050 static inline nir_def *
nir_extract_i8_imm(nir_builder * b,nir_def * a,unsigned i)1051 nir_extract_i8_imm(nir_builder *b, nir_def *a, unsigned i)
1052 {
1053    return nir_extract_i8(b, a, nir_imm_intN_t(b, i, a->bit_size));
1054 }
1055 
1056 static inline nir_def *
nir_fclamp(nir_builder * b,nir_def * x,nir_def * min_val,nir_def * max_val)1057 nir_fclamp(nir_builder *b,
1058            nir_def *x, nir_def *min_val, nir_def *max_val)
1059 {
1060    return nir_fmin(b, nir_fmax(b, x, min_val), max_val);
1061 }
1062 
1063 static inline nir_def *
nir_iclamp(nir_builder * b,nir_def * x,nir_def * min_val,nir_def * max_val)1064 nir_iclamp(nir_builder *b,
1065            nir_def *x, nir_def *min_val, nir_def *max_val)
1066 {
1067    return nir_imin(b, nir_imax(b, x, min_val), max_val);
1068 }
1069 
1070 static inline nir_def *
nir_uclamp(nir_builder * b,nir_def * x,nir_def * min_val,nir_def * max_val)1071 nir_uclamp(nir_builder *b,
1072            nir_def *x, nir_def *min_val, nir_def *max_val)
1073 {
1074    return nir_umin(b, nir_umax(b, x, min_val), max_val);
1075 }
1076 
1077 static inline nir_def *
nir_ffma_imm12(nir_builder * build,nir_def * src0,double src1,double src2)1078 nir_ffma_imm12(nir_builder *build, nir_def *src0, double src1, double src2)
1079 {
1080    if (build->shader->options &&
1081        build->shader->options->avoid_ternary_with_two_constants)
1082       return nir_fadd_imm(build, nir_fmul_imm(build, src0, src1), src2);
1083    else
1084       return nir_ffma(build, src0, nir_imm_floatN_t(build, src1, src0->bit_size),
1085                       nir_imm_floatN_t(build, src2, src0->bit_size));
1086 }
1087 
1088 static inline nir_def *
nir_ffma_imm1(nir_builder * build,nir_def * src0,double src1,nir_def * src2)1089 nir_ffma_imm1(nir_builder *build, nir_def *src0, double src1, nir_def *src2)
1090 {
1091    return nir_ffma(build, src0, nir_imm_floatN_t(build, src1, src0->bit_size), src2);
1092 }
1093 
1094 static inline nir_def *
nir_ffma_imm2(nir_builder * build,nir_def * src0,nir_def * src1,double src2)1095 nir_ffma_imm2(nir_builder *build, nir_def *src0, nir_def *src1, double src2)
1096 {
1097    return nir_ffma(build, src0, src1, nir_imm_floatN_t(build, src2, src0->bit_size));
1098 }
1099 
1100 static inline nir_def *
nir_a_minus_bc(nir_builder * build,nir_def * src0,nir_def * src1,nir_def * src2)1101 nir_a_minus_bc(nir_builder *build, nir_def *src0, nir_def *src1,
1102                nir_def *src2)
1103 {
1104    return nir_ffma(build, nir_fneg(build, src1), src2, src0);
1105 }
1106 
1107 static inline nir_def *
nir_pack_bits(nir_builder * b,nir_def * src,unsigned dest_bit_size)1108 nir_pack_bits(nir_builder *b, nir_def *src, unsigned dest_bit_size)
1109 {
1110    assert(src->num_components * src->bit_size == dest_bit_size);
1111 
1112    switch (dest_bit_size) {
1113    case 64:
1114       switch (src->bit_size) {
1115       case 32:
1116          return nir_pack_64_2x32(b, src);
1117       case 16:
1118          return nir_pack_64_4x16(b, src);
1119       default:
1120          break;
1121       }
1122       break;
1123 
1124    case 32:
1125       switch (src->bit_size) {
1126       case 32: return src;
1127       case 16: return nir_pack_32_2x16(b, src);
1128       case 8: return nir_pack_32_4x8(b, src);
1129       default: break;
1130       }
1131 
1132       break;
1133 
1134    default:
1135       break;
1136    }
1137 
1138    /* If we got here, we have no dedicated unpack opcode. */
1139    nir_def *dest = nir_imm_intN_t(b, 0, dest_bit_size);
1140    for (unsigned i = 0; i < src->num_components; i++) {
1141       nir_def *val = nir_u2uN(b, nir_channel(b, src, i), dest_bit_size);
1142       val = nir_ishl(b, val, nir_imm_int(b, i * src->bit_size));
1143       dest = nir_ior(b, dest, val);
1144    }
1145    return dest;
1146 }
1147 
1148 static inline nir_def *
nir_unpack_bits(nir_builder * b,nir_def * src,unsigned dest_bit_size)1149 nir_unpack_bits(nir_builder *b, nir_def *src, unsigned dest_bit_size)
1150 {
1151    assert(src->num_components == 1);
1152    assert(src->bit_size >= dest_bit_size);
1153    const unsigned dest_num_components = src->bit_size / dest_bit_size;
1154    assert(dest_num_components <= NIR_MAX_VEC_COMPONENTS);
1155 
1156    switch (src->bit_size) {
1157    case 64:
1158       switch (dest_bit_size) {
1159       case 32:
1160          return nir_unpack_64_2x32(b, src);
1161       case 16:
1162          return nir_unpack_64_4x16(b, src);
1163       default:
1164          break;
1165       }
1166       break;
1167 
1168    case 32:
1169       switch (dest_bit_size) {
1170       case 32: return src;
1171       case 16: return nir_unpack_32_2x16(b, src);
1172       case 8: return nir_unpack_32_4x8(b, src);
1173       default: break;
1174       }
1175 
1176       break;
1177 
1178    default:
1179       break;
1180    }
1181 
1182    /* If we got here, we have no dedicated unpack opcode. */
1183    nir_def *dest_comps[NIR_MAX_VEC_COMPONENTS];
1184    for (unsigned i = 0; i < dest_num_components; i++) {
1185       nir_def *val = nir_ushr_imm(b, src, i * dest_bit_size);
1186       dest_comps[i] = nir_u2uN(b, val, dest_bit_size);
1187    }
1188    return nir_vec(b, dest_comps, dest_num_components);
1189 }
1190 
1191 /**
1192  * Treats srcs as if it's one big blob of bits and extracts the range of bits
1193  * given by
1194  *
1195  *       [first_bit, first_bit + dest_num_components * dest_bit_size)
1196  *
1197  * The range can have any alignment or size as long as it's an integer number
1198  * of destination components and fits inside the concatenated sources.
1199  *
1200  * TODO: The one caveat here is that we can't handle byte alignment if 64-bit
1201  * values are involved because that would require pack/unpack to/from a vec8
1202  * which NIR currently does not support.
1203  */
1204 static inline nir_def *
nir_extract_bits(nir_builder * b,nir_def ** srcs,unsigned num_srcs,unsigned first_bit,unsigned dest_num_components,unsigned dest_bit_size)1205 nir_extract_bits(nir_builder *b, nir_def **srcs, unsigned num_srcs,
1206                  unsigned first_bit,
1207                  unsigned dest_num_components, unsigned dest_bit_size)
1208 {
1209    const unsigned num_bits = dest_num_components * dest_bit_size;
1210 
1211    /* Figure out the common bit size */
1212    unsigned common_bit_size = dest_bit_size;
1213    for (unsigned i = 0; i < num_srcs; i++)
1214       common_bit_size = MIN2(common_bit_size, srcs[i]->bit_size);
1215    if (first_bit > 0)
1216       common_bit_size = MIN2(common_bit_size, (1u << (ffs(first_bit) - 1)));
1217 
1218    /* We don't want to have to deal with 1-bit values */
1219    assert(common_bit_size >= 8);
1220 
1221    nir_def *common_comps[NIR_MAX_VEC_COMPONENTS * sizeof(uint64_t)];
1222    assert(num_bits / common_bit_size <= ARRAY_SIZE(common_comps));
1223 
1224    /* First, unpack to the common bit size and select the components from the
1225     * source.
1226     */
1227    int src_idx = -1;
1228    unsigned src_start_bit = 0;
1229    unsigned src_end_bit = 0;
1230    for (unsigned i = 0; i < num_bits / common_bit_size; i++) {
1231       const unsigned bit = first_bit + (i * common_bit_size);
1232       while (bit >= src_end_bit) {
1233          src_idx++;
1234          assert(src_idx < (int)num_srcs);
1235          src_start_bit = src_end_bit;
1236          src_end_bit += srcs[src_idx]->bit_size *
1237                         srcs[src_idx]->num_components;
1238       }
1239       assert(bit >= src_start_bit);
1240       assert(bit + common_bit_size <= src_end_bit);
1241       const unsigned rel_bit = bit - src_start_bit;
1242       const unsigned src_bit_size = srcs[src_idx]->bit_size;
1243 
1244       nir_def *comp = nir_channel(b, srcs[src_idx],
1245                                   rel_bit / src_bit_size);
1246       if (srcs[src_idx]->bit_size > common_bit_size) {
1247          nir_def *unpacked = nir_unpack_bits(b, comp, common_bit_size);
1248          comp = nir_channel(b, unpacked, (rel_bit % src_bit_size) / common_bit_size);
1249       }
1250       common_comps[i] = comp;
1251    }
1252 
1253    /* Now, re-pack the destination if we have to */
1254    if (dest_bit_size > common_bit_size) {
1255       unsigned common_per_dest = dest_bit_size / common_bit_size;
1256       nir_def *dest_comps[NIR_MAX_VEC_COMPONENTS];
1257       for (unsigned i = 0; i < dest_num_components; i++) {
1258          nir_def *unpacked = nir_vec(b, common_comps + i * common_per_dest,
1259                                      common_per_dest);
1260          dest_comps[i] = nir_pack_bits(b, unpacked, dest_bit_size);
1261       }
1262       return nir_vec(b, dest_comps, dest_num_components);
1263    } else {
1264       assert(dest_bit_size == common_bit_size);
1265       return nir_vec(b, common_comps, dest_num_components);
1266    }
1267 }
1268 
1269 static inline nir_def *
nir_bitcast_vector(nir_builder * b,nir_def * src,unsigned dest_bit_size)1270 nir_bitcast_vector(nir_builder *b, nir_def *src, unsigned dest_bit_size)
1271 {
1272    assert((src->bit_size * src->num_components) % dest_bit_size == 0);
1273    const unsigned dest_num_components =
1274       (src->bit_size * src->num_components) / dest_bit_size;
1275    assert(dest_num_components <= NIR_MAX_VEC_COMPONENTS);
1276 
1277    return nir_extract_bits(b, &src, 1, 0, dest_num_components, dest_bit_size);
1278 }
1279 
1280 static inline nir_def *
nir_trim_vector(nir_builder * b,nir_def * src,unsigned num_components)1281 nir_trim_vector(nir_builder *b, nir_def *src, unsigned num_components)
1282 {
1283    assert(src->num_components >= num_components);
1284    if (src->num_components == num_components)
1285       return src;
1286 
1287    return nir_channels(b, src, nir_component_mask(num_components));
1288 }
1289 
1290 /**
1291  * Pad a value to N components with undefs of matching bit size.
1292  * If the value already contains >= num_components, it is returned without change.
1293  */
1294 static inline nir_def *
nir_pad_vector(nir_builder * b,nir_def * src,unsigned num_components)1295 nir_pad_vector(nir_builder *b, nir_def *src, unsigned num_components)
1296 {
1297    assert(src->num_components <= num_components);
1298    if (src->num_components == num_components)
1299       return src;
1300 
1301    nir_scalar components[NIR_MAX_VEC_COMPONENTS];
1302    nir_scalar undef = nir_get_scalar(nir_undef(b, 1, src->bit_size), 0);
1303    unsigned i = 0;
1304    for (; i < src->num_components; i++)
1305       components[i] = nir_get_scalar(src, i);
1306    for (; i < num_components; i++)
1307       components[i] = undef;
1308 
1309    return nir_vec_scalars(b, components, num_components);
1310 }
1311 
1312 /**
1313  * Pad a value to N components with copies of the given immediate of matching
1314  * bit size. If the value already contains >= num_components, it is returned
1315  * without change.
1316  */
1317 static inline nir_def *
nir_pad_vector_imm_int(nir_builder * b,nir_def * src,uint64_t imm_val,unsigned num_components)1318 nir_pad_vector_imm_int(nir_builder *b, nir_def *src, uint64_t imm_val,
1319                        unsigned num_components)
1320 {
1321    assert(src->num_components <= num_components);
1322    if (src->num_components == num_components)
1323       return src;
1324 
1325    nir_scalar components[NIR_MAX_VEC_COMPONENTS];
1326    nir_scalar imm = nir_get_scalar(nir_imm_intN_t(b, imm_val, src->bit_size), 0);
1327    unsigned i = 0;
1328    for (; i < src->num_components; i++)
1329       components[i] = nir_get_scalar(src, i);
1330    for (; i < num_components; i++)
1331       components[i] = imm;
1332 
1333    return nir_vec_scalars(b, components, num_components);
1334 }
1335 
1336 /**
1337  * Pad a value to 4 components with undefs of matching bit size.
1338  * If the value already contains >= 4 components, it is returned without change.
1339  */
1340 static inline nir_def *
nir_pad_vec4(nir_builder * b,nir_def * src)1341 nir_pad_vec4(nir_builder *b, nir_def *src)
1342 {
1343    return nir_pad_vector(b, src, 4);
1344 }
1345 
1346 /**
1347  * Resizes a vector by either trimming off components or adding undef
1348  * components, as needed.  Only use this helper if it's actually what you
1349  * need.  Prefer nir_pad_vector() or nir_trim_vector() instead if you know a
1350  * priori which direction you're resizing.
1351  */
1352 static inline nir_def *
nir_resize_vector(nir_builder * b,nir_def * src,unsigned num_components)1353 nir_resize_vector(nir_builder *b, nir_def *src, unsigned num_components)
1354 {
1355    if (src->num_components < num_components)
1356       return nir_pad_vector(b, src, num_components);
1357    else
1358       return nir_trim_vector(b, src, num_components);
1359 }
1360 
1361 nir_def *
1362 nir_ssa_for_alu_src(nir_builder *build, nir_alu_instr *instr, unsigned srcn);
1363 
1364 static inline unsigned
nir_get_ptr_bitsize(nir_shader * shader)1365 nir_get_ptr_bitsize(nir_shader *shader)
1366 {
1367    if (shader->info.stage == MESA_SHADER_KERNEL)
1368       return shader->info.cs.ptr_size;
1369    return 32;
1370 }
1371 
1372 static inline nir_deref_instr *
nir_build_deref_var(nir_builder * build,nir_variable * var)1373 nir_build_deref_var(nir_builder *build, nir_variable *var)
1374 {
1375    nir_deref_instr *deref =
1376       nir_deref_instr_create(build->shader, nir_deref_type_var);
1377 
1378    deref->modes = (nir_variable_mode)var->data.mode;
1379    deref->type = var->type;
1380    deref->var = var;
1381 
1382    nir_def_init(&deref->instr, &deref->def, 1,
1383                 nir_get_ptr_bitsize(build->shader));
1384 
1385    nir_builder_instr_insert(build, &deref->instr);
1386 
1387    return deref;
1388 }
1389 
1390 static inline nir_deref_instr *
nir_build_deref_array(nir_builder * build,nir_deref_instr * parent,nir_def * index)1391 nir_build_deref_array(nir_builder *build, nir_deref_instr *parent,
1392                       nir_def *index)
1393 {
1394    assert(glsl_type_is_array(parent->type) ||
1395           glsl_type_is_matrix(parent->type) ||
1396           glsl_type_is_vector(parent->type));
1397 
1398    assert(index->bit_size == parent->def.bit_size);
1399 
1400    nir_deref_instr *deref =
1401       nir_deref_instr_create(build->shader, nir_deref_type_array);
1402 
1403    deref->modes = parent->modes;
1404    deref->type = glsl_get_array_element(parent->type);
1405    deref->parent = nir_src_for_ssa(&parent->def);
1406    deref->arr.index = nir_src_for_ssa(index);
1407 
1408    nir_def_init(&deref->instr, &deref->def,
1409                 parent->def.num_components, parent->def.bit_size);
1410 
1411    nir_builder_instr_insert(build, &deref->instr);
1412 
1413    return deref;
1414 }
1415 
1416 static inline nir_deref_instr *
nir_build_deref_array_imm(nir_builder * build,nir_deref_instr * parent,int64_t index)1417 nir_build_deref_array_imm(nir_builder *build, nir_deref_instr *parent,
1418                           int64_t index)
1419 {
1420    nir_def *idx_ssa = nir_imm_intN_t(build, index,
1421                                      parent->def.bit_size);
1422 
1423    return nir_build_deref_array(build, parent, idx_ssa);
1424 }
1425 
1426 static inline nir_deref_instr *
nir_build_deref_ptr_as_array(nir_builder * build,nir_deref_instr * parent,nir_def * index)1427 nir_build_deref_ptr_as_array(nir_builder *build, nir_deref_instr *parent,
1428                              nir_def *index)
1429 {
1430    assert(parent->deref_type == nir_deref_type_array ||
1431           parent->deref_type == nir_deref_type_ptr_as_array ||
1432           parent->deref_type == nir_deref_type_cast);
1433 
1434    assert(index->bit_size == parent->def.bit_size);
1435 
1436    nir_deref_instr *deref =
1437       nir_deref_instr_create(build->shader, nir_deref_type_ptr_as_array);
1438 
1439    deref->modes = parent->modes;
1440    deref->type = parent->type;
1441    deref->parent = nir_src_for_ssa(&parent->def);
1442    deref->arr.index = nir_src_for_ssa(index);
1443 
1444    nir_def_init(&deref->instr, &deref->def,
1445                 parent->def.num_components, parent->def.bit_size);
1446 
1447    nir_builder_instr_insert(build, &deref->instr);
1448 
1449    return deref;
1450 }
1451 
1452 static inline nir_deref_instr *
nir_build_deref_array_wildcard(nir_builder * build,nir_deref_instr * parent)1453 nir_build_deref_array_wildcard(nir_builder *build, nir_deref_instr *parent)
1454 {
1455    assert(glsl_type_is_array(parent->type) ||
1456           glsl_type_is_matrix(parent->type));
1457 
1458    nir_deref_instr *deref =
1459       nir_deref_instr_create(build->shader, nir_deref_type_array_wildcard);
1460 
1461    deref->modes = parent->modes;
1462    deref->type = glsl_get_array_element(parent->type);
1463    deref->parent = nir_src_for_ssa(&parent->def);
1464 
1465    nir_def_init(&deref->instr, &deref->def,
1466                 parent->def.num_components, parent->def.bit_size);
1467 
1468    nir_builder_instr_insert(build, &deref->instr);
1469 
1470    return deref;
1471 }
1472 
1473 static inline nir_deref_instr *
nir_build_deref_struct(nir_builder * build,nir_deref_instr * parent,unsigned index)1474 nir_build_deref_struct(nir_builder *build, nir_deref_instr *parent,
1475                        unsigned index)
1476 {
1477    assert(glsl_type_is_struct_or_ifc(parent->type));
1478 
1479    nir_deref_instr *deref =
1480       nir_deref_instr_create(build->shader, nir_deref_type_struct);
1481 
1482    deref->modes = parent->modes;
1483    deref->type = glsl_get_struct_field(parent->type, index);
1484    deref->parent = nir_src_for_ssa(&parent->def);
1485    deref->strct.index = index;
1486 
1487    nir_def_init(&deref->instr, &deref->def,
1488                 parent->def.num_components, parent->def.bit_size);
1489 
1490    nir_builder_instr_insert(build, &deref->instr);
1491 
1492    return deref;
1493 }
1494 
1495 static inline nir_deref_instr *
nir_build_deref_cast_with_alignment(nir_builder * build,nir_def * parent,nir_variable_mode modes,const struct glsl_type * type,unsigned ptr_stride,unsigned align_mul,unsigned align_offset)1496 nir_build_deref_cast_with_alignment(nir_builder *build, nir_def *parent,
1497                                     nir_variable_mode modes,
1498                                     const struct glsl_type *type,
1499                                     unsigned ptr_stride,
1500                                     unsigned align_mul,
1501                                     unsigned align_offset)
1502 {
1503    nir_deref_instr *deref =
1504       nir_deref_instr_create(build->shader, nir_deref_type_cast);
1505 
1506    deref->modes = modes;
1507    deref->type = type;
1508    deref->parent = nir_src_for_ssa(parent);
1509    deref->cast.align_mul = align_mul;
1510    deref->cast.align_offset = align_offset;
1511    deref->cast.ptr_stride = ptr_stride;
1512 
1513    nir_def_init(&deref->instr, &deref->def, parent->num_components,
1514                 parent->bit_size);
1515 
1516    nir_builder_instr_insert(build, &deref->instr);
1517 
1518    return deref;
1519 }
1520 
1521 static inline nir_deref_instr *
nir_build_deref_cast(nir_builder * build,nir_def * parent,nir_variable_mode modes,const struct glsl_type * type,unsigned ptr_stride)1522 nir_build_deref_cast(nir_builder *build, nir_def *parent,
1523                      nir_variable_mode modes, const struct glsl_type *type,
1524                      unsigned ptr_stride)
1525 {
1526    return nir_build_deref_cast_with_alignment(build, parent, modes, type,
1527                                               ptr_stride, 0, 0);
1528 }
1529 
1530 static inline nir_deref_instr *
nir_alignment_deref_cast(nir_builder * build,nir_deref_instr * parent,uint32_t align_mul,uint32_t align_offset)1531 nir_alignment_deref_cast(nir_builder *build, nir_deref_instr *parent,
1532                          uint32_t align_mul, uint32_t align_offset)
1533 {
1534    nir_deref_instr *deref =
1535       nir_deref_instr_create(build->shader, nir_deref_type_cast);
1536 
1537    deref->modes = parent->modes;
1538    deref->type = parent->type;
1539    deref->parent = nir_src_for_ssa(&parent->def);
1540    deref->cast.ptr_stride = nir_deref_instr_array_stride(deref);
1541    deref->cast.align_mul = align_mul;
1542    deref->cast.align_offset = align_offset;
1543 
1544    nir_def_init(&deref->instr, &deref->def,
1545                 parent->def.num_components, parent->def.bit_size);
1546 
1547    nir_builder_instr_insert(build, &deref->instr);
1548 
1549    return deref;
1550 }
1551 
1552 /** Returns a deref that follows another but starting from the given parent
1553  *
1554  * The new deref will be the same type and take the same array or struct index
1555  * as the leader deref but it may have a different parent.  This is very
1556  * useful for walking deref paths.
1557  */
1558 static inline nir_deref_instr *
nir_build_deref_follower(nir_builder * b,nir_deref_instr * parent,nir_deref_instr * leader)1559 nir_build_deref_follower(nir_builder *b, nir_deref_instr *parent,
1560                          nir_deref_instr *leader)
1561 {
1562    /* If the derefs would have the same parent, don't make a new one */
1563    if (leader->parent.ssa == &parent->def)
1564       return leader;
1565 
1566    UNUSED nir_deref_instr *leader_parent = nir_src_as_deref(leader->parent);
1567 
1568    switch (leader->deref_type) {
1569    case nir_deref_type_var:
1570       unreachable("A var dereference cannot have a parent");
1571       break;
1572 
1573    case nir_deref_type_array:
1574    case nir_deref_type_array_wildcard:
1575       assert(glsl_type_is_matrix(parent->type) ||
1576              glsl_type_is_array(parent->type) ||
1577              (leader->deref_type == nir_deref_type_array &&
1578               glsl_type_is_vector(parent->type)));
1579       assert(glsl_get_length(parent->type) ==
1580              glsl_get_length(leader_parent->type));
1581 
1582       if (leader->deref_type == nir_deref_type_array) {
1583          nir_def *index = nir_i2iN(b, leader->arr.index.ssa,
1584                                    parent->def.bit_size);
1585          return nir_build_deref_array(b, parent, index);
1586       } else {
1587          return nir_build_deref_array_wildcard(b, parent);
1588       }
1589 
1590    case nir_deref_type_struct:
1591       assert(glsl_type_is_struct_or_ifc(parent->type));
1592       assert(glsl_get_length(parent->type) ==
1593              glsl_get_length(leader_parent->type));
1594 
1595       return nir_build_deref_struct(b, parent, leader->strct.index);
1596 
1597    case nir_deref_type_cast:
1598       return nir_build_deref_cast_with_alignment(b, &parent->def,
1599                                                  leader->modes,
1600                                                  leader->type,
1601                                                  leader->cast.ptr_stride,
1602                                                  leader->cast.align_mul,
1603                                                  leader->cast.align_offset);
1604    default:
1605       unreachable("Invalid deref instruction type");
1606    }
1607    return NULL;
1608 }
1609 
1610 static inline nir_def *
nir_load_deref_with_access(nir_builder * build,nir_deref_instr * deref,enum gl_access_qualifier access)1611 nir_load_deref_with_access(nir_builder *build, nir_deref_instr *deref,
1612                            enum gl_access_qualifier access)
1613 {
1614    return nir_build_load_deref(build, glsl_get_vector_elements(deref->type),
1615                                glsl_get_bit_size(deref->type), &deref->def,
1616                                access);
1617 }
1618 
1619 #undef nir_load_deref
1620 static inline nir_def *
nir_load_deref(nir_builder * build,nir_deref_instr * deref)1621 nir_load_deref(nir_builder *build, nir_deref_instr *deref)
1622 {
1623    return nir_load_deref_with_access(build, deref, (enum gl_access_qualifier)0);
1624 }
1625 
1626 static inline void
nir_store_deref_with_access(nir_builder * build,nir_deref_instr * deref,nir_def * value,unsigned writemask,enum gl_access_qualifier access)1627 nir_store_deref_with_access(nir_builder *build, nir_deref_instr *deref,
1628                             nir_def *value, unsigned writemask,
1629                             enum gl_access_qualifier access)
1630 {
1631    writemask &= (1u << value->num_components) - 1u;
1632    nir_build_store_deref(build, &deref->def, value, writemask, access);
1633 }
1634 
1635 #undef nir_store_deref
1636 static inline void
nir_store_deref(nir_builder * build,nir_deref_instr * deref,nir_def * value,unsigned writemask)1637 nir_store_deref(nir_builder *build, nir_deref_instr *deref,
1638                 nir_def *value, unsigned writemask)
1639 {
1640    nir_store_deref_with_access(build, deref, value, writemask,
1641                                (enum gl_access_qualifier)0);
1642 }
1643 
1644 static inline void
nir_build_write_masked_store(nir_builder * b,nir_deref_instr * vec_deref,nir_def * value,unsigned component)1645 nir_build_write_masked_store(nir_builder *b, nir_deref_instr *vec_deref,
1646                              nir_def *value, unsigned component)
1647 {
1648    assert(value->num_components == 1);
1649    unsigned num_components = glsl_get_components(vec_deref->type);
1650    assert(num_components > 1 && num_components <= NIR_MAX_VEC_COMPONENTS);
1651 
1652    nir_def *vec =
1653       nir_vector_insert_imm(b, nir_undef(b, num_components, value->bit_size),
1654                             value, component);
1655    nir_store_deref(b, vec_deref, vec, (1u << component));
1656 }
1657 
1658 static inline void
nir_build_write_masked_stores(nir_builder * b,nir_deref_instr * vec_deref,nir_def * value,nir_def * index,unsigned start,unsigned end)1659 nir_build_write_masked_stores(nir_builder *b, nir_deref_instr *vec_deref,
1660                               nir_def *value, nir_def *index,
1661                               unsigned start, unsigned end)
1662 {
1663    if (start == end - 1) {
1664       nir_build_write_masked_store(b, vec_deref, value, start);
1665    } else {
1666       unsigned mid = start + (end - start) / 2;
1667       nir_push_if(b, nir_ilt_imm(b, index, mid));
1668       nir_build_write_masked_stores(b, vec_deref, value, index, start, mid);
1669       nir_push_else(b, NULL);
1670       nir_build_write_masked_stores(b, vec_deref, value, index, mid, end);
1671       nir_pop_if(b, NULL);
1672    }
1673 }
1674 
1675 static inline void
nir_copy_deref_with_access(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src,enum gl_access_qualifier dest_access,enum gl_access_qualifier src_access)1676 nir_copy_deref_with_access(nir_builder *build, nir_deref_instr *dest,
1677                            nir_deref_instr *src,
1678                            enum gl_access_qualifier dest_access,
1679                            enum gl_access_qualifier src_access)
1680 {
1681    nir_build_copy_deref(build, &dest->def, &src->def, dest_access, src_access);
1682 }
1683 
1684 #undef nir_copy_deref
1685 static inline void
nir_copy_deref(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src)1686 nir_copy_deref(nir_builder *build, nir_deref_instr *dest, nir_deref_instr *src)
1687 {
1688    nir_copy_deref_with_access(build, dest, src,
1689                               (enum gl_access_qualifier)0,
1690                               (enum gl_access_qualifier)0);
1691 }
1692 
1693 static inline void
nir_memcpy_deref_with_access(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src,nir_def * size,enum gl_access_qualifier dest_access,enum gl_access_qualifier src_access)1694 nir_memcpy_deref_with_access(nir_builder *build, nir_deref_instr *dest,
1695                              nir_deref_instr *src, nir_def *size,
1696                              enum gl_access_qualifier dest_access,
1697                              enum gl_access_qualifier src_access)
1698 {
1699    nir_build_memcpy_deref(build, &dest->def, &src->def,
1700                           size, dest_access, src_access);
1701 }
1702 
1703 #undef nir_memcpy_deref
1704 static inline void
nir_memcpy_deref(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src,nir_def * size)1705 nir_memcpy_deref(nir_builder *build, nir_deref_instr *dest,
1706                  nir_deref_instr *src, nir_def *size)
1707 {
1708    nir_memcpy_deref_with_access(build, dest, src, size,
1709                                 (enum gl_access_qualifier)0,
1710                                 (enum gl_access_qualifier)0);
1711 }
1712 
1713 static inline nir_def *
nir_load_var(nir_builder * build,nir_variable * var)1714 nir_load_var(nir_builder *build, nir_variable *var)
1715 {
1716    return nir_load_deref(build, nir_build_deref_var(build, var));
1717 }
1718 
1719 static inline void
nir_store_var(nir_builder * build,nir_variable * var,nir_def * value,unsigned writemask)1720 nir_store_var(nir_builder *build, nir_variable *var, nir_def *value,
1721               unsigned writemask)
1722 {
1723    nir_store_deref(build, nir_build_deref_var(build, var), value, writemask);
1724 }
1725 
1726 static inline void
nir_copy_var(nir_builder * build,nir_variable * dest,nir_variable * src)1727 nir_copy_var(nir_builder *build, nir_variable *dest, nir_variable *src)
1728 {
1729    nir_copy_deref(build, nir_build_deref_var(build, dest),
1730                   nir_build_deref_var(build, src));
1731 }
1732 
1733 static inline nir_def *
nir_load_array_var(nir_builder * build,nir_variable * var,nir_def * index)1734 nir_load_array_var(nir_builder *build, nir_variable *var, nir_def *index)
1735 {
1736    nir_deref_instr *deref =
1737       nir_build_deref_array(build, nir_build_deref_var(build, var), index);
1738    return nir_load_deref(build, deref);
1739 }
1740 
1741 static inline nir_def *
nir_load_array_var_imm(nir_builder * build,nir_variable * var,int64_t index)1742 nir_load_array_var_imm(nir_builder *build, nir_variable *var, int64_t index)
1743 {
1744    nir_deref_instr *deref =
1745       nir_build_deref_array_imm(build, nir_build_deref_var(build, var), index);
1746    return nir_load_deref(build, deref);
1747 }
1748 
1749 static inline void
nir_store_array_var(nir_builder * build,nir_variable * var,nir_def * index,nir_def * value,unsigned writemask)1750 nir_store_array_var(nir_builder *build, nir_variable *var, nir_def *index,
1751                     nir_def *value, unsigned writemask)
1752 {
1753    nir_deref_instr *deref =
1754       nir_build_deref_array(build, nir_build_deref_var(build, var), index);
1755    nir_store_deref(build, deref, value, writemask);
1756 }
1757 
1758 static inline void
nir_store_array_var_imm(nir_builder * build,nir_variable * var,int64_t index,nir_def * value,unsigned writemask)1759 nir_store_array_var_imm(nir_builder *build, nir_variable *var, int64_t index,
1760                         nir_def *value, unsigned writemask)
1761 {
1762    nir_deref_instr *deref =
1763       nir_build_deref_array_imm(build, nir_build_deref_var(build, var), index);
1764    nir_store_deref(build, deref, value, writemask);
1765 }
1766 
1767 #undef nir_load_global
1768 static inline nir_def *
nir_load_global(nir_builder * build,nir_def * addr,unsigned align,unsigned num_components,unsigned bit_size)1769 nir_load_global(nir_builder *build, nir_def *addr, unsigned align,
1770                 unsigned num_components, unsigned bit_size)
1771 {
1772    nir_intrinsic_instr *load =
1773       nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_global);
1774    load->num_components = num_components;
1775    load->src[0] = nir_src_for_ssa(addr);
1776    nir_intrinsic_set_align(load, align, 0);
1777    nir_def_init(&load->instr, &load->def, num_components, bit_size);
1778    nir_builder_instr_insert(build, &load->instr);
1779    return &load->def;
1780 }
1781 
1782 #undef nir_store_global
1783 static inline void
nir_store_global(nir_builder * build,nir_def * addr,unsigned align,nir_def * value,nir_component_mask_t write_mask)1784 nir_store_global(nir_builder *build, nir_def *addr, unsigned align,
1785                  nir_def *value, nir_component_mask_t write_mask)
1786 {
1787    nir_intrinsic_instr *store =
1788       nir_intrinsic_instr_create(build->shader, nir_intrinsic_store_global);
1789    store->num_components = value->num_components;
1790    store->src[0] = nir_src_for_ssa(value);
1791    store->src[1] = nir_src_for_ssa(addr);
1792    nir_intrinsic_set_write_mask(store,
1793                                 write_mask & BITFIELD_MASK(value->num_components));
1794    nir_intrinsic_set_align(store, align, 0);
1795    nir_builder_instr_insert(build, &store->instr);
1796 }
1797 
1798 #undef nir_load_global_constant
1799 static inline nir_def *
nir_load_global_constant(nir_builder * build,nir_def * addr,unsigned align,unsigned num_components,unsigned bit_size)1800 nir_load_global_constant(nir_builder *build, nir_def *addr, unsigned align,
1801                          unsigned num_components, unsigned bit_size)
1802 {
1803    nir_intrinsic_instr *load =
1804       nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_global_constant);
1805    load->num_components = num_components;
1806    load->src[0] = nir_src_for_ssa(addr);
1807    nir_intrinsic_set_align(load, align, 0);
1808    nir_def_init(&load->instr, &load->def, num_components, bit_size);
1809    nir_builder_instr_insert(build, &load->instr);
1810    return &load->def;
1811 }
1812 
1813 #undef nir_load_param
1814 static inline nir_def *
nir_load_param(nir_builder * build,uint32_t param_idx)1815 nir_load_param(nir_builder *build, uint32_t param_idx)
1816 {
1817    assert(param_idx < build->impl->function->num_params);
1818    nir_parameter *param = &build->impl->function->params[param_idx];
1819    return nir_build_load_param(build, param->num_components, param->bit_size, param_idx);
1820 }
1821 
1822 #undef nir_decl_reg
1823 static inline nir_def *
nir_decl_reg(nir_builder * b,unsigned num_components,unsigned bit_size,unsigned num_array_elems)1824 nir_decl_reg(nir_builder *b, unsigned num_components, unsigned bit_size,
1825              unsigned num_array_elems)
1826 {
1827    nir_intrinsic_instr *decl =
1828       nir_intrinsic_instr_create(b->shader, nir_intrinsic_decl_reg);
1829    nir_intrinsic_set_num_components(decl, num_components);
1830    nir_intrinsic_set_bit_size(decl, bit_size);
1831    nir_intrinsic_set_num_array_elems(decl, num_array_elems);
1832    nir_intrinsic_set_divergent(decl, true);
1833    nir_def_init(&decl->instr, &decl->def, 1, 32);
1834 
1835    nir_instr_insert(nir_before_impl(b->impl), &decl->instr);
1836 
1837    return &decl->def;
1838 }
1839 
1840 #undef nir_load_reg
1841 static inline nir_def *
nir_load_reg(nir_builder * b,nir_def * reg)1842 nir_load_reg(nir_builder *b, nir_def *reg)
1843 {
1844    nir_intrinsic_instr *decl = nir_reg_get_decl(reg);
1845    unsigned num_components = nir_intrinsic_num_components(decl);
1846    unsigned bit_size = nir_intrinsic_bit_size(decl);
1847 
1848    nir_def *res = nir_build_load_reg(b, num_components, bit_size, reg);
1849    res->divergent = nir_intrinsic_divergent(decl);
1850 
1851    return res;
1852 }
1853 
1854 #undef nir_store_reg
1855 static inline void
nir_store_reg(nir_builder * b,nir_def * value,nir_def * reg)1856 nir_store_reg(nir_builder *b, nir_def *value, nir_def *reg)
1857 {
1858    ASSERTED nir_intrinsic_instr *decl = nir_reg_get_decl(reg);
1859    ASSERTED unsigned num_components = nir_intrinsic_num_components(decl);
1860    ASSERTED unsigned bit_size = nir_intrinsic_bit_size(decl);
1861 
1862    assert(value->num_components == num_components);
1863    assert(value->bit_size == bit_size);
1864 
1865    nir_build_store_reg(b, value, reg);
1866 }
1867 
1868 static inline nir_tex_src
nir_tex_src_for_ssa(nir_tex_src_type src_type,nir_def * def)1869 nir_tex_src_for_ssa(nir_tex_src_type src_type, nir_def *def)
1870 {
1871    nir_tex_src src;
1872    src.src = nir_src_for_ssa(def);
1873    src.src_type = src_type;
1874    return src;
1875 }
1876 
1877 /*
1878  * Find a texture source, remove it, and return its nir_def. If the texture
1879  * source does not exist, return NULL. This is useful for texture lowering pass
1880  * that consume their input sources and produce a new lowered source.
1881  */
1882 static inline nir_def *
nir_steal_tex_src(nir_tex_instr * tex,nir_tex_src_type type_)1883 nir_steal_tex_src(nir_tex_instr *tex, nir_tex_src_type type_)
1884 {
1885    int idx = nir_tex_instr_src_index(tex, type_);
1886    if (idx < 0)
1887       return NULL;
1888 
1889    nir_def *ssa = tex->src[idx].src.ssa;
1890    nir_tex_instr_remove_src(tex, idx);
1891    return ssa;
1892 }
1893 
1894 static inline nir_def *
nir_tex_deref(nir_builder * b,nir_deref_instr * t,nir_deref_instr * s,nir_def * coord)1895 nir_tex_deref(nir_builder *b, nir_deref_instr *t, nir_deref_instr *s,
1896               nir_def *coord)
1897 {
1898    nir_tex_src srcs[] = { nir_tex_src_for_ssa(nir_tex_src_coord, coord) };
1899 
1900    return nir_build_tex_deref_instr(b, nir_texop_tex, t, s,
1901                                     ARRAY_SIZE(srcs), srcs);
1902 }
1903 
1904 static inline nir_def *
nir_txl_deref(nir_builder * b,nir_deref_instr * t,nir_deref_instr * s,nir_def * coord,nir_def * lod)1905 nir_txl_deref(nir_builder *b, nir_deref_instr *t, nir_deref_instr *s,
1906               nir_def *coord, nir_def *lod)
1907 {
1908    nir_tex_src srcs[] = {
1909       nir_tex_src_for_ssa(nir_tex_src_coord, coord),
1910       nir_tex_src_for_ssa(nir_tex_src_lod, lod),
1911    };
1912 
1913    return nir_build_tex_deref_instr(b, nir_texop_txl, t, s,
1914                                     ARRAY_SIZE(srcs), srcs);
1915 }
1916 
1917 static inline nir_def *
nir_txl_zero_deref(nir_builder * b,nir_deref_instr * t,nir_deref_instr * s,nir_def * coord)1918 nir_txl_zero_deref(nir_builder *b, nir_deref_instr *t, nir_deref_instr *s,
1919                    nir_def *coord)
1920 {
1921    return nir_txl_deref(b, t, s, coord, nir_imm_float(b, 0));
1922 }
1923 
1924 static inline bool
nir_tex_type_has_lod(const struct glsl_type * tex_type)1925 nir_tex_type_has_lod(const struct glsl_type *tex_type)
1926 {
1927    switch (glsl_get_sampler_dim(tex_type)) {
1928    case GLSL_SAMPLER_DIM_1D:
1929    case GLSL_SAMPLER_DIM_2D:
1930    case GLSL_SAMPLER_DIM_3D:
1931    case GLSL_SAMPLER_DIM_CUBE:
1932       return true;
1933    default:
1934       return false;
1935    }
1936 }
1937 
1938 static inline nir_def *
nir_txf_deref(nir_builder * b,nir_deref_instr * t,nir_def * coord,nir_def * lod)1939 nir_txf_deref(nir_builder *b, nir_deref_instr *t,
1940               nir_def *coord, nir_def *lod)
1941 {
1942    nir_tex_src srcs[2];
1943    unsigned num_srcs = 0;
1944 
1945    srcs[num_srcs++] = nir_tex_src_for_ssa(nir_tex_src_coord, coord);
1946 
1947    if (lod == NULL && nir_tex_type_has_lod(t->type))
1948       lod = nir_imm_int(b, 0);
1949 
1950    if (lod != NULL)
1951       srcs[num_srcs++] = nir_tex_src_for_ssa(nir_tex_src_lod, lod);
1952 
1953    return nir_build_tex_deref_instr(b, nir_texop_txf, t, NULL,
1954                                     num_srcs, srcs);
1955 }
1956 
1957 static inline nir_def *
nir_txf_ms_deref(nir_builder * b,nir_deref_instr * t,nir_def * coord,nir_def * ms_index)1958 nir_txf_ms_deref(nir_builder *b, nir_deref_instr *t,
1959                  nir_def *coord, nir_def *ms_index)
1960 {
1961    nir_tex_src srcs[] = {
1962       nir_tex_src_for_ssa(nir_tex_src_coord, coord),
1963       nir_tex_src_for_ssa(nir_tex_src_ms_index, ms_index),
1964    };
1965 
1966    return nir_build_tex_deref_instr(b, nir_texop_txf_ms, t, NULL,
1967                                     ARRAY_SIZE(srcs), srcs);
1968 }
1969 
1970 static inline nir_def *
nir_txs_deref(nir_builder * b,nir_deref_instr * t,nir_def * lod)1971 nir_txs_deref(nir_builder *b, nir_deref_instr *t, nir_def *lod)
1972 {
1973    nir_tex_src srcs[1];
1974    unsigned num_srcs = 0;
1975 
1976    if (lod == NULL && nir_tex_type_has_lod(t->type))
1977       lod = nir_imm_int(b, 0);
1978 
1979    if (lod != NULL)
1980       srcs[num_srcs++] = nir_tex_src_for_ssa(nir_tex_src_lod, lod);
1981 
1982    return nir_build_tex_deref_instr(b, nir_texop_txs, t, NULL,
1983                                     num_srcs, srcs);
1984 }
1985 
1986 static inline nir_def *
nir_samples_identical_deref(nir_builder * b,nir_deref_instr * t,nir_def * coord)1987 nir_samples_identical_deref(nir_builder *b, nir_deref_instr *t,
1988                             nir_def *coord)
1989 {
1990    nir_tex_src srcs[] = { nir_tex_src_for_ssa(nir_tex_src_coord, coord) };
1991 
1992    return nir_build_tex_deref_instr(b, nir_texop_samples_identical, t, NULL,
1993                                     ARRAY_SIZE(srcs), srcs);
1994 }
1995 
1996 /* calculate a `(1 << value) - 1` in ssa without overflows */
1997 static inline nir_def *
nir_mask(nir_builder * b,nir_def * bits,unsigned dst_bit_size)1998 nir_mask(nir_builder *b, nir_def *bits, unsigned dst_bit_size)
1999 {
2000    return nir_ushr(b, nir_imm_intN_t(b, -1, dst_bit_size),
2001                    nir_isub_imm(b, dst_bit_size, nir_u2u32(b, bits)));
2002 }
2003 
2004 static inline nir_def *
nir_load_barycentric(nir_builder * build,nir_intrinsic_op op,unsigned interp_mode)2005 nir_load_barycentric(nir_builder *build, nir_intrinsic_op op,
2006                      unsigned interp_mode)
2007 {
2008    unsigned num_components = op == nir_intrinsic_load_barycentric_model ? 3 : 2;
2009    nir_intrinsic_instr *bary = nir_intrinsic_instr_create(build->shader, op);
2010    nir_def_init(&bary->instr, &bary->def, num_components, 32);
2011    nir_intrinsic_set_interp_mode(bary, interp_mode);
2012    nir_builder_instr_insert(build, &bary->instr);
2013    return &bary->def;
2014 }
2015 
2016 static inline void
nir_jump(nir_builder * build,nir_jump_type jump_type)2017 nir_jump(nir_builder *build, nir_jump_type jump_type)
2018 {
2019    assert(jump_type != nir_jump_goto && jump_type != nir_jump_goto_if);
2020    nir_jump_instr *jump = nir_jump_instr_create(build->shader, jump_type);
2021    nir_builder_instr_insert(build, &jump->instr);
2022 }
2023 
2024 static inline void
nir_goto(nir_builder * build,struct nir_block * target)2025 nir_goto(nir_builder *build, struct nir_block *target)
2026 {
2027    assert(!build->impl->structured);
2028    nir_jump_instr *jump = nir_jump_instr_create(build->shader, nir_jump_goto);
2029    jump->target = target;
2030    nir_builder_instr_insert(build, &jump->instr);
2031 }
2032 
2033 static inline void
nir_goto_if(nir_builder * build,struct nir_block * target,nir_src cond,struct nir_block * else_target)2034 nir_goto_if(nir_builder *build, struct nir_block *target, nir_src cond,
2035             struct nir_block *else_target)
2036 {
2037    assert(!build->impl->structured);
2038    nir_jump_instr *jump = nir_jump_instr_create(build->shader, nir_jump_goto_if);
2039    jump->condition = cond;
2040    jump->target = target;
2041    jump->else_target = else_target;
2042    nir_builder_instr_insert(build, &jump->instr);
2043 }
2044 
2045 static inline void
nir_build_call(nir_builder * build,nir_function * func,size_t count,nir_def ** args)2046 nir_build_call(nir_builder *build, nir_function *func, size_t count,
2047                nir_def **args)
2048 {
2049    assert(count == func->num_params && "parameter count must match");
2050    nir_call_instr *call = nir_call_instr_create(build->shader, func);
2051 
2052    for (unsigned i = 0; i < count; ++i) {
2053       call->params[i] = nir_src_for_ssa(args[i]);
2054    }
2055 
2056    nir_builder_instr_insert(build, &call->instr);
2057 }
2058 
2059 /*
2060  * Call a given nir_function * with a variadic number of nir_def * arguments.
2061  *
2062  * Defined with __VA_ARGS__ instead of va_list so we can assert the correct
2063  * number of parameters are passed in.
2064  */
2065 #define nir_call(build, func, ...)                         \
2066    do {                                                    \
2067       nir_def *args[] = { __VA_ARGS__ };                   \
2068       nir_build_call(build, func, ARRAY_SIZE(args), args); \
2069    } while (0)
2070 
2071 nir_def *
2072 nir_compare_func(nir_builder *b, enum compare_func func,
2073                  nir_def *src0, nir_def *src1);
2074 
2075 static inline void
nir_scoped_memory_barrier(nir_builder * b,mesa_scope scope,nir_memory_semantics semantics,nir_variable_mode modes)2076 nir_scoped_memory_barrier(nir_builder *b,
2077                           mesa_scope scope,
2078                           nir_memory_semantics semantics,
2079                           nir_variable_mode modes)
2080 {
2081    nir_barrier(b, SCOPE_NONE, scope, semantics, modes);
2082 }
2083 
2084 nir_def *
2085 nir_gen_rect_vertices(nir_builder *b, nir_def *z, nir_def *w);
2086 
2087 #ifdef __cplusplus
2088 } /* extern "C" */
2089 #endif
2090 
2091 #endif /* NIR_BUILDER_H */
2092