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 | |
| 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.
47 files changed, 332 insertions, 2206 deletions
@@ -1,5 +1,63 @@ 2016-08-29 Paul E. Murphy <murphyp@linux.vnet.ibm.com> + * math/Makefile (libm-gen-calls): Add cpow, clog, clog10, cexp, cproj. + (libm-calls): Remove the above. + + * math/s_cexp_template.c: Update using type-generic macros. + * math/s_clog10_template.c: Likewise. + * math/s_cpow_template.c: Likewise. + * math/s_clog_template.c: Likewise. + * math/s_cproj_template.c: Likewise. + * math/s_csqrt_template.c: Likewise. + + * math/s_cexp.c: Removed. + * math/s_cexpf.c: Removed. + * math/s_cexpl.c: Removed. + * math/s_clog10.c: Removed. + * math/s_clog10f.c: Removed. + * math/s_clog10l.c: Removed. + * math/s_cpow.c: Removed. + * math/s_cpowf.c: Removed. + * math/s_cpowl.c: Removed. + * math/s_clog.c: Removed. + * math/s_clogf.c: Removed. + * math/s_clogl.c: Removed. + * math/s_cproj.c: Removed. + * math/s_cprojf.c: Removed. + * math/s_cprojl.c: Removed. + * math/s_csqrt.c: Removed. + * math/s_csqrtf.c: Removed. + * math/s_csqrtl.c: Removed. + + * sysdeps/alpha/fpu/s_cexpf.c: Update using templated version. + * sysdeps/alpha/fpu/s_clog10f.c: Update using templated version. + * sysdeps/alpha/fpu/s_clogf.c: Update using templated version. + * sysdeps/alpha/fpu/s_cpowf.c: Update using templated version. + * sysdeps/alpha/fpu/s_cprojf.c: Update using templated version. + * sysdeps/alpha/fpu/s_csqrtf.c: Update using templated version. + + * sysdeps/ieee754/ldbl-opt/s_cexp.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_cexpl.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_clog.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_clog10.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_clog10l.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_cpow.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_cpowl.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_cproj.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_cprojl.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_csqrt.c: Removed. + * sysdeps/ieee754/ldbl-opt/s_csqrtl.c: Removed. + + * sysdeps/ieee754/ldbl-opt/s_clogl.c: Update using templated + version. + + * sysdeps/m68k/m680x0/fpu/s_cexp.c: Refactor into. + * sysdeps/m68k/m680x0/fpu/s_cexp_template.c: New file. + * sysdeps/m68k/m680x0/fpu/s_cexpf.c: Removed. + * sysdeps/m68k/m680x0/fpu/s_cexpl.c: Removed. + +2016-08-29 Paul E. Murphy <murphyp@linux.vnet.ibm.com> + * s_cexp_template.c: Copy of s_cexp.c. * s_clog_template.c: Copy of s_clog.c. * s_clog10_template.c: Copy of s_clog10.c. 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; |
