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