nouveau/mme: Add a mme_reg_alloc struct
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Tue, 31 Jan 2023 02:12:05 +0000 (20:12 -0600)
committerMarge Bot <emma+marge@anholt.net>
Fri, 4 Aug 2023 21:32:03 +0000 (21:32 +0000)
This has some nice asserts which we'll want when we start having
reserved registers on Fermi.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24326>

src/nouveau/mme/mme_builder.h
src/nouveau/mme/mme_tu104_builder.c
src/nouveau/mme/mme_value.h

index afb6eb6..7e9649e 100644 (file)
@@ -48,6 +48,8 @@ struct mme_tu104_builder {
    struct mme_tu104_cf cf_stack[8];
 };
 
+void mme_tu104_builder_init(struct mme_builder *b);
+
 void mme_tu104_add_inst(struct mme_builder *b,
                         const struct mme_tu104_inst *inst);
 
@@ -100,10 +102,8 @@ void mme_tu104_end_while(struct mme_builder *b,
 uint32_t *mme_tu104_builder_finish(struct mme_tu104_builder *b,
                                    size_t *size_out);
 
-#define MME_BUILDER_MAX_REGS 23
-
 struct mme_builder {
-   uint32_t reg_alloc;
+   struct mme_reg_alloc reg_alloc;
 
    struct mme_tu104_builder tu104;
 };
@@ -112,6 +112,7 @@ static inline void
 mme_builder_init(struct mme_builder *b)
 {
    memset(b, 0, sizeof(*b));
+   mme_tu104_builder_init(b);
 }
 
 static inline uint32_t *
@@ -120,35 +121,16 @@ mme_builder_finish(struct mme_builder *b, size_t *size_out)
    return mme_tu104_builder_finish(&b->tu104, size_out);
 }
 
-static inline uint8_t
-__mme_alloc_reg(struct mme_builder *b)
-{
-   uint8_t reg = ffs(~b->reg_alloc) - 1;
-   b->reg_alloc |= (1u << reg);
-   return reg;
-}
-
-static inline void
-__mme_free_reg(struct mme_builder *b, uint8_t reg)
-{
-   b->reg_alloc &= ~(1u << reg);
-}
-
 static inline struct mme_value
 mme_alloc_reg(struct mme_builder *b)
 {
-   struct mme_value val = {
-      .type = MME_VALUE_TYPE_REG,
-      .reg = __mme_alloc_reg(b),
-   };
-   return val;
+   return mme_reg_alloc_alloc(&b->reg_alloc);
 }
 
 static inline void
 mme_free_reg(struct mme_builder *b, struct mme_value val)
 {
-   assert(val.type == MME_VALUE_TYPE_REG);
-   __mme_free_reg(b, val.reg);
+   mme_reg_alloc_free(&b->reg_alloc, val);
 }
 
 static inline struct mme_value
index 74f0a4e..8f37973 100644 (file)
@@ -3,6 +3,14 @@
 #include <stdio.h>
 #include <stdlib.h>
 
+#define MME_TU104_MAX_REGS 23
+
+void
+mme_tu104_builder_init(struct mme_builder *b)
+{
+   mme_reg_alloc_init(&b->reg_alloc, BITFIELD_MASK(MME_TU104_MAX_REGS));
+}
+
 static void
 mme_tu104_new_inst(struct mme_tu104_builder *tb)
 {
index b550ec9..dda0580 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdbool.h>
 #include <stdint.h>
 
+#include "util/bitscan.h"
 #include "util/macros.h"
 
 #ifdef __cplusplus
@@ -77,6 +78,47 @@ mme_imm64(uint64_t imm)
    return val;
 }
 
+struct mme_reg_alloc {
+   uint32_t exists;
+   uint32_t alloc;
+};
+
+static inline void
+mme_reg_alloc_init(struct mme_reg_alloc *a, uint32_t exists)
+{
+   a->alloc = 0;
+   a->exists = exists;
+}
+
+static inline struct mme_value
+mme_reg_alloc_alloc(struct mme_reg_alloc *a)
+{
+   uint8_t reg = ffs(~a->alloc & a->exists) - 1;
+   assert(reg < 32);
+   assert(a->exists & (1u << reg));
+
+   a->alloc |= (1u << reg);
+
+   struct mme_value val = {
+      .type = MME_VALUE_TYPE_REG,
+      .reg = reg,
+   };
+
+   return val;
+}
+
+static inline void
+mme_reg_alloc_free(struct mme_reg_alloc *a, struct mme_value val)
+{
+   assert(val.type == MME_VALUE_TYPE_REG);
+
+   assert(val.reg < 32);
+   assert(a->exists & (1u << val.reg));
+   assert(a->alloc & (1u << val.reg));
+
+   a->alloc &= ~(1u << val.reg);
+}
+
 #ifdef __cplusplus
 }
 #endif