Mesa (master): pan/bi: Handle fmov class ops

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 1 02:42:47 UTC 2020


Module: Mesa
Branch: master
Commit: 12cf9f43f02ac00b9604e12f1fb26e363941d90b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=12cf9f43f02ac00b9604e12f1fb26e363941d90b

Author: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Date:   Tue Mar 31 22:16:55 2020 -0400

pan/bi: Handle fmov class ops

We need to lower them to something reasonable (ideally, the modifier
would be attached but we need to do something for the case it's not). We
specifically have to lower pre-sched as well, but we can do the lower
literally at schedule time for now (if this proves annoying, we can move
it earlier, but I want to leave room for modifier-aware copyprop should
that prove interesting).

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4396>

---

 src/panfrost/bifrost/bi_pack.c     |  2 --
 src/panfrost/bifrost/bi_print.c    |  1 +
 src/panfrost/bifrost/bi_schedule.c | 19 +++++++++++++++++++
 3 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/panfrost/bifrost/bi_pack.c b/src/panfrost/bifrost/bi_pack.c
index 293a109eb5a..9ec31044f71 100644
--- a/src/panfrost/bifrost/bi_pack.c
+++ b/src/panfrost/bifrost/bi_pack.c
@@ -780,7 +780,6 @@ bi_pack_fma(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
                 return BIFROST_FMA_NOP;
         case BI_MOV:
                 return bi_pack_fma_1src(bundle.fma, regs, BIFROST_FMA_OP_MOV);
-        case BI_FMOV:
         case BI_SHIFT:
         case BI_SWIZZLE:
         case BI_ROUND:
@@ -989,7 +988,6 @@ bi_pack_add(bi_clause *clause, bi_bundle bundle, struct bi_registers *regs)
                 return bi_pack_add_ld_var_addr(clause, bundle.add, regs);
         case BI_MINMAX:
         case BI_MOV:
-        case BI_FMOV:
         case BI_SHIFT:
         case BI_STORE:
                 return BIFROST_ADD_NOP;
diff --git a/src/panfrost/bifrost/bi_print.c b/src/panfrost/bifrost/bi_print.c
index 73c3a7f6422..7a4b73aca2b 100644
--- a/src/panfrost/bifrost/bi_print.c
+++ b/src/panfrost/bifrost/bi_print.c
@@ -137,6 +137,7 @@ bi_class_name(enum bi_class cl)
         case BI_CSEL: return "csel";
         case BI_DISCARD: return "discard";
         case BI_FMA: return "fma";
+        case BI_FMOV: return "fmov";
         case BI_FREXP: return "frexp";
         case BI_ISUB: return "isub";
         case BI_LOAD: return "load";
diff --git a/src/panfrost/bifrost/bi_schedule.c b/src/panfrost/bifrost/bi_schedule.c
index b3f7ca605c3..2885aeefe3a 100644
--- a/src/panfrost/bifrost/bi_schedule.c
+++ b/src/panfrost/bifrost/bi_schedule.c
@@ -89,6 +89,22 @@ bi_ambiguous_abs(bi_instruction *ins)
         return classy && typey && absy;
 }
 
+/* Lowers FMOV to ADD #0, since FMOV doesn't exist on the h/w and this is the
+ * latest time it's sane to lower (it's useful to distinguish before, but we'll
+ * need this handle during scheduling to ensure the ports get modeled
+ * correctly with respect to the new zero source) */
+
+static void
+bi_lower_fmov(bi_instruction *ins)
+{
+        if (ins->type != BI_FMOV)
+                return;
+
+        ins->type = BI_ADD;
+        ins->src[1] = BIR_INDEX_ZERO;
+        ins->src_types[1] = ins->src_types[0];
+}
+
 /* Eventually, we'll need a proper scheduling, grouping instructions
  * into clauses and ordering/assigning grouped instructions to the
  * appropriate FMA/ADD slots. Right now we do the dumbest possible
@@ -108,6 +124,9 @@ bi_schedule(bi_context *ctx)
                 list_inithead(&bblock->clauses);
 
                 bi_foreach_instr_in_block(bblock, ins) {
+                        /* Convenient time to lower */
+                        bi_lower_fmov(ins);
+
                         unsigned props = bi_class_props[ins->type];
 
                         bi_clause *u = rzalloc(ctx, bi_clause);



More information about the mesa-commit mailing list