pan/bi: Measure distance between blocks
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 28 May 2020 17:49:59 +0000 (13:49 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 29 May 2020 20:34:55 +0000 (20:34 +0000)
For branch offset calculation.

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

src/panfrost/bifrost/bi_layout.c
src/panfrost/bifrost/compiler.h

index 1c700b138401df6c7a574abea0713fe5568676ba..77e97e85ee94aa625dfb38fcc382a37ecd319814 100644 (file)
@@ -89,3 +89,49 @@ bi_clause_quadwords(bi_clause *clause)
 
         return Y + DIV_ROUND_UP(constants, 2);
 }
+
+/* Measures the number of quadwords a branch jumps. Bifrost relative offsets
+ * are from the beginning of a clause so to jump forward we count the current
+ * clause length, but to jump backwards we do not. */
+
+signed
+bi_block_offset(bi_context *ctx, bi_clause *start, bi_block *target)
+{
+        /* Signed since we might jump backwards */
+        signed ret = 0;
+
+        /* Determine if the block we're branching to is strictly greater in
+         * source order */
+        bool forwards = target->base.name > start->block->base.name;
+
+        if (forwards) {
+                /* We have to jump through this block from the start of this
+                 * clause to the end */
+                bi_foreach_clause_in_block_from(start->block, clause, start) {
+                        ret += bi_clause_quadwords(clause);
+                }
+
+                /* We then need to jump through every clause of every following
+                 * block until the target */
+                bi_foreach_block_from(ctx, start->block, _blk) {
+                        bi_block *blk = (bi_block *) _blk;
+
+                        /* Don't double-count the first block */
+                        if (blk == start->block)
+                                continue;
+
+                        /* End just before the target */
+                        if (blk == target)
+                                break;
+
+                        /* Count every clause in the block */
+                        bi_foreach_clause_in_block(blk, clause) {
+                                ret += bi_clause_quadwords(clause);
+                        }
+                }
+        } else {
+                unreachable("Backwards branching is to-do");
+        }
+
+        return ret;
+}
index bfa8ab81fe0592951a73542cf839b7d3be21ef7c..ad02a46a2d00f49dc9dcc83231b783905668b341 100644 (file)
@@ -602,6 +602,7 @@ bool bi_is_live_after(bi_context *ctx, bi_block *block, bi_instruction *start, i
 
 bool bi_can_insert_bundle(bi_clause *clause, bool constant);
 unsigned bi_clause_quadwords(bi_clause *clause);
+signed bi_block_offset(bi_context *ctx, bi_clause *start, bi_block *target);
 
 /* Code emit */