Mesa (main): nir,vc4: Suffix a bunch of unorm 4x8 opcodes _vc4

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 21 14:28:04 UTC 2021


Module: Mesa
Branch: main
Commit: 2e08bae9b38a241b505e882d681f6f68d346937e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=2e08bae9b38a241b505e882d681f6f68d346937e

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Fri Jun 18 09:28:59 2021 -0500

nir,vc4: Suffix a bunch of unorm 4x8 opcodes _vc4

Reviewed-by: Alyssa Rosenzweig <alyssa at collabora.com>
Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11463>

---

 src/compiler/nir/nir_opcodes.py               | 92 ++++++++++++++-------------
 src/compiler/nir/nir_opt_algebraic.py         | 12 ++--
 src/gallium/drivers/vc4/vc4_nir_lower_blend.c | 16 ++---
 src/gallium/drivers/vc4/vc4_program.c         | 10 +--
 4 files changed, 66 insertions(+), 64 deletions(-)

diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py
index efd7ecce212..4e48567340c 100644
--- a/src/compiler/nir/nir_opcodes.py
+++ b/src/compiler/nir/nir_opcodes.py
@@ -883,51 +883,6 @@ binop("fmax", tfloat, _2src_commutative + associative, "fmax(src0, src1)")
 binop("imax", tint, _2src_commutative + associative, "src1 > src0 ? src1 : src0")
 binop("umax", tuint, _2src_commutative + associative, "src1 > src0 ? src1 : src0")
 
