aco: Add validation for v_permlane instructions.
Previously there hasn't been any validation for these instructions, but after shooting myself in the leg with it a few times, I decided to add the validation now. Signed-off-by: Timur Kristóf <timur.kristof@gmail.com> Reviewed-by: Tony Wasserka <tony.wasserka@gmx.de> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11072>
This commit is contained in:
parent
fd6605367d
commit
5713e059ea
|
@ -745,7 +745,9 @@ bool can_apply_sgprs(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
|||
instr->opcode != aco_opcode::v_readlane_b32 &&
|
||||
instr->opcode != aco_opcode::v_readlane_b32_e64 &&
|
||||
instr->opcode != aco_opcode::v_writelane_b32 &&
|
||||
instr->opcode != aco_opcode::v_writelane_b32_e64;
|
||||
instr->opcode != aco_opcode::v_writelane_b32_e64 &&
|
||||
instr->opcode != aco_opcode::v_permlane16_b32 &&
|
||||
instr->opcode != aco_opcode::v_permlanex16_b32;
|
||||
}
|
||||
|
||||
void to_VOP3(opt_ctx& ctx, aco_ptr<Instruction>& instr)
|
||||
|
@ -818,6 +820,8 @@ bool valu_can_accept_vgpr(aco_ptr<Instruction>& instr, unsigned operand)
|
|||
if (instr->opcode == aco_opcode::v_readlane_b32 || instr->opcode == aco_opcode::v_readlane_b32_e64 ||
|
||||
instr->opcode == aco_opcode::v_writelane_b32 || instr->opcode == aco_opcode::v_writelane_b32_e64)
|
||||
return operand != 1;
|
||||
if (instr->opcode == aco_opcode::v_permlane16_b32 || instr->opcode == aco_opcode::v_permlanex16_b32)
|
||||
return operand == 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -286,6 +286,16 @@ bool validate_ir(Program* program)
|
|||
"Wrong Operand type for VALU instruction", instr.get());
|
||||
continue;
|
||||
}
|
||||
if (instr->opcode == aco_opcode::v_permlane16_b32 ||
|
||||
instr->opcode == aco_opcode::v_permlanex16_b32) {
|
||||
check(i != 0 ||
|
||||
(op.isTemp() && op.regClass().type() == RegType::vgpr),
|
||||
"Operand 0 of v_permlane must be VGPR", instr.get());
|
||||
check(i == 0 ||
|
||||
(op.isTemp() && op.regClass().type() == RegType::sgpr) ||
|
||||
op.isConstant(),
|
||||
"Lane select operands of v_permlane must be SGPR or constant", instr.get());
|
||||
}
|
||||
|
||||
if (instr->opcode == aco_opcode::v_writelane_b32 ||
|
||||
instr->opcode == aco_opcode::v_writelane_b32_e64) {
|
||||
|
|
Loading…
Reference in New Issue