@@ -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 \
similarity index 56%
rename from math/e_exp2l.c
rename to math/e_exp2_template.c
@@ -27,22 +27,34 @@
# define LDBL_EPSILON 0x1p-106L
#endif
-long double
-__ieee754_exp2l (long double x)
+#define M_PRE_X(prefix, x) prefix ## _ ## x
+#define M_PRE_S(prefix, x) M_PRE_X (prefix, x)
+#define M_PRE(x) M_PRE_S (M_PFX, x)
+
+#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))
+
+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_PRE (MAX_EXP))))
{
- if (__builtin_expect (isgreaterequal (x, (long double) (LDBL_MIN_EXP
- - LDBL_MANT_DIG
- - 1)), 1))
+ if (__builtin_expect (isgreaterequal (x, (FLOAT) (M_PRE (MIN_EXP)
+ - M_PRE (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_SUF (fabs) (fractx) < M_PRE (EPSILON) / M_LIT (4.0))
+ result = M_SUF (__scalbn) (M_LIT (1.0) + fractx, intx);
else
- result = __scalbnl (__ieee754_expl (M_LN2l * fractx), intx);
+ result = M_SUF (__scalbn) (M_SUF (__ieee754_exp) (M_SUF (M_LN2)
+ * fractx), intx);
math_check_force_underflow_nonneg (result);
return result;
}
@@ -52,11 +64,11 @@ __ieee754_exp2l (long double x)
if (isinf (x))
return 0;
else
- return LDBL_MIN * LDBL_MIN;
+ return M_PRE (MIN) * M_PRE (MIN);
}
}
else
/* Infinity, NaN or overflow. */
- return LDBL_MAX * x;
+ return M_PRE (MAX) * x;
}
-strong_alias (__ieee754_exp2l, __exp2l_finite)
+declare_mgen_finite_alias (__ieee754_exp2, __exp2)