pan/bi: Add move lowering pass

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>
This commit is contained in:
Alyssa Rosenzweig 2020-03-19 17:21:49 -04:00 committed by Marge Bot
parent 58a51c49bb
commit 50d3f4df45
1 changed files with 43 additions and 0 deletions

View 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 {