[Mesa-dev] [PATCH 28/30] pan/midgard: Add mir_flip helper

Alyssa Rosenzweig alyssa.rosenzweig at collabora.com
Sat Sep 28 19:02:33 UTC 2019


Useful for various operations on both commutative and anticommutative
ops.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
---
 src/panfrost/midgard/compiler.h           |  1 +
 src/panfrost/midgard/midgard_opt_invert.c | 13 +++----------
 src/panfrost/midgard/mir.c                | 17 +++++++++++++++++
 3 files changed, 21 insertions(+), 10 deletions(-)

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;
+}
-- 
2.23.0



More information about the mesa-dev mailing list