]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
ieee754: provide gcc builtins based generic fma functions
authorVineet Gupta <vgupta@synopsys.com>
Fri, 29 May 2020 22:58:33 +0000 (15:58 -0700)
committerVineet Gupta <vgupta@synopsys.com>
Wed, 3 Jun 2020 17:23:28 +0000 (10:23 -0700)
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
sysdeps/generic/math-use-builtins.h
sysdeps/ieee754/dbl-64/s_fma.c
sysdeps/ieee754/dbl-64/s_fmaf.c
sysdeps/ieee754/float128/float128_private.h
sysdeps/ieee754/ldbl-128/s_fma.c
sysdeps/ieee754/ldbl-128/s_fmal.c
sysdeps/s390/fpu/math-use-builtins.h

index fc724c824a17ee1abd785cbaff9032d389c4d6e2..cf25ed8a2138bb6413da2dec64783e147a9416ec 100644 (file)
@@ -63,4 +63,9 @@
 #define USE_SQRT_BUILTIN 0
 #define USE_SQRTF_BUILTIN 0
 
+#define USE_FMA_BUILTIN 0
+#define USE_FMAF_BUILTIN 0
+#define USE_FMAL_BUILTIN 0
+#define USE_FMAF128_BUILTIN 0
+
 #endif /* math-use-builtins.h */
index 876df6e78bdc3df795323021a04458ad83b55841..9dc5b132b9ee429f8f4f7208e8053e9eb2ab7341 100644 (file)
@@ -25,6 +25,7 @@
 #include <fenv_private.h>
 #include <libm-alias-double.h>
 #include <tininess.h>
+#include <math-use-builtins.h>
 
 /* This implementation uses rounding to odd to avoid problems with
    double rounding.  See a paper by Boldo and Melquiond:
 double
 __fma (double x, double y, double z)
 {
+#if USE_FMA_BUILTIN
+  return __builtin_fma (x, y, z);
+#else
+  /* Use generic implementation.  */
   union ieee754_double u, v, w;
   int adjust = 0;
   u.d = x;
@@ -292,6 +297,7 @@ __fma (double x, double y, double z)
       v.ieee.mantissa1 |= j;
       return v.d * 0x1p-108;
     }
+#endif /* ! USE_FMA_BUILTIN  */
 }
 #ifndef __fma
 libm_alias_double (__fma, fma)
index 57329d0a87fe803c3bde69417852a96e23adb983..93b8660d5242433143322cb9c4a9e386c63680d3 100644 (file)
@@ -23,6 +23,7 @@
 #include <math-barriers.h>
 #include <fenv_private.h>
 #include <libm-alias-float.h>
+#include <math-use-builtins.h>
 
 /* This implementation relies on double being more than twice as
    precise as float and uses rounding to odd in order to avoid problems
 float
 __fmaf (float x, float y, float z)
 {
+#if USE_FMAF_BUILTIN
+  return __builtin_fmaf (x, y, z);
+#else
+  /* Use generic implementation.  */
   fenv_t env;
 
   /* Multiplication is always exact.  */
@@ -60,6 +65,7 @@ __fmaf (float x, float y, float z)
 
   /* And finally truncation with round to nearest.  */
   return (float) u.d;
+#endif /* ! USE_FMAF_BUILTIN  */
 }
 #ifndef __fmaf
 libm_alias_float (__fma, fma)
index f97463d9dc1b8917ecaf6234366a8bbf52062814..ab6fc9f3c9cfe4d28a886eace7c032fdc5128f9e 100644 (file)
 #define USE_ROUNDL_BUILTIN USE_ROUNDF128_BUILTIN
 #undef USE_COPYSIGNL_BUILTIN
 #define USE_COPYSIGNL_BUILTIN USE_COPYSIGNF128_BUILTIN
+#undef USE_FMAL_BUILTIN
+#define USE_FMAL_BUILTIN USE_FMAF128_BUILTIN
 
 /* IEEE function renames.  */
 #define __ieee754_acoshl __ieee754_acoshf128
index 13f8ed3b87eba372c335129b4d4ed1f9f0b626c4..0feff0a71cd1ca2dc37bc4fd552c21b970d8629c 100644 (file)
@@ -21,6 +21,7 @@
 #include <fenv.h>
 #include <ieee754.h>
 #include <libm-alias-double.h>
+#include <math-use-builtins.h>
 
 /* This implementation relies on long double being more than twice as
    precise as double and uses rounding to odd in order to avoid problems
@@ -31,6 +32,9 @@
 double
 __fma (double x, double y, double z)
 {
+#if USE_FMA_BUILTIN
+  return __builtin_fma (x, y, z);
+#else
   fenv_t env;
   /* Multiplication is always exact.  */
   long double temp = (long double) x * (long double) y;
@@ -50,6 +54,7 @@ __fma (double x, double y, double z)
   feupdateenv (&env);
   /* And finally truncation with round to nearest.  */
   return (double) u.d;
+#endif /* ! USE_FMA_BUILTIN  */
 }
 #ifndef __fma
 libm_alias_double (__fma, fma)
index 7475015bcec621fde7baa2aefd28686de3a15af3..a610499e47c7711f9967a20877e91b67c75f8932 100644 (file)
@@ -25,6 +25,7 @@
 #include <math_private.h>
 #include <libm-alias-ldouble.h>
 #include <tininess.h>
+#include <math-use-builtins.h>
 
 /* This implementation uses rounding to odd to avoid problems with
    double rounding.  See a paper by Boldo and Melquiond:
@@ -33,6 +34,9 @@
 _Float128
 __fmal (_Float128 x, _Float128 y, _Float128 z)
 {
+#if USE_FMAL_BUILTIN
+  return __builtin_fmal (x, y, z);
+#else
   union ieee854_long_double u, v, w;
   int adjust = 0;
   u.d = x;
@@ -296,5 +300,6 @@ __fmal (_Float128 x, _Float128 y, _Float128 z)
       v.ieee.mantissa3 |= j;
       return v.d * L(0x1p-228);
     }
+#endif /* ! USE_FMAL_BUILTIN  */
 }
 libm_alias_ldouble (__fma, fma)
index eb87b6b0b16bbde229a4b4824f600884a9c97d03..3a80f86b2e293e0b09f84cc2b5ee743801a22989 100644 (file)
 #define USE_SQRT_BUILTIN 0
 #define USE_SQRTF_BUILTIN 0
 
+#define USE_FMA_BUILTIN 0
+#define USE_FMAF_BUILTIN 0
+#define USE_FMAL_BUILTIN 0
+#define USE_FMAF128_BUILTIN 0
+
 #endif /* math-use-builtins.h */