diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -2068,6 +2068,12 @@ } else if (V == "vec-extabi") { VecExtabi = true; A->claim(); + } else if (V == "elfv1") { + ABIName = "elfv1"; + A->claim(); + } else if (V == "elfv2") { + ABIName = "elfv2"; + A->claim(); } else if (V != "altivec") // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore // the option if given as we don't have backend support for any targets diff --git a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp --- a/llvm/lib/Target/PowerPC/PPCISelLowering.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelLowering.cpp @@ -17225,7 +17225,7 @@ bool PPCTargetLowering::isFMAFasterThanFMulAndFAdd(const Function &F, Type *Ty) const { - if (Subtarget.hasSPE()) + if (Subtarget.hasSPE() || Subtarget.useSoftFloat()) return false; switch (Ty->getScalarType()->getTypeID()) { case Type::FloatTyID: diff --git a/llvm/test/CodeGen/PowerPC/ppcsoftops.ll b/llvm/test/CodeGen/PowerPC/ppcsoftops.ll --- a/llvm/test/CodeGen/PowerPC/ppcsoftops.ll +++ b/llvm/test/CodeGen/PowerPC/ppcsoftops.ll @@ -51,4 +51,25 @@ ; CHECK-LABEL: __divdf3 } +; Function Attrs: noinline nounwind optnone uwtable +define dso_local zeroext i32 @func(double noundef %0, double noundef %1) #0 { + %3 = alloca double, align 8 + %4 = alloca double, align 8 + store double %0, ptr %3, align 8 + store double %1, ptr %4, align 8 + %5 = load double, ptr %3, align 8 + %6 = load double, ptr %4, align 8 + %7 = fneg double %6 + %8 = call double @llvm.fmuladd.f64(double %7, double 0x41F0000000000000, double %5) + %9 = fptoui double %8 to i32 + ret i32 %9 + + ; CHECK-LABEL: __muldf3 + ; CHECK-LABEL: __adddf3 +} + +; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none) +declare double @llvm.fmuladd.f64(double, double, double) #1 + attributes #0 = {"use-soft-float"="true" } +attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }