From 38c4461c78a7d9106488e0610e6bc999d8d2fe1e Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Wed, 27 May 2026 19:04:02 +0200 Subject: [PATCH] aco/gfx8: fix 16bit nir_op_ffma aco uses the GFX9 opcode names, and GFX8 only has the legacy 16bit fma that zeros the high register half. Fixes: 570bfe1ee03 ("ac: handle new float multadd opcodes") Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/ci/radv-polaris10-fails.txt | 109 ------------------ .../aco_select_nir_alu.cpp | 5 +- 2 files changed, 4 insertions(+), 110 deletions(-) diff --git a/src/amd/ci/radv-polaris10-fails.txt b/src/amd/ci/radv-polaris10-fails.txt index 103bd140fe8..d8d3996f950 100644 --- a/src/amd/ci/radv-polaris10-fails.txt +++ b/src/amd/ci/radv-polaris10-fails.txt @@ -48,112 +48,3 @@ dEQP-VK.spirv_assembly.instruction.compute.opfma.fp64.vec3.rte.denorm_flush.dire dEQP-VK.spirv_assembly.instruction.compute.opfma.fp64.vec3.rte.denorm_flush.float_controls,Fail dEQP-VK.spirv_assembly.instruction.compute.opfma.fp64.vec4.rte.denorm_flush.directed,Fail dEQP-VK.spirv_assembly.instruction.compute.opfma.fp64.vec4.rte.denorm_flush.float_controls,Fail - -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rte.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.rtz.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.scalar.undef.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rte.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.rtz.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec2.undef.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rte.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.rtz.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec3.undef.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rte.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.rtz.denorm_preserve.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_flush.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_flush.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_flush.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_none.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_none.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_none.random,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_preserve.directed,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_preserve.float_controls,Fail -dEQP-VK.spirv_assembly.instruction.compute.opfma.fp16.vec4.undef.denorm_preserve.random,Fail diff --git a/src/amd/compiler/instruction_selection/aco_select_nir_alu.cpp b/src/amd/compiler/instruction_selection/aco_select_nir_alu.cpp index 9aaa64a3f7f..eef5a7c9b91 100644 --- a/src/amd/compiler/instruction_selection/aco_select_nir_alu.cpp +++ b/src/amd/compiler/instruction_selection/aco_select_nir_alu.cpp @@ -1927,7 +1927,10 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr) } case nir_op_ffma: { if (dst.regClass() == v2b) { - emit_vop3a_instruction(ctx, instr, aco_opcode::v_fma_f16, dst, false, 3); + if (ctx->options->gfx_level >= GFX9) + emit_vop3a_instruction(ctx, instr, aco_opcode::v_fma_f16, dst, false, 3); + else + emit_vop3a_instruction(ctx, instr, aco_opcode::v_fma_legacy_f16, dst, false, 3); } else if (dst.regClass() == v1 && instr->def.bit_size == 16) { assert(instr->def.num_components == 2);