aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--math/Makefile4
-rw-r--r--math/e_exp2_template.c (renamed from math/e_exp2l.c)39
-rw-r--r--sysdeps/generic/math-type-macros.h1
4 files changed, 31 insertions, 22 deletions
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 <gftg@linux.vnet.ibm.com>
+
+ * 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 <siddhesh@sourceware.org>
* 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
index bd68e62cd4..f1b34882d2 100644
--- a/math/e_exp2l.c
+++ b/math/e_exp2_template.c
@@ -20,29 +20,28 @@
#include <math_private.h>
#include <float.h>
-/* 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)