Mesa (staging/21.0): aco: optimize packed fneg

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 13 19:31:07 UTC 2021


Module: Mesa
Branch: staging/21.0
Commit: 4562f9f89402c20681f7480b99d82e9967b5de0f
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=4562f9f89402c20681f7480b99d82e9967b5de0f

Author: Daniel Schürmann <daniel at schuermann.dev>
Date:   Fri Sep 11 16:20:21 2020 +0100

aco: optimize packed fneg

Reviewed-by: Rhys Perry <pendingchaos02 at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6680>
(cherry picked from commit b03be30e07546b813acc1156407b964e68892beb)

---

 .pick_status.json                  |  2 +-
 src/amd/compiler/aco_optimizer.cpp | 38 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/.pick_status.json b/.pick_status.json
index 1fa8f5c86de..04d5f7e9b70 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -301,7 +301,7 @@
         "description": "aco: optimize packed fneg",
         "nominated": false,
         "nomination_type": null,
-        "resolution": 4,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": null
     },
diff --git a/src/amd/compiler/aco_optimizer.cpp b/src/amd/compiler/aco_optimizer.cpp
index 768037a5294..6ce2567a970 100644
--- a/src/amd/compiler/aco_optimizer.cpp
+++ b/src/amd/compiler/aco_optimizer.cpp
@@ -2750,6 +2750,44 @@ void combine_vop3p(opt_ctx &ctx, Block& block, aco_ptr<Instruction>& instr)
       }
    }
 
+   /* check for fneg modifiers */
+   if (instr_info.can_use_input_modifiers[(int)instr->opcode]) {
+      /* at this point, we only have 2-operand instructions */
+      assert(instr->operands.size() == 2);
+      for (unsigned i = 0; i < 2; i++) {
+         Operand& op = instr->operands[i];
+         if (!op.isTemp())
+            continue;
+
+         ssa_info& info = ctx.info[op.tempId()];
+         if (info.is_vop3p() && info.instr->opcode == aco_opcode::v_pk_mul_f16 &&
+             info.instr->operands[1].constantEquals(0xBC00)) {
+            Operand ops[2] = {instr->operands[!i], info.instr->operands[0]};
+            if (!check_vop3_operands(ctx, 2, ops))
+               continue;
+
+            VOP3P_instruction* fneg = static_cast<VOP3P_instruction*>(info.instr);
+            if (fneg->clamp)
+               continue;
+            instr->operands[i] = fneg->operands[0];
+
+            /* opsel_lo/hi is either 0 or 1:
+             * if 0 - pick selection from fneg->lo
+             * if 1 - pick selection from fneg->hi
+             */
+            bool opsel_lo = vop3p->opsel_lo & (1 << i);
+            bool opsel_hi = vop3p->opsel_hi & (1 << i);
+            vop3p->neg_lo[i] ^= true ^ (opsel_lo ? fneg->neg_hi[0] : fneg->neg_lo[0]);
+            vop3p->neg_hi[i] ^= true ^ (opsel_hi ? fneg->neg_hi[0] : fneg->neg_lo[0]);
+            vop3p->opsel_lo ^= ((opsel_lo ? ~fneg->opsel_hi : fneg->opsel_lo) & 1) << i;
+            vop3p->opsel_hi ^= ((opsel_hi ? ~fneg->opsel_hi : fneg->opsel_lo) & 1) << i;
+
+            if (--ctx.uses[fneg->definitions[0].tempId()])
+               ctx.uses[fneg->operands[0].tempId()]++;
+         }
+      }
+   }
+
    if (instr->opcode == aco_opcode::v_pk_add_f16) {
       if (instr->definitions[0].isPrecise())
          return;



More information about the mesa-commit mailing list