#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 */
#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;
v.ieee.mantissa1 |= j;
return v.d * 0x1p-108;
}
+#endif /* ! USE_FMA_BUILTIN */
}
#ifndef __fma
libm_alias_double (__fma, fma)
#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. */
/* And finally truncation with round to nearest. */
return (float) u.d;
+#endif /* ! USE_FMAF_BUILTIN */
}
#ifndef __fmaf
libm_alias_float (__fma, fma)
#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
#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
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;
feupdateenv (&env);
/* And finally truncation with round to nearest. */
return (double) u.d;
+#endif /* ! USE_FMA_BUILTIN */
}
#ifndef __fma
libm_alias_double (__fma, fma)
#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:
_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;
v.ieee.mantissa3 |= j;
return v.d * L(0x1p-228);
}
+#endif /* ! USE_FMAL_BUILTIN */
}
libm_alias_ldouble (__fma, fma)
#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 */