diff --git a/ChangeLog b/ChangeLog index 2570bf4afb..ef284095cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2017-05-17 Gabriel F. T. Gomes + + * math/Makefile (libm-calls): Move e_exp2F to gen-libm-calls. + (gen-libm-calls): Add e_exp2F to use the template. + * math/e_exp2l.c: Rename to math/e_exp2_template.c. + * math/e_exp2_template.c: New file, renamed from + math/e_exp2l.c, and made into a template. + * sysdeps/generic/math-type-macros.h (M_MIN_EXP): New macro. + 2017-05-17 Siddhesh Poyarekar * elf/dl-tunable-types.h (tunable_type_code_t): New type diff --git a/math/Makefile b/math/Makefile index ff4aa0051b..9aca4e04ec 100644 --- a/math/Makefile +++ b/math/Makefile @@ -59,7 +59,7 @@ gen-libm-calls = cargF conjF cimagF crealF cabsF s_cacosF \ w_acoshF w_asinF w_atan2F w_atanhF w_coshF w_exp10F \ w_exp2F w_fmodF w_hypotF w_j0F w_j1F w_jnF w_logF \ w_log10F w_log2F w_powF w_remainderF w_sinhF w_sqrtF \ - w_tgammaF w_lgammaF w_lgammaF_r w_expF + w_tgammaF w_lgammaF w_lgammaF_r w_expF e_exp2F libm-calls = \ e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \ @@ -72,7 +72,7 @@ libm-calls = \ s_nextafterF s_nexttowardF s_rintF s_scalblnF \ s_significandF s_sinF s_tanF s_tanhF \ s_fpclassifyF s_truncF \ - s_remquoF e_log2F e_exp2F s_roundF s_nearbyintF s_sincosF \ + s_remquoF e_log2F s_roundF s_nearbyintF s_sincosF \ s_fmaF s_lrintF s_llrintF s_lroundF s_llroundF e_exp10F \ s_issignalingF $(calls:s_%=m_%) x2y2m1F \ gamma_productF lgamma_negF lgamma_productF \ diff --git a/math/e_exp2l.c b/math/e_exp2_template.c similarity index 59% rename from math/e_exp2l.c rename to math/e_exp2_template.c index bd68e62cd4..f1b34882d2 100644 --- a/math/e_exp2l.c +++ b/math/e_exp2_template.c @@ -20,29 +20,28 @@ #include #include -/* To avoid spurious underflows, use this definition to treat IBM long - double as approximating an IEEE-style format. */ -#if LDBL_MANT_DIG == 106 -# undef LDBL_EPSILON -# define LDBL_EPSILON 0x1p-106L -#endif +#define declare_mgen_finite_alias_x(from, to) \ + strong_alias (from, to ## _finite) +#define declare_mgen_finite_alias_s(from,to) \ + declare_mgen_finite_alias_x (from, to) +#define declare_mgen_finite_alias(from, to) \ + declare_mgen_finite_alias_s (M_SUF (from), M_SUF (to)) -long double -__ieee754_exp2l (long double x) +FLOAT +M_DECL_FUNC (__ieee754_exp2) (FLOAT x) { - if (__glibc_likely (isless (x, (long double) LDBL_MAX_EXP))) + if (__glibc_likely (isless (x, (FLOAT) M_MAX_EXP))) { - if (__builtin_expect (isgreaterequal (x, (long double) (LDBL_MIN_EXP - - LDBL_MANT_DIG - - 1)), 1)) + if (__builtin_expect (isgreaterequal (x, (FLOAT) (M_MIN_EXP - M_MANT_DIG + - 1)), 1)) { int intx = (int) x; - long double fractx = x - intx; - long double result; - if (fabsl (fractx) < LDBL_EPSILON / 4.0L) - result = __scalbnl (1.0L + fractx, intx); + FLOAT fractx = x - intx; + FLOAT result; + if (M_FABS (fractx) < M_EPSILON / 4) + result = M_SCALBN (1 + fractx, intx); else - result = __scalbnl (__ieee754_expl (M_LN2l * fractx), intx); + result = M_SCALBN (M_EXP (M_SUF (M_LN2) * fractx), intx); math_check_force_underflow_nonneg (result); return result; } @@ -52,11 +51,11 @@ __ieee754_exp2l (long double x) if (isinf (x)) return 0; else - return LDBL_MIN * LDBL_MIN; + return M_MIN * M_MIN; } } else /* Infinity, NaN or overflow. */ - return LDBL_MAX * x; + return M_MAX * x; } -strong_alias (__ieee754_exp2l, __exp2l_finite) +declare_mgen_finite_alias (__ieee754_exp2, __exp2) diff --git a/sysdeps/generic/math-type-macros.h b/sysdeps/generic/math-type-macros.h index 1b462b11ff..b4c2aee6aa 100644 --- a/sysdeps/generic/math-type-macros.h +++ b/sysdeps/generic/math-type-macros.h @@ -78,6 +78,7 @@ #define __M_CONCATX(a,b) __M_CONCAT(a,b) #define M_NAN M_SUF (__builtin_nan) ("") +#define M_MIN_EXP __M_CONCATX (M_PFX, _MIN_EXP) #define M_MAX_EXP __M_CONCATX (M_PFX, _MAX_EXP) #define M_MIN __M_CONCATX (M_PFX, _MIN) #define M_MAX __M_CONCATX (M_PFX, _MAX)