-# Saturated vector add for 4 8bit ints.
-binop("usadd_4x8", tint32, _2src_commutative + associative, """
-dst = 0;
-for (int i = 0; i < 32; i += 8) {
-   dst |= MIN2(((src0 >> i) & 0xff) + ((src1 >> i) & 0xff), 0xff) << i;
-}
-""")
-
-# Saturated vector subtract for 4 8bit ints.
-binop("ussub_4x8", tint32, "", """
-dst = 0;
-for (int i = 0; i < 32; i += 8) {
-   int src0_chan = (src0 >> i) & 0xff;
-   int src1_chan = (src1 >> i) & 0xff;
-   if (src0_chan > src1_chan)
-      dst |= (src0_chan - src1_chan) << i;
-}
-""")
-
-# vector min for 4 8bit ints.
-binop("umin_4x8", tint32, _2src_commutative + associative, """
-dst = 0;
-for (int i = 0; i < 32; i += 8) {
-   dst |= MIN2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
-}
-""")
-
-# vector max for 4 8bit ints.
-binop("umax_4x8", tint32, _2src_commutative + associative, """
-dst = 0;
-for (int i = 0; i < 32; i += 8) {
-   dst |= MAX2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
-}
-""")
-
-# unorm multiply: (a * b) / 255.
-binop("umul_unorm_4x8", tint32, _2src_commutative + associative, """
-dst = 0;
-for (int i = 0; i < 32; i += 8) {
-   int src0_chan = (src0 >> i) & 0xff;
-   int src1_chan = (src1 >> i) & 0xff;
-   dst |= ((src0_chan * src1_chan) / 255) << i;
-}
-""")
-
 binop("fpow", tfloat, "", "bit_size == 64 ? powf(src0, src1) : pow(src0, src1)")
 
 binop_horiz("pack_half_2x16_split", 1, tuint32, 1, tfloat32, 1, tfloat32,
@@ -1286,6 +1241,53 @@ binop("umul24_relaxed", tuint32, _2src_commutative + associative, "src0 * src1")
 unop_convert("fisnormal", tbool1, tfloat, "isnormal(src0)")
 unop_convert("fisfinite", tbool1, tfloat, "isfinite(src0)")
 
+# vc4-specific opcodes
+
+# Saturated vector add for 4 8bit ints.
+binop("usadd_4x8_vc4", tint32, _2src_commutative + associative, """
+dst = 0;
+for (int i = 0; i < 32; i += 8) {
+   dst |= MIN2(((src0 >> i) & 0xff) + ((src1 >> i) & 0xff), 0xff) << i;
+}
+""")
+
+# Saturated vector subtract for 4 8bit ints.
+binop("ussub_4x8_vc4", tint32, "", """
+dst = 0;
+for (int i = 0; i < 32; i += 8) {
+   int src0_chan = (src0 >> i) & 0xff;
+   int src1_chan = (src1 >> i) & 0xff;
+   if (src0_chan > src1_chan)
+      dst |= (src0_chan - src1_chan) << i;
+}
+""")
+
+# vector min for 4 8bit ints.
+binop("umin_4x8_vc4", tint32, _2src_commutative + associative, """
+dst = 0;
+for (int i = 0; i < 32; i += 8) {
+   dst |= MIN2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
+}
+""")
+
+# vector max for 4 8bit ints.
+binop("umax_4x8_vc4", tint32, _2src_commutative + associative, """
+dst = 0;
+for (int i = 0; i < 32; i += 8) {
+   dst |= MAX2((src0 >> i) & 0xff, (src1 >> i) & 0xff) << i;
+}
+""")
+
+# unorm multiply: (a * b) / 255.
+binop("umul_unorm_4x8_vc4", tint32, _2src_commutative + associative, """
+dst = 0;
+for (int i = 0; i < 32; i += 8) {
+   int src0_chan = (src0 >> i) & 0xff;
+   int src1_chan = (src1 >> i) & 0xff;
+   dst |= ((src0_chan * src1_chan) / 255) << i;
+}
+""")
+
 # Mali-specific opcodes
 unop("fsat_signed_mali", tfloat, ("fmin(fmax(src0, -1.0), 1.0)"))
 unop("fclamp_pos_mali", tfloat, ("fmax(src0, 0.0)"))
diff --git a/src/compiler/nir/nir_opt_algebraic.py b/src/compiler/nir/nir_opt_algebraic.py
index 8dc20390491..eef8027c7f6 100644
--- a/src/compiler/nir/nir_opt_algebraic.py
+++ b/src/compiler/nir/nir_opt_algebraic.py
@@ -133,8 +133,8 @@ optimizations = [
    (('fadd(is_only_used_as_float)', 'a at 16', 0.0), a, '!'+signed_zero_inf_nan_preserve_16),
    (('fadd(is_only_used_as_float)', 'a at 32', 0.0), a, '!'+signed_zero_inf_nan_preserve_32),
    (('iadd', a, 0), a),
-   (('usadd_4x8', a, 0), a),
-   (('usadd_4x8', a, ~0), ~0),
+   (('usadd_4x8_vc4', a, 0), a),
+   (('usadd_4x8_vc4', a, ~0), ~0),
    (('~fadd', ('fmul', a, b), ('fmul', a, c)), ('fmul', a, ('fadd', b, c))),
    (('iadd', ('imul', a, b), ('imul', a, c)), ('imul', a, ('iadd', b, c))),
    (('iand', ('ior', a, b), ('ior', a, c)), ('ior', a, ('iand', b, c))),
@@ -151,8 +151,8 @@ optimizations = [
    (('fmul', 'a at 16', 0.0), 0.0, '!'+signed_zero_inf_nan_preserve_16),
    (('fmul', 'a at 32', 0.0), 0.0, '!'+signed_zero_inf_nan_preserve_32),
    (('imul', a, 0), 0),
-   (('umul_unorm_4x8', a, 0), 0),
-   (('umul_unorm_4x8', a, ~0), a),
+   (('umul_unorm_4x8_vc4', a, 0), 0),
+   (('umul_unorm_4x8_vc4', a, ~0), a),
    (('~fmul', a, 1.0), a),
    # The only effect a*1.0 can have is flushing denormals. If it's only used by
    # a floating point instruction, they should flush any input denormals and
@@ -1333,8 +1333,8 @@ for op in ('extract_u8', 'extract_i8'):
 
 optimizations.extend([
    # Subtracts
-   (('ussub_4x8', a, 0), a),
-   (('ussub_4x8', a, ~0), 0),
+   (('ussub_4x8_vc4', a, 0), a),
+   (('ussub_4x8_vc4', a, ~0), 0),
    # Lower all Subtractions first - they can get recombined later
    (('fsub', a, b), ('fadd', a, ('fneg', b))),
    (('isub', a, b), ('iadd', a, ('ineg', b))),
diff --git a/src/gallium/drivers/vc4/vc4_nir_lower_blend.c b/src/gallium/drivers/vc4/vc4_nir_lower_blend.c
index d7cfa735310..d01a4c20749 100644
--- a/src/gallium/drivers/vc4/vc4_nir_lower_blend.c
+++ b/src/gallium/drivers/vc4/vc4_nir_lower_blend.c
@@ -159,7 +159,7 @@ vc4_blend_channel_i(nir_builder *b,
                 return dst;
         case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
                 return vc4_nir_set_packed_chan(b,
-                                               nir_umin_4x8(b,
+                                               nir_umin_4x8_vc4(b,
                                                             src_a,
                                                             nir_inot(b, dst_a)),
                                                nir_imm_int(b, ~0),
@@ -226,15 +226,15 @@ vc4_blend_func_i(nir_builder *b, nir_ssa_def *src, nir_ssa_def *dst,
 {
         switch (func) {
         case PIPE_BLEND_ADD:
-                return nir_usadd_4x8(b, src, dst);
+                return nir_usadd_4x8_vc4(b, src, dst);
         case PIPE_BLEND_SUBTRACT:
-                return nir_ussub_4x8(b, src, dst);
+                return nir_ussub_4x8_vc4(b, src, dst);
         case PIPE_BLEND_REVERSE_SUBTRACT:
-                return nir_ussub_4x8(b, dst, src);
+                return nir_ussub_4x8_vc4(b, dst, src);
         case PIPE_BLEND_MIN:
-                return nir_umin_4x8(b, src, dst);
+                return nir_umin_4x8_vc4(b, src, dst);
         case PIPE_BLEND_MAX:
-                return nir_umax_4x8(b, src, dst);
+                return nir_umax_4x8_vc4(b, src, dst);
 
         default:
                 /* Unsupported. */
@@ -353,8 +353,8 @@ vc4_do_blending_i(struct vc4_compile *c, nir_builder *b,
                                                      dst_alpha_factor,
                                                      alpha_chan);
         }
-        nir_ssa_def *src_blend = nir_umul_unorm_4x8(b, src_color, src_factor);
-        nir_ssa_def *dst_blend = nir_umul_unorm_4x8(b, dst_color, dst_factor);
+        nir_ssa_def *src_blend = nir_umul_unorm_4x8_vc4(b, src_color, src_factor);
+        nir_ssa_def *dst_blend = nir_umul_unorm_4x8_vc4(b, dst_color, dst_factor);
 
         nir_ssa_def *result =
                 vc4_blend_func_i(b, src_blend, dst_blend, blend->rgb_func);
diff --git a/src/gallium/drivers/vc4/vc4_program.c b/src/gallium/drivers/vc4/vc4_program.c
index f3c57942621..0c4ff754d4d 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -1276,23 +1276,23 @@ ntq_emit_alu(struct vc4_compile *c, nir_alu_instr *instr)
                 result = ntq_emit_ubfe(c, src[0], src[1], src[2]);
                 break;
 
-        case nir_op_usadd_4x8:
+        case nir_op_usadd_4x8_vc4:
                 result = qir_V8ADDS(c, src[0], src[1]);
                 break;
 
-        case nir_op_ussub_4x8:
+        case nir_op_ussub_4x8_vc4:
                 result = qir_V8SUBS(c, src[0], src[1]);
                 break;
 
-        case nir_op_umin_4x8:
+        case nir_op_umin_4x8_vc4:
                 result = qir_V8MIN(c, src[0], src[1]);
                 break;
 
-        case nir_op_umax_4x8:
+        case nir_op_umax_4x8_vc4:
                 result = qir_V8MAX(c, src[0], src[1]);
                 break;
 
-        case nir_op_umul_unorm_4x8:
+        case nir_op_umul_unorm_4x8_vc4:
                 result = qir_V8MULD(c, src[0], src[1]);
                 break;
 



More information about the mesa-commit mailing list