From 0b52da5afab65e91392cb2d01499894fe4610d90 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 30 Jan 2023 20:12:05 -0600 Subject: [PATCH] nouveau/mme: Break the Turing builder guts into a separate header Part-of: --- src/nouveau/mme/mme_builder.h | 91 +---------------------------------- src/nouveau/mme/mme_tu104_builder.h | 94 +++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 90 deletions(-) create mode 100644 src/nouveau/mme/mme_tu104_builder.h diff --git a/src/nouveau/mme/mme_builder.h b/src/nouveau/mme/mme_builder.h index a5feadd..16ef7a2 100644 --- a/src/nouveau/mme/mme_builder.h +++ b/src/nouveau/mme/mme_builder.h @@ -48,96 +48,7 @@ enum mme_cmp_op { struct mme_builder; -enum mme_tu104_instr_parts { - MME_TU104_INSTR_PART_IMM0 = BITFIELD_BIT(0), - MME_TU104_INSTR_PART_IMM1 = BITFIELD_BIT(1), - MME_TU104_INSTR_PART_LOAD0 = BITFIELD_BIT(2), - MME_TU104_INSTR_PART_LOAD1 = BITFIELD_BIT(3), - MME_TU104_INSTR_PART_ALU0 = BITFIELD_BIT(4), - MME_TU104_INSTR_PART_ALU1 = BITFIELD_BIT(5), - MME_TU104_INSTR_PART_MTHD0 = BITFIELD_BIT(6), - MME_TU104_INSTR_PART_MTHD1 = BITFIELD_BIT(7), - MME_TU104_INSTR_PART_EMIT0 = BITFIELD_BIT(8), - MME_TU104_INSTR_PART_EMIT1 = BITFIELD_BIT(9), -}; - -#define MME_TU104_BUILDER_MAX_INSTS 128 - -enum mme_tu104_cf_type { - MME_CF_TYPE_IF, - MME_CF_TYPE_LOOP, - MME_CF_TYPE_WHILE, -}; - -struct mme_tu104_cf { - enum mme_tu104_cf_type type; - uint16_t start_ip; -}; - -struct mme_tu104_builder { - uint32_t inst_count; - struct mme_tu104_inst insts[MME_TU104_BUILDER_MAX_INSTS]; - enum mme_tu104_instr_parts inst_parts; - - uint32_t cf_depth; - 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); - -#define mme_tu104_asm(b, __inst) \ - for (struct mme_tu104_inst __inst = { MME_TU104_INST_DEFAULTS }; \ - !__inst.end_next; \ - mme_tu104_add_inst((b), &__inst), __inst.end_next = true) - -void mme_tu104_alu_to(struct mme_builder *b, - struct mme_value dst, - enum mme_alu_op op, - struct mme_value x, - struct mme_value y, - uint16_t implicit_imm); - -void mme_tu104_alu64_to(struct mme_builder *b, - struct mme_value64 dst, - enum mme_alu_op op_lo, - enum mme_alu_op op_hi, - struct mme_value64 x, - struct mme_value64 y); - -void mme_tu104_load_barrier(struct mme_builder *b); - -void mme_tu104_load_to(struct mme_builder *b, - struct mme_value dst); - -void mme_tu104_mthd(struct mme_builder *b, - uint16_t mthd, struct mme_value index); - -void mme_tu104_emit(struct mme_builder *b, - struct mme_value data); - -void mme_tu104_start_loop(struct mme_builder *b, - struct mme_value count); -void mme_tu104_end_loop(struct mme_builder *b); - -void mme_tu104_start_if(struct mme_builder *b, - enum mme_cmp_op op, - bool if_true, - struct mme_value x, - struct mme_value y); -void mme_tu104_end_if(struct mme_builder *b); - -void mme_tu104_start_while(struct mme_builder *b); -void mme_tu104_end_while(struct mme_builder *b, - enum mme_cmp_op op, - bool if_true, - struct mme_value x, - struct mme_value y); - -uint32_t *mme_tu104_builder_finish(struct mme_tu104_builder *b, - size_t *size_out); +#include "mme_tu104_builder.h" struct mme_builder { struct mme_reg_alloc reg_alloc; diff --git a/src/nouveau/mme/mme_tu104_builder.h b/src/nouveau/mme/mme_tu104_builder.h new file mode 100644 index 0000000..79dab87 --- /dev/null +++ b/src/nouveau/mme/mme_tu104_builder.h @@ -0,0 +1,94 @@ +#ifndef MME_BUILDER_H +#error "This file must only be included by mme_builder.h" +#endif + +enum mme_tu104_instr_parts { + MME_TU104_INSTR_PART_IMM0 = BITFIELD_BIT(0), + MME_TU104_INSTR_PART_IMM1 = BITFIELD_BIT(1), + MME_TU104_INSTR_PART_LOAD0 = BITFIELD_BIT(2), + MME_TU104_INSTR_PART_LOAD1 = BITFIELD_BIT(3), + MME_TU104_INSTR_PART_ALU0 = BITFIELD_BIT(4), + MME_TU104_INSTR_PART_ALU1 = BITFIELD_BIT(5), + MME_TU104_INSTR_PART_MTHD0 = BITFIELD_BIT(6), + MME_TU104_INSTR_PART_MTHD1 = BITFIELD_BIT(7), + MME_TU104_INSTR_PART_EMIT0 = BITFIELD_BIT(8), + MME_TU104_INSTR_PART_EMIT1 = BITFIELD_BIT(9), +}; + +#define MME_TU104_BUILDER_MAX_INSTS 128 + +enum mme_tu104_cf_type { + MME_CF_TYPE_IF, + MME_CF_TYPE_LOOP, + MME_CF_TYPE_WHILE, +}; + +struct mme_tu104_cf { + enum mme_tu104_cf_type type; + uint16_t start_ip; +}; + +struct mme_tu104_builder { + uint32_t inst_count; + struct mme_tu104_inst insts[MME_TU104_BUILDER_MAX_INSTS]; + enum mme_tu104_instr_parts inst_parts; + + uint32_t cf_depth; + 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); + +#define mme_tu104_asm(b, __inst) \ + for (struct mme_tu104_inst __inst = { MME_TU104_INST_DEFAULTS }; \ + !__inst.end_next; \ + mme_tu104_add_inst((b), &__inst), __inst.end_next = true) + +void mme_tu104_alu_to(struct mme_builder *b, + struct mme_value dst, + enum mme_alu_op op, + struct mme_value x, + struct mme_value y, + uint16_t implicit_imm); + +void mme_tu104_alu64_to(struct mme_builder *b, + struct mme_value64 dst, + enum mme_alu_op op_lo, + enum mme_alu_op op_hi, + struct mme_value64 x, + struct mme_value64 y); + +void mme_tu104_load_barrier(struct mme_builder *b); + +void mme_tu104_load_to(struct mme_builder *b, + struct mme_value dst); + +void mme_tu104_mthd(struct mme_builder *b, + uint16_t mthd, struct mme_value index); + +void mme_tu104_emit(struct mme_builder *b, + struct mme_value data); + +void mme_tu104_start_loop(struct mme_builder *b, + struct mme_value count); +void mme_tu104_end_loop(struct mme_builder *b); + +void mme_tu104_start_if(struct mme_builder *b, + enum mme_cmp_op op, + bool if_true, + struct mme_value x, + struct mme_value y); +void mme_tu104_end_if(struct mme_builder *b); + +void mme_tu104_start_while(struct mme_builder *b); +void mme_tu104_end_while(struct mme_builder *b, + enum mme_cmp_op op, + bool if_true, + struct mme_value x, + struct mme_value y); + +uint32_t *mme_tu104_builder_finish(struct mme_tu104_builder *b, + size_t *size_out); -- 2.7.4