pan/bi: Add helper to measure clause size
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Tue, 5 May 2020 22:20:08 +0000 (18:20 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 29 May 2020 20:34:55 +0000 (20:34 +0000)
Useful for branching.

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 cc40d0398f9eb0024c6f3197c67de06328c24776..1c700b138401df6c7a574abea0713fe5568676ba 100644 (file)
@@ -49,3 +49,43 @@ bi_can_insert_bundle(bi_clause *clause, bool constant)
 
         return (constant_count + bundle_count) <= 13;
 }
+
+/* Helper to calculate the number of quadwords in a clause. This is a function
+ * of the number of instructions and constants; it doesn't require actually
+ * packing, which is useful for branch offsets.
+ *
+ * Table of instruction count to instruction quadwords, per the packing
+ * algorithm, where * indicates a constant is packed for free:
+ *
+ *   X | Y
+ *  ---|---
+ *   1 | 1
+ *   2 | 2
+ *   3 | 3*
+ *   4 | 3
+ *   5 | 4*
+ *   6 | 5*
+ *   7 | 5
+ *   8 | 6*
+ * 
+ * Y = { X      if X <= 3
+ *     { X - 1  if 4 <= X <= 6
+ *     { X - 2  if 7 <= X <= 8
+ *
+ * and there is a constant for free if X is in {3, 5, 6, 8}. The remaining
+ * constants are packed two-by-two as constant quadwords.
+ */
+
+unsigned
+bi_clause_quadwords(bi_clause *clause)
+{
+        unsigned X = clause->bundle_count;
+        unsigned Y = X - ((X >= 7) ? 2 : (X >= 4) ? 1 : 0);
+
+        unsigned constants = clause->constant_count;
+
+        if ((X != 4) && (X != 7) && (X >= 3) && constants)
+                constants--;
+
+        return Y + DIV_ROUND_UP(constants, 2);
+}
index eda8694079fed0a3efb0d0cc7a1a2bc5e2f03656..b1f7887e58706de036dc8008f5aab03a61a9921d 100644 (file)
@@ -584,6 +584,7 @@ bool bi_is_live_after(bi_context *ctx, bi_block *block, bi_instruction *start, i
 /* Layout */
 
 bool bi_can_insert_bundle(bi_clause *clause, bool constant);
+unsigned bi_clause_quadwords(bi_clause *clause);
 
 /* Code emit */