aco: implement ford, funord, fneo, fequ, fltu, fgeu

Reviewed-by: Timur Kristóf <timur.kristof@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29467>
This commit is contained in:
Georg Lehmann
2024-05-29 15:03:05 +02:00
committed by Marge Bot
parent 99372c1ed7
commit c5ba17cd25
+31 -21
View File
@@ -1005,27 +1005,7 @@ emit_vopc_instruction(isel_context* ctx, nir_alu_instr* instr, aco_opcode op, Te
if (src1.type() == RegType::sgpr) {
if (src0.type() == RegType::vgpr) {
/* to swap the operands, we might also have to change the opcode */
switch (op) {
case aco_opcode::v_cmp_lt_f16: op = aco_opcode::v_cmp_gt_f16; break;
case aco_opcode::v_cmp_ge_f16: op = aco_opcode::v_cmp_le_f16; break;
case aco_opcode::v_cmp_lt_i16: op = aco_opcode::v_cmp_gt_i16; break;
case aco_opcode::v_cmp_ge_i16: op = aco_opcode::v_cmp_le_i16; break;
case aco_opcode::v_cmp_lt_u16: op = aco_opcode::v_cmp_gt_u16; break;
case aco_opcode::v_cmp_ge_u16: op = aco_opcode::v_cmp_le_u16; break;
case aco_opcode::v_cmp_lt_f32: op = aco_opcode::v_cmp_gt_f32; break;
case aco_opcode::v_cmp_ge_f32: op = aco_opcode::v_cmp_le_f32; break;
case aco_opcode::v_cmp_lt_i32: op = aco_opcode::v_cmp_gt_i32; break;
case aco_opcode::v_cmp_ge_i32: op = aco_opcode::v_cmp_le_i32; break;
case aco_opcode::v_cmp_lt_u32: op = aco_opcode::v_cmp_gt_u32; break;
case aco_opcode::v_cmp_ge_u32: op = aco_opcode::v_cmp_le_u32; break;
case aco_opcode::v_cmp_lt_f64: op = aco_opcode::v_cmp_gt_f64; break;
case aco_opcode::v_cmp_ge_f64: op = aco_opcode::v_cmp_le_f64; break;
case aco_opcode::v_cmp_lt_i64: op = aco_opcode::v_cmp_gt_i64; break;
case aco_opcode::v_cmp_ge_i64: op = aco_opcode::v_cmp_le_i64; break;
case aco_opcode::v_cmp_lt_u64: op = aco_opcode::v_cmp_gt_u64; break;
case aco_opcode::v_cmp_ge_u64: op = aco_opcode::v_cmp_le_u64; break;
default: /* eq and ne are commutative */ break;
}
op = get_swapped(op);
Temp t = src0;
src0 = src1;
src1 = t;
@@ -3693,6 +3673,16 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr)
aco_opcode::v_cmp_ge_f64);
break;
}
case nir_op_fltu: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_nge_f16, aco_opcode::v_cmp_nge_f32,
aco_opcode::v_cmp_nge_f64);
break;
}
case nir_op_fgeu: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_nlt_f16, aco_opcode::v_cmp_nlt_f32,
aco_opcode::v_cmp_nlt_f64);
break;
}
case nir_op_feq: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_eq_f16, aco_opcode::v_cmp_eq_f32,
aco_opcode::v_cmp_eq_f64);
@@ -3703,6 +3693,26 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr)
aco_opcode::v_cmp_neq_f64);
break;
}
case nir_op_fequ: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_nlg_f16, aco_opcode::v_cmp_nlg_f32,
aco_opcode::v_cmp_nlg_f64);
break;
}
case nir_op_fneo: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_lg_f16, aco_opcode::v_cmp_lg_f32,
aco_opcode::v_cmp_lg_f64);
break;
}
case nir_op_funord: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_u_f16, aco_opcode::v_cmp_u_f32,
aco_opcode::v_cmp_u_f64);
break;
}
case nir_op_ford: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_o_f16, aco_opcode::v_cmp_o_f32,
aco_opcode::v_cmp_o_f64);
break;
}
case nir_op_ilt: {
emit_comparison(ctx, instr, dst, aco_opcode::v_cmp_lt_i16, aco_opcode::v_cmp_lt_i32,
aco_opcode::v_cmp_lt_i64, aco_opcode::s_cmp_lt_i32);