diff --git a/lib/msun/Makefile b/lib/msun/Makefile --- a/lib/msun/Makefile +++ b/lib/msun/Makefile @@ -21,6 +21,10 @@ .endif # long double format +# The logic here is a bit weak, but the only values that could be found here +# (for now) are 53, 64 or 113. See the various Makefile.inc files under this +# location. If LDBL_PREC is neither 64 nor 113, then the original tgamma is +# used. .if ${LDBL_PREC} == 64 .PATH: ${.CURDIR}/ld80 CFLAGS+= -I${.CURDIR}/ld80 @@ -135,6 +139,11 @@ s_nextafterl.c s_nexttoward.c s_remquol.c s_rintl.c s_roundl.c \ s_scalbnl.c s_sinl.c s_sincosl.c s_sinpil.c \ s_tanhl.c s_tanl.c s_tanpil.c s_truncl.c w_cabsl.c +# Maybe add 128-bit version +.if ${LDBL_PREC} == 113 +.PATH: ${SRCTOP}/contrib/arm-optimized-routines/math +COMMON_SRCS+= tgamma128.c +.endif # Work around this warning from gcc: # lib/msun/ld80/e_powl.c:275:1: error: floating constant exceeds range of # 'long double' [-Werror=overflow] diff --git a/lib/msun/ld128/b_tgammal.c b/lib/msun/ld128/b_tgammal.c --- a/lib/msun/ld128/b_tgammal.c +++ b/lib/msun/ld128/b_tgammal.c @@ -1,8 +1,7 @@ /*- * SPDX-License-Identifier: BSD-2-Clause * - * Copyright (c) 2013 David Chisnall - * All rights reserved. + * Copyright (c) 2024 Mark Murray * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -26,30 +25,15 @@ * SUCH DAMAGE. */ -#include -#include - -/* - * If long double is not the same size as double, then these will lose - * precision and we should emit a warning whenever something links against - * them. - */ -#if (LDBL_MANT_DIG > 53) -#define WARN_IMPRECISE(x) \ - __warn_references(x, # x " has lower than advertised precision"); -#else -#define WARN_IMPRECISE(x) -#endif /* - * Declare the functions as weak variants so that other libraries providing - * real versions can override them. + * This is a pure C function generously donated by ARM. + * See src/contrib/arm-optimized-routines/math/tgamma128.[ch]. */ -#define DECLARE_WEAK(x)\ - __weak_reference(imprecise_## x, x);\ - WARN_IMPRECISE(x) +long double tgamma128(long double x); -#define DECLARE_IMPRECISE(f) \ - long double imprecise_ ## f ## l(long double v) { return f(v); }\ - DECLARE_WEAK(f ## l) +long double +tgammal(long double x) +{ -DECLARE_IMPRECISE(tgamma); + return tgamma128(x); +} diff --git a/lib/msun/man/lgamma.3 b/lib/msun/man/lgamma.3 --- a/lib/msun/man/lgamma.3 +++ b/lib/msun/man/lgamma.3 @@ -25,7 +25,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.Dd December 8, 2017 +.Dd March 1, 2024 .Dt LGAMMA 3 .Os .Sh NAME @@ -167,15 +167,6 @@ For large non-integer negative values, .Fn tgamma will underflow. -.Sh BUGS -To conform with newer C/C++ standards, a stub implementation for -.Nm tgammal -was committed to the math library, where -.Nm tgammal -is mapped to -.Nm tgamma . -Thus, the numerical accuracy is at most that of the 53-bit double -precision implementation. .Sh SEE ALSO .Xr math 3 .Sh STANDARDS @@ -212,3 +203,11 @@ .Fn tgamma function appeared in .Fx 5.0 . +The 128-bit +.Ft long double +version of +.Fn tgammal +replaced the 80-bit stub version in +version in +.Fx 16 , +thanks to an appropriate implementation from Arm.