diff options
| author | Paul E. Murphy <murphyp@linux.vnet.ibm.com> | 2016-06-28 14:28:04 -0500 |
|---|---|---|
| committer | Paul E. Murphy <murphyp@linux.vnet.ibm.com> | 2016-08-29 12:43:38 -0500 |
| commit | feb62ddacb7b1d772d7383de0228a3977f07fc1e (patch) | |
| tree | 963280635eb242a98f191744c196d55fadc2550f /math | |
| parent | 1dbc54f61e281d3f2c1712dadd12864c42f8a64a (diff) | |
| download | glibc-feb62ddacb7b1d772d7383de0228a3977f07fc1e.tar.xz glibc-feb62ddacb7b1d772d7383de0228a3977f07fc1e.zip | |
Convert remaining complex function to generated files
Convert cpow, clog, clog10, cexp, csqrt, and cproj functions
into generated templates. Note, ldbl-opt still retains
s_clog10l.c as the aliasing rules are non-trivial.
Diffstat (limited to 'math')
| -rw-r--r-- | math/Makefile | 5 | ||||
| -rw-r--r-- | math/s_cexp.c | 157 | ||||
| -rw-r--r-- | math/s_cexp_template.c | 64 | ||||
| -rw-r--r-- | math/s_cexpf.c | 155 | ||||
| -rw-r--r-- | math/s_cexpl.c | 153 | ||||
| -rw-r--r-- | math/s_clog.c | 118 | ||||
| -rw-r--r-- | math/s_clog10.c | 124 | ||||
| -rw-r--r-- | math/s_clog10_template.c | 90 | ||||
| -rw-r--r-- | math/s_clog10f.c | 122 | ||||
| -rw-r--r-- | math/s_clog10l.c | 127 | ||||
| -rw-r--r-- | math/s_clog_template.c | 83 | ||||
| -rw-r--r-- | math/s_clogf.c | 116 | ||||
| -rw-r--r-- | math/s_clogl.c | 121 | ||||
| -rw-r--r-- | math/s_cpow.c | 33 | ||||
| -rw-r--r-- | math/s_cpow_template.c | 18 | ||||
| -rw-r--r-- | math/s_cpowf.c | 31 | ||||
| -rw-r--r-- | math/s_cpowl.c | 29 | ||||
| -rw-r--r-- | math/s_cproj.c | 44 | ||||
| -rw-r--r-- | math/s_cproj_template.c | 19 | ||||
| -rw-r--r-- | math/s_cprojf.c | 42 | ||||
| -rw-r--r-- | math/s_cprojl.c | 40 | ||||
| -rw-r--r-- | math/s_csqrt.c | 165 | ||||
| -rw-r--r-- | math/s_csqrt_template.c | 105 | ||||
| -rw-r--r-- | math/s_csqrtf.c | 163 | ||||
| -rw-r--r-- | math/s_csqrtl.c | 161 |
25 files changed, 194 insertions, 2091 deletions
diff --git a/math/Makefile b/math/Makefile index dbc2a179dc..f1b7937c98 100644 --- a/math/Makefile +++ b/math/Makefile @@ -48,7 +48,8 @@ libm-support = s_lib_version s_matherr s_signgam \ gen-libm-calls = cargF conjF cimagF crealF cabsF s_cacosF \ s_cacoshF s_ccosF s_ccoshF s_casinF s_csinF s_casinhF \ k_casinhF s_csinhF k_casinhF s_csinhF s_catanhF s_catanF \ - s_ctanF s_ctanhF + s_ctanF s_ctanhF s_cexpF s_clogF s_cprojF s_csqrtF \ + s_cpowF s_clog10F libm-calls = \ e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \ @@ -66,8 +67,6 @@ libm-calls = \ w_ilogbF \ s_fpclassifyF s_fmaxF s_fminF s_fdimF s_nanF s_truncF \ s_remquoF e_log2F e_exp2F s_roundF s_nearbyintF s_sincosF \ - s_cexpF s_clogF \ - s_csqrtF s_cpowF s_cprojF s_clog10F \ s_fmaF s_lrintF s_llrintF s_lroundF s_llroundF e_exp10F w_log2F \ s_issignalingF $(calls:s_%=m_%) x2y2m1F \ gamma_productF lgamma_negF lgamma_productF \ diff --git a/math/s_cexp.c b/math/s_cexp.c deleted file mode 100644 index 3a476bde3c..0000000000 --- a/math/s_cexp.c +++ /dev/null @@ -1,157 +0,0 @@ -/* Return value of complex exponential function for double complex value. - Copyright (C) 1997-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <complex.h> -#include <fenv.h> -#include <math.h> -#include <math_private.h> -#include <float.h> - -__complex__ double -__cexp (__complex__ double x) -{ - __complex__ double retval; - int rcls = fpclassify (__real__ x); - int icls = fpclassify (__imag__ x); - - if (__glibc_likely (rcls >= FP_ZERO)) - { - /* Real part is finite. */ - if (__glibc_likely (icls >= FP_ZERO)) - { - /* Imaginary part is finite. */ - const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2); - double sinix, cosix; - - if (__glibc_likely (fabs (__imag__ x) > DBL_MIN)) - { - __sincos (__imag__ x, &sinix, &cosix); - } - else - { - sinix = __imag__ x; - cosix = 1.0; - } - - if (__real__ x > t) - { - double exp_t = __ieee754_exp (t); - __real__ x -= t; - sinix *= exp_t; - cosix *= exp_t; - if (__real__ x > t) - { - __real__ x -= t; - sinix *= exp_t; - cosix *= exp_t; - } - } - if (__real__ x > t) - { - /* Overflow (original real part of x > 3t). */ - __real__ retval = DBL_MAX * cosix; - __imag__ retval = DBL_MAX * sinix; - } - else - { - double exp_val = __ieee754_exp (__real__ x); - __real__ retval = exp_val * cosix; - __imag__ retval = exp_val * sinix; - } - math_check_force_underflow_complex (retval); - } - else - { - /* If the imaginary part is +-inf or NaN and the real part - is not +-inf the result is NaN + iNaN. */ - __real__ retval = __nan (""); - __imag__ retval = __nan (""); - - feraiseexcept (FE_INVALID); - } - } - else if (__glibc_likely (rcls == FP_INFINITE)) - { - /* Real part is infinite. */ - if (__glibc_likely (icls >= FP_ZERO)) - { - /* Imaginary part is finite. */ - double value = signbit (__real__ x) ? 0.0 : HUGE_VAL; - - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = value; - __imag__ retval = __imag__ x; - } - else - { - double sinix, cosix; - - if (__glibc_likely (fabs (__imag__ x) > DBL_MIN)) - { - __sincos (__imag__ x, &sinix, &cosix); - } - else - { - sinix = __imag__ x; - cosix = 1.0; - } - - __real__ retval = __copysign (value, cosix); - __imag__ retval = __copysign (value, sinix); - } - } - else if (signbit (__real__ x) == 0) - { - __real__ retval = HUGE_VAL; - __imag__ retval = __nan (""); - - if (icls == FP_INFINITE) - feraiseexcept (FE_INVALID); - } - else - { - __real__ retval = 0.0; - __imag__ retval = __copysign (0.0, __imag__ x); - } - } - else - { - /* If the real part is NaN the result is NaN + iNaN unless the - imaginary part is zero. */ - __real__ retval = __nan (""); - if (icls == FP_ZERO) - __imag__ retval = __imag__ x; - else - { - __imag__ retval = __nan (""); - - if (rcls != FP_NAN || icls != FP_NAN) - feraiseexcept (FE_INVALID); - } - } - - return retval; -} -weak_alias (__cexp, cexp) -#ifdef NO_LONG_DOUBLE -strong_alias (__cexp, __cexpl) -weak_alias (__cexp, cexpl) -#endif diff --git a/math/s_cexp_template.c b/math/s_cexp_template.c index 3a476bde3c..a60afe0cac 100644 --- a/math/s_cexp_template.c +++ b/math/s_cexp_template.c @@ -1,4 +1,4 @@ -/* Return value of complex exponential function for double complex value. +/* Return value of complex exponential function for a float type. Copyright (C) 1997-2016 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -23,10 +23,10 @@ #include <math_private.h> #include <float.h> -__complex__ double -__cexp (__complex__ double x) +CFLOAT +M_DECL_FUNC (__cexp) (CFLOAT x) { - __complex__ double retval; + CFLOAT retval; int rcls = fpclassify (__real__ x); int icls = fpclassify (__imag__ x); @@ -36,22 +36,22 @@ __cexp (__complex__ double x) if (__glibc_likely (icls >= FP_ZERO)) { /* Imaginary part is finite. */ - const int t = (int) ((DBL_MAX_EXP - 1) * M_LN2); - double sinix, cosix; + const int t = (int) ((M_MAX_EXP - 1) * M_MLIT (M_LN2)); + FLOAT sinix, cosix; - if (__glibc_likely (fabs (__imag__ x) > DBL_MIN)) + if (__glibc_likely (M_FABS (__imag__ x) > M_MIN)) { - __sincos (__imag__ x, &sinix, &cosix); + M_SINCOS (__imag__ x, &sinix, &cosix); } else { sinix = __imag__ x; - cosix = 1.0; + cosix = 1; } if (__real__ x > t) { - double exp_t = __ieee754_exp (t); + FLOAT exp_t = M_EXP (t); __real__ x -= t; sinix *= exp_t; cosix *= exp_t; @@ -65,12 +65,12 @@ __cexp (__complex__ double x) if (__real__ x > t) { /* Overflow (original real part of x > 3t). */ - __real__ retval = DBL_MAX * cosix; - __imag__ retval = DBL_MAX * sinix; + __real__ retval = M_MAX * cosix; + __imag__ retval = M_MAX * sinix; } else { - double exp_val = __ieee754_exp (__real__ x); + FLOAT exp_val = M_EXP (__real__ x); __real__ retval = exp_val * cosix; __imag__ retval = exp_val * sinix; } @@ -80,8 +80,8 @@ __cexp (__complex__ double x) { /* If the imaginary part is +-inf or NaN and the real part is not +-inf the result is NaN + iNaN. */ - __real__ retval = __nan (""); - __imag__ retval = __nan (""); + __real__ retval = M_NAN; + __imag__ retval = M_NAN; feraiseexcept (FE_INVALID); } @@ -92,7 +92,7 @@ __cexp (__complex__ double x) if (__glibc_likely (icls >= FP_ZERO)) { /* Imaginary part is finite. */ - double value = signbit (__real__ x) ? 0.0 : HUGE_VAL; + FLOAT value = signbit (__real__ x) ? 0 : M_HUGE_VAL; if (icls == FP_ZERO) { @@ -102,46 +102,46 @@ __cexp (__complex__ double x) } else { - double sinix, cosix; + FLOAT sinix, cosix; - if (__glibc_likely (fabs (__imag__ x) > DBL_MIN)) + if (__glibc_likely (M_FABS (__imag__ x) > M_MIN)) { - __sincos (__imag__ x, &sinix, &cosix); + M_SINCOS (__imag__ x, &sinix, &cosix); } else { sinix = __imag__ x; - cosix = 1.0; + cosix = 1; } - __real__ retval = __copysign (value, cosix); - __imag__ retval = __copysign (value, sinix); + __real__ retval = M_COPYSIGN (value, cosix); + __imag__ retval = M_COPYSIGN (value, sinix); } } else if (signbit (__real__ x) == 0) { - __real__ retval = HUGE_VAL; - __imag__ retval = __nan (""); + __real__ retval = M_HUGE_VAL; + __imag__ retval = M_NAN; if (icls == FP_INFINITE) feraiseexcept (FE_INVALID); } else { - __real__ retval = 0.0; - __imag__ retval = __copysign (0.0, __imag__ x); + __real__ retval = 0; + __imag__ retval = M_COPYSIGN (0, __imag__ x); } } else { /* If the real part is NaN the result is NaN + iNaN unless the imaginary part is zero. */ - __real__ retval = __nan (""); + __real__ retval = M_NAN; if (icls == FP_ZERO) __imag__ retval = __imag__ x; else { - __imag__ retval = __nan (""); + __imag__ retval = M_NAN; if (rcls != FP_NAN || icls != FP_NAN) feraiseexcept (FE_INVALID); @@ -150,8 +150,8 @@ __cexp (__complex__ double x) return retval; } -weak_alias (__cexp, cexp) -#ifdef NO_LONG_DOUBLE -strong_alias (__cexp, __cexpl) -weak_alias (__cexp, cexpl) +declare_mgen_alias (__cexp, cexp) + +#if M_LIBM_NEED_COMPAT (cexp) +declare_mgen_libm_compat (__cexp, cexp) #endif diff --git a/math/s_cexpf.c b/math/s_cexpf.c deleted file mode 100644 index 001fec2492..0000000000 --- a/math/s_cexpf.c +++ /dev/null @@ -1,155 +0,0 @@ -/* Return value of complex exponential function for float complex value. - Copyright (C) 1997-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <complex.h> -#include <fenv.h> -#include <math.h> -#include <math_private.h> -#include <float.h> - -__complex__ float -__cexpf (__complex__ float x) -{ - __complex__ float retval; - int rcls = fpclassify (__real__ x); - int icls = fpclassify (__imag__ x); - - if (__glibc_likely (rcls >= FP_ZERO)) - { - /* Real part is finite. */ - if (__glibc_likely (icls >= FP_ZERO)) - { - /* Imaginary part is finite. */ - const int t = (int) ((FLT_MAX_EXP - 1) * M_LN2); - float sinix, cosix; - - if (__glibc_likely (fabsf (__imag__ x) > FLT_MIN)) - { - __sincosf (__imag__ x, &sinix, &cosix); - } - else - { - sinix = __imag__ x; - cosix = 1.0f; - } - - if (__real__ x > t) - { - float exp_t = __ieee754_expf (t); - __real__ x -= t; - sinix *= exp_t; - cosix *= exp_t; - if (__real__ x > t) - { - __real__ x -= t; - sinix *= exp_t; - cosix *= exp_t; - } - } - if (__real__ x > t) - { - /* Overflow (original real part of x > 3t). */ - __real__ retval = FLT_MAX * cosix; - __imag__ retval = FLT_MAX * sinix; - } - else - { - float exp_val = __ieee754_expf (__real__ x); - __real__ retval = exp_val * cosix; - __imag__ retval = exp_val * sinix; - } - math_check_force_underflow_complex (retval); - } - else - { - /* If the imaginary part is +-inf or NaN and the real part - is not +-inf the result is NaN + iNaN. */ - __real__ retval = __nanf (""); - __imag__ retval = __nanf (""); - - feraiseexcept (FE_INVALID); - } - } - else if (__glibc_likely (rcls == FP_INFINITE)) - { - /* Real part is infinite. */ - if (__glibc_likely (icls >= FP_ZERO)) - { - /* Imaginary part is finite. */ - float value = signbit (__real__ x) ? 0.0 : HUGE_VALF; - - if (icls == FP_ZERO) - { - /* Imaginary part is 0.0. */ - __real__ retval = value; - __imag__ retval = __imag__ x; - } - else - { - float sinix, cosix; - - if (__glibc_likely (fabsf (__imag__ x) > FLT_MIN)) - { - __sincosf (__imag__ x, &sinix, &cosix); - } - else - { - sinix = __imag__ x; - cosix = 1.0f; - } - - __real__ retval = __copysignf (value, cosix); - __imag__ retval = __copysignf (value, sinix); - } - } - else if (signbit (__real__ x) == 0) - { - __real__ retval = HUGE_VALF; - __imag__ retval = __nanf (""); - - if (icls == FP_INFINITE) - feraiseexcept (FE_INVALID); - } - else - { - __real__ retval = 0.0; - __imag__ retval = __copysignf (0.0, __imag__ x); - } - } - else - { - /* If the real part is NaN the result is NaN + iNaN unless the - imaginary part is zero. */ - __real__ retval = __nanf (""); - if (icls == FP_ZERO) - __imag__ retval = __imag__ x; - else - { - __imag__ retval = __nanf (""); - - if (rcls != FP_NAN || icls != FP_NAN) - feraiseexcept (FE_INVALID); - } - } - - return retval; -} -#ifndef __cexpf -weak_alias (__cexpf, cexpf) -#endif diff --git a/math/s_cexpl.c b/math/s_cexpl.c deleted file mode 100644 index 9ab566c0c1..0000000000 --- a/math/s_cexpl.c +++ /dev/null @@ -1,153 +0,0 @@ -/* Return value of complex exponential function for long double complex value. - Copyright (C) 1997-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <complex.h> -#include <fenv.h> -#include <math.h> -#include <math_private.h> -#include <float.h> - -__complex__ long double -__cexpl (__complex__ long double x) -{ - __complex__ long double retval; - int rcls = fpclassify (__real__ x); - int icls = fpclassify (__imag__ x); - - if (__glibc_likely (rcls >= FP_ZERO)) - { - /* Real part is finite. */ - if (__glibc_likely (icls >= FP_ZERO)) - { - /* Imaginary part is finite. */ - const int t = (int) ((LDBL_MAX_EXP - 1) * M_LN2l); - long double sinix, cosix; - - if (__glibc_likely (fabsl (__imag__ x) > LDBL_MIN)) - { - __sincosl (__imag__ x, &sinix, &cosix); - } - else - { - sinix = __imag__ x; - cosix = 1.0; - } - - if (__real__ x > t) - { - long double exp_t = __ieee754_expl (t); - __real__ x -= t; - sinix *= exp_t; - cosix *= exp_t; - if (__real__ x > t) - { - __real__ x -= t; - sinix *= exp_t; - cosix *= exp_t; - } - } - if (__real__ x > t) - { - /* Overflow (original real part of x > 3t). */ - |
