pan/bi: Add move lowering pass
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 19 Mar 2020 21:21:49 +0000 (17:21 -0400)
committerMarge Bot <eric+marge@anholt.net>
Sun, 22 Mar 2020 03:32:35 +0000 (03:32 +0000)
We need ALU mostly scalarized, but we get vector moves created from
lower_vec_to_mov so let's scalarize that ourselves rather than bother
NIR.

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

src/panfrost/bifrost/bifrost_compile.c

index 7d050678115d69e902abe2a67f9fd358d2602e7f..a1040eb6f0f3aea053a045a98adc1e2ac1ec7fff 100644 (file)
@@ -838,6 +838,44 @@ bi_optimize_nir(nir_shader *nir)
         NIR_PASS(progress, nir, nir_opt_dce);
 }
 
+static void
+bi_insert_mov32(bi_context *ctx, bi_instruction *parent, unsigned comp)
+{
+        bi_instruction move = {
+                .type = BI_MOV,
+                .dest = parent->dest,
+                .dest_type = nir_type_uint32,
+                .writemask = (0xF << (4 * comp)),
+                .src = { parent->src[0] },
+                .src_types = { nir_type_uint32 },
+                .swizzle = { { comp } }
+        };
+
+        bi_emit_before(ctx, parent, move);
+}
+
+static void
+bi_lower_mov(bi_context *ctx, bi_block *block)
+{
+        bi_foreach_instr_in_block_safe(block, ins) {
+                if (ins->type != BI_MOV) continue;
+                if (util_bitcount(ins->writemask) <= 4) continue;
+
+                for (unsigned i = 0; i < 4; ++i) {
+                        unsigned quad = (ins->writemask >> (4 * i)) & 0xF;
+
+                        if (quad == 0)
+                                continue;
+                        else if (quad == 0xF)
+                                bi_insert_mov32(ctx, ins, i);
+                        else
+                                unreachable("TODO: Lowering <32bit moves");
+                }
+
+                bi_remove_instruction(ins);
+        }
+}
+
 void
 bifrost_compile_shader_nir(nir_shader *nir, panfrost_program *program, unsigned product_id)
 {
@@ -881,6 +919,11 @@ bifrost_compile_shader_nir(nir_shader *nir, panfrost_program *program, unsigned
                 break; /* TODO: Multi-function shaders */
         }
 
+        bi_foreach_block(ctx, _block) {
+                bi_block *block = (bi_block *) _block;
+                bi_lower_mov(ctx, block);
+        }
+
         bool progress = false;
 
         do {