Revert "sysdeps/ieee754/ldbl-128ibm/e_expl.c"

This reverts commit 35eb879e3b.
This commit is contained in:
Andreas Schwab 2013-01-10 10:42:58 +01:00
parent 8790af5f9f
commit d1cdd05138
2 changed files with 16 additions and 64 deletions

View File

@ -70,11 +70,11 @@
static const long double C[] = { static const long double C[] = {
/* Smallest integer x for which e^x overflows. */ /* Smallest integer x for which e^x overflows. */
#define himark C[0] #define himark C[0]
709.78271289338399678773454114191496482L, 709.08956571282405153382846025171462914L,
/* Largest integer x for which e^x underflows. */ /* Largest integer x for which e^x underflows. */
#define lomark C[1] #define lomark C[1]
-744.44007192138126231410729844608163411L, -744.44007192138121808966388925909996033L,
/* 3x2^96 */ /* 3x2^96 */
#define THREEp96 C[2] #define THREEp96 C[2]
@ -138,12 +138,14 @@ __ieee754_expl (long double x)
if (isless (x, himark) && isgreater (x, lomark)) if (isless (x, himark) && isgreater (x, lomark))
{ {
int tval1, tval2, unsafe, n_i, exponent2; int tval1, tval2, unsafe, n_i, exponent2;
long double x22, n, xl; long double x22, n, result, xl;
union ibm_extended_long_double ex2_u, scale_u, result; union ibm_extended_long_double ex2_u, scale_u;
fenv_t oldenv; fenv_t oldenv;
feholdexcept (&oldenv); feholdexcept (&oldenv);
#ifdef FE_TONEAREST
fesetround (FE_TONEAREST); fesetround (FE_TONEAREST);
#endif
n = __roundl (x*M_1_LN2); n = __roundl (x*M_1_LN2);
x = x-n*M_LN2_0; x = x-n*M_LN2_0;
@ -164,7 +166,7 @@ __ieee754_expl (long double x)
* __expl_table[T_EXPL_RES2 + tval2]; * __expl_table[T_EXPL_RES2 + tval2];
n_i = (int)n; n_i = (int)n;
/* 'unsafe' is 1 iff n_1 != 0. */ /* 'unsafe' is 1 iff n_1 != 0. */
unsafe = abs (n_i) >= -LDBL_MIN_EXP - 1; unsafe = fabsl(n_i) >= -LDBL_MIN_EXP - 1;
ex2_u.ieee.exponent += n_i >> unsafe; ex2_u.ieee.exponent += n_i >> unsafe;
/* Fortunately, there are no subnormal lowpart doubles in /* Fortunately, there are no subnormal lowpart doubles in
__expl_table, only normal values and zeros. __expl_table, only normal values and zeros.
@ -202,7 +204,7 @@ __ieee754_expl (long double x)
/* Return result. */ /* Return result. */
fesetenv (&oldenv); fesetenv (&oldenv);
result.d = x22 * ex2_u.d + ex2_u.d; result = x22 * ex2_u.d + ex2_u.d;
/* Now we can test whether the result is ultimate or if we are unsure. /* Now we can test whether the result is ultimate or if we are unsure.
In the later case we should probably call a mpn based routine to give In the later case we should probably call a mpn based routine to give
@ -233,22 +235,10 @@ __ieee754_expl (long double x)
return __ieee754_expl_proc2 (origx); return __ieee754_expl_proc2 (origx);
} }
*/ */
if (unsafe) if (!unsafe)
{ return result;
/* The scale with denormal number might generated underflow for else
first high double multiplication. The exception holding is return result * scale_u.d;
to avoid it. */
if (result.ieee.exponent + scale_u.ieee.exponent
< IBM_EXTENDED_LONG_DOUBLE_BIAS)
{
feholdexcept (&oldenv);
result.d *= scale_u.d;
fesetenv (&oldenv);
}
else
result.d *= scale_u.d;
}
return result.d;
} }
/* Exceptional cases: */ /* Exceptional cases: */
else if (isless (x, himark)) else if (isless (x, himark))

View File

@ -1,44 +1,6 @@
/* /* Looks like we can use ieee854 w_expl.c as is for IBM extended format. */
* ====================================================
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
*
* Developed at SunPro, a Sun Microsystems, Inc. business.
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/
#include <math.h>
#include <math_private.h>
#include <math_ldbl_opt.h> #include <math_ldbl_opt.h>
#undef weak_alias
/* #define weak_alias(n,a)
* wrapper expl(x) #include <sysdeps/ieee754/ldbl-128/w_expl.c>
*/
static const long double
o_threshold = 709.78271289338399678773454114191496482L,
u_threshold = -744.44007192138126231410729844608163411L;
long double __expl(long double x) /* wrapper exp */
{
#ifdef _IEEE_LIBM
return __ieee754_expl(x);
#else
long double z;
z = __ieee754_expl(x);
if (_LIB_VERSION == _IEEE_)
return z;
if (__finitel(x))
{
if (x >= o_threshold)
return __kernel_standard_l(x,x,206); /* exp overflow */
else if (x <= u_threshold)
return __kernel_standard_l(x,x,207); /* exp underflow */
}
return z;
#endif
}
hidden_def (__expl)
long_double_symbol (libm, __expl, expl); long_double_symbol (libm, __expl, expl);