xref: /aosp_15_r20/external/mesa3d/src/nouveau/mme/mme_tu104_builder.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2022 Collabora Ltd.
3  * SPDX-License-Identifier: MIT
4  */
5 #ifndef MME_BUILDER_H
6 #error "This file must only be included by mme_builder.h"
7 #endif
8 
9 enum mme_tu104_instr_parts {
10    MME_TU104_INSTR_PART_IMM0  = BITFIELD_BIT(0),
11    MME_TU104_INSTR_PART_IMM1  = BITFIELD_BIT(1),
12    MME_TU104_INSTR_PART_LOAD0 = BITFIELD_BIT(2),
13    MME_TU104_INSTR_PART_LOAD1 = BITFIELD_BIT(3),
14    MME_TU104_INSTR_PART_ALU0  = BITFIELD_BIT(4),
15    MME_TU104_INSTR_PART_ALU1  = BITFIELD_BIT(5),
16    MME_TU104_INSTR_PART_MTHD0 = BITFIELD_BIT(6),
17    MME_TU104_INSTR_PART_MTHD1 = BITFIELD_BIT(7),
18    MME_TU104_INSTR_PART_EMIT0 = BITFIELD_BIT(8),
19    MME_TU104_INSTR_PART_EMIT1 = BITFIELD_BIT(9),
20 };
21 
22 #define MME_TU104_BUILDER_MAX_INSTS 128
23 
24 struct mme_tu104_builder {
25    uint32_t inst_count;
26    struct mme_tu104_inst insts[MME_TU104_BUILDER_MAX_INSTS];
27    enum mme_tu104_instr_parts inst_parts;
28 
29    uint32_t cf_depth;
30    struct mme_cf cf_stack[8];
31 };
32 
33 void mme_tu104_builder_init(struct mme_builder *b);
34 
35 void mme_tu104_add_inst(struct mme_builder *b,
36                         const struct mme_tu104_inst *inst);
37 
38 #define mme_tu104_asm(b, __inst)                                     \
39    for (struct mme_tu104_inst __inst = { MME_TU104_INST_DEFAULTS };  \
40         !__inst.end_next;                                            \
41         mme_tu104_add_inst((b), &__inst), __inst.end_next = true)
42 
43 void mme_tu104_alu_to(struct mme_builder *b,
44                       struct mme_value dst,
45                       enum mme_alu_op op,
46                       struct mme_value x,
47                       struct mme_value y);
48 
49 void mme_tu104_alu64_to(struct mme_builder *b,
50                         struct mme_value64 dst,
51                         enum mme_alu_op op_lo,
52                         enum mme_alu_op op_hi,
53                         struct mme_value64 x,
54                         struct mme_value64 y);
55 
56 void mme_tu104_merge_to(struct mme_builder *b, struct mme_value dst,
57                         struct mme_value x, struct mme_value y,
58                         uint16_t dst_pos, uint16_t bits, uint16_t src_pos);
59 
60 void mme_tu104_state_arr_to(struct mme_builder *b, struct mme_value dst,
61                             uint16_t state, struct mme_value index);
62 
63 void mme_tu104_load_barrier(struct mme_builder *b);
64 
65 void mme_tu104_load_to(struct mme_builder *b,
66                        struct mme_value dst);
67 
68 void mme_tu104_mthd(struct mme_builder *b,
69                     uint16_t mthd, struct mme_value index);
70 
71 void mme_tu104_emit(struct mme_builder *b,
72                     struct mme_value data);
73 
74 void mme_tu104_start_loop(struct mme_builder *b,
75                           struct mme_value count);
76 void mme_tu104_end_loop(struct mme_builder *b);
77 
78 void mme_tu104_start_if(struct mme_builder *b,
79                         enum mme_cmp_op op,
80                         bool if_true,
81                         struct mme_value x,
82                         struct mme_value y);
83 void mme_tu104_end_if(struct mme_builder *b);
84 
85 void mme_tu104_start_while(struct mme_builder *b);
86 void mme_tu104_end_while(struct mme_builder *b,
87                          enum mme_cmp_op op,
88                          bool if_true,
89                          struct mme_value x,
90                          struct mme_value y);
91 
92 void mme_tu104_exit_if(struct mme_builder *b,
93                        enum mme_cmp_op op,
94                        bool if_true,
95                        struct mme_value x,
96                        struct mme_value y);
97 
98 uint32_t *mme_tu104_builder_finish(struct mme_tu104_builder *b,
99                                    size_t *size_out);
100 
101 void mme_tu104_builder_dump(struct mme_builder *b, FILE *fp);
102