nir/builder: Add nir_replicate helper
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Fri, 26 May 2023 15:10:58 +0000 (11:10 -0400)
committerAlyssa Rosenzweig <alyssa@rosenzweig.io>
Tue, 30 May 2023 20:24:21 +0000 (16:24 -0400)
Splat a scalar to all components of a vector.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Acked-by: Jesse Natalie <jenatali@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23259>

src/compiler/nir/nir_builder.h

index c6a476f..c1d6768 100644 (file)
@@ -708,6 +708,19 @@ nir_vector_insert(nir_builder *b, nir_ssa_def *vec, nir_ssa_def *scalar,
 }
 
 static inline nir_ssa_def *
+nir_replicate(nir_builder *b, nir_ssa_def *scalar, unsigned num_components)
+{
+   assert(scalar->num_components == 1);
+   assert(num_components < NIR_MAX_VEC_COMPONENTS);
+
+   nir_ssa_def *copies[NIR_MAX_VEC_COMPONENTS] = {NULL};
+   for (unsigned i = 0; i < num_components; ++i)
+      copies[i] = scalar;
+
+   return nir_vec(b, copies, num_components);
+}
+
+static inline nir_ssa_def *
 nir_iadd_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
 {
    assert(x->bit_size <= 64);