From 4482ff226e4b286ab171f3c5841ae1f7e61780cd Mon Sep 17 00:00:00 2001 From: "Paul E. Murphy" Date: Mon, 8 Aug 2016 15:58:28 -0500 Subject: Merge common usage of mul_split function A number of files share identical code for the mul_split function. This moves the duplicated function mul_split into its own header, and refactors the fma usage into a single selection macro. Likewise, mul_split when used by a long double implementation is renamed mul_splitl for clarity. --- sysdeps/ieee754/ldbl-128ibm/s_fmal.c | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) (limited to 'sysdeps/ieee754/ldbl-128ibm/s_fmal.c') diff --git a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c index 177a048..1405763 100644 --- a/sysdeps/ieee754/ldbl-128ibm/s_fmal.c +++ b/sysdeps/ieee754/ldbl-128ibm/s_fmal.c @@ -22,6 +22,7 @@ #include #include #include +#include #include /* Calculate X + Y exactly and store the result in *HI + *LO. It is @@ -36,32 +37,6 @@ add_split (double *hi, double *lo, double x, double y) *lo = (x - *hi) + y; } -/* Calculate X * Y exactly and store the result in *HI + *LO. It is - given that the values are small enough that no overflow occurs and - large enough (or zero) that no underflow occurs. */ - -static void -mul_split (double *hi, double *lo, double x, double y) -{ -#ifdef __FP_FAST_FMA - /* Fast built-in fused multiply-add. */ - *hi = x * y; - *lo = __builtin_fma (x, y, -*hi); -#else - /* Apply Dekker's algorithm. */ - *hi = x * y; -# define C ((1 << (DBL_MANT_DIG + 1) / 2) + 1) - double x1 = x * C; - double y1 = y * C; -# undef C - x1 = (x - x1) + x1; - y1 = (y - y1) + y1; - double x2 = x - x1; - double y2 = y - y1; - *lo = (((x1 * y1 - *hi) + x1 * y2) + x2 * y1) + x2 * y2; -#endif -} - /* Value with extended range, used in intermediate computations. */ typedef struct { -- cgit v1.1