mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 04:10:09 +01:00
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:
parent
b1064e91f1
commit
de64dfe940
5 changed files with 77 additions and 14 deletions
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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), },
|
||||
},
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue