[PATCH 2/3] libm: Remove __ieee754_gamma_r variants
Keith Packard
keithp@keithp.com
Wed Aug 26 17:03:56 GMT 2020
Gamma should consume the sign reported by lgamma internally instead of
providing it back to the application. This removes the need to have _r
variants as there is no longer any re-entrancy issues with the API.
Signed-off-by: Keith Packard <keithp@keithp.com>
---
newlib/libc/include/math.h | 2 -
newlib/libc/sys/linux/cmath/math_private.h | 2 -
newlib/libm/common/fdlibm.h | 4 +-
newlib/libm/math/Makefile.am | 4 +-
newlib/libm/math/Makefile.in | 24 +++--------
newlib/libm/math/er_gamma.c | 12 ++++--
newlib/libm/math/erf_gamma.c | 12 ++++--
newlib/libm/math/w_gamma.c | 15 +------
newlib/libm/math/w_tgamma.c | 4 +-
newlib/libm/math/wf_gamma.c | 15 +------
newlib/libm/math/wf_tgamma.c | 4 +-
newlib/libm/math/wr_gamma.c | 49 ----------------------
newlib/libm/math/wrf_gamma.c | 48 ---------------------
13 files changed, 32 insertions(+), 163 deletions(-)
delete mode 100644 newlib/libm/math/wr_gamma.c
delete mode 100644 newlib/libm/math/wrf_gamma.c
diff --git a/newlib/libc/include/math.h b/newlib/libc/include/math.h
index 3399d3649..28d4df10f 100644
--- a/newlib/libc/include/math.h
+++ b/newlib/libc/include/math.h
@@ -515,9 +515,7 @@ extern float dremf (float, float);
#ifdef __CYGWIN__
extern float dreml (long double, long double);
#endif /* __CYGWIN__ */
-extern double gamma_r (double, int *);
extern double lgamma_r (double, int *);
-extern float gammaf_r (float, int *);
extern float lgammaf_r (float, int *);
#endif
diff --git a/newlib/libc/sys/linux/cmath/math_private.h b/newlib/libc/sys/linux/cmath/math_private.h
index 3e32b29ba..f5792f7fa 100644
--- a/newlib/libc/sys/linux/cmath/math_private.h
+++ b/newlib/libc/sys/linux/cmath/math_private.h
@@ -178,7 +178,6 @@ extern double __ieee754_cosh (double);
extern double __ieee754_fmod (double,double);
extern double __ieee754_pow (double,double);
extern double __ieee754_lgamma_r (double,int *);
-extern double __ieee754_gamma_r (double,int *);
extern double __ieee754_lgamma (double);
extern double __ieee754_gamma (double);
extern double __ieee754_log10 (double);
@@ -241,7 +240,6 @@ extern float __ieee754_coshf (float);
extern float __ieee754_fmodf (float,float);
extern float __ieee754_powf (float,float);
extern float __ieee754_lgammaf_r (float,int *);
-extern float __ieee754_gammaf_r (float,int *);
extern float __ieee754_lgammaf (float);
extern float __ieee754_gammaf (float);
extern float __ieee754_log10f (float);
diff --git a/newlib/libm/common/fdlibm.h b/newlib/libm/common/fdlibm.h
index 8dffc832d..5226c2e13 100644
--- a/newlib/libm/common/fdlibm.h
+++ b/newlib/libm/common/fdlibm.h
@@ -159,7 +159,7 @@ extern double __ieee754_cosh __P((double));
extern double __ieee754_fmod __P((double,double));
extern double __ieee754_pow __P((double,double));
extern double __ieee754_lgamma_r __P((double,int *));
-extern double __ieee754_gamma_r __P((double,int *));
+extern double __ieee754_gamma __P((double));
extern double __ieee754_log10 __P((double));
extern double __ieee754_sinh __P((double));
extern double __ieee754_hypot __P((double,double));
@@ -205,7 +205,7 @@ extern float __ieee754_coshf __P((float));
extern float __ieee754_fmodf __P((float,float));
extern float __ieee754_powf __P((float,float));
extern float __ieee754_lgammaf_r __P((float,int *));
-extern float __ieee754_gammaf_r __P((float,int *));
+extern float __ieee754_gammaf __P((float));
extern float __ieee754_log10f __P((float));
extern float __ieee754_sinhf __P((float));
extern float __ieee754_hypotf __P((float,float));
diff --git a/newlib/libm/math/Makefile.am b/newlib/libm/math/Makefile.am
index e745159ae..87e47dbd5 100644
--- a/newlib/libm/math/Makefile.am
+++ b/newlib/libm/math/Makefile.am
@@ -14,7 +14,7 @@ src = k_standard.c k_rem_pio2.c \
e_scalb.c e_sinh.c e_sqrt.c \
w_acos.c w_acosh.c w_asin.c w_atan2.c \
w_atanh.c w_cosh.c w_exp.c w_fmod.c \
- w_gamma.c wr_gamma.c w_hypot.c w_j0.c \
+ w_gamma.c w_hypot.c w_j0.c \
w_j1.c w_jn.c w_lgamma.c wr_lgamma.c \
w_log.c w_log10.c w_pow.c w_remainder.c \
w_scalb.c w_sinh.c w_sqrt.c \
@@ -37,7 +37,7 @@ fsrc = kf_rem_pio2.c \
ef_scalb.c ef_sinh.c ef_sqrt.c \
wf_acos.c wf_acosh.c wf_asin.c wf_atan2.c \
wf_atanh.c wf_cosh.c wf_exp.c wf_fmod.c \
- wf_gamma.c wrf_gamma.c wf_hypot.c wf_j0.c \
+ wf_gamma.c wf_hypot.c wf_j0.c \
wf_j1.c wf_jn.c wf_lgamma.c wrf_lgamma.c \
wf_log.c wf_log10.c wf_pow.c wf_remainder.c \
wf_scalb.c wf_sinh.c wf_sqrt.c \
diff --git a/newlib/libm/math/Makefile.in b/newlib/libm/math/Makefile.in
index 0ac2b1668..9ba1be8ca 100644
--- a/newlib/libm/math/Makefile.in
+++ b/newlib/libm/math/Makefile.in
@@ -90,7 +90,7 @@ am__objects_1 = lib_a-k_standard.$(OBJEXT) lib_a-k_rem_pio2.$(OBJEXT) \
lib_a-w_atan2.$(OBJEXT) lib_a-w_atanh.$(OBJEXT) \
lib_a-w_cosh.$(OBJEXT) lib_a-w_exp.$(OBJEXT) \
lib_a-w_fmod.$(OBJEXT) lib_a-w_gamma.$(OBJEXT) \
- lib_a-wr_gamma.$(OBJEXT) lib_a-w_hypot.$(OBJEXT) \
+ lib_a-w_hypot.$(OBJEXT) \
lib_a-w_j0.$(OBJEXT) lib_a-w_j1.$(OBJEXT) lib_a-w_jn.$(OBJEXT) \
lib_a-w_lgamma.$(OBJEXT) lib_a-wr_lgamma.$(OBJEXT) \
lib_a-w_log.$(OBJEXT) lib_a-w_log10.$(OBJEXT) \
@@ -122,7 +122,7 @@ am__objects_2 = lib_a-kf_rem_pio2.$(OBJEXT) lib_a-kf_cos.$(OBJEXT) \
lib_a-wf_asin.$(OBJEXT) lib_a-wf_atan2.$(OBJEXT) \
lib_a-wf_atanh.$(OBJEXT) lib_a-wf_cosh.$(OBJEXT) \
lib_a-wf_exp.$(OBJEXT) lib_a-wf_fmod.$(OBJEXT) \
- lib_a-wf_gamma.$(OBJEXT) lib_a-wrf_gamma.$(OBJEXT) \
+ lib_a-wf_gamma.$(OBJEXT) \
lib_a-wf_hypot.$(OBJEXT) lib_a-wf_j0.$(OBJEXT) \
lib_a-wf_j1.$(OBJEXT) lib_a-wf_jn.$(OBJEXT) \
lib_a-wf_lgamma.$(OBJEXT) lib_a-wrf_lgamma.$(OBJEXT) \
@@ -151,7 +151,7 @@ am__objects_4 = k_standard.lo k_rem_pio2.lo k_cos.lo k_sin.lo k_tan.lo \
e_jn.lo er_lgamma.lo e_log.lo e_log10.lo e_pow.lo \
e_rem_pio2.lo e_remainder.lo e_scalb.lo e_sinh.lo e_sqrt.lo \
w_acos.lo w_acosh.lo w_asin.lo w_atan2.lo w_atanh.lo w_cosh.lo \
- w_exp.lo w_fmod.lo w_gamma.lo wr_gamma.lo w_hypot.lo w_j0.lo \
+ w_exp.lo w_fmod.lo w_gamma.lo w_hypot.lo w_j0.lo \
w_j1.lo w_jn.lo w_lgamma.lo wr_lgamma.lo w_log.lo w_log10.lo \
w_pow.lo w_remainder.lo w_scalb.lo w_sinh.lo w_sqrt.lo \
w_sincos.lo w_drem.lo s_asinh.lo s_atan.lo s_ceil.lo s_cos.lo \
@@ -164,7 +164,7 @@ am__objects_5 = kf_rem_pio2.lo kf_cos.lo kf_sin.lo kf_tan.lo \
ef_pow.lo ef_rem_pio2.lo ef_remainder.lo ef_scalb.lo \
ef_sinh.lo ef_sqrt.lo wf_acos.lo wf_acosh.lo wf_asin.lo \
wf_atan2.lo wf_atanh.lo wf_cosh.lo wf_exp.lo wf_fmod.lo \
- wf_gamma.lo wrf_gamma.lo wf_hypot.lo wf_j0.lo wf_j1.lo \
+ wf_gamma.lo wf_hypot.lo wf_j0.lo wf_j1.lo \
wf_jn.lo wf_lgamma.lo wrf_lgamma.lo wf_log.lo wf_log10.lo \
wf_pow.lo wf_remainder.lo wf_scalb.lo wf_sinh.lo wf_sqrt.lo \
wf_sincos.lo wf_drem.lo sf_asinh.lo sf_atan.lo sf_ceil.lo \
@@ -339,7 +339,7 @@ src = k_standard.c k_rem_pio2.c \
e_scalb.c e_sinh.c e_sqrt.c \
w_acos.c w_acosh.c w_asin.c w_atan2.c \
w_atanh.c w_cosh.c w_exp.c w_fmod.c \
- w_gamma.c wr_gamma.c w_hypot.c w_j0.c \
+ w_gamma.c w_hypot.c w_j0.c \
w_j1.c w_jn.c w_lgamma.c wr_lgamma.c \
w_log.c w_log10.c w_pow.c w_remainder.c \
w_scalb.c w_sinh.c w_sqrt.c \
@@ -362,7 +362,7 @@ fsrc = kf_rem_pio2.c \
ef_scalb.c ef_sinh.c ef_sqrt.c \
wf_acos.c wf_acosh.c wf_asin.c wf_atan2.c \
wf_atanh.c wf_cosh.c wf_exp.c wf_fmod.c \
- wf_gamma.c wrf_gamma.c wf_hypot.c wf_j0.c \
+ wf_gamma.c wf_hypot.c wf_j0.c \
wf_j1.c wf_jn.c wf_lgamma.c wrf_lgamma.c \
wf_log.c wf_log10.c wf_pow.c wf_remainder.c \
wf_scalb.c wf_sinh.c wf_sqrt.c \
@@ -690,12 +690,6 @@ lib_a-w_gamma.o: w_gamma.c
lib_a-w_gamma.obj: w_gamma.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-w_gamma.obj `if test -f 'w_gamma.c'; then $(CYGPATH_W) 'w_gamma.c'; else $(CYGPATH_W) '$(srcdir)/w_gamma.c'; fi`
-lib_a-wr_gamma.o: wr_gamma.c
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wr_gamma.o `test -f 'wr_gamma.c' || echo '$(srcdir)/'`wr_gamma.c
-
-lib_a-wr_gamma.obj: wr_gamma.c
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wr_gamma.obj `if test -f 'wr_gamma.c'; then $(CYGPATH_W) 'wr_gamma.c'; else $(CYGPATH_W) '$(srcdir)/wr_gamma.c'; fi`
-
lib_a-w_hypot.o: w_hypot.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-w_hypot.o `test -f 'w_hypot.c' || echo '$(srcdir)/'`w_hypot.c
@@ -1086,12 +1080,6 @@ lib_a-wf_gamma.o: wf_gamma.c
lib_a-wf_gamma.obj: wf_gamma.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wf_gamma.obj `if test -f 'wf_gamma.c'; then $(CYGPATH_W) 'wf_gamma.c'; else $(CYGPATH_W) '$(srcdir)/wf_gamma.c'; fi`
-lib_a-wrf_gamma.o: wrf_gamma.c
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wrf_gamma.o `test -f 'wrf_gamma.c' || echo '$(srcdir)/'`wrf_gamma.c
-
-lib_a-wrf_gamma.obj: wrf_gamma.c
- $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wrf_gamma.obj `if test -f 'wrf_gamma.c'; then $(CYGPATH_W) 'wrf_gamma.c'; else $(CYGPATH_W) '$(srcdir)/wrf_gamma.c'; fi`
-
lib_a-wf_hypot.o: wf_hypot.c
$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-wf_hypot.o `test -f 'wf_hypot.c' || echo '$(srcdir)/'`wf_hypot.c
diff --git a/newlib/libm/math/er_gamma.c b/newlib/libm/math/er_gamma.c
index 3c0e241e5..9252e2d04 100644
--- a/newlib/libm/math/er_gamma.c
+++ b/newlib/libm/math/er_gamma.c
@@ -22,11 +22,15 @@
#include "fdlibm.h"
#ifdef __STDC__
- double __ieee754_gamma_r(double x, int *signgamp)
+ double __ieee754_gamma(double x)
#else
- double __ieee754_gamma_r(x,signgamp)
- double x; int *signgamp;
+ double __ieee754_gamma(x)
+ double x;
#endif
{
- return __ieee754_exp (__ieee754_lgamma_r(x,signgamp));
+ int local_signgam = 1;
+ double y = __ieee754_exp (__ieee754_lgamma_r(x, &local_signgam));
+ if (local_signgam < 0)
+ y = -y;
+ return y;
}
diff --git a/newlib/libm/math/erf_gamma.c b/newlib/libm/math/erf_gamma.c
index 9e529dce0..bddac60c7 100644
--- a/newlib/libm/math/erf_gamma.c
+++ b/newlib/libm/math/erf_gamma.c
@@ -24,11 +24,15 @@
#include "fdlibm.h"
#ifdef __STDC__
- float __ieee754_gammaf_r(float x, int *signgamp)
+ float __ieee754_gammaf(float x)
#else
- float __ieee754_gammaf_r(x,signgamp)
- float x; int *signgamp;
+ float __ieee754_gammaf(x)
+ float x;
#endif
{
- return __ieee754_expf (__ieee754_lgammaf_r(x,signgamp));
+ int local_signgam = 1;
+ float y = __ieee754_expf (__ieee754_lgammaf_r(x,&local_signgam));
+ if (local_signgam < 0)
+ y = -y;
+ return y;
}
diff --git a/newlib/libm/math/w_gamma.c b/newlib/libm/math/w_gamma.c
index b65d5cc4b..bb47fab31 100644
--- a/newlib/libm/math/w_gamma.c
+++ b/newlib/libm/math/w_gamma.c
@@ -148,18 +148,7 @@ in terms of the base return values, although the <[signgam]> global for
double x;
#endif
{
-#ifdef _IEEE_LIBM
- return __ieee754_gamma_r(x,&(_REENT_SIGNGAM(_REENT)));
-#else
- double y;
- y = __ieee754_gamma_r(x,&(_REENT_SIGNGAM(_REENT)));
- if(_LIB_VERSION == _IEEE_) return y;
- if(!finite(y)&&finite(x)) {
- /* gamma(finite) overflow */
- errno = ERANGE;
- }
- return y;
-#endif
-}
+ return tgamma(x);
+}
#endif /* defined(_DOUBLE_IS_32BITS) */
diff --git a/newlib/libm/math/w_tgamma.c b/newlib/libm/math/w_tgamma.c
index c0c011dd0..cbb3e7f7f 100644
--- a/newlib/libm/math/w_tgamma.c
+++ b/newlib/libm/math/w_tgamma.c
@@ -27,9 +27,7 @@
#endif
{
double y;
- int local_signgam;
- y = __ieee754_gamma_r(x,&local_signgam);
- if (local_signgam < 0) y = -y;
+ y = __ieee754_gamma(x);
#ifdef _IEEE_LIBM
return y;
#else
diff --git a/newlib/libm/math/wf_gamma.c b/newlib/libm/math/wf_gamma.c
index f0284a282..4e961c864 100644
--- a/newlib/libm/math/wf_gamma.c
+++ b/newlib/libm/math/wf_gamma.c
@@ -25,19 +25,8 @@
float x;
#endif
{
-#ifdef _IEEE_LIBM
- return __ieee754_gammaf_r(x,&(_REENT_SIGNGAM(_REENT)));
-#else
- float y;
- y = __ieee754_gammaf_r(x,&(_REENT_SIGNGAM(_REENT)));
- if(_LIB_VERSION == _IEEE_) return y;
- if(!finitef(y)&&finitef(x)) {
- /* gammaf(finite) overflow */
- errno = ERANGE;
- }
- return y;
-#endif
-}
+ return tgammaf(x);
+}
#ifdef _DOUBLE_IS_32BITS
diff --git a/newlib/libm/math/wf_tgamma.c b/newlib/libm/math/wf_tgamma.c
index 92df39648..8f0c501b8 100644
--- a/newlib/libm/math/wf_tgamma.c
+++ b/newlib/libm/math/wf_tgamma.c
@@ -24,9 +24,7 @@
#endif
{
float y;
- int local_signgam;
- y = __ieee754_gammaf_r(x,&local_signgam);
- if (local_signgam < 0) y = -y;
+ y = __ieee754_gammaf(x);
#ifdef _IEEE_LIBM
return y;
#else
diff --git a/newlib/libm/math/wr_gamma.c b/newlib/libm/math/wr_gamma.c
deleted file mode 100644
index c4c2a829e..000000000
--- a/newlib/libm/math/wr_gamma.c
+++ /dev/null
@@ -1,49 +0,0 @@
-
-/* @(#)wr_gamma.c 5.1 93/09/24 */
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
- * wrapper double gamma_r(double x, int *signgamp)
- */
-
-#include "fdlibm.h"
-#include <errno.h>
-
-#ifndef _DOUBLE_IS_32BITS
-
-#ifdef __STDC__
- double gamma_r(double x, int *signgamp) /* wrapper lgamma_r */
-#else
- double gamma_r(x,signgamp) /* wrapper lgamma_r */
- double x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
- return __ieee754_gamma_r(x,signgamp);
-#else
- double y;
- y = __ieee754_gamma_r(x,signgamp);
- if(_LIB_VERSION == _IEEE_) return y;
- if(!finite(y)&&finite(x)) {
- if(floor(x)==x&&x<=0.0)
- /* gamma(-integer) or gamma(0) */
- errno = EDOM;
- else
- /* gamma(finite) overflow */
- errno = ERANGE;
- return HUGE_VALF;
- } else
- return y;
-#endif
-}
-
-#endif /* defined(_DOUBLE_IS_32BITS) */
diff --git a/newlib/libm/math/wrf_gamma.c b/newlib/libm/math/wrf_gamma.c
deleted file mode 100644
index d43c7f03d..000000000
--- a/newlib/libm/math/wrf_gamma.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/* wrf_gamma.c -- float version of wr_gamma.c.
- * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
- */
-
-/*
- * ====================================================
- * 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.
- * ====================================================
- */
-
-/*
- * wrapper float gammaf_r(float x, int *signgamp)
- */
-
-#include "fdlibm.h"
-#include <errno.h>
-
-#ifdef __STDC__
- float gammaf_r(float x, int *signgamp) /* wrapper lgammaf_r */
-#else
- float gammaf_r(x,signgamp) /* wrapper lgammaf_r */
- float x; int *signgamp;
-#endif
-{
-#ifdef _IEEE_LIBM
- return __ieee754_gammaf_r(x,signgamp);
-#else
- float y;
- y = __ieee754_gammaf_r(x,signgamp);
- if(_LIB_VERSION == _IEEE_) return y;
- if(!finitef(y)&&finitef(x)) {
- if(floorf(x)==x&&x<=0.0f) {
- /* gammaf(-integer) or gamma(0) */
- errno = EDOM;
- } else {
- /* gammaf(finite) overflow */
- errno = ERANGE;
- }
- return HUGE_VALF;
- } else
- return y;
-#endif
-}
--
2.28.0
More information about the Newlib
mailing list