[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