mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 20:28:04 +02:00
aco: rematerialize s_movk instructions
Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
This commit is contained in:
parent
b6f5085dfe
commit
746b9380bd
1 changed files with 7 additions and 2 deletions
|
|
@ -231,11 +231,13 @@ void compute_global_next_uses(spill_ctx& ctx, std::vector<std::set<Temp>>& live_
|
|||
bool should_rematerialize(aco_ptr<Instruction>& instr)
|
||||
{
|
||||
/* TODO: rematerialization is only supported for VOP1, SOP1 and PSEUDO */
|
||||
if (instr->format != Format::VOP1 && instr->format != Format::SOP1 && instr->format != Format::PSEUDO)
|
||||
if (instr->format != Format::VOP1 && instr->format != Format::SOP1 && instr->format != Format::PSEUDO && instr->format != Format::SOPK)
|
||||
return false;
|
||||
/* TODO: pseudo-instruction rematerialization is only supported for p_create_vector */
|
||||
if (instr->format == Format::PSEUDO && instr->opcode != aco_opcode::p_create_vector)
|
||||
return false;
|
||||
if (instr->format == Format::SOPK && instr->opcode != aco_opcode::s_movk_i32)
|
||||
return false;
|
||||
|
||||
for (const Operand& op : instr->operands) {
|
||||
/* TODO: rematerialization using temporaries isn't yet supported */
|
||||
|
|
@ -255,7 +257,7 @@ aco_ptr<Instruction> do_reload(spill_ctx& ctx, Temp tmp, Temp new_name, uint32_t
|
|||
std::map<Temp, remat_info>::iterator remat = ctx.remat.find(tmp);
|
||||
if (remat != ctx.remat.end()) {
|
||||
Instruction *instr = remat->second.instr;
|
||||
assert((instr->format == Format::VOP1 || instr->format == Format::SOP1 || instr->format == Format::PSEUDO) && "unsupported");
|
||||
assert((instr->format == Format::VOP1 || instr->format == Format::SOP1 || instr->format == Format::PSEUDO || instr->format == Format::SOPK) && "unsupported");
|
||||
assert((instr->format != Format::PSEUDO || instr->opcode == aco_opcode::p_create_vector) && "unsupported");
|
||||
assert(instr->definitions.size() == 1 && "unsupported");
|
||||
|
||||
|
|
@ -266,6 +268,9 @@ aco_ptr<Instruction> do_reload(spill_ctx& ctx, Temp tmp, Temp new_name, uint32_t
|
|||
res.reset(create_instruction<SOP1_instruction>(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size()));
|
||||
} else if (instr->format == Format::PSEUDO) {
|
||||
res.reset(create_instruction<Pseudo_instruction>(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size()));
|
||||
} else if (instr->format == Format::SOPK) {
|
||||
res.reset(create_instruction<SOPK_instruction>(instr->opcode, instr->format, instr->operands.size(), instr->definitions.size()));
|
||||
static_cast<SOPK_instruction*>(res.get())->imm = static_cast<SOPK_instruction*>(instr)->imm;
|
||||
}
|
||||
for (unsigned i = 0; i < instr->operands.size(); i++) {
|
||||
res->operands[i] = instr->operands[i];
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue