Page MenuHomeFreeBSD

D44168.id135316.diff
No OneTemporary

D44168.id135316.diff

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,55 +1,18 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
- * Copyright (c) 2013 David Chisnall
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ * Copyright (c) 2024 Mark Murray
*/
-#include <float.h>
-#include <math.h>
-
-/*
- * 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.

File Metadata

Mime Type
text/plain
Expires
Wed, Feb 12, 12:18 PM (6 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16610445
Default Alt Text
D44168.id135316.diff (4 KB)

Event Timeline