pan/midgard: Add mir_choose_alu helper
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Fri, 27 Sep 2019 12:18:54 +0000 (08:18 -0400)
committerAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Mon, 30 Sep 2019 12:40:13 +0000 (08:40 -0400)
Based on a given unit.

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
src/panfrost/midgard/midgard_schedule.c

index e2641ea018093776de16715688e3b1befe70d882..dea8b023e9d1ee2fcbe24a9b71da2bd63c630127 100644 (file)
@@ -818,6 +818,9 @@ struct midgard_predicate {
         /* True if we want to pop off the chosen instruction */
         bool destructive;
 
+        /* For ALU, choose only this unit */
+        unsigned unit;
+
         /* State for bundle constants. constants is the actual constants
          * for the bundle. constant_count is the number of bytes (up to
          * 16) currently in use for constants. When picking in destructive
@@ -957,6 +960,27 @@ mir_choose_bundle(
                 return ~0;
 }
 
+/* We want to choose an ALU instruction filling a given unit */
+static void
+mir_choose_alu(midgard_instruction **slot,
+                midgard_instruction **instructions,
+                BITSET_WORD *worklist, unsigned len,
+                struct midgard_predicate *predicate,
+                unsigned unit)
+{
+        /* Did we already schedule to this slot? */
+        if ((*slot) != NULL)
+                return;
+
+        /* Try to schedule something, if not */
+        predicate->unit = unit;
+        *slot = mir_choose_instruction(instructions, worklist, len, predicate);
+
+        /* Store unit upon scheduling */
+        if (*slot && !((*slot)->compact_branch))
+                (*slot)->unit = unit;
+}
+
 /* When we are scheduling a branch/csel, we need the consumed condition in the
  * same block as a pipeline register. There are two options to enable this:
  *