Module: Mesa Branch: main Commit: de64dfe9404f2b586a83b3933f8c38c3f25e17a9 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=de64dfe9404f2b586a83b3933f8c38c3f25e17a9
Author: Simon Perretta <[email protected]> Date: Thu Feb 16 15:33:00 2023 +0000 pvr: Add branch support Signed-off-by: Simon Perretta <[email protected]> Acked-by: Frank Binns <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21474> --- .../rogue/passes/rogue_schedule_instr_groups.c | 13 ++++-- src/imagination/rogue/rogue.h | 8 +++- src/imagination/rogue/rogue_ctrl_instrs.def | 3 +- src/imagination/rogue/rogue_encode.c | 52 +++++++++++++++++++--- src/imagination/rogue/rogue_info.c | 15 ++++++- 5 files changed, 77 insertions(+), 14 deletions(-) diff --git a/src/imagination/rogue/passes/rogue_schedule_instr_groups.c b/src/imagination/rogue/passes/rogue_schedule_instr_groups.c index 8775b019ad4..bbf3c74afd2 100644 --- a/src/imagination/rogue/passes/rogue_schedule_instr_groups.c +++ b/src/imagination/rogue/passes/rogue_schedule_instr_groups.c @@ -662,10 +662,6 @@ static void rogue_calc_ctrl_instrs_size(rogue_instr_group *group, enum rogue_instr_phase phase) { switch (ctrl->op) { - case ROGUE_CTRL_OP_WDF: - group->size.instrs[phase] = 0; - break; - case ROGUE_CTRL_OP_NOP: group->size.instrs[phase] = 1; break; @@ -674,6 +670,15 @@ static void rogue_calc_ctrl_instrs_size(rogue_instr_group *group, group->size.instrs[phase] = 0; break; + case ROGUE_CTRL_OP_BR: + case ROGUE_CTRL_OP_BA: + group->size.instrs[phase] = 5; + break; + + case ROGUE_CTRL_OP_WDF: + group->size.instrs[phase] = 0; + break; + default: unreachable("Unsupported ctrl op."); } diff --git a/src/imagination/rogue/rogue.h b/src/imagination/rogue/rogue.h index e70c15e3f11..4acb2ae3033 100644 --- a/src/imagination/rogue/rogue.h +++ b/src/imagination/rogue/rogue.h @@ -1101,7 +1101,8 @@ enum rogue_ctrl_op { /* Real instructions. */ ROGUE_CTRL_OP_NOP, ROGUE_CTRL_OP_WOP, - ROGUE_CTRL_OP_BA, + ROGUE_CTRL_OP_BR, /* Branch: relative (to block). */ + ROGUE_CTRL_OP_BA, /* Branch: absolute (to address). */ ROGUE_CTRL_OP_WDF, /* Pseudo-instructions. */ @@ -1113,6 +1114,11 @@ enum rogue_ctrl_op { enum rogue_ctrl_op_mod { /* In order of priority */ + ROGUE_CTRL_OP_MOD_LINK, + + ROGUE_CTRL_OP_MOD_ALLINST, + ROGUE_CTRL_OP_MOD_ANYINST, + ROGUE_CTRL_OP_MOD_END, ROGUE_CTRL_OP_MOD_COUNT, diff --git a/src/imagination/rogue/rogue_ctrl_instrs.def b/src/imagination/rogue/rogue_ctrl_instrs.def index 55b61180818..435f5b55e8c 100644 --- a/src/imagination/rogue/rogue_ctrl_instrs.def +++ b/src/imagination/rogue/rogue_ctrl_instrs.def @@ -53,13 +53,14 @@ #define ROGUE_BUILDER_DEFINE_CTRL01(...) #endif /* ROGUE_BUILDER_DEFINE_CTRL01 */ -ROGUE_BUILDER_DEFINE_CTRLB(BA) +ROGUE_BUILDER_DEFINE_CTRLB(BR) ROGUE_BUILDER_DEFINE_CTRL00(END) ROGUE_BUILDER_DEFINE_CTRL00(NOP) ROGUE_BUILDER_DEFINE_CTRL00(WOP) ROGUE_BUILDER_DEFINE_CTRL01(WDF) +ROGUE_BUILDER_DEFINE_CTRL01(BA) #undef ROGUE_BUILDER_DEFINE_CTRL01 #undef ROGUE_BUILDER_DEFINE_CTRL00 diff --git a/src/imagination/rogue/rogue_encode.c b/src/imagination/rogue/rogue_encode.c index e9ce7829e56..438e14c51f9 100644 --- a/src/imagination/rogue/rogue_encode.c +++ b/src/imagination/rogue/rogue_encode.c @@ -145,26 +145,33 @@ static void rogue_encode_instr_group_header(rogue_instr_group *group, case ROGUE_ALU_CONTROL: h.alutype = ALUTYPE_CONTROL; +#define OM(op_mod) ROGUE_CTRL_OP_MOD_##op_mod const rogue_instr *instr = group->instrs[ROGUE_INSTR_PHASE_CTRL]; const rogue_ctrl_instr *ctrl = rogue_instr_as_ctrl(instr); switch (ctrl->op) { - case ROGUE_CTRL_OP_WDF: - h.ctrlop = CTRLOP_WDF; - h.miscctl = rogue_ref_get_drc_index(&ctrl->src[0].ref); - break; - case ROGUE_CTRL_OP_NOP: h.ctrlop = CTRLOP_NOP; - h.miscctl = rogue_ctrl_op_mod_is_set(ctrl, ROGUE_CTRL_OP_MOD_END); + h.miscctl = rogue_ctrl_op_mod_is_set(ctrl, OM(END)); break; case ROGUE_CTRL_OP_WOP: h.ctrlop = CTRLOP_WOP; break; + case ROGUE_CTRL_OP_BR: + case ROGUE_CTRL_OP_BA: + h.ctrlop = CTRLOP_BA; + break; + + case ROGUE_CTRL_OP_WDF: + h.ctrlop = CTRLOP_WDF; + h.miscctl = rogue_ref_get_drc_index(&ctrl->src[0].ref); + break; + default: unreachable("Unsupported ctrl op."); } +#undef OM break; default: @@ -600,6 +607,7 @@ static void rogue_encode_backend_instr(const rogue_backend_instr *backend, } #undef OM +#define OM(op_mod) ROGUE_CTRL_OP_MOD_##op_mod static void rogue_encode_ctrl_instr(const rogue_ctrl_instr *ctrl, unsigned instr_size, rogue_instr_encoding *instr_encoding) @@ -610,10 +618,42 @@ static void rogue_encode_ctrl_instr(const rogue_ctrl_instr *ctrl, memset(&instr_encoding->ctrl.nop, 0, sizeof(instr_encoding->ctrl.nop)); break; + case ROGUE_CTRL_OP_BR: + case ROGUE_CTRL_OP_BA: { + bool branch_abs = (ctrl->op == ROGUE_CTRL_OP_BA); + rogue_offset32 offset; + + instr_encoding->ctrl.ba.abs = branch_abs; + instr_encoding->ctrl.ba.allp = + rogue_ctrl_op_mod_is_set(ctrl, OM(ALLINST)); + instr_encoding->ctrl.ba.anyp = + rogue_ctrl_op_mod_is_set(ctrl, OM(ANYINST)); + instr_encoding->ctrl.ba.link = rogue_ctrl_op_mod_is_set(ctrl, OM(LINK)); + + if (branch_abs) { + offset._ = rogue_ref_get_val(&ctrl->src[0].ref); + } else { + rogue_instr_group *block_group = + list_entry(ctrl->target_block->instrs.next, + rogue_instr_group, + link); + offset._ = block_group->size.offset - (ctrl->instr.group->size.offset + + ctrl->instr.group->size.total); + } + + instr_encoding->ctrl.ba.offset_7_1 = offset._7_1; + instr_encoding->ctrl.ba.offset_15_8 = offset._15_8; + instr_encoding->ctrl.ba.offset_23_16 = offset._23_16; + instr_encoding->ctrl.ba.offset_31_24 = offset._31_24; + + break; + } + default: unreachable("Unsupported ctrl op."); } } +#undef OM static void rogue_encode_bitwise_instr(const rogue_bitwise_instr *bitwise, unsigned instr_size, diff --git a/src/imagination/rogue/rogue_info.c b/src/imagination/rogue/rogue_info.c index bdcb8fad87c..8b40b708f98 100644 --- a/src/imagination/rogue/rogue_info.c +++ b/src/imagination/rogue/rogue_info.c @@ -217,9 +217,14 @@ const rogue_alu_src_mod_info rogue_alu_src_mod_infos[ROGUE_ALU_SRC_MOD_COUNT] = [ROGUE_ALU_SRC_MOD_NEG] = { .str = "neg", }, }; +#define OM(op_mod) BITFIELD64_BIT(ROGUE_CTRL_OP_MOD_##op_mod) const rogue_ctrl_op_mod_info rogue_ctrl_op_mod_infos[ROGUE_CTRL_OP_MOD_COUNT] = { - [ROGUE_CTRL_OP_MOD_END] = { .str = "end", }, + [ROGUE_CTRL_OP_MOD_LINK] = { .str = "link", }, + [ROGUE_CTRL_OP_MOD_ALLINST] = { .str = "allinst", .exclude = OM(ANYINST) }, + [ROGUE_CTRL_OP_MOD_ANYINST] = { .str = "anyinst", .exclude = OM(ALLINST) }, + [ROGUE_CTRL_OP_MOD_END] = { .str = "end", }, }; +#undef OM #define OM(op_mod) BITFIELD64_BIT(ROGUE_CTRL_OP_MOD_##op_mod) #define T(type) BITFIELD64_BIT(ROGUE_REF_TYPE_##type - 1) @@ -230,7 +235,13 @@ const rogue_ctrl_op_info rogue_ctrl_op_infos[ROGUE_CTRL_OP_COUNT] = { .supported_op_mods = OM(END), }, [ROGUE_CTRL_OP_WOP] = { .str = "wop", }, - [ROGUE_CTRL_OP_BA] = { .str = "ba", .has_target = true, .ends_block = true, }, + [ROGUE_CTRL_OP_BR] = { .str = "br", .has_target = true, .ends_block = true, + .supported_op_mods = OM(LINK) | OM(ALLINST) | OM(ANYINST), + }, + [ROGUE_CTRL_OP_BA] = { .str = "ba", .ends_block = true, .num_srcs = 1, + .supported_op_mods = OM(LINK) | OM(ALLINST) | OM(ANYINST), + .supported_src_types = { [0] = T(VAL), }, + }, [ROGUE_CTRL_OP_WDF] = { .str = "wdf", .num_srcs = 1, .supported_src_types = { [0] = T(DRC), }, },
