diff --git a/libc/src/__support/FPUtil/FMA.h b/libc/src/__support/FPUtil/FMA.h index 807d685239732..1e40d06dc1462 100644 --- a/libc/src/__support/FPUtil/FMA.h +++ b/libc/src/__support/FPUtil/FMA.h @@ -25,11 +25,19 @@ LIBC_INLINE OutType fma(InType x, InType y, InType z) { #ifdef LIBC_TARGET_CPU_HAS_FMA template <> LIBC_INLINE float fma(float x, float y, float z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else return __builtin_fmaf(x, y, z); +#endif } template <> LIBC_INLINE double fma(double x, double y, double z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else return __builtin_fma(x, y, z); +#endif } #endif // LIBC_TARGET_CPU_HAS_FMA diff --git a/libc/src/__support/FPUtil/multiply_add.h b/libc/src/__support/FPUtil/multiply_add.h index a86067c401873..ae00e08673d08 100644 --- a/libc/src/__support/FPUtil/multiply_add.h +++ b/libc/src/__support/FPUtil/multiply_add.h @@ -47,11 +47,19 @@ namespace LIBC_NAMESPACE_DECL { namespace fputil { LIBC_INLINE float multiply_add(float x, float y, float z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else return __builtin_fmaf(x, y, z); +#endif } LIBC_INLINE double multiply_add(double x, double y, double z) { +#if __has_builtin(__builtin_elementwise_fma) + return __builtin_elementwise_fma(x, y, z); +#else return __builtin_fma(x, y, z); +#endif } } // namespace fputil