From: Alyssa Rosenzweig Date: Tue, 24 Sep 2019 13:06:37 +0000 (-0400) Subject: pan/midgard: Extend csel_swizzle to branches X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7cf493241061d2d942a8555ec8cfa08be3254045;p=mesa.git pan/midgard: Extend csel_swizzle to branches Conditions for branches don't have a swizzle explicitly in the emitted binary, but they do implicitly get swizzled in whatever instruction wrote r31, so we need to handle that. Signed-off-by: Alyssa Rosenzweig --- diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index 780e4323554..60d5b9d0e20 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -88,8 +88,8 @@ typedef struct midgard_instruction { unsigned src[3]; unsigned dest; - /* Swizzle for the conditional for a csel */ - unsigned csel_swizzle; + /* Swizzle for the conditional for a csel/branch */ + unsigned cond_swizzle; /* Special fields for an ALU instruction */ midgard_reg_info registers; diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 95ec48e9563..337f46f2e0d 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -1095,7 +1095,7 @@ emit_alu(compiler_context *ctx, nir_alu_instr *instr) }; if (nr_inputs == 3) { - ins.csel_swizzle = SWIZZLE_FROM_ARRAY(nirmods[2]->swizzle); + ins.cond_swizzle = SWIZZLE_FROM_ARRAY(nirmods[2]->swizzle); assert(!nirmods[2]->abs); assert(!nirmods[2]->negate); } diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c index 9e5ba7abcb0..faeac16d18d 100644 --- a/src/panfrost/midgard/mir.c +++ b/src/panfrost/midgard/mir.c @@ -42,8 +42,8 @@ unsigned mir_get_swizzle(midgard_instruction *ins, unsigned idx) { if (ins->type == TAG_ALU_4) { - if (idx == 2) - return ins->csel_swizzle; + if (idx == 2 || ins->compact_branch) + return ins->cond_swizzle; unsigned b = (idx == 0) ? ins->alu.src1 : ins->alu.src2; @@ -105,6 +105,11 @@ void mir_set_swizzle(midgard_instruction *ins, unsigned idx, unsigned new) { if (ins->type == TAG_ALU_4) { + if (idx == 2 || ins->compact_branch) { + ins->cond_swizzle = new; + return; + } + unsigned b = (idx == 0) ? ins->alu.src1 : ins->alu.src2; midgard_vector_alu_src s =