pan/bi: Route through clause header
[mesa.git] / src / panfrost / bifrost / compiler.h
index 920ca7d7e06dc306e6418014e540e6a813566fbd..3c84c2671d52cc37782f6430c37e42bce8f9348a 100644 (file)
@@ -113,6 +113,11 @@ extern unsigned bi_class_props[BI_NUM_CLASSES];
 /* Intrinsic is vectorized and should read 4 components regardless of writemask */
 #define BI_VECTOR (1 << 8)
 
+/* Use a data register for src0/dest respectively, bypassing the usual
+ * register accessor. Mutually exclusive. */
+#define BI_DATA_REG_SRC (1 << 9)
+#define BI_DATA_REG_DEST (1 << 10)
+
 /* It can't get any worse than csel4... can it? */
 #define BIR_SRC_COUNT 4
 
@@ -302,12 +307,18 @@ typedef struct {
         bool back_to_back;
         bool branch_conditional;
 
+        /* Assigned data register */
+        unsigned data_register;
+
         /* Corresponds to the usual bit but shifted by a clause */
         bool data_register_write_barrier;
 
         /* Constants read by this clause. ISA limit. */
         uint64_t constants[8];
         unsigned constant_count;
+
+        /* What type of high latency instruction is here, basically */
+        unsigned clause_type;
 } bi_clause;
 
 typedef struct bi_block {
@@ -371,23 +382,25 @@ bi_remove_instruction(bi_instruction *ins)
  *  Uniform: access a uniform register given by low bits.
  *  Constant: access the specified constant 
  *  Zero: special cased to avoid wasting a constant
+ *  Passthrough: a bifrost_packed_src to passthrough T/T0/T1
  */
 
 #define BIR_INDEX_REGISTER (1 << 31)
 #define BIR_INDEX_UNIFORM  (1 << 30)
 #define BIR_INDEX_CONSTANT (1 << 29)
 #define BIR_INDEX_ZERO     (1 << 28)
+#define BIR_INDEX_PASS     (1 << 27)
 
 /* Keep me synced please so we can check src & BIR_SPECIAL */
 
 #define BIR_SPECIAL        ((BIR_INDEX_REGISTER | BIR_INDEX_UNIFORM) | \
-        (BIR_INDEX_CONSTANT | BIR_INDEX_ZERO))
+        (BIR_INDEX_CONSTANT | BIR_INDEX_ZERO | BIR_INDEX_PASS))
 
 static inline unsigned
 bi_max_temp(bi_context *ctx)
 {
         unsigned alloc = MAX2(ctx->impl->reg_alloc, ctx->impl->ssa_alloc);
-        return ((alloc + 1 + ctx->temp_alloc) << 1) | BIR_IS_REG;
+        return ((alloc + 2 + ctx->temp_alloc) << 1);
 }
 
 static inline unsigned
@@ -494,6 +507,12 @@ bi_next_op(bi_instruction *ins)
         return list_first_entry(&(ins->link), bi_instruction, link);
 }
 
+static inline pan_block *
+pan_next_block(pan_block *block)
+{
+        return list_first_entry(&(block->link), pan_block, link);
+}
+
 /* BIR manipulation */
 
 bool bi_has_outmod(bi_instruction *ins);
@@ -508,6 +527,7 @@ uint16_t bi_bytemask_of_read_components(bi_instruction *ins, unsigned node);
 
 bool bi_opt_dead_code_eliminate(bi_context *ctx, bi_block *block);
 void bi_schedule(bi_context *ctx);
+void bi_register_allocate(bi_context *ctx);
 
 /* Liveness */
 
@@ -516,4 +536,8 @@ void bi_liveness_ins_update(uint16_t *live, bi_instruction *ins, unsigned max);
 void bi_invalidate_liveness(bi_context *ctx);
 bool bi_is_live_after(bi_context *ctx, bi_block *block, bi_instruction *start, int src);
 
+/* Code emit */
+
+void bi_pack(bi_context *ctx, struct util_dynarray *emission);
+
 #endif