aco: fix v_writelane_b32 with two sgprs

v_writelane_b32 can take two sgprs but only if one is m0.

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Cc: 20.2 <mesa-stable>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6662>
This commit is contained in:
Rhys Perry
2020-09-07 20:20:34 +01:00
committed by Marge Bot
parent 641d45befb
commit 36e58a14cc
@@ -1485,6 +1485,19 @@ bool operand_can_use_reg(chip_class chip, aco_ptr<Instruction>& instr, unsigned
if (instr->operands[idx].isFixed())
return instr->operands[idx].physReg() == reg;
bool is_writelane = instr->opcode == aco_opcode::v_writelane_b32 ||
instr->opcode == aco_opcode::v_writelane_b32_e64;
if (chip <= GFX9 && is_writelane && idx <= 1) {
/* v_writelane_b32 can take two sgprs but only if one is m0. */
bool is_other_sgpr = instr->operands[!idx].isTemp() &&
(!instr->operands[!idx].isFixed() ||
instr->operands[!idx].physReg() != m0);
if (is_other_sgpr && instr->operands[!idx].tempId() != instr->operands[idx].tempId()) {
instr->operands[idx].setFixed(m0);
return reg == m0;
}
}
if (reg.byte()) {
unsigned stride = get_subdword_operand_stride(chip, instr, idx, rc);
if (reg.byte() % stride)