From bc62c2fb152d6ffec63975d88fd8f1bc3d3b7c01 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sat, 22 Oct 2011 00:32:39 -0400 Subject: [PATCH] Optimization to some complex math functions Also, change last reference to __sqrt into __sqrt to easily. --- ChangeLog | 26 ++++++++++++++++ math/math_private.h | 7 +++++ math/s_cacosh.c | 3 +- math/s_cacoshl.c | 3 +- math/s_casinh.c | 3 +- math/s_casinhf.c | 3 +- math/s_casinhl.c | 3 +- math/s_ccos.c | 48 +++--------------------------- math/s_ccosf.c | 48 +++--------------------------- math/s_ccosh.c | 24 +++++++-------- math/s_ccoshf.c | 24 +++++++-------- math/s_ccoshl.c | 26 +++++++--------- math/s_ccosl.c | 48 +++--------------------------- math/s_csin.c | 12 ++------ math/s_csinf.c | 12 ++------ math/s_csinh.c | 26 +++++++--------- math/s_csinhf.c | 26 +++++++--------- math/s_csinhl.c | 26 +++++++--------- math/s_csinl.c | 12 ++------ math/s_ctan.c | 4 +-- sysdeps/ieee754/dbl-64/e_acosh.c | 2 +- sysdeps/ieee754/flt-32/e_acoshf.c | 2 +- sysdeps/ieee754/ldbl-96/e_acoshl.c | 2 +- 23 files changed, 132 insertions(+), 258 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2a15d9c19a..adc9025a84 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2011-10-22 Ulrich Drepper + + * math/math_private.h: Define __nan, __nanf, __nanl. + * math/s_cacosh.c: Include . + * math/s_cacoshl.c: Likewise. + * math/s_casinh.c: Likewise. + * math/s_casinhf.c: Likewise. + * math/s_casinhl.c: Likewise. + * math/s_ccos.c: Rely entire on ccosh. + * math/s_ccosf.c: Rely entire on ccoshf. + * math/s_ccosl.c: Rely entirely on ccoshl. + * math/s_ccosh.c: Add branch predicion helpers. Add branch prediction. + Remove tests for FE_INVALID. + * math/s_ccoshf.c: Likewise. + * math/s_ccoshl.c: Likewise. + * math/s_csin.c: Likewise. + * math/s_csinf.c: Likewise. + * math/s_csinh.c Likewise. + * math/s_csinhf.c: Likewise. + * math/s_csinhl.c: Likewise. + * math/s_csinl.c: Likewise. + * math/s_ctan.c: Likewise. + * sysdeps/ieee754/dbl-64/e_acosh.c: Use __ieee754_sqrt. + * sysdeps/ieee754/flt-32/e_acoshf.c: Use __ieee754_sqrtf. + * sysdeps/ieee754/ldbl-96/e_acoshl.c: Use __ieee754_sqrtl. + 2011-10-21 Ulrich Drepper * sysdeps/x86_64/multiarch/init-arch.c (__init_cpu_features): Fix diff --git a/math/math_private.h b/math/math_private.h index db733c8ac7..4cb81ea418 100644 --- a/math/math_private.h +++ b/math/math_private.h @@ -395,4 +395,11 @@ extern void __docos (double __x, double __dx, double __v[]); #define libc_feupdateenvf(e) (void) feupdateenv (e) #define libc_feupdateenvl(e) (void) feupdateenv (e) +#define __nan(str) \ + (__builtin_constant_p (str) && str[0] == '\0' ? NAN : __nan (str)) +#define __nanf(str) \ + (__builtin_constant_p (str) && str[0] == '\0' ? NAN : __nan (str)) +#define __nanl(str) \ + (__builtin_constant_p (str) && str[0] == '\0' ? NAN : __nan (str)) + #endif /* _MATH_PRIVATE_H_ */ diff --git a/math/s_cacosh.c b/math/s_cacosh.c index ada7ca5af6..bec6d3827e 100644 --- a/math/s_cacosh.c +++ b/math/s_cacosh.c @@ -1,5 +1,5 @@ /* Return arc hyperbole cosine for double value. - Copyright (C) 1997, 2006 Free Software Foundation, Inc. + Copyright (C) 1997, 2006, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -20,6 +20,7 @@ #include #include +#include __complex__ double diff --git a/math/s_cacoshl.c b/math/s_cacoshl.c index da23c8d8aa..36f7a5f70e 100644 --- a/math/s_cacoshl.c +++ b/math/s_cacoshl.c @@ -1,5 +1,5 @@ /* Return arc hyperbole cosine for long double value. - Copyright (C) 1997, 1998, 2006 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2006, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -20,6 +20,7 @@ #include #include +#include __complex__ long double diff --git a/math/s_casinh.c b/math/s_casinh.c index a574add70e..db340ac1b1 100644 --- a/math/s_casinh.c +++ b/math/s_casinh.c @@ -1,5 +1,5 @@ /* Return arc hyperbole sine for double value. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -20,6 +20,7 @@ #include #include +#include __complex__ double diff --git a/math/s_casinhf.c b/math/s_casinhf.c index 7037ab937c..f545d8e2ee 100644 --- a/math/s_casinhf.c +++ b/math/s_casinhf.c @@ -1,5 +1,5 @@ /* Return arc hyperbole sine for float value. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -20,6 +20,7 @@ #include #include +#include __complex__ float diff --git a/math/s_casinhl.c b/math/s_casinhl.c index 376b2347a0..b8e3918290 100644 --- a/math/s_casinhl.c +++ b/math/s_casinhl.c @@ -1,5 +1,5 @@ /* Return arc hyperbole sine for long double value. - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -20,6 +20,7 @@ #include #include +#include __complex__ long double diff --git a/math/s_ccos.c b/math/s_ccos.c index 63851aab54..4612eb33c3 100644 --- a/math/s_ccos.c +++ b/math/s_ccos.c @@ -27,52 +27,12 @@ __complex__ double __ccos (__complex__ double x) { - __complex__ double res; + __complex__ double y; - if (!isfinite (__real__ x) || __isnan (__imag__ x)) - { - if (__real__ x == 0.0 || __imag__ x == 0.0) - { - __real__ res = __nan (""); - __imag__ res = 0.0; + __real__ y = -__imag__ x; + __imag__ y = __real__ x; -#ifdef FE_INVALID - if (__isinf_ns (__real__ x)) - feraiseexcept (FE_INVALID); -#endif - } - else if (__isinf_ns (__imag__ x)) - { - __real__ res = HUGE_VAL; - __imag__ res = __nan (""); - -#ifdef FE_INVALID - if (__isinf_ns (__real__ x)) - feraiseexcept (FE_INVALID); -#endif - } - else - { - __real__ res = __nan (""); - __imag__ res = __nan (""); - -#ifdef FE_INVALID - if (isfinite (__imag__ x)) - feraiseexcept (FE_INVALID); -#endif - } - } - else - { - __complex__ double y; - - __real__ y = -__imag__ x; - __imag__ y = __real__ x; - - res = __ccosh (y); - } - - return res; + return __ccosh (y); } weak_alias (__ccos, ccos) #ifdef NO_LONG_DOUBLE diff --git a/math/s_ccosf.c b/math/s_ccosf.c index f0e9c2ac9e..1ee932486b 100644 --- a/math/s_ccosf.c +++ b/math/s_ccosf.c @@ -27,52 +27,12 @@ __complex__ float __ccosf (__complex__ float x) { - __complex__ float res; + __complex__ float y; - if (!isfinite (__real__ x) || __isnanf (__imag__ x)) - { - if (__real__ x == 0.0 || __imag__ x == 0.0) - { - __real__ res = __nanf (""); - __imag__ res = 0.0; + __real__ y = -__imag__ x; + __imag__ y = __real__ x; -#ifdef FE_INVALID - if (__isinf_nsf (__real__ x)) - feraiseexcept (FE_INVALID); -#endif - } - else if (__isinf_nsf (__imag__ x)) - { - __real__ res = HUGE_VALF; - __imag__ res = __nanf (""); - -#ifdef FE_INVALID - if (__isinf_nsf (__real__ x)) - feraiseexcept (FE_INVALID); -#endif - } - else - { - __real__ res = __nanf (""); - __imag__ res = __nanf (""); - -#ifdef FE_INVALID - if (isfinite (__imag__ x)) - feraiseexcept (FE_INVALID); -#endif - } - } - else - { - __complex__ float y; - - __real__ y = -__imag__ x; - __imag__ y = __real__ x; - - res = __ccoshf (y); - } - - return res; + return __ccoshf (y); } #ifndef __ccosf weak_alias (__ccosf, ccosf) diff --git a/math/s_ccosh.c b/math/s_ccosh.c index 83aa025d42..c10e5d899f 100644 --- a/math/s_ccosh.c +++ b/math/s_ccosh.c @@ -1,5 +1,5 @@ /* Complex cosine hyperbole function for double. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -32,10 +32,10 @@ __ccosh (__complex__ double x) int rcls = fpclassify (__real__ x); int icls = fpclassify (__imag__ x); - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ double sinh_val = __ieee754_sinh (__real__ x); @@ -52,22 +52,14 @@ __ccosh (__complex__ double x) __imag__ retval = __real__ x == 0.0 ? 0.0 : __nan (""); __real__ retval = __nan ("") + __nan (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } else if (rcls == FP_INFINITE) { /* Real part is infinite. */ - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = HUGE_VAL; - __imag__ retval = __imag__ x * __copysign (1.0, __real__ x); - } - else if (icls > FP_ZERO) + if (__builtin_expect (icls > FP_ZERO, 1)) { /* Imaginary part is finite. */ double sinix, cosix; @@ -78,16 +70,20 @@ __ccosh (__complex__ double x) __imag__ retval = (__copysign (HUGE_VAL, sinix) * __copysign (1.0, __real__ x)); } + else if (icls == FP_ZERO) + { + /* Imaginary part is 0.0. */ + __real__ retval = HUGE_VAL; + __imag__ retval = __imag__ x * __copysign (1.0, __real__ x); + } else { /* The addition raises the invalid exception. */ __real__ retval = HUGE_VAL; __imag__ retval = __nan ("") + __nan (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } else diff --git a/math/s_ccoshf.c b/math/s_ccoshf.c index b9b2f3346f..6aae5d854b 100644 --- a/math/s_ccoshf.c +++ b/math/s_ccoshf.c @@ -1,5 +1,5 @@ /* Complex cosine hyperbole function for float. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -32,10 +32,10 @@ __ccoshf (__complex__ float x) int rcls = fpclassify (__real__ x); int icls = fpclassify (__imag__ x); - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ float sinh_val = __ieee754_sinhf (__real__ x); @@ -52,22 +52,14 @@ __ccoshf (__complex__ float x) __imag__ retval = __real__ x == 0.0 ? 0.0 : __nanf (""); __real__ retval = __nanf (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } - else if (rcls == FP_INFINITE) + else if (__builtin_expect (rcls == FP_INFINITE, 1)) { /* Real part is infinite. */ - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = HUGE_VALF; - __imag__ retval = __imag__ x * __copysignf (1.0, __real__ x); - } - else if (icls > FP_ZERO) + if (__builtin_expect (icls > FP_ZERO, 1)) { /* Imaginary part is finite. */ float sinix, cosix; @@ -78,6 +70,12 @@ __ccoshf (__complex__ float x) __imag__ retval = (__copysignf (HUGE_VALF, sinix) * __copysignf (1.0, __real__ x)); } + else if (icls == FP_ZERO) + { + /* Imaginary part is 0.0. */ + __real__ retval = HUGE_VALF; + __imag__ retval = __imag__ x * __copysignf (1.0, __real__ x); + } else { /* The addition raises the invalid exception. */ diff --git a/math/s_ccoshl.c b/math/s_ccoshl.c index 1913bb6ee4..ed1bc459df 100644 --- a/math/s_ccoshl.c +++ b/math/s_ccoshl.c @@ -1,5 +1,5 @@ /* Complex cosine hyperbole function for long double. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -32,10 +32,10 @@ __ccoshl (__complex__ long double x) int rcls = fpclassify (__real__ x); int icls = fpclassify (__imag__ x); - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ long double sinh_val = __ieee754_sinhl (__real__ x); @@ -52,22 +52,14 @@ __ccoshl (__complex__ long double x) __imag__ retval = __real__ x == 0.0 ? 0.0 : __nanl (""); __real__ retval = __nanl ("") + __nanl (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } - else if (rcls == FP_INFINITE) + else if (__builtin_expect (rcls == FP_INFINITE, 1)) { /* Real part is infinite. */ - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = HUGE_VALL; - __imag__ retval = __imag__ x * __copysignl (1.0, __real__ x); - } - else if (icls > FP_ZERO) + if (__builtin_expect (icls > FP_ZERO, 1)) { /* Imaginary part is finite. */ long double sinix, cosix; @@ -78,16 +70,20 @@ __ccoshl (__complex__ long double x) __imag__ retval = (__copysignl (HUGE_VALL, sinix) * __copysignl (1.0, __real__ x)); } + else if (icls == FP_ZERO) + { + /* Imaginary part is 0.0. */ + __real__ retval = HUGE_VALL; + __imag__ retval = __imag__ x * __copysignl (1.0, __real__ x); + } else { /* The addition raises the invalid exception. */ __real__ retval = HUGE_VALL; __imag__ retval = __nanl ("") + __nanl (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } else diff --git a/math/s_ccosl.c b/math/s_ccosl.c index 9902a02edd..153a60b08b 100644 --- a/math/s_ccosl.c +++ b/math/s_ccosl.c @@ -27,51 +27,11 @@ __complex__ long double __ccosl (__complex__ long double x) { - __complex__ long double res; + __complex__ long double y; - if (!isfinite (__real__ x) || __isnanl (__imag__ x)) - { - if (__real__ x == 0.0 || __imag__ x == 0.0) - { - __real__ res = __nanl (""); - __imag__ res = 0.0; + __real__ y = -__imag__ x; + __imag__ y = __real__ x; -#ifdef FE_INVALID - if (__isinf_nsl (__real__ x)) - feraiseexcept (FE_INVALID); -#endif - } - else if (__isinf_nsl (__imag__ x)) - { - __real__ res = HUGE_VALL; - __imag__ res = __nanl (""); - -#ifdef FE_INVALID - if (__isinf_nsl (__real__ x)) - feraiseexcept (FE_INVALID); -#endif - } - else - { - __real__ res = __nanl (""); - __imag__ res = __nanl (""); - -#ifdef FE_INVALID - if (isfinite (__imag__ x)) - feraiseexcept (FE_INVALID); -#endif - } - } - else - { - __complex__ long double y; - - __real__ y = -__imag__ x; - __imag__ y = __real__ x; - - res = __ccoshl (y); - } - - return res; + return __ccoshl (y); } weak_alias (__ccosl, ccosl) diff --git a/math/s_csin.c b/math/s_csin.c index 0d4441ca2b..07a78c4384 100644 --- a/math/s_csin.c +++ b/math/s_csin.c @@ -1,5 +1,5 @@ /* Complex sine function for double. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -35,10 +35,10 @@ __csin (__complex__ double x) __real__ x = fabs (__real__ x); - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ double sinh_val = __ieee754_sinh (__imag__ x); @@ -61,19 +61,15 @@ __csin (__complex__ double x) __real__ retval = __nan (""); __imag__ retval = __imag__ x; -#ifdef FE_INVALID if (rcls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } else { __real__ retval = __nan (""); __imag__ retval = __nan (""); -#ifdef FE_INVALID feraiseexcept (FE_INVALID); -#endif } } } @@ -107,10 +103,8 @@ __csin (__complex__ double x) __real__ retval = __nan (""); __imag__ retval = HUGE_VAL; -#ifdef FE_INVALID if (rcls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } else diff --git a/math/s_csinf.c b/math/s_csinf.c index 61786ba6c8..4f4dfb8ea2 100644 --- a/math/s_csinf.c +++ b/math/s_csinf.c @@ -1,5 +1,5 @@ /* Complex sine function for float. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -35,10 +35,10 @@ __csinf (__complex__ float x) __real__ x = fabsf (__real__ x); - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ float sinh_val = __ieee754_sinhf (__imag__ x); @@ -61,19 +61,15 @@ __csinf (__complex__ float x) __real__ retval = __nanf (""); __imag__ retval = __imag__ x; -#ifdef FE_INVALID if (rcls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } else { __real__ retval = __nanf (""); __imag__ retval = __nanf (""); -#ifdef FE_INVALID feraiseexcept (FE_INVALID); -#endif } } } @@ -107,10 +103,8 @@ __csinf (__complex__ float x) __real__ retval = __nanf (""); __imag__ retval = HUGE_VALF; -#ifdef FE_INVALID if (rcls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } else diff --git a/math/s_csinh.c b/math/s_csinh.c index 138d80505e..2eec065a8f 100644 --- a/math/s_csinh.c +++ b/math/s_csinh.c @@ -1,5 +1,5 @@ /* Complex sine hyperbole function for double. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -35,10 +35,10 @@ __csinh (__complex__ double x) __real__ x = fabs (__real__ x); - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ double sinh_val = __ieee754_sinh (__real__ x); @@ -61,32 +61,22 @@ __csinh (__complex__ double x) __real__ retval = __copysign (0.0, negate ? -1.0 : 1.0); __imag__ retval = __nan ("") + __nan (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } else { __real__ retval = __nan (""); __imag__ retval = __nan (""); -#ifdef FE_INVALID feraiseexcept (FE_INVALID); -#endif } } } else if (rcls == FP_INFINITE) { /* Real part is infinite. */ - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = negate ? -HUGE_VAL : HUGE_VAL; - __imag__ retval = __imag__ x; - } - else if (icls > FP_ZERO) + if (__builtin_expect (icls > FP_ZERO, 1)) { /* Imaginary part is finite. */ double sinix, cosix; @@ -99,16 +89,20 @@ __csinh (__complex__ double x) if (negate) __real__ retval = -__real__ retval; } + else if (icls == FP_ZERO) + { + /* Imaginary part is 0.0. */ + __real__ retval = negate ? -HUGE_VAL : HUGE_VAL; + __imag__ retval = __imag__ x; + } else { /* The addition raises the invalid exception. */ __real__ retval = HUGE_VAL; __imag__ retval = __nan ("") + __nan (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } else diff --git a/math/s_csinhf.c b/math/s_csinhf.c index 3440516529..51e837b14f 100644 --- a/math/s_csinhf.c +++ b/math/s_csinhf.c @@ -1,5 +1,5 @@ /* Complex sine hyperbole function for float. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -35,10 +35,10 @@ __csinhf (__complex__ float x) __real__ x = fabsf (__real__ x); - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ float sinh_val = __ieee754_sinhf (__real__ x); @@ -61,32 +61,22 @@ __csinhf (__complex__ float x) __real__ retval = __copysignf (0.0, negate ? -1.0 : 1.0); __imag__ retval = __nanf ("") + __nanf (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } else { __real__ retval = __nanf (""); __imag__ retval = __nanf (""); -#ifdef FE_INVALID feraiseexcept (FE_INVALID); -#endif } } } - else if (rcls == FP_INFINITE) + else if (__builtin_expect (rcls == FP_INFINITE, 1)) { /* Real part is infinite. */ - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = negate ? -HUGE_VALF : HUGE_VALF; - __imag__ retval = __imag__ x; - } - else if (icls > FP_ZERO) + if (__builtin_expect (icls > FP_ZERO, 1)) { /* Imaginary part is finite. */ float sinix, cosix; @@ -99,6 +89,12 @@ __csinhf (__complex__ float x) if (negate) __real__ retval = -__real__ retval; } + else if (icls == FP_ZERO) + { + /* Imaginary part is 0.0. */ + __real__ retval = negate ? -HUGE_VALF : HUGE_VALF; + __imag__ retval = __imag__ x; + } else { /* The addition raises the invalid exception. */ diff --git a/math/s_csinhl.c b/math/s_csinhl.c index db1b47b301..d2964f8a2b 100644 --- a/math/s_csinhl.c +++ b/math/s_csinhl.c @@ -1,5 +1,5 @@ /* Complex sine hyperbole function for long double. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -35,10 +35,10 @@ __csinhl (__complex__ long double x) __real__ x = fabsl (__real__ x); - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ long double sinh_val = __ieee754_sinhl (__real__ x); @@ -61,32 +61,22 @@ __csinhl (__complex__ long double x) __real__ retval = __copysignl (0.0, negate ? -1.0 : 1.0); __imag__ retval = __nanl ("") + __nanl (""); -#ifdef FE_INVALID if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } else { __real__ retval = __nanl (""); __imag__ retval = __nanl (""); -#ifdef FE_INVALID feraiseexcept (FE_INVALID); -#endif } } } - else if (rcls == FP_INFINITE) + else if (__builtin_expect (rcls == FP_INFINITE, 1)) { /* Real part is infinite. */ - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = negate ? -HUGE_VALL : HUGE_VALL; - __imag__ retval = __imag__ x; - } - else if (icls > FP_ZERO) + if (__builtin_expect (icls > FP_ZERO, 1)) { /* Imaginary part is finite. */ long double sinix, cosix; @@ -99,6 +89,12 @@ __csinhl (__complex__ long double x) if (negate) __real__ retval = -__real__ retval; } + else if (icls == FP_ZERO) + { + /* Imaginary part is 0.0. */ + __real__ retval = negate ? -HUGE_VALL : HUGE_VALL; + __imag__ retval = __imag__ x; + } else { /* The addition raises the invalid exception. */ diff --git a/math/s_csinl.c b/math/s_csinl.c index 5e477eb7f9..300035c699 100644 --- a/math/s_csinl.c +++ b/math/s_csinl.c @@ -1,5 +1,5 @@ /* Complex sine function for long double. - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. @@ -35,10 +35,10 @@ __csinl (__complex__ long double x) __real__ x = fabsl (__real__ x); - if (icls >= FP_ZERO) + if (__builtin_expect (icls >= FP_ZERO, 1)) { /* Imaginary part is finite. */ - if (rcls >= FP_ZERO) + if (__builtin_expect (rcls >= FP_ZERO, 1)) { /* Real part is finite. */ long double sinh_val = __ieee754_sinhl (__imag__ x); @@ -61,19 +61,15 @@ __csinl (__complex__ long double x) __real__ retval = __nanl (""); __imag__ retval = __imag__ x; -#ifdef FE_INVALID if (rcls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } else { __real__ retval = __nanl (""); __imag__ retval = __nanl (""); -#ifdef FE_INVALID feraiseexcept (FE_INVALID); -#endif } } } @@ -107,10 +103,8 @@ __csinl (__complex__ long double x) __real__ retval = __nanl (""); __imag__ retval = HUGE_VALL; -#ifdef FE_INVALID if (rcls == FP_INFINITE) feraiseexcept (FE_INVALID); -#endif } } else diff --git a/math/s_ctan.c b/math/s_ctan.c index 0dd211e907..41958516f1 100644 --- a/math/s_ctan.c +++ b/math/s_ctan.c @@ -30,7 +30,7 @@ __ctan (__complex__ double x) { __complex__ double res; - if (!isfinite (__real__ x) || !isfinite (__imag__ x)) + if (__builtin_expect (!isfinite (__real__ x) || !isfinite (__imag__ x), 0)) { if (__isinf_ns (__imag__ x)) { @@ -46,10 +46,8 @@ __ctan (__complex__ double x) __real__ res = __nan (""); __imag__ res = __nan (""); -#ifdef FE_INVALID if (__isinf_ns (__real__ x)) feraiseexcept (FE_INVALID); -#endif } } else diff --git a/sysdeps/ieee754/dbl-64/e_acosh.c b/sysdeps/ieee754/dbl-64/e_acosh.c index f474e9ab5c..6ef10cb84b 100644 --- a/sysdeps/ieee754/dbl-64/e_acosh.c +++ b/sysdeps/ieee754/dbl-64/e_acosh.c @@ -52,7 +52,7 @@ __ieee754_acosh(double x) return __ieee754_log(2.0*x-one/(x+__ieee754_sqrt(t-one))); } else { /* 1