From: Alyssa Rosenzweig Date: Sat, 28 Sep 2019 16:38:51 +0000 (-0400) Subject: pan/midgard: Add mir_flip helper X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f0f4b3954805b76135fbaeb434b9cad3226e287a;p=mesa.git pan/midgard: Add mir_flip helper Useful for various operations on both commutative and anticommutative ops. Signed-off-by: Alyssa Rosenzweig --- diff --git a/src/panfrost/midgard/compiler.h b/src/panfrost/midgard/compiler.h index cb7d53dd653..8bbf67aa4e7 100644 --- a/src/panfrost/midgard/compiler.h +++ b/src/panfrost/midgard/compiler.h @@ -524,6 +524,7 @@ bool mir_nontrivial_outmod(midgard_instruction *ins); void mir_insert_instruction_before_scheduled(compiler_context *ctx, midgard_block *block, midgard_instruction *tag, midgard_instruction ins); void mir_insert_instruction_after_scheduled(compiler_context *ctx, midgard_block *block, midgard_instruction *tag, midgard_instruction ins); +void mir_flip(midgard_instruction *ins); /* MIR goodies */ diff --git a/src/panfrost/midgard/midgard_opt_invert.c b/src/panfrost/midgard/midgard_opt_invert.c index 729169f9a4a..f846bca5bf9 100644 --- a/src/panfrost/midgard/midgard_opt_invert.c +++ b/src/panfrost/midgard/midgard_opt_invert.c @@ -256,16 +256,9 @@ midgard_opt_fuse_src_invert(compiler_context *ctx, midgard_block *block) if (both) { ins->alu.op = mir_demorgan_op(ins->alu.op); } else if (right || (left && !ins->has_inline_constant)) { - if (left) { - /* Commute */ - unsigned temp = ins->src[0]; - ins->src[0] = ins->src[1]; - ins->src[1] = temp; - - temp = ins->alu.src1; - ins->alu.src1 = ins->alu.src2; - ins->alu.src2 = temp; - } + /* Commute arguments */ + if (left) + mir_flip(ins); ins->alu.op = mir_notright_op(ins->alu.op); } else if (left && ins->has_inline_constant) { diff --git a/src/panfrost/midgard/mir.c b/src/panfrost/midgard/mir.c index faeac16d18d..f02527ff219 100644 --- a/src/panfrost/midgard/mir.c +++ b/src/panfrost/midgard/mir.c @@ -527,3 +527,20 @@ mir_insert_instruction_after_scheduled( memcpy(bundles + after + 1, &new, sizeof(new)); list_addtail(&new.instructions[0]->link, &after_bundle_1->instructions[0]->link); } + +/* Flip the first-two arguments of a (binary) op. Currently ALU + * only, no known uses for ldst/tex */ + +void +mir_flip(midgard_instruction *ins) +{ + unsigned temp = ins->src[0]; + ins->src[0] = ins->src[1]; + ins->src[1] = temp; + + assert(ins->type == TAG_ALU_4); + + temp = ins->alu.src1; + ins->alu.src1 = ins->alu.src2; + ins->alu.src2 = temp; +}