ac: use fma on gfx10
authorMarek Olšák <marek.olsak@amd.com>
Mon, 26 Aug 2019 20:19:31 +0000 (16:19 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 10 Sep 2019 03:43:03 +0000 (23:43 -0400)
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
src/amd/common/ac_llvm_build.c
src/amd/common/ac_nir_to_llvm.c

index 94ec569ad9fcf23bc7ce3e71a425eb115cb7ca04..a1e3ce6d241bbae51400758bca015d7abc6243f4 100644 (file)
@@ -2665,6 +2665,13 @@ LLVMValueRef ac_build_imad(struct ac_llvm_context *ctx, LLVMValueRef s0,
 LLVMValueRef ac_build_fmad(struct ac_llvm_context *ctx, LLVMValueRef s0,
                           LLVMValueRef s1, LLVMValueRef s2)
 {
+       /* FMA is better on GFX10, because it has FMA units instead of MUL-ADD units. */
+       if (ctx->chip_class >= GFX10) {
+               return ac_build_intrinsic(ctx, "llvm.fma.f32", ctx->f32,
+                                         (LLVMValueRef []) {s0, s1, s2}, 3,
+                                         AC_FUNC_ATTR_READNONE);
+       }
+
        return LLVMBuildFAdd(ctx->builder,
                             LLVMBuildFMul(ctx->builder, s0, s1, ""), s2, "");
 }
index 5ed21b1650b86f6008ad8b7045fafc38f8882a9b..7294b293ca247951418e266138c686c78fafd03b 100644 (file)
@@ -811,7 +811,8 @@ static void visit_alu(struct ac_nir_context *ctx, const nir_alu_instr *instr)
                }
                break;
        case nir_op_ffma:
-               result = emit_intrin_3f_param(&ctx->ac, "llvm.fmuladd",
+               /* FMA is better on GFX10, because it has FMA units instead of MUL-ADD units. */
+               result = emit_intrin_3f_param(&ctx->ac, ctx->ac.chip_class >= GFX10 ? "llvm.fma" : "llvm.fmuladd",
                                              ac_to_float_type(&ctx->ac, def_type), src[0], src[1], src[2]);
                break;
        case nir_op_ldexp: