[libc-commits] [libc] [libc] Use __builtin_elementwise_fma instead of __builtin_fma (PR #126288)
Petr Hosek via libc-commits
libc-commits at lists.llvm.org
Fri Feb 7 11:27:14 PST 2025
https://github.com/petrhosek updated https://github.com/llvm/llvm-project/pull/126288
>From 30fb1f9d6b5d7efb4206cab89e11f5cb3e919aa7 Mon Sep 17 00:00:00 2001
From: Petr Hosek <phosek at google.com>
Date: Fri, 7 Feb 2025 09:22:45 +0000
Subject: [PATCH 1/3] [libc] Use __builtin_elementwise_fma instead of
__builtin_fma
__builtin_elementwise_fma doesn't consider errno and is thus more suitable
for libc fma implementation.
Fixes #126025
---
libc/src/__support/FPUtil/FMA.h | 4 ++--
libc/src/__support/FPUtil/multiply_add.h | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/libc/src/__support/FPUtil/FMA.h b/libc/src/__support/FPUtil/FMA.h
index 807d685239732e5..7b505d22c06b6ac 100644
--- a/libc/src/__support/FPUtil/FMA.h
+++ b/libc/src/__support/FPUtil/FMA.h
@@ -25,11 +25,11 @@ 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) {
- return __builtin_fmaf(x, y, z);
+ return __builtin_elementwise_fma(x, y, z);
}
template <> LIBC_INLINE double fma(double x, double y, double z) {
- return __builtin_fma(x, y, z);
+ return __builtin_elementwise_fma(x, y, z);
}
#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 a86067c401873ba..763799f1f29d72b 100644
--- a/libc/src/__support/FPUtil/multiply_add.h
+++ b/libc/src/__support/FPUtil/multiply_add.h
@@ -47,11 +47,11 @@ namespace LIBC_NAMESPACE_DECL {
namespace fputil {
LIBC_INLINE float multiply_add(float x, float y, float z) {
- return __builtin_fmaf(x, y, z);
+ return __builtin_elementwise_fma(x, y, z);
}
LIBC_INLINE double multiply_add(double x, double y, double z) {
- return __builtin_fma(x, y, z);
+ return __builtin_elementwise_fma(x, y, z);
}
} // namespace fputil
>From 32e599c4e36e3b894dfe5f7dbd8765685eaa27b7 Mon Sep 17 00:00:00 2001
From: Petr Hosek <phosek at google.com>
Date: Fri, 7 Feb 2025 19:21:10 +0000
Subject: [PATCH 2/3] Check if __builtin_elementwise_fma is available
---
libc/src/__support/FPUtil/FMA.h | 9 +++++++++
libc/src/__support/FPUtil/multiply_add.h | 8 ++++++++
2 files changed, 17 insertions(+)
diff --git a/libc/src/__support/FPUtil/FMA.h b/libc/src/__support/FPUtil/FMA.h
index 7b505d22c06b6ac..3ae2e39ff31d423 100644
--- a/libc/src/__support/FPUtil/FMA.h
+++ b/libc/src/__support/FPUtil/FMA.h
@@ -25,11 +25,20 @@ 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 763799f1f29d72b..358d9420fd72a39 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_fmaf(x, y, z);
+#endif
}
} // namespace fputil
>From ebb2660e9fe4b99fd67cf8a1eb0c60d0f6410923 Mon Sep 17 00:00:00 2001
From: Petr Hosek <phosek at google.com>
Date: Fri, 7 Feb 2025 19:26:52 +0000
Subject: [PATCH 3/3] Formatting fix
---
libc/src/__support/FPUtil/FMA.h | 1 -
1 file changed, 1 deletion(-)
diff --git a/libc/src/__support/FPUtil/FMA.h b/libc/src/__support/FPUtil/FMA.h
index 3ae2e39ff31d423..1e40d06dc146269 100644
--- a/libc/src/__support/FPUtil/FMA.h
+++ b/libc/src/__support/FPUtil/FMA.h
@@ -38,7 +38,6 @@ template <> LIBC_INLINE double fma(double x, double y, double z) {
#else
return __builtin_fma(x, y, z);
#endif
-
}
#endif // LIBC_TARGET_CPU_HAS_FMA
More information about the libc-commits
mailing list