xref: /aosp_15_r20/external/mesa3d/src/nouveau/mme/mme_value.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2022 Collabora Ltd.
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker #ifndef MME_VALUE_H
6*61046927SAndroid Build Coastguard Worker #define MME_VALUE_H
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
9*61046927SAndroid Build Coastguard Worker #include <stdint.h>
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "util/bitscan.h"
12*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
15*61046927SAndroid Build Coastguard Worker extern "C" {
16*61046927SAndroid Build Coastguard Worker #endif
17*61046927SAndroid Build Coastguard Worker 
18*61046927SAndroid Build Coastguard Worker enum mme_value_type {
19*61046927SAndroid Build Coastguard Worker    /* This must be zero, making a zero-initizlied mme_value a ZERO */
20*61046927SAndroid Build Coastguard Worker    MME_VALUE_TYPE_ZERO = 0,
21*61046927SAndroid Build Coastguard Worker    MME_VALUE_TYPE_IMM,
22*61046927SAndroid Build Coastguard Worker    MME_VALUE_TYPE_REG,
23*61046927SAndroid Build Coastguard Worker };
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker struct mme_value {
26*61046927SAndroid Build Coastguard Worker    enum mme_value_type type;
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker    union {
29*61046927SAndroid Build Coastguard Worker       uint32_t imm;
30*61046927SAndroid Build Coastguard Worker       uint32_t reg;
31*61046927SAndroid Build Coastguard Worker    };
32*61046927SAndroid Build Coastguard Worker };
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker struct mme_value64 {
35*61046927SAndroid Build Coastguard Worker    struct mme_value lo;
36*61046927SAndroid Build Coastguard Worker    struct mme_value hi;
37*61046927SAndroid Build Coastguard Worker };
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker static inline struct mme_value
mme_zero()40*61046927SAndroid Build Coastguard Worker mme_zero()
41*61046927SAndroid Build Coastguard Worker {
42*61046927SAndroid Build Coastguard Worker    struct mme_value val = {
43*61046927SAndroid Build Coastguard Worker       .type = MME_VALUE_TYPE_ZERO,
44*61046927SAndroid Build Coastguard Worker    };
45*61046927SAndroid Build Coastguard Worker    return val;
46*61046927SAndroid Build Coastguard Worker }
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker static inline struct mme_value
mme_imm(uint32_t imm)49*61046927SAndroid Build Coastguard Worker mme_imm(uint32_t imm)
50*61046927SAndroid Build Coastguard Worker {
51*61046927SAndroid Build Coastguard Worker    struct mme_value val = {
52*61046927SAndroid Build Coastguard Worker       .type = MME_VALUE_TYPE_IMM,
53*61046927SAndroid Build Coastguard Worker       .imm = imm,
54*61046927SAndroid Build Coastguard Worker    };
55*61046927SAndroid Build Coastguard Worker    return val;
56*61046927SAndroid Build Coastguard Worker }
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker static inline bool
mme_is_zero(struct mme_value x)59*61046927SAndroid Build Coastguard Worker mme_is_zero(struct mme_value x)
60*61046927SAndroid Build Coastguard Worker {
61*61046927SAndroid Build Coastguard Worker    switch (x.type) {
62*61046927SAndroid Build Coastguard Worker    case MME_VALUE_TYPE_ZERO:  return true;
63*61046927SAndroid Build Coastguard Worker    case MME_VALUE_TYPE_IMM:   return x.imm == 0;
64*61046927SAndroid Build Coastguard Worker    case MME_VALUE_TYPE_REG:   return false;
65*61046927SAndroid Build Coastguard Worker    default: unreachable("Invalid MME value type");
66*61046927SAndroid Build Coastguard Worker    }
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker static inline struct mme_value64
mme_value64(struct mme_value lo,struct mme_value hi)70*61046927SAndroid Build Coastguard Worker mme_value64(struct mme_value lo, struct mme_value hi)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker    struct mme_value64 val = { lo, hi };
73*61046927SAndroid Build Coastguard Worker    return val;
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker static inline struct mme_value64
mme_imm64(uint64_t imm)77*61046927SAndroid Build Coastguard Worker mme_imm64(uint64_t imm)
78*61046927SAndroid Build Coastguard Worker {
79*61046927SAndroid Build Coastguard Worker    struct mme_value64 val = {
80*61046927SAndroid Build Coastguard Worker       mme_imm((uint32_t)imm),
81*61046927SAndroid Build Coastguard Worker       mme_imm((uint32_t)(imm >> 32)),
82*61046927SAndroid Build Coastguard Worker    };
83*61046927SAndroid Build Coastguard Worker    return val;
84*61046927SAndroid Build Coastguard Worker }
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker struct mme_reg_alloc {
87*61046927SAndroid Build Coastguard Worker    uint32_t exists;
88*61046927SAndroid Build Coastguard Worker    uint32_t alloc;
89*61046927SAndroid Build Coastguard Worker };
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker static inline void
mme_reg_alloc_init(struct mme_reg_alloc * a,uint32_t exists)92*61046927SAndroid Build Coastguard Worker mme_reg_alloc_init(struct mme_reg_alloc *a, uint32_t exists)
93*61046927SAndroid Build Coastguard Worker {
94*61046927SAndroid Build Coastguard Worker    a->alloc = 0;
95*61046927SAndroid Build Coastguard Worker    a->exists = exists;
96*61046927SAndroid Build Coastguard Worker }
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker static inline struct mme_value
mme_reg_alloc_alloc(struct mme_reg_alloc * a)99*61046927SAndroid Build Coastguard Worker mme_reg_alloc_alloc(struct mme_reg_alloc *a)
100*61046927SAndroid Build Coastguard Worker {
101*61046927SAndroid Build Coastguard Worker    uint8_t reg = ffs(~a->alloc & a->exists) - 1;
102*61046927SAndroid Build Coastguard Worker    assert(reg < 32);
103*61046927SAndroid Build Coastguard Worker    assert(a->exists & (1u << reg));
104*61046927SAndroid Build Coastguard Worker 
105*61046927SAndroid Build Coastguard Worker    a->alloc |= (1u << reg);
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker    struct mme_value val = {
108*61046927SAndroid Build Coastguard Worker       .type = MME_VALUE_TYPE_REG,
109*61046927SAndroid Build Coastguard Worker       .reg = reg,
110*61046927SAndroid Build Coastguard Worker    };
111*61046927SAndroid Build Coastguard Worker 
112*61046927SAndroid Build Coastguard Worker    return val;
113*61046927SAndroid Build Coastguard Worker }
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker static inline void
mme_reg_alloc_realloc(struct mme_reg_alloc * a,struct mme_value val)116*61046927SAndroid Build Coastguard Worker mme_reg_alloc_realloc(struct mme_reg_alloc *a, struct mme_value val)
117*61046927SAndroid Build Coastguard Worker {
118*61046927SAndroid Build Coastguard Worker    assert(val.type == MME_VALUE_TYPE_REG);
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker    assert(val.reg < 32);
121*61046927SAndroid Build Coastguard Worker    assert(a->exists & (1u << val.reg));
122*61046927SAndroid Build Coastguard Worker    assert(!(a->alloc & (1u << val.reg)));
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    a->alloc |= (1u << val.reg);
125*61046927SAndroid Build Coastguard Worker }
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker static inline void
mme_reg_alloc_free(struct mme_reg_alloc * a,struct mme_value val)128*61046927SAndroid Build Coastguard Worker mme_reg_alloc_free(struct mme_reg_alloc *a, struct mme_value val)
129*61046927SAndroid Build Coastguard Worker {
130*61046927SAndroid Build Coastguard Worker    assert(val.type == MME_VALUE_TYPE_REG);
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    assert(val.reg < 32);
133*61046927SAndroid Build Coastguard Worker    assert(a->exists & (1u << val.reg));
134*61046927SAndroid Build Coastguard Worker    assert(a->alloc & (1u << val.reg));
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker    a->alloc &= ~(1u << val.reg);
137*61046927SAndroid Build Coastguard Worker }
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker #endif
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker #endif /* MME_VALUE_H */
144