pvr: Add branch support

Signed-off-by: Simon Perretta <simon.perretta@imgtec.com>
Acked-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21474>
This commit is contained in:
Simon Perretta 2023-02-16 15:33:00 +00:00 committed by Marge Bot
parent b1064e91f1
commit de64dfe940
5 changed files with 77 additions and 14 deletions

View file

@ -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.");
}

View file

@ -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,

View file

@ -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

View file

@ -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,

View file

@ -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), },
},