aco/ir: Generalize (un)ordered_swapped.

Signed-off-by: Georg Lehmann <dadschoorse@gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17763>
This commit is contained in:
Georg Lehmann 2022-07-27 11:43:03 +02:00 committed by Marge Bot
parent f286cab27b
commit 590b93ae65
1 changed files with 6 additions and 13 deletions

View File

@ -604,8 +604,7 @@ needs_exec_mask(const Instruction* instr)
struct CmpInfo {
aco_opcode ordered;
aco_opcode unordered;
aco_opcode ordered_swapped;
aco_opcode unordered_swapped;
aco_opcode swapped;
aco_opcode inverse;
aco_opcode f32;
unsigned size;
@ -616,8 +615,7 @@ get_cmp_info(aco_opcode op, CmpInfo* info)
{
info->ordered = aco_opcode::num_opcodes;
info->unordered = aco_opcode::num_opcodes;
info->ordered_swapped = aco_opcode::num_opcodes;
info->unordered_swapped = aco_opcode::num_opcodes;
info->swapped = aco_opcode::num_opcodes;
switch (op) {
// clang-format off
#define CMP2(ord, unord, ord_swap, unord_swap, sz) \
@ -625,8 +623,8 @@ get_cmp_info(aco_opcode op, CmpInfo* info)
case aco_opcode::v_cmp_n##unord##_f##sz: \
info->ordered = aco_opcode::v_cmp_##ord##_f##sz; \
info->unordered = aco_opcode::v_cmp_n##unord##_f##sz; \
info->ordered_swapped = aco_opcode::v_cmp_##ord_swap##_f##sz; \
info->unordered_swapped = aco_opcode::v_cmp_n##unord_swap##_f##sz; \
info->swapped = op == aco_opcode::v_cmp_##ord##_f##sz ? aco_opcode::v_cmp_##ord_swap##_f##sz \
: aco_opcode::v_cmp_n##unord_swap##_f##sz; \
info->inverse = op == aco_opcode::v_cmp_n##unord##_f##sz ? aco_opcode::v_cmp_##unord##_f##sz \
: aco_opcode::v_cmp_n##ord##_f##sz; \
info->f32 = op == aco_opcode::v_cmp_##ord##_f##sz ? aco_opcode::v_cmp_##ord##_f32 \
@ -752,13 +750,8 @@ can_swap_operands(aco_ptr<Instruction>& instr, aco_opcode* new_op)
case aco_opcode::v_sub_u32: *new_op = aco_opcode::v_subrev_u32; return true;
default: {
CmpInfo info;
get_cmp_info(instr->opcode, &info);
if (info.ordered == instr->opcode) {
*new_op = info.ordered_swapped;
return true;
}
if (info.unordered == instr->opcode) {
*new_op = info.unordered_swapped;
if (get_cmp_info(instr->opcode, &info) && info.swapped != aco_opcode::num_opcodes) {
*new_op = info.swapped;
return true;
}
return false;