agx: Implement 8-bit sign extensions
authorAlyssa Rosenzweig <alyssa@rosenzweig.io>
Fri, 25 Nov 2022 01:40:48 +0000 (20:40 -0500)
committerMarge Bot <emma+marge@anholt.net>
Fri, 2 Dec 2022 06:25:20 +0000 (06:25 +0000)
Long term, I think having i2i16 and i2i32 available with 8-bit sources should
make lowering the rest of 8-bit away a bit easier. Short term, this avoids
special casing 8-bit in the VBO lowering code.

Signed-off-by: Alyssa Rosenzweig <alyssa@rosenzweig.io>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19996>

src/asahi/compiler/agx_compile.c

index e4936804cf0876d2dc6ca6ea81d2bdc55a675e0a..506a5604a08ecb7a89eac6eaf021b2fe2d2d0716 100644 (file)
@@ -1015,18 +1015,26 @@ agx_emit_alu(agx_builder *b, nir_alu_instr *instr)
 
    case nir_op_i2i32:
    {
-      if (s0.size != AGX_SIZE_16)
-         unreachable("todo: more conversions");
-
-      return agx_iadd_to(b, dst, s0, agx_zero(), 0);
+      if (src_sz == 8) {
+         /* Sign extend in software, NIR likes 8-bit conversions */
+         agx_index ishl16 = agx_bfi(b, agx_zero(), s0, agx_immediate(8), 0);
+         return agx_asr_to(b, dst, ishl16, agx_immediate(8));
+      } else {
+         assert(s0.size == AGX_SIZE_16 && "other conversions lowered");
+         return agx_iadd_to(b, dst, s0, agx_zero(), 0);
+      }
    }
 
    case nir_op_i2i16:
    {
-      if (s0.size != AGX_SIZE_32)
-         unreachable("todo: more conversions");
-
-      return agx_iadd_to(b, dst, s0, agx_zero(), 0);
+      if (src_sz == 8) {
+         /* Sign extend in software, NIR likes 8-bit conversions */
+         agx_index ishl16 = agx_bfi(b, agx_zero(), s0, agx_immediate(8), 0);
+         return agx_asr_to(b, dst, ishl16, agx_immediate(8));
+      } else {
+         assert (s0.size == AGX_SIZE_32 && "other conversions lowered");
+         return agx_iadd_to(b, dst, s0, agx_zero(), 0);
+      }
    }
 
    case nir_op_iadd_sat: