pan/midgard: Add mir_flip helper

Useful for various operations on both commutative and anticommutative
ops.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
This commit is contained in:
Alyssa Rosenzweig
2019-09-28 12:38:51 -04:00
parent 10037ce523
commit f0f4b39548
3 changed files with 21 additions and 10 deletions

View File

@@ -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 */

View File

@@ -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) {

View File

@@ -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;
}