diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c index 4c1e3dcb2d4..99b9faea8a0 100644 --- a/src/imagination/pco/pco_nir.c +++ b/src/imagination/pco/pco_nir.c @@ -40,6 +40,8 @@ static const struct spirv_to_nir_options spirv_options = { static const nir_shader_compiler_options nir_options = { .discard_is_demote = true, .fuse_ffma32 = true, + .float_mul_add32 = nir_float_muladd_support_has_ffma | + nir_float_muladd_support_fuse, .has_f2i32_rtne = true, .has_fused_comp_and_csel = true, diff --git a/src/imagination/pco/pco_nir_pvfio.c b/src/imagination/pco/pco_nir_pvfio.c index c12599fc7ca..46a675cb245 100644 --- a/src/imagination/pco/pco_nir_pvfio.c +++ b/src/imagination/pco/pco_nir_pvfio.c @@ -1288,12 +1288,12 @@ static nir_def *alu_iter(nir_builder *b, .component = component, .io_semantics = io_semantics); - nir_def *result = nir_ffma_old(b, - nir_channel(b, coeffs, 1), - nir_channel(b, coords, 1), - nir_channel(b, coeffs, 2)); + nir_def *result = nir_ffma_weak(b, + nir_channel(b, coeffs, 1), + nir_channel(b, coords, 1), + nir_channel(b, coeffs, 2)); result = - nir_ffma_old(b, nir_channel(b, coeffs, 0), nir_channel(b, coords, 0), result); + nir_ffma_weak(b, nir_channel(b, coeffs, 0), nir_channel(b, coords, 0), result); return result; } diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index 830ff65acdc..f2dc8fd37da 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -3177,6 +3177,7 @@ static pco_instr *trans_alu(trans_ctx *tctx, nir_alu_instr *alu) instr = pco_fmul(&tctx->b, dest, src[0], src[1]); break; + case nir_op_ffma: case nir_op_ffma_old: instr = pco_fmad(&tctx->b, dest, src[0], src[1], src[2]); break;