agx: Add agx_alu_src_index helper for emit_alu
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Sun, 11 Apr 2021 19:09:36 +0000 (15:09 -0400)
committerAlyssa Rosenzweig <none>
Sun, 2 May 2021 21:41:12 +0000 (17:41 -0400)
Since we don't use abs/neg in NIR, this just needs to construct
p_extract ops to deal with swizzles.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Acked-by: Jason Ekstrand <jason@jlekstrand.net>
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10582>

src/asahi/compiler/agx_compile.c

index 05dc927..31618c3 100644 (file)
@@ -137,6 +137,27 @@ agx_emit_intrinsic(agx_builder *b, nir_intrinsic_instr *instr)
   }
 }
 
+static agx_index
+agx_alu_src_index(agx_builder *b, nir_alu_src src)
+{
+   /* Check well-formedness of the input NIR */
+   ASSERTED unsigned bitsize = nir_src_bit_size(src.src);
+   unsigned comps = nir_src_num_components(src.src);
+   unsigned channel = src.swizzle[0];
+
+   assert(bitsize == 16 || bitsize == 32 || bitsize == 64);
+   assert(!(src.negate || src.abs));
+   assert(channel < comps);
+
+   agx_index idx = agx_src_index(&src.src);
+
+   /* We only deal with scalars, emit p_extract if needed */
+   if (comps > 1)
+      return agx_p_extract(b, idx, channel);
+   else
+      return idx;
+}
+
 static agx_instr *
 agx_emit_alu(agx_builder *b, nir_alu_instr *instr)
 {