Update.
1999-10-24 Ulrich Drepper <drepper@cygnus.com> * math/libm-test.inc: Disable some boundary case tests for inline function testing. * math/math.h: Pretty printing. * sysdeps/i386/fpu/e_atanh.S: Correct handling of NaN. * sysdeps/i386/fpu/e_atanhf.S: Likewise. * sysdeps/i386/fpu/e_atanhl.S: Likewise. * sysdeps/i386/fpu/e_log10.S: Likewise. * sysdeps/i386/fpu/e_log10f.S: Likewise. * sysdeps/i386/fpu/e_log10l.S: Likewise. * sysdeps/i386/fpu/s_log1p.S: Likewise. * sysdeps/i386/fpu/s_log1pf.S: Likewise. * sysdeps/i386/fpu/s_log1pl.S: Likewise. * sysdeps/i386/fpu/s_log2.S: Likewise. * sysdeps/i386/fpu/s_log2f.S: Likewise. * sysdeps/i386/fpu/s_log2l.S: Likewise. * sysdeps/i386/fpu/libm-test-ulps: New file. * sysdeps/i386/fpu/bits/mathinline.h (__expm1_code): Correct return value for x == 0. (pow): Correct case x == 0. (__sgn1l): Correct handling of -0.0. 1999-10-22 Andreas Jaeger <aj@suse.de> * math/libm-test.inc (asinh_test): Add test for NaN as input parameter. (atan_test): Likewise. (atanh_test): Likewise. (atan2_test): Likewise. (carg_test): Likewise. (ceil_test): Likewise. (cos_test): Likewise. (cosh_test): Likewise. (cpow_test): Likewise. (erf_test): Likewise. (erfc_test): Likewise. (exp_test): Likewise. (exp10_test): Likewise. (exp2_test): Likewise. (expm1_test): Likewise. (fabs_test): Likewise. (floor_test): Likewise. (fmod_test): Likewise. (gamma_test): Likewise. (lgamma_test): Likewise. (log10_test): Likewise. (log1p_test): Likewise. (log2_test): Likewise. (logb_test): Likewise. (nearbyint_test): Likewise. (remainder_test): Likewise. (remquo_test): Likewise. (sin_test): Likewise. (sincos_test): Likewise. (sinh_test): Likewise. (sqrt_test): Likewise. (tan_test): Likewise. (tanh_test): Likewise. (tgamma_test): Likewise.
This commit is contained in:
parent
eb3bf57345
commit
15daa63995
64
ChangeLog
64
ChangeLog
@ -1,3 +1,67 @@
|
||||
1999-10-24 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* math/libm-test.inc: Disable some boundary case tests for inline
|
||||
function testing.
|
||||
|
||||
* math/math.h: Pretty printing.
|
||||
|
||||
* sysdeps/i386/fpu/e_atanh.S: Correct handling of NaN.
|
||||
* sysdeps/i386/fpu/e_atanhf.S: Likewise.
|
||||
* sysdeps/i386/fpu/e_atanhl.S: Likewise.
|
||||
* sysdeps/i386/fpu/e_log10.S: Likewise.
|
||||
* sysdeps/i386/fpu/e_log10f.S: Likewise.
|
||||
* sysdeps/i386/fpu/e_log10l.S: Likewise.
|
||||
* sysdeps/i386/fpu/s_log1p.S: Likewise.
|
||||
* sysdeps/i386/fpu/s_log1pf.S: Likewise.
|
||||
* sysdeps/i386/fpu/s_log1pl.S: Likewise.
|
||||
* sysdeps/i386/fpu/s_log2.S: Likewise.
|
||||
* sysdeps/i386/fpu/s_log2f.S: Likewise.
|
||||
* sysdeps/i386/fpu/s_log2l.S: Likewise.
|
||||
|
||||
* sysdeps/i386/fpu/libm-test-ulps: New file.
|
||||
|
||||
* sysdeps/i386/fpu/bits/mathinline.h (__expm1_code): Correct return
|
||||
value for x == 0.
|
||||
(pow): Correct case x == 0.
|
||||
(__sgn1l): Correct handling of -0.0.
|
||||
|
||||
1999-10-22 Andreas Jaeger <aj@suse.de>
|
||||
|
||||
* math/libm-test.inc (asinh_test): Add test for NaN as input parameter.
|
||||
(atan_test): Likewise.
|
||||
(atanh_test): Likewise.
|
||||
(atan2_test): Likewise.
|
||||
(carg_test): Likewise.
|
||||
(ceil_test): Likewise.
|
||||
(cos_test): Likewise.
|
||||
(cosh_test): Likewise.
|
||||
(cpow_test): Likewise.
|
||||
(erf_test): Likewise.
|
||||
(erfc_test): Likewise.
|
||||
(exp_test): Likewise.
|
||||
(exp10_test): Likewise.
|
||||
(exp2_test): Likewise.
|
||||
(expm1_test): Likewise.
|
||||
(fabs_test): Likewise.
|
||||
(floor_test): Likewise.
|
||||
(fmod_test): Likewise.
|
||||
(gamma_test): Likewise.
|
||||
(lgamma_test): Likewise.
|
||||
(log10_test): Likewise.
|
||||
(log1p_test): Likewise.
|
||||
(log2_test): Likewise.
|
||||
(logb_test): Likewise.
|
||||
(nearbyint_test): Likewise.
|
||||
(remainder_test): Likewise.
|
||||
(remquo_test): Likewise.
|
||||
(sin_test): Likewise.
|
||||
(sincos_test): Likewise.
|
||||
(sinh_test): Likewise.
|
||||
(sqrt_test): Likewise.
|
||||
(tan_test): Likewise.
|
||||
(tanh_test): Likewise.
|
||||
(tgamma_test): Likewise.
|
||||
|
||||
1999-10-21 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* sysdeps/ieee754/ldbl-96/s_nexttoward.c: If x == y, return y.
|
||||
|
@ -1,3 +1,14 @@
|
||||
1999-10-21 Xavier Leroy <Xavier.Leroy@inria.fr>
|
||||
|
||||
* linuxthreads/pthread.c: For i386, wrap pthread_handle_sigrestart
|
||||
and pthread_handle_sigcancel with functions that restore
|
||||
%gs from the signal context. For each signal handling function,
|
||||
two wrappers are required, one for a non-RT signal and one for
|
||||
a RT signal.
|
||||
* linuxthreads/signal.c: For i386, add code to restore %gs
|
||||
from the signal context in pthread_sighandler and
|
||||
pthread_sighandler_rt.
|
||||
|
||||
1999-10-17 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* internals.h (PTHREAD_START_ARGS_INITIALIZER): Add cast.
|
||||
|
@ -162,14 +162,15 @@ extern int _h_errno;
|
||||
/* Forward declarations */
|
||||
|
||||
static void pthread_exit_process(int retcode, void *arg);
|
||||
#ifndef __i386__
|
||||
static void pthread_handle_sigcancel(int sig);
|
||||
static void pthread_handle_sigrestart(int sig);
|
||||
#else
|
||||
static void pthread_handle_sigcancel(int sig, struct sigcontext ctx);
|
||||
static void pthread_handle_sigrestart(int sig, struct sigcontext ctx);
|
||||
#ifdef __i386__
|
||||
static void pthread_handle_sigrestart_nonrt(int sig, struct sigcontext ctx);
|
||||
static void pthread_handle_sigrestart_rt(int sig, struct siginfo *si,
|
||||
struct ucontext *uc);
|
||||
static void pthread_handle_sigcancel_nonrt(int sig, struct sigcontext ctx);
|
||||
static void pthread_handle_sigcancel_rt(int sig, struct siginfo *si,
|
||||
struct ucontext *uc);
|
||||
#endif
|
||||
static void pthread_handle_sigdebug(int sig);
|
||||
|
||||
@ -330,7 +331,7 @@ static void pthread_initialize(void)
|
||||
if (__pthread_sig_restart >= SIGRTMIN)
|
||||
sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart_rt;
|
||||
else
|
||||
sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart;
|
||||
sa.sa_handler = (__sighandler_t) pthread_handle_sigrestart_nonrt;
|
||||
#endif
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_flags = 0;
|
||||
@ -338,7 +339,10 @@ static void pthread_initialize(void)
|
||||
#ifndef __i386__
|
||||
sa.sa_handler = pthread_handle_sigcancel;
|
||||
#else
|
||||
sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel;
|
||||
if (__pthread_sig_restart >= SIGRTMIN)
|
||||
sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel_rt;
|
||||
else
|
||||
sa.sa_handler = (__sighandler_t) pthread_handle_sigcancel_nonrt;
|
||||
#endif
|
||||
sa.sa_flags = 0;
|
||||
__sigaction(__pthread_sig_cancel, &sa, NULL);
|
||||
@ -564,54 +568,38 @@ static void pthread_exit_process(int retcode, void *arg)
|
||||
in the thread descriptor, and optionally performs a siglongjmp
|
||||
(for pthread_cond_timedwait). */
|
||||
|
||||
#ifndef __i386__
|
||||
static void pthread_handle_sigrestart(int sig)
|
||||
{
|
||||
pthread_descr self = thread_self();
|
||||
#else
|
||||
static void pthread_handle_sigrestart(int sig, struct sigcontext ctx)
|
||||
{
|
||||
pthread_descr self;
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
|
||||
self = thread_self();
|
||||
#endif
|
||||
THREAD_SETMEM(self, p_signal, sig);
|
||||
if (THREAD_GETMEM(self, p_signal_jmp) != NULL)
|
||||
siglongjmp(*THREAD_GETMEM(self, p_signal_jmp), 1);
|
||||
}
|
||||
|
||||
#ifdef __i386__
|
||||
static void pthread_handle_sigrestart_nonrt(int sig, struct sigcontext ctx)
|
||||
{
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
|
||||
pthread_handle_sigrestart(sig);
|
||||
}
|
||||
|
||||
static void pthread_handle_sigrestart_rt(int sig, struct siginfo *si,
|
||||
struct ucontext *uc)
|
||||
{
|
||||
pthread_descr self;
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (uc->uc_mcontext.gregs[GS]));
|
||||
self = thread_self();
|
||||
THREAD_SETMEM(self, p_signal, sig);
|
||||
if (THREAD_GETMEM(self, p_signal_jmp) != NULL)
|
||||
siglongjmp(*THREAD_GETMEM(self, p_signal_jmp), 1);
|
||||
pthread_handle_sigrestart(sig);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* The handler for the CANCEL signal checks for cancellation
|
||||
(in asynchronous mode), for process-wide exit and exec requests.
|
||||
For the thread manager thread, redirect the signal to
|
||||
__pthread_manager_sighandler. */
|
||||
|
||||
#ifndef __i386__
|
||||
static void pthread_handle_sigcancel(int sig)
|
||||
{
|
||||
pthread_descr self = thread_self();
|
||||
sigjmp_buf * jmpbuf;
|
||||
#else
|
||||
static void pthread_handle_sigcancel(int sig, struct sigcontext ctx)
|
||||
{
|
||||
pthread_descr self;
|
||||
sigjmp_buf * jmpbuf;
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
|
||||
self = thread_self();
|
||||
#endif
|
||||
|
||||
if (self == &__pthread_manager_thread)
|
||||
{
|
||||
@ -637,6 +625,21 @@ static void pthread_handle_sigcancel(int sig, struct sigcontext ctx)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __i386__
|
||||
static void pthread_handle_sigcancel_nonrt(int sig, struct sigcontext ctx)
|
||||
{
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
|
||||
pthread_handle_sigcancel(sig);
|
||||
}
|
||||
|
||||
static void pthread_handle_sigcancel_rt(int sig, struct siginfo *si,
|
||||
struct ucontext *uc)
|
||||
{
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (uc->uc_mcontext.gregs[GS]));
|
||||
pthread_handle_sigcancel(sig);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Handler for the DEBUG signal.
|
||||
The debugging strategy is as follows:
|
||||
On reception of a REQ_DEBUG request (sent by new threads created to
|
||||
|
@ -79,8 +79,12 @@ static union
|
||||
/* The wrapper around user-provided signal handlers */
|
||||
static void pthread_sighandler(int signo, SIGCONTEXT ctx)
|
||||
{
|
||||
pthread_descr self = thread_self();
|
||||
pthread_descr self;
|
||||
char * in_sighandler;
|
||||
#ifdef __i386__
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (ctx.gs));
|
||||
#endif
|
||||
self = thread_self();
|
||||
/* If we're in a sigwait operation, just record the signal received
|
||||
and return without calling the user's handler */
|
||||
if (THREAD_GETMEM(self, p_sigwaiting)) {
|
||||
@ -102,8 +106,12 @@ static void pthread_sighandler(int signo, SIGCONTEXT ctx)
|
||||
static void pthread_sighandler_rt(int signo, struct siginfo *si,
|
||||
struct ucontext *uc)
|
||||
{
|
||||
pthread_descr self = thread_self();
|
||||
pthread_descr self;
|
||||
char * in_sighandler;
|
||||
#ifdef __i386__
|
||||
asm volatile ("movw %w0,%%gs" : : "r" (uc->uc_mcontext.gregs[GS]));
|
||||
#endif
|
||||
self = thread_self();
|
||||
/* If we're in a sigwait operation, just record the signal received
|
||||
and return without calling the user's handler */
|
||||
if (THREAD_GETMEM(self, p_sigwaiting)) {
|
||||
|
@ -204,7 +204,7 @@ print_screen (int ok, int xfail)
|
||||
{
|
||||
if (output_points
|
||||
&& (verbose > 1
|
||||
|| ((verbose == 1) && (ok == xfail))))
|
||||
|| (verbose == 1 && ok == xfail)))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@ -280,8 +280,8 @@ print_complex_function_ulps (const char *function_name, FLOAT real_ulp,
|
||||
CHOOSE("ldouble", "double", "float",
|
||||
"ildouble", "idouble", "ifloat"), imag_ulp);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -537,7 +537,7 @@ check_complex (const char *test_name, __complex__ FLOAT computed,
|
||||
part_exp = __real__ expected;
|
||||
part_max_ulp = __real__ max_ulp;
|
||||
part_xfail = __real__ xfail;
|
||||
|
||||
|
||||
check_float_internal (str, part_comp, part_exp, part_max_ulp, part_xfail,
|
||||
exception, &real_max_error);
|
||||
|
||||
@ -546,7 +546,7 @@ check_complex (const char *test_name, __complex__ FLOAT computed,
|
||||
part_exp = __imag__ expected;
|
||||
part_max_ulp = __imag__ max_ulp;
|
||||
part_xfail = __imag__ xfail;
|
||||
|
||||
|
||||
/* Don't check again for exceptions, just pass through the
|
||||
zero/inf sign test. */
|
||||
check_float_internal (str, part_comp, part_exp, part_max_ulp, part_xfail,
|
||||
@ -764,8 +764,11 @@ asinh_test (void)
|
||||
|
||||
TEST_f_f (asinh, 0, 0);
|
||||
TEST_f_f (asinh, minus_zero, minus_zero);
|
||||
#ifndef TEST_INLINE
|
||||
TEST_f_f (asinh, plus_infty, plus_infty);
|
||||
TEST_f_f (asinh, minus_infty, minus_infty);
|
||||
#endif
|
||||
TEST_f_f (asinh, nan_value, nan_value);
|
||||
TEST_f_f (asinh, 0.7, 0.652666566082355786L);
|
||||
|
||||
END (asinh);
|
||||
@ -782,6 +785,7 @@ atan_test (void)
|
||||
|
||||
TEST_f_f (atan, plus_infty, M_PI_2l);
|
||||
TEST_f_f (atan, minus_infty, -M_PI_2l);
|
||||
TEST_f_f (atan, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (atan, 1, M_PI_4l);
|
||||
TEST_f_f (atan, -1, -M_PI_4l);
|
||||
@ -805,6 +809,7 @@ atanh_test (void)
|
||||
|
||||
TEST_f_f (atanh, 1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
TEST_f_f (atanh, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
TEST_f_f (atanh, nan_value, nan_value);
|
||||
|
||||
/* atanh (x) == NaN plus invalid exception if |x| > 1. */
|
||||
TEST_f_f (atanh, 1.1, nan_value, INVALID_EXCEPTION);
|
||||
@ -872,6 +877,7 @@ atan2_test (void)
|
||||
TEST_ff_f (atan2, minus_infty, plus_infty, -M_PI_4l);
|
||||
TEST_ff_f (atan2, plus_infty, minus_infty, M_PI_34l);
|
||||
TEST_ff_f (atan2, minus_infty, minus_infty, -M_PI_34l);
|
||||
TEST_ff_f (atan2, nan_value, nan_value, nan_value);
|
||||
|
||||
TEST_ff_f (atan2, 0.7, 1, 0.6107259643892086165L);
|
||||
TEST_ff_f (atan2, 0.4, 0.0003, 1.5700463269355215718L);
|
||||
@ -1096,6 +1102,8 @@ carg_test (void)
|
||||
|
||||
TEST_c_f (carg, minus_infty, minus_infty, -3 * M_PI_4l);
|
||||
|
||||
TEST_c_f (carg, nan_value, nan_value, nan_value);
|
||||
|
||||
END (carg);
|
||||
}
|
||||
|
||||
@ -1495,6 +1503,7 @@ ceil_test (void)
|
||||
TEST_f_f (ceil, minus_zero, minus_zero);
|
||||
TEST_f_f (ceil, plus_infty, plus_infty);
|
||||
TEST_f_f (ceil, minus_infty, minus_infty);
|
||||
TEST_f_f (ceil, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (ceil, M_PIl, 4.0);
|
||||
TEST_f_f (ceil, -M_PIl, -3.0);
|
||||
@ -1747,6 +1756,7 @@ cos_test (void)
|
||||
TEST_f_f (cos, minus_zero, 1);
|
||||
TEST_f_f (cos, plus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (cos, minus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (cos, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (cos, M_PI_6l * 2.0, 0.5);
|
||||
TEST_f_f (cos, M_PI_6l * 4.0, -0.5);
|
||||
@ -1764,8 +1774,11 @@ cosh_test (void)
|
||||
TEST_f_f (cosh, 0, 1);
|
||||
TEST_f_f (cosh, minus_zero, 1);
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
TEST_f_f (cosh, plus_infty, plus_infty);
|
||||
TEST_f_f (cosh, minus_infty, plus_infty);
|
||||
#endif
|
||||
TEST_f_f (cosh, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (cosh, 0.7, 1.255169005630943018L);
|
||||
END (cosh);
|
||||
@ -1783,6 +1796,8 @@ cpow_test (void)
|
||||
TEST_cc_c (cpow, M_El, 0, 0, 2 * M_PIl, 1.0, 0.0);
|
||||
TEST_cc_c (cpow, 2, 3, 4, 0, -119.0, -120.0);
|
||||
|
||||
TEST_cc_c (cpow, nan_value, nan_value, nan_value, nan_value, nan_value, nan_value);
|
||||
|
||||
END (cpow, complex);
|
||||
}
|
||||
|
||||
@ -2128,6 +2143,7 @@ erf_test (void)
|
||||
TEST_f_f (erf, minus_zero, minus_zero);
|
||||
TEST_f_f (erf, plus_infty, 1);
|
||||
TEST_f_f (erf, minus_infty, -1);
|
||||
TEST_f_f (erf, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (erf, 0.7, 0.67780119383741847297L);
|
||||
|
||||
@ -2155,6 +2171,7 @@ erfc_test (void)
|
||||
TEST_f_f (erfc, minus_infty, 2.0);
|
||||
TEST_f_f (erfc, 0.0, 1.0);
|
||||
TEST_f_f (erfc, minus_zero, 1.0);
|
||||
TEST_f_f (erfc, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (erfc, 0.7, 0.32219880616258152702L);
|
||||
|
||||
@ -2174,8 +2191,11 @@ exp_test (void)
|
||||
TEST_f_f (exp, 0, 1);
|
||||
TEST_f_f (exp, minus_zero, 1);
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
TEST_f_f (exp, plus_infty, plus_infty);
|
||||
TEST_f_f (exp, minus_infty, 0);
|
||||
#endif
|
||||
TEST_f_f (exp, nan_value, nan_value);
|
||||
TEST_f_f (exp, 1, M_El);
|
||||
|
||||
TEST_f_f (exp, 2, M_E2l);
|
||||
@ -2202,6 +2222,7 @@ exp10_test (void)
|
||||
|
||||
TEST_f_f (exp10, plus_infty, plus_infty);
|
||||
TEST_f_f (exp10, minus_infty, 0);
|
||||
TEST_f_f (exp10, nan_value, nan_value);
|
||||
TEST_f_f (exp10, 3, 1000);
|
||||
TEST_f_f (exp10, -1, 0.1);
|
||||
TEST_f_f (exp10, 1e6, plus_infty);
|
||||
@ -2226,6 +2247,8 @@ exp2_test (void)
|
||||
TEST_f_f (exp2, minus_zero, 1);
|
||||
TEST_f_f (exp2, plus_infty, plus_infty);
|
||||
TEST_f_f (exp2, minus_infty, 0);
|
||||
TEST_f_f (exp2, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (exp2, 10, 1024);
|
||||
TEST_f_f (exp2, -1, 0.5);
|
||||
TEST_f_f (exp2, 1e6, plus_infty);
|
||||
@ -2243,8 +2266,11 @@ expm1_test (void)
|
||||
TEST_f_f (expm1, 0, 0);
|
||||
TEST_f_f (expm1, minus_zero, minus_zero);
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
TEST_f_f (expm1, plus_infty, plus_infty);
|
||||
TEST_f_f (expm1, minus_infty, -1);
|
||||
#endif
|
||||
TEST_f_f (expm1, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (expm1, 1, M_El - 1.0);
|
||||
TEST_f_f (expm1, 0.7, 1.0137527074704765216L);
|
||||
@ -2262,6 +2288,7 @@ fabs_test (void)
|
||||
|
||||
TEST_f_f (fabs, plus_infty, plus_infty);
|
||||
TEST_f_f (fabs, minus_infty, plus_infty);
|
||||
TEST_f_f (fabs, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (fabs, 38.0, 38.0);
|
||||
TEST_f_f (fabs, -M_El, M_El);
|
||||
@ -2312,6 +2339,7 @@ floor_test (void)
|
||||
TEST_f_f (floor, minus_zero, minus_zero);
|
||||
TEST_f_f (floor, plus_infty, plus_infty);
|
||||
TEST_f_f (floor, minus_infty, minus_infty);
|
||||
TEST_f_f (floor, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (floor, M_PIl, 3.0);
|
||||
TEST_f_f (floor, -M_PIl, -4.0);
|
||||
@ -2447,6 +2475,8 @@ fmod_test (void)
|
||||
/* fmod (x, -inf) == x for x not infinite. */
|
||||
TEST_ff_f (fmod, 3.0, minus_infty, 3.0);
|
||||
|
||||
TEST_ff_f (fmod, nan_value, nan_value, nan_value);
|
||||
|
||||
TEST_ff_f (fmod, 6.5, 2.3, 1.9);
|
||||
TEST_ff_f (fmod, -6.5, 2.3, -1.9);
|
||||
TEST_ff_f (fmod, 6.5, -2.3, 1.9);
|
||||
@ -2509,6 +2539,7 @@ gamma_test (void)
|
||||
TEST_f_f (gamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
TEST_f_f (gamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
TEST_f_f (gamma, minus_infty, plus_infty);
|
||||
TEST_f_f (gamma, nan_value, nan_value);
|
||||
|
||||
TEST_f_f1 (gamma, 1, 0, 1);
|
||||
TEST_f_f1 (gamma, 3, M_LN2l, 1);
|
||||
@ -2527,10 +2558,12 @@ hypot_test (void)
|
||||
TEST_ff_f (hypot, plus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN);
|
||||
TEST_ff_f (hypot, minus_infty, 1, plus_infty, IGNORE_ZERO_INF_SIGN);
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
TEST_ff_f (hypot, plus_infty, nan_value, plus_infty);
|
||||
TEST_ff_f (hypot, minus_infty, nan_value, plus_infty);
|
||||
TEST_ff_f (hypot, nan_value, plus_infty, plus_infty);
|
||||
TEST_ff_f (hypot, nan_value, minus_infty, plus_infty);
|
||||
#endif
|
||||
|
||||
TEST_ff_f (hypot, nan_value, nan_value, nan_value);
|
||||
|
||||
@ -2759,6 +2792,7 @@ lgamma_test (void)
|
||||
|
||||
TEST_f_f (lgamma, plus_infty, plus_infty);
|
||||
TEST_f_f (lgamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
TEST_f_f (lgamma, nan_value, nan_value);
|
||||
|
||||
/* lgamma (x) == +inf plus divide by zero exception for integer x <= 0. */
|
||||
TEST_f_f (lgamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
@ -2881,6 +2915,7 @@ log10_test (void)
|
||||
TEST_f_f (log10, -1, nan_value, INVALID_EXCEPTION);
|
||||
|
||||
TEST_f_f (log10, plus_infty, plus_infty);
|
||||
TEST_f_f (log10, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (log10, 0.1L, -1);
|
||||
TEST_f_f (log10, 10.0, 1);
|
||||
@ -2905,6 +2940,7 @@ log1p_test (void)
|
||||
TEST_f_f (log1p, -2, nan_value, INVALID_EXCEPTION);
|
||||
|
||||
TEST_f_f (log1p, plus_infty, plus_infty);
|
||||
TEST_f_f (log1p, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (log1p, M_El - 1.0, 1);
|
||||
|
||||
@ -2927,6 +2963,7 @@ log2_test (void)
|
||||
TEST_f_f (log2, -1, nan_value, INVALID_EXCEPTION);
|
||||
|
||||
TEST_f_f (log2, plus_infty, plus_infty);
|
||||
TEST_f_f (log2, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (log2, M_El, M_LOG2El);
|
||||
TEST_f_f (log2, 2.0, 1);
|
||||
@ -2949,6 +2986,7 @@ logb_test (void)
|
||||
TEST_f_f (logb, 0, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
|
||||
TEST_f_f (logb, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
|
||||
TEST_f_f (logb, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (logb, 1, 0);
|
||||
TEST_f_f (logb, M_El, 1);
|
||||
@ -3063,6 +3101,7 @@ nearbyint_test (void)
|
||||
TEST_f_f (nearbyint, minus_zero, minus_zero);
|
||||
TEST_f_f (nearbyint, plus_infty, plus_infty);
|
||||
TEST_f_f (nearbyint, minus_infty, minus_infty);
|
||||
TEST_f_f (nearbyint, nan_value, nan_value);
|
||||
|
||||
END (nearbyint);
|
||||
}
|
||||
@ -3139,6 +3178,7 @@ pow_test (void)
|
||||
TEST_ff_f (pow, nan_value, minus_zero, 1);
|
||||
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
TEST_ff_f (pow, 1.1, plus_infty, plus_infty);
|
||||
TEST_ff_f (pow, plus_infty, plus_infty, plus_infty);
|
||||
TEST_ff_f (pow, -1.1, plus_infty, plus_infty);
|
||||
@ -3190,6 +3230,7 @@ pow_test (void)
|
||||
TEST_ff_f (pow, minus_infty, -1.1, 0);
|
||||
TEST_ff_f (pow, minus_infty, -11.1, 0);
|
||||
TEST_ff_f (pow, minus_infty, -1001.1, 0);
|
||||
#endif
|
||||
|
||||
TEST_ff_f (pow, nan_value, nan_value, nan_value);
|
||||
TEST_ff_f (pow, 0, nan_value, nan_value);
|
||||
@ -3236,6 +3277,7 @@ pow_test (void)
|
||||
TEST_ff_f (pow, minus_zero, 2, 0);
|
||||
TEST_ff_f (pow, minus_zero, 11.1, 0);
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
/* pow (x, +inf) == +inf for |x| > 1. */
|
||||
TEST_ff_f (pow, 1.5, plus_infty, plus_infty);
|
||||
|
||||
@ -3247,6 +3289,7 @@ pow_test (void)
|
||||
|
||||
/* pow (x, -inf) == +inf for |x| < 1. */
|
||||
TEST_ff_f (pow, 0.5, minus_infty, plus_infty);
|
||||
#endif
|
||||
|
||||
/* pow (+inf, y) == +inf for y > 0. */
|
||||
TEST_ff_f (pow, plus_infty, 2, plus_infty);
|
||||
@ -3296,6 +3339,7 @@ remainder_test (void)
|
||||
TEST_ff_f (remainder, 1, minus_zero, nan_value, INVALID_EXCEPTION);
|
||||
TEST_ff_f (remainder, plus_infty, 1, nan_value, INVALID_EXCEPTION);
|
||||
TEST_ff_f (remainder, minus_infty, 1, nan_value, INVALID_EXCEPTION);
|
||||
TEST_ff_f (remainder, nan_value, nan_value, nan_value);
|
||||
|
||||
TEST_ff_f (remainder, 1.625, 1.0, -0.375);
|
||||
TEST_ff_f (remainder, -1.625, 1.0, 0.375);
|
||||
@ -3319,6 +3363,7 @@ remquo_test (void)
|
||||
TEST_ffI_f1 (remquo, 1, minus_zero, nan_value, IGNORE, INVALID_EXCEPTION);
|
||||
TEST_ffI_f1 (remquo, plus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION);
|
||||
TEST_ffI_f1 (remquo, minus_infty, 1, nan_value, IGNORE, INVALID_EXCEPTION);
|
||||
TEST_ffI_f1 (remquo, nan_value, nan_value, nan_value, IGNORE);
|
||||
|
||||
TEST_ffI_f1 (remquo, 1.625, 1.0, -0.375, 2);
|
||||
TEST_ffI_f1 (remquo, -1.625, 1.0, 0.375, -2);
|
||||
@ -3496,6 +3541,7 @@ sin_test (void)
|
||||
TEST_f_f (sin, minus_zero, minus_zero);
|
||||
TEST_f_f (sin, plus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (sin, minus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (sin, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (sin, M_PI_6l, 0.5);
|
||||
TEST_f_f (sin, -M_PI_6l, -0.5);
|
||||
@ -3520,6 +3566,7 @@ sincos_test (void)
|
||||
TEST_extra (sincos, minus_zero, minus_zero, 1);
|
||||
TEST_extra (sincos, plus_infty, nan_value, nan_value, INVALID_EXCEPTION);
|
||||
TEST_extra (sincos, minus_infty, nan_value, nan_value, INVALID_EXCEPTION);
|
||||
TEST_extra (sincos, nan_value, nan_value, nan_value);
|
||||
|
||||
TEST_extra (sincos, M_PI_2l, 1, 0);
|
||||
TEST_extra (sincos, M_PI_6l, 0.5, 0.866025403784438646764L);
|
||||
@ -3536,8 +3583,11 @@ sinh_test (void)
|
||||
TEST_f_f (sinh, 0, 0);
|
||||
TEST_f_f (sinh, minus_zero, minus_zero);
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
TEST_f_f (sinh, plus_infty, plus_infty);
|
||||
TEST_f_f (sinh, minus_infty, minus_infty);
|
||||
#endif
|
||||
TEST_f_f (sinh, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (sinh, 0.7, 0.75858370183953350346L);
|
||||
|
||||
@ -3558,6 +3608,7 @@ sqrt_test (void)
|
||||
/* sqrt (x) == NaN plus invalid exception for x < 0. */
|
||||
TEST_f_f (sqrt, -1, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (sqrt, minus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (sqrt, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (sqrt, 2209, 47);
|
||||
TEST_f_f (sqrt, 4, 2);
|
||||
@ -3579,6 +3630,7 @@ tan_test (void)
|
||||
TEST_f_f (tan, minus_zero, minus_zero);
|
||||
TEST_f_f (tan, plus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (tan, minus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (tan, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (tan, M_PI_4l, 1);
|
||||
TEST_f_f (tan, 0.7, 0.84228838046307944813L);
|
||||
@ -3594,8 +3646,11 @@ tanh_test (void)
|
||||
TEST_f_f (tanh, 0, 0);
|
||||
TEST_f_f (tanh, minus_zero, minus_zero);
|
||||
|
||||
#ifndef TEST_INLINE
|
||||
TEST_f_f (tanh, plus_infty, 1);
|
||||
TEST_f_f (tanh, minus_infty, -1);
|
||||
#endif
|
||||
TEST_f_f (tanh, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (tanh, 0.7, 0.60436777711716349631L);
|
||||
|
||||
@ -3620,6 +3675,7 @@ tgamma_test (void)
|
||||
/* tgamma (x) == NaN plus invalid exception for integer x <= 0. */
|
||||
TEST_f_f (tgamma, -2, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (tgamma, minus_infty, nan_value, INVALID_EXCEPTION);
|
||||
TEST_f_f (tgamma, nan_value, nan_value);
|
||||
|
||||
TEST_f_f (tgamma, 0.5, M_SQRT_PIl);
|
||||
TEST_f_f (tgamma, -0.5, -M_2_SQRT_PIl);
|
||||
|
40
math/math.h
40
math/math.h
@ -171,10 +171,10 @@ enum
|
||||
(sizeof (x) == sizeof (float) ? __fpclassifyf (x) : __fpclassify (x))
|
||||
# else
|
||||
# define fpclassify(x) \
|
||||
(sizeof (x) == sizeof (float) ? \
|
||||
__fpclassifyf (x) \
|
||||
: sizeof (x) == sizeof (double) ? \
|
||||
__fpclassify (x) : __fpclassifyl (x))
|
||||
(sizeof (x) == sizeof (float) \
|
||||
? __fpclassifyf (x) \
|
||||
: sizeof (x) == sizeof (double) \
|
||||
? __fpclassify (x) : __fpclassifyl (x))
|
||||
# endif
|
||||
|
||||
/* Return nonzero value if sign of X is negative. */
|
||||
@ -183,10 +183,10 @@ enum
|
||||
(sizeof (x) == sizeof (float) ? __signbitf (x) : __signbit (x))
|
||||
# else
|
||||
# define signbit(x) \
|
||||
(sizeof (x) == sizeof (float) ? \
|
||||
__signbitf (x) \
|
||||
: sizeof (x) == sizeof (double) ? \
|
||||
__signbit (x) : __signbitl (x))
|
||||
(sizeof (x) == sizeof (float) \
|
||||
? __signbitf (x) \
|
||||
: sizeof (x) == sizeof (double) \
|
||||
? __signbit (x) : __signbitl (x))
|
||||
# endif
|
||||
|
||||
/* Return nonzero value if X is not +-Inf or NaN. */
|
||||
@ -195,10 +195,10 @@ enum
|
||||
(sizeof (x) == sizeof (float) ? __finitef (x) : __finite (x))
|
||||
# else
|
||||
# define isfinite(x) \
|
||||
(sizeof (x) == sizeof (float) ? \
|
||||
__finitef (x) \
|
||||
: sizeof (x) == sizeof (double) ? \
|
||||
__finite (x) : __finitel (x))
|
||||
(sizeof (x) == sizeof (float) \
|
||||
? __finitef (x) \
|
||||
: sizeof (x) == sizeof (double) \
|
||||
? __finite (x) : __finitel (x))
|
||||
# endif
|
||||
|
||||
/* Return nonzero value if X is neither zero, subnormal, Inf, nor NaN. */
|
||||
@ -211,10 +211,10 @@ enum
|
||||
(sizeof (x) == sizeof (float) ? __isnanf (x) : __isnan (x))
|
||||
# else
|
||||
# define isnan(x) \
|
||||
(sizeof (x) == sizeof (float) ? \
|
||||
__isnanf (x) \
|
||||
: sizeof (x) == sizeof (double) ? \
|
||||
__isnan (x) : __isnanl (x))
|
||||
(sizeof (x) == sizeof (float) \
|
||||
? __isnanf (x) \
|
||||
: sizeof (x) == sizeof (double) \
|
||||
? __isnan (x) : __isnanl (x))
|
||||
# endif
|
||||
|
||||
/* Return nonzero value is X is positive or negative infinity. */
|
||||
@ -223,10 +223,10 @@ enum
|
||||
(sizeof (x) == sizeof (float) ? __isinff (x) : __isinf (x))
|
||||
# else
|
||||
# define isinf(x) \
|
||||
(sizeof (x) == sizeof (float) ? \
|
||||
__isinff (x) \
|
||||
: sizeof (x) == sizeof (double) ? \
|
||||
__isinf (x) : __isinfl (x))
|
||||
(sizeof (x) == sizeof (float) \
|
||||
? __isinff (x) \
|
||||
: sizeof (x) == sizeof (double) \
|
||||
? __isinf (x) : __isinfl (x))
|
||||
# endif
|
||||
|
||||
#endif /* Use ISO C 9X. */
|
||||
|
@ -324,7 +324,7 @@ __sincosl (long double __x, long double *__sinx, long double *__cosx)
|
||||
("fscale # 2^int(x * log2(e))\n\t" \
|
||||
: "=t" (__temp) : "0" (1.0), "u" (__exponent)); \
|
||||
__temp -= 1.0; \
|
||||
return __temp + __value
|
||||
return __temp + __value ?: __x
|
||||
__inline_mathcode_ (long double, __expm1l, __x, __expm1_code)
|
||||
|
||||
|
||||
@ -383,8 +383,14 @@ __inline_mathcode2 (pow, __x, __y, \
|
||||
register long double __value; \
|
||||
register long double __exponent; \
|
||||
__extension__ long long int __p = (long long int) __y; \
|
||||
if (__x == 0.0 && __y > 0.0) \
|
||||
return 0.0; \
|
||||
if (__x == 0.0) \
|
||||
{ \
|
||||
if (__y > 0.0) \
|
||||
return __y == (double) __p && (__p & 1) != 0 ? __x : 0.0; \
|
||||
else if (__y < 0.0) \
|
||||
return (__y == (double) __p && (-__p & 1) != 0 \
|
||||
? 1.0 / __x : 1.0 / fabs (__x)); \
|
||||
} \
|
||||
if (__y == (double) __p) \
|
||||
{ \
|
||||
long double __r = 1.0; \
|
||||
@ -448,7 +454,12 @@ __inline_mathop_decl (log10, "fldlg2; fxch; fyl2x", "0" (__x) : "st(1)")
|
||||
__inline_mathcode (asin, __x, return __atan2l (__x, __sqrtl (1.0 - __x * __x)))
|
||||
__inline_mathcode (acos, __x, return __atan2l (__sqrtl (1.0 - __x * __x), __x))
|
||||
|
||||
__inline_mathcode_ (long double, __sgn1l, __x, return __x >= 0.0 ? 1.0 : -1.0)
|
||||
__inline_mathcode_ (long double, __sgn1l, __x, \
|
||||
union { long double __xld; unsigned int __xi[3]; } __n = { .__xld = __x }; \
|
||||
__n.__xi[2] = (__n.__xi[2] & 0x8000) | 0x3fff; \
|
||||
__n.__xi[1] = 0x80000000; \
|
||||
__n.__xi[0] = 0; \
|
||||
return __n.__xld)
|
||||
|
||||
|
||||
/* The argument range of the inline version of sinhl is slightly reduced. */
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* ix87 specific implementation of arctanh function.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
@ -50,6 +50,12 @@ ln2_2: .tfloat 0.3465735902799726547086160
|
||||
ENTRY(__ieee754_atanh)
|
||||
movl 8(%esp), %ecx
|
||||
|
||||
movl %ecx, %eax
|
||||
andl $0x7fffffff, %eax
|
||||
cmpl $0x7ff00000, %eax
|
||||
jae 5f
|
||||
7:
|
||||
|
||||
#ifdef PIC
|
||||
call 1f
|
||||
1: popl %edx
|
||||
@ -98,4 +104,11 @@ ENTRY(__ieee754_atanh)
|
||||
jecxz 3f
|
||||
fchs // 0.5*ln2*ld((1+x)/(1-x))
|
||||
3: ret
|
||||
|
||||
// x == NaN or ±Inf
|
||||
5: ja 6f
|
||||
cmpl $0, 4(%esp)
|
||||
je 7b
|
||||
6: fldl 4(%esp)
|
||||
ret
|
||||
END(__ieee754_atanh)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* ix87 specific implementation of arctanh function.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
@ -51,6 +51,11 @@ ln2_2: .tfloat 0.3465735902799726547086160
|
||||
ENTRY(__ieee754_atanhf)
|
||||
movl 4(%esp), %ecx
|
||||
|
||||
movl %ecx, %eax
|
||||
andl $0x7fffffff, %eax
|
||||
cmpl $0x7f800000, %eax
|
||||
ja 5f
|
||||
|
||||
#ifdef PIC
|
||||
call 1f
|
||||
1: popl %edx
|
||||
@ -99,4 +104,8 @@ ENTRY(__ieee754_atanhf)
|
||||
jecxz 3f
|
||||
fchs // 0.5*ln2*ld((1+x)/(1-x))
|
||||
3: ret
|
||||
|
||||
// x == NaN
|
||||
5: flds 4(%esp)
|
||||
ret
|
||||
END(__ieee754_atanhf)
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* ix87 specific implementation of arctanh function.
|
||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
||||
Copyright (C) 1996, 1999 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||
|
||||
@ -57,6 +57,12 @@ ln2_2: .tfloat 0.3465735902799726547086160
|
||||
ENTRY(__ieee754_atanhl)
|
||||
movl 12(%esp), %ecx
|
||||
|
||||
movl %ecx, %eax
|
||||
andl $0x7fff, %eax
|
||||
cmpl $0x7fff, %eax
|
||||
je 5f
|
||||
7:
|
||||
|
||||
#ifdef PIC
|
||||
call 1f
|
||||
1: popl %edx
|
||||
@ -105,4 +111,12 @@ ENTRY(__ieee754_atanhl)
|
||||
jecxz 3f
|
||||
fchs // 0.5*ln2*ld((1+x)/(1-x))
|
||||
3: ret
|
||||
|
||||
// x == NaN or ±Inf
|
||||
5: cmpl $0x80000000, 8(%esp)
|
||||
ja 6f
|
||||
cmpl $0, 4(%esp)
|
||||
je 7b
|
||||
6: fldt 4(%esp)
|
||||
ret
|
||||
END(__ieee754_atanhl)
|
||||
|
@ -41,8 +41,12 @@ ENTRY(__ieee754_log10)
|
||||
1: popl %edx
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||
#endif
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st // x : x : log10(2)
|
||||
fsubl MO(one) // x-1 : x : log10(2)
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fsubl MO(one) // x-1 : x : log10(2)
|
||||
fld %st // x-1 : x-1 : x : log10(2)
|
||||
fabs // |x-1| : x-1 : x : log10(2)
|
||||
fcompl MO(limit) // x-1 : x : log10(2)
|
||||
@ -56,4 +60,9 @@ ENTRY(__ieee754_log10)
|
||||
2: fstp %st(0) // x : log10(2)
|
||||
fyl2x // log10(x)
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
END (__ieee754_log10)
|
||||
|
@ -42,8 +42,12 @@ ENTRY(__ieee754_log10f)
|
||||
1: popl %edx
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||
#endif
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st // x : x : log10(2)
|
||||
fsubl MO(one) // x-1 : x : log10(2)
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fsubl MO(one) // x-1 : x : log10(2)
|
||||
fld %st // x-1 : x-1 : x : log10(2)
|
||||
fabs // |x-1| : x-1 : x : log10(2)
|
||||
fcompl MO(limit) // x-1 : x : log10(2)
|
||||
@ -57,4 +61,9 @@ ENTRY(__ieee754_log10f)
|
||||
2: fstp %st(0) // x : log10(2)
|
||||
fyl2x // log10(x)
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
END (__ieee754_log10f)
|
||||
|
@ -43,8 +43,12 @@ ENTRY(__ieee754_log10l)
|
||||
1: popl %edx
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||
#endif
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st // x : x : log10(2)
|
||||
fsubl MO(one) // x-1 : x : log10(2)
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fsubl MO(one) // x-1 : x : log10(2)
|
||||
fld %st // x-1 : x-1 : x : log10(2)
|
||||
fabs // |x-1| : x-1 : x : log10(2)
|
||||
fcompl MO(limit) // x-1 : x : log10(2)
|
||||
@ -58,4 +62,9 @@ ENTRY(__ieee754_log10l)
|
||||
2: fstp %st(0) // x : log10(2)
|
||||
fyl2x // log10(x)
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
END(__ieee754_log10l)
|
||||
|
1428
sysdeps/i386/fpu/libm-test-ulps
Normal file
1428
sysdeps/i386/fpu/libm-test-ulps
Normal file
File diff suppressed because it is too large
Load Diff
@ -36,8 +36,12 @@ ENTRY(__log1p)
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||
#endif
|
||||
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st
|
||||
fabs
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fabs
|
||||
#ifdef PIC
|
||||
fcompl limit@GOTOFF(%edx)
|
||||
#else
|
||||
@ -58,5 +62,10 @@ ENTRY(__log1p)
|
||||
2: fyl2xp1
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
|
||||
END (__log1p)
|
||||
weak_alias (__log1p, log1p)
|
||||
|
@ -36,8 +36,12 @@ ENTRY(__log1pf)
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||
#endif
|
||||
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st
|
||||
fabs
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fabs
|
||||
#ifdef PIC
|
||||
fcomps limit@GOTOFF(%edx)
|
||||
#else
|
||||
@ -58,5 +62,10 @@ ENTRY(__log1pf)
|
||||
2: fyl2xp1
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
|
||||
END (__log1pf)
|
||||
weak_alias (__log1pf, log1pf)
|
||||
|
@ -41,7 +41,12 @@ ENTRY(__log1pl)
|
||||
addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx
|
||||
#endif
|
||||
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4:
|
||||
fabs
|
||||
#ifdef PIC
|
||||
fldt limit@GOTOFF(%edx)
|
||||
@ -64,5 +69,10 @@ ENTRY(__log1pl)
|
||||
2: fyl2xp1
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
|
||||
END (__log1pl)
|
||||
weak_alias (__log1pl, log1pl)
|
||||
|
@ -40,8 +40,12 @@ ENTRY(__log2)
|
||||
#endif
|
||||
fldl MO(one)
|
||||
fldl 4(%esp) // x : 1
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st // x : x : 1
|
||||
fsub %st(2), %st // x-1 : x : 1
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fsub %st(2), %st // x-1 : x : 1
|
||||
fld %st // x-1 : x-1 : x : 1
|
||||
fabs // |x-1| : x-1 : x : 1
|
||||
fcompl MO(limit) // x-1 : x : 1
|
||||
@ -55,5 +59,10 @@ ENTRY(__log2)
|
||||
2: fstp %st(0) // x : 1
|
||||
fyl2x // log(x)
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
END (__log2)
|
||||
weak_alias (__log2, log2)
|
||||
|
@ -40,8 +40,12 @@ ENTRY(__log2f)
|
||||
#endif
|
||||
fldl MO(one)
|
||||
flds 4(%esp) // x : 1
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st // x : x : 1
|
||||
fsub %st(2), %st // x-1 : x : 1
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fsub %st(2), %st // x-1 : x : 1
|
||||
fld %st // x-1 : x-1 : x : 1
|
||||
fabs // |x-1| : x-1 : x : 1
|
||||
fcompl MO(limit) // x-1 : x : 1
|
||||
@ -55,5 +59,10 @@ ENTRY(__log2f)
|
||||
2: fstp %st(0) // x : 1
|
||||
fyl2x // log(x)
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
END (__log2f)
|
||||
weak_alias (__log2f, log2f)
|
||||
|
@ -40,8 +40,12 @@ ENTRY(__log2l)
|
||||
#endif
|
||||
fldl MO(one)
|
||||
fldt 4(%esp) // x : 1
|
||||
fxam
|
||||
fnstsw
|
||||
fld %st // x : x : 1
|
||||
fsub %st(2), %st // x-1 : x : 1
|
||||
sahf
|
||||
jc 3f // in case x is NaN or ±Inf
|
||||
4: fsub %st(2), %st // x-1 : x : 1
|
||||
fld %st // x-1 : x-1 : x : 1
|
||||
fabs // |x-1| : x-1 : x : 1
|
||||
fcompl MO(limit) // x-1 : x : 1
|
||||
@ -55,5 +59,10 @@ ENTRY(__log2l)
|
||||
2: fstp %st(0) // x : 1
|
||||
fyl2x // log(x)
|
||||
ret
|
||||
|
||||
3: jp 4b // in case x is ±Inf
|
||||
fstp %st(1)
|
||||
fstp %st(1)
|
||||
ret
|
||||
END (__log2l)
|
||||
weak_alias (__log2l, log2l)
|
||||
|
Loading…
x
Reference in New Issue
Block a user