[libc-commits] [libc] 2bdeeaa - [libc] Use __builtin_elementwise_fma instead of __builtin_fma (#126288)
via libc-commits
libc-commits at lists.llvm.org
Thu Feb 13 11:40:07 PST 2025
Author: Petr Hosek
Date: 2025-02-13T11:40:04-08:00
New Revision: 2bdeeaa18531f41e838389596cef66e4010a634c
URL: https://github.com/llvm/llvm-project/commit/2bdeeaa18531f41e838389596cef66e4010a634c
DIFF: https://github.com/llvm/llvm-project/commit/2bdeeaa18531f41e838389596cef66e4010a634c.diff
LOG: [libc] Use __builtin_elementwise_fma instead of __builtin_fma (#126288)
__builtin_elementwise_fma doesn't consider errno and is thus more
suitable for libc fma implementation.
Added:
Modified:
libc/src/__support/FPUtil/FMA.h
libc/src/__support/FPUtil/multiply_add.h
Removed:
################################################################################
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
More information about the libc-commits
mailing list