[PATCH 2/3] newlib: Add non LDBL_EQ_DBL math support for aarch64, i386, and x86_64

Jennifer Averett jennifer.averett@oarcorp.com
Mon Apr 3 20:58:36 GMT 2023


    Rename s_nearbyint.c to remove conflicts
    Remove functions that are not needed from s_nearbyint.c
    Modify include paths
    Add missing types
    Create Makefiles
    Create header files to resolve dependencies between directories
    Modify some instances of unsigned long to uint64_t for 32 bit platforms
    Add HAVE_FPMATH_H
---
 newlib/libc/acinclude.m4                      |  3 +
 newlib/libc/include/math.h                    | 14 -----
 newlib/libc/include/sys/endian.h              | 42 ++++++++++++--
 newlib/libc/machine/aarch64/machine/_fpmath.h | 20 ++++---
 newlib/libm/Makefile.inc                      |  8 +++
 newlib/libm/ld/Makefile.inc                   | 56 +++++++++++++++++++
 newlib/libm/ld/e_lgammal.c                    |  2 +
 newlib/libm/ld/fpmath.h                       |  2 +-
 newlib/libm/ld/invtrig.h                      | 34 +++++++++++
 newlib/libm/ld/k_expl.h                       | 33 +++++++++++
 newlib/libm/ld/math_private.h                 | 21 ++++++-
 newlib/libm/ld/s_ilogbl.c                     |  6 +-
 newlib/libm/ld/s_logbl.c                      |  6 +-
 newlib/libm/ld/s_lround.c                     |  2 +-
 .../libm/ld/{s_nearbyint.c => s_nearbyintl.c} |  7 +++
 newlib/libm/ld128/Makefile.inc                | 13 +++++
 newlib/libm/ld128/e_powl.c                    |  2 +-
 newlib/libm/ld128/e_rem_pio2l.h               |  2 +-
 newlib/libm/ld128/invtrig.h                   |  2 +-
 newlib/libm/ld128/s_erfl.c                    |  4 +-
 newlib/libm/ld128/s_exp2l.c                   |  2 +-
 newlib/libm/ld128/s_expl.c                    |  4 +-
 newlib/libm/ld128/s_logl.c                    |  4 +-
 newlib/libm/ld80/Makefile.inc                 | 14 +++++
 newlib/libm/ld80/b_expl.c                     |  4 +-
 newlib/libm/ld80/b_tgammal.c                  |  7 ++-
 newlib/libm/ld80/e_powl.c                     |  4 +-
 newlib/libm/ld80/e_rem_pio2l.h                |  2 +-
 newlib/libm/ld80/invtrig.h                    |  2 +-
 newlib/libm/ld80/s_cospil.c                   |  4 +-
 newlib/libm/ld80/s_erfl.c                     |  4 +-
 newlib/libm/ld80/s_exp2l.c                    |  4 +-
 newlib/libm/ld80/s_expl.c                     |  4 +-
 newlib/libm/ld80/s_logl.c                     |  4 +-
 newlib/libm/ld80/s_sinpil.c                   |  4 +-
 35 files changed, 279 insertions(+), 67 deletions(-)
 create mode 100644 newlib/libm/ld/Makefile.inc
 create mode 100644 newlib/libm/ld/invtrig.h
 create mode 100644 newlib/libm/ld/k_expl.h
 rename newlib/libm/ld/{s_nearbyint.c => s_nearbyintl.c} (94%)
 create mode 100644 newlib/libm/ld128/Makefile.inc
 create mode 100644 newlib/libm/ld80/Makefile.inc

diff --git a/newlib/libc/acinclude.m4 b/newlib/libc/acinclude.m4
index 7cba7db39..42662669f 100644
--- a/newlib/libc/acinclude.m4
+++ b/newlib/libc/acinclude.m4
@@ -62,4 +62,7 @@ m4_foreach_w([MACHINE], [
   z8k
 ], [AM_CONDITIONAL([HAVE_LIBC_MACHINE_]m4_toupper(MACHINE), test "${machine_dir}" = MACHINE)])
 
+AM_CONDITIONAL(HAVE_FPMATH_H, test -r "${srcdir}/libc/machine/${machine_dir}/machine/_fpmath.h")
+
+
 AM_CONDITIONAL(MACH_ADD_SETJMP, test "x$mach_add_setjmp" = "xtrue")
diff --git a/newlib/libc/include/math.h b/newlib/libc/include/math.h
index 54e30ef82..7fc18b6dd 100644
--- a/newlib/libc/include/math.h
+++ b/newlib/libc/include/math.h
@@ -440,14 +440,7 @@ extern float log2f (float);
 extern float hypotf (float, float);
 #endif /* ! defined (_REENT_ONLY) */
 
-/* Newlib doesn't fully support long double math functions so far.
-   On platforms where long double equals double the long double functions
-   simply call the double functions.  On Cygwin the long double functions
-   are implemented independently from newlib to be able to use optimized
-   assembler functions despite using the Microsoft x86_64 ABI. */
-#if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__)
 /* Reentrant ANSI C functions.  */
-#ifndef __math_68881
 extern long double atanl (long double);
 extern long double cosl (long double);
 extern long double sinl (long double);
@@ -460,10 +453,7 @@ extern long double fabsl (long double);
 extern long double floorl (long double);
 extern long double log1pl (long double);
 extern long double expm1l (long double);
-#endif /* ! defined (__math_68881) */
 /* Non reentrant ANSI C functions.  */
-#ifndef _REENT_ONLY
-#ifndef __math_68881
 extern long double acosl (long double);
 extern long double asinl (long double);
 extern long double atan2l (long double, long double);
@@ -477,8 +467,6 @@ extern long double powl (long double, long double);
 extern long double sqrtl (long double);
 extern long double fmodl (long double, long double);
 extern long double hypotl (long double, long double);
-#endif /* ! defined (__math_68881) */
-#endif /* ! defined (_REENT_ONLY) */
 extern long double copysignl (long double, long double);
 extern long double nanl (const char *);
 extern int ilogbl (long double);
@@ -515,7 +503,6 @@ extern long double lgammal (long double);
 extern long double erfl (long double);
 extern long double erfcl (long double);
 #endif /* ! defined (_REENT_ONLY) */
-#else /* !_LDBL_EQ_DBL && !__CYGWIN__ */
 extern long double hypotl (long double, long double);
 extern long double sqrtl (long double);
 extern long double frexpl (long double, int *);
@@ -525,7 +512,6 @@ extern _LONG_DOUBLE rintl (_LONG_DOUBLE);
 extern long int lrintl (_LONG_DOUBLE);
 extern long long int llrintl (_LONG_DOUBLE);
 #endif /* __i386__ */
-#endif /* !_LDBL_EQ_DBL && !__CYGWIN__ */
 
 #endif /* __ISO_C_VISIBLE >= 1999 */
 
diff --git a/newlib/libc/include/sys/endian.h b/newlib/libc/include/sys/endian.h
index d91c442e9..d070d09ad 100644
--- a/newlib/libc/include/sys/endian.h
+++ b/newlib/libc/include/sys/endian.h
@@ -55,12 +55,6 @@ typedef	__uint64_t	uint64_t;
 #define	_UINT64_T_DECLARED
 #endif
 
-/*
- * Note: While tempting to try to avoid namespace pollution from this file,
- * several software packages assume these marcos are defined, even when it
- * defines _POSIX_C_SOURCE to request an unpolluted namespace.
- */
-
 /*
  * General byte order swapping functions.
  */
@@ -68,7 +62,42 @@ typedef	__uint64_t	uint64_t;
 #define	bswap32(x)	__bswap32(x)
 #define	bswap64(x)	__bswap64(x)
 
+/*
+ * Host to big endian, host to little endian, big endian to host, and little
+ * endian to host byte order functions as detailed in byteorder(9).
+ */
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define	htobe16(x)	bswap16((x))
+#define	htobe32(x)	bswap32((x))
+#define	htobe64(x)	bswap64((x))
+#define	htole16(x)	((uint16_t)(x))
+#define	htole32(x)	((uint32_t)(x))
+#define	htole64(x)	((uint64_t)(x))
+
+#define	be16toh(x)	bswap16((x))
+#define	be32toh(x)	bswap32((x))
+#define	be64toh(x)	bswap64((x))
+#define	le16toh(x)	((uint16_t)(x))
+#define	le32toh(x)	((uint32_t)(x))
+#define	le64toh(x)	((uint64_t)(x))
+#else /* _BYTE_ORDER != _LITTLE_ENDIAN */
+#define	htobe16(x)	((uint16_t)(x))
+#define	htobe32(x)	((uint32_t)(x))
+#define	htobe64(x)	((uint64_t)(x))
+#define	htole16(x)	bswap16((x))
+#define	htole32(x)	bswap32((x))
+#define	htole64(x)	bswap64((x))
+
+#define	be16toh(x)	((uint16_t)(x))
+#define	be32toh(x)	((uint32_t)(x))
+#define	be64toh(x)	((uint64_t)(x))
+#define	le16toh(x)	bswap16((x))
+#define	le32toh(x)	bswap32((x))
+#define	le64toh(x)	bswap64((x))
+#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
+
 /* Alignment-agnostic encode/decode bytestream to/from little/big endian. */
+
 static __inline uint16_t
 be16dec(const void *pp)
 {
@@ -174,4 +203,5 @@ le64enc(void *pp, uint64_t u)
 	le32enc(p, (uint32_t)(u & 0xffffffffU));
 	le32enc(p + 4, (uint32_t)(u >> 32));
 }
+
 #endif	/* _SYS_ENDIAN_H_ */
diff --git a/newlib/libc/machine/aarch64/machine/_fpmath.h b/newlib/libc/machine/aarch64/machine/_fpmath.h
index 71d0a7152..fa62ae81c 100644
--- a/newlib/libc/machine/aarch64/machine/_fpmath.h
+++ b/newlib/libc/machine/aarch64/machine/_fpmath.h
@@ -27,19 +27,25 @@
  * $FreeBSD$
  */
 
+/*
+ * Change unsigned int/long used by FreeBSD to fixed width types because
+ * ilp32 has a different size for unsigned long. --joel (20 Aug 2022)
+ */
+#include <stdint.h>
+
 union IEEEl2bits {
 	long double	e;
 	struct {
-		unsigned long	manl	:64;
-		unsigned long	manh	:48;
-		unsigned int	exp	:15;
-		unsigned int	sign	:1;
+		uint64_t	manl	:64;
+		uint64_t	manh	:48;
+		uint32_t	exp	:15;
+		uint32_t	sign	:1;
 	} bits;
 	/* TODO andrew: Check the packing here */
 	struct {
-		unsigned long	manl	:64;
-		unsigned long	manh	:48;
-		unsigned int	expsign	:16;
+		uint64_t	manl	:64;
+		uint64_t	manh	:48;
+		uint32_t	expsign	:16;
 	} xbits;
 };
 
diff --git a/newlib/libm/Makefile.inc b/newlib/libm/Makefile.inc
index 9d1469555..075693a73 100644
--- a/newlib/libm/Makefile.inc
+++ b/newlib/libm/Makefile.inc
@@ -44,12 +44,18 @@ else
 include %D%/math/Makefile.inc
 endif
 include %D%/common/Makefile.inc
+
+if HAVE_FPMATH_H
+include %D%/ld/Makefile.inc
+endif # HAVE_FPMATH_H
+
 include %D%/complex/Makefile.inc
 include %D%/fenv/Makefile.inc
 include %D%/test/Makefile.inc
 
 if HAVE_LIBM_MACHINE_AARCH64
 include %D%/machine/aarch64/Makefile.inc
+include %D%/ld128/Makefile.inc
 endif
 if HAVE_LIBM_MACHINE_AMDGCN
 include %D%/machine/amdgcn/Makefile.inc
@@ -59,6 +65,7 @@ include %D%/machine/arm/Makefile.inc
 endif
 if HAVE_LIBM_MACHINE_I386
 include %D%/machine/i386/Makefile.inc
+include %D%/ld80/Makefile.inc
 endif
 if HAVE_LIBM_MACHINE_MIPS
 include %D%/machine/mips/Makefile.inc
@@ -83,6 +90,7 @@ include %D%/machine/riscv/Makefile.inc
 endif
 if HAVE_LIBM_MACHINE_X86_64
 include %D%/machine/x86_64/Makefile.inc
+include %D%/ld80/Makefile.inc
 endif
 
 CLEANFILES += \
diff --git a/newlib/libm/ld/Makefile.inc b/newlib/libm/ld/Makefile.inc
new file mode 100644
index 000000000..a64480557
--- /dev/null
+++ b/newlib/libm/ld/Makefile.inc
@@ -0,0 +1,56 @@
+%C%_lsrc = \
+	%D%/e_acoshl.c \
+	%D%/e_acosl.c \
+	%D%/e_asinl.c \
+	%D%/e_atan2l.c \
+	%D%/e_atanhl.c \
+	%D%/e_coshl.c \
+	%D%/e_fmodl.c \
+	%D%/e_lgammal.c \
+	%D%/e_remainderl.c \
+	%D%/e_sinhl.c \
+	%D%/s_asinhl.c \
+	%D%/s_atanl.c \
+	%D%/s_cbrtl.c \
+	%D%/s_ceill.c \
+	%D%/s_copysignl.c \
+	%D%/s_cosl.c \
+	%D%/s_fabsl.c \
+	%D%/s_fdim.c \
+	%D%/s_floorl.c \
+	%D%/s_fmal.c \
+	%D%/s_fmaxl.c \
+	%D%/s_fminl.c \
+	%D%/s_frexpl.c \
+	%D%/s_ilogbl.c \
+	%D%/s_llrintl.c \
+	%D%/s_llroundl.c \
+	%D%/s_logbl.c \
+	%D%/s_lrint.c \
+	%D%/s_lrintl.c \
+	%D%/s_lround.c \
+	%D%/s_lroundl.c \
+	%D%/s_modfl.c \
+	%D%/s_nearbyintl.c \
+	%D%/s_nextafterl.c \
+	%D%/s_nexttoward.c \
+	%D%/s_nexttowardf.c \
+	%D%/s_remquol.c \
+	%D%/s_rintl.c \
+	%D%/s_roundl.c \
+	%D%/s_scalbln.c \
+	%D%/s_scalbnl.c \
+	%D%/s_sinl.c \
+	%D%/s_tanhl.c \
+	%D%/s_tanl.c \
+	%D%/s_truncl.c
+
+libm_a_CFLAGS_%C% = -fbuiltin -fno-math-errno
+
+if HAVE_LONG_DOUBLE
+libm_a_SOURCES += $(%C%_lsrc)
+endif # HAVE_LONG_DOUBLE
+
+LIBM_CHEWOUT_FILES += 
+
+LIBM_CHAPTERS +=
diff --git a/newlib/libm/ld/e_lgammal.c b/newlib/libm/ld/e_lgammal.c
index ebc2fc78c..0e6a0c39b 100644
--- a/newlib/libm/ld/e_lgammal.c
+++ b/newlib/libm/ld/e_lgammal.c
@@ -16,6 +16,8 @@ __FBSDID("$FreeBSD$");
 #include "math.h"
 #include "math_private.h"
 
+long double lgammal_r(long double x, int *signp);
+
 extern int signgam;
 
 long double
diff --git a/newlib/libm/ld/fpmath.h b/newlib/libm/ld/fpmath.h
index ce935eb40..323fbe5fc 100644
--- a/newlib/libm/ld/fpmath.h
+++ b/newlib/libm/ld/fpmath.h
@@ -33,7 +33,7 @@
 #define _FPMATH_H_
 
 #include <sys/endian.h>
-#include "_fpmath.h"
+#include "machine/_fpmath.h"  /* changed to machine for newlib */
 
 #ifndef _IEEE_WORD_ORDER
 #define	_IEEE_WORD_ORDER	_BYTE_ORDER
diff --git a/newlib/libm/ld/invtrig.h b/newlib/libm/ld/invtrig.h
new file mode 100644
index 000000000..028807f86
--- /dev/null
+++ b/newlib/libm/ld/invtrig.h
@@ -0,0 +1,34 @@
+/*
+ *  COPYRIGHT (c) 1989-1999.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
+ */
+
+#if LDBL_MANT_DIG == 64
+#include "../ld80/invtrig.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/invtrig.h"
+#else
+#error "Unsupported long double format"
+#endif
+
diff --git a/newlib/libm/ld/k_expl.h b/newlib/libm/ld/k_expl.h
new file mode 100644
index 000000000..721a91280
--- /dev/null
+++ b/newlib/libm/ld/k_expl.h
@@ -0,0 +1,33 @@
+/*
+ *  COPYRIGHT (c) 1989-1999.
+ *  On-Line Applications Research Corporation (OAR).
+ *
+ * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
+ */
+
+#if LDBL_MANT_DIG == 64
+#include "../ld80/k_expl.h"
+#elif LDBL_MANT_DIG == 113
+#include "../ld128/k_expl.h"
+#else
+#error "Unsupported long double format"
+#endif
diff --git a/newlib/libm/ld/math_private.h b/newlib/libm/ld/math_private.h
index df526e71e..28c4d1304 100644
--- a/newlib/libm/ld/math_private.h
+++ b/newlib/libm/ld/math_private.h
@@ -20,6 +20,23 @@
 #include <sys/types.h>
 #include <machine/endian.h>
 
+/*
+ * __double_t and __float_t are defined elsewhere in
+ * freebsd and used to define double_t and float_t.
+ * Newlib has already went through the process of 
+ * defining double_t and float_t so we should be able
+ * to use them to define __double_t and __float_t for
+ * this file.
+ */
+typedef double_t          __double_t;
+typedef float_t           __float_t;
+
+/*
+ * Necessary to disable Protection Enabled specific
+ * Free-bsd source.
+ */ 
+#define NO_FPSETPREC
+
 /*
  * The original fdlibm code used statements like:
  *	n0 = ((*(int*)&one)>>29)^1;		* index of high word *
@@ -644,7 +661,7 @@ rnintl(long double x)
  * return type provided their arg is a floating point integer.  They can
  * sometimes be more efficient because no rounding is required.
  */
-#if defined(amd64) || defined(__i386__)
+#if defined(amd64) || (defined(__i386__) && (!defined _SOFT_FLOAT))
 #define	irint(x)						\
     (sizeof(x) == sizeof(float) &&				\
     sizeof(__float_t) == sizeof(long double) ? irintf(x) :	\
@@ -677,7 +694,7 @@ irintd(double x)
 }
 #endif
 
-#if defined(__amd64__) || defined(__i386__)
+#if defined(__amd64__) || (defined(__i386__) && (!defined _SOFT_FLOAT))
 static __inline int
 irintl(long double x)
 {
diff --git a/newlib/libm/ld/s_ilogbl.c b/newlib/libm/ld/s_ilogbl.c
index 3211f4409..37e6f7ba6 100644
--- a/newlib/libm/ld/s_ilogbl.c
+++ b/newlib/libm/ld/s_ilogbl.c
@@ -23,7 +23,7 @@ int
 ilogbl(long double x)
 {
 	union IEEEl2bits u;
-	unsigned long m;
+	uint64_t m;
 	int b;
 
 	u.e = x;
@@ -32,11 +32,11 @@ ilogbl(long double x)
 			return (FP_ILOGB0);
 		/* denormalized */
 		if (u.bits.manh == 0) {
-			m = 1lu << (LDBL_MANL_SIZE - 1);
+			m = 1llu << (LDBL_MANL_SIZE - 1);
 			for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
 				b++;
 		} else {
-			m = 1lu << (LDBL_MANH_SIZE - 1);
+			m = 1llu << (LDBL_MANH_SIZE - 1);
 			for (b = 0; !(u.bits.manh & m); m >>= 1)
 				b++;
 		}
diff --git a/newlib/libm/ld/s_logbl.c b/newlib/libm/ld/s_logbl.c
index ee1a91fd8..90ce6ec04 100644
--- a/newlib/libm/ld/s_logbl.c
+++ b/newlib/libm/ld/s_logbl.c
@@ -23,7 +23,7 @@ long double
 logbl(long double x)
 {
 	union IEEEl2bits u;
-	unsigned long m;
+	uint64_t m;
 	int b;
 
 	u.e = x;
@@ -34,11 +34,11 @@ logbl(long double x)
 		}
 		/* denormalized */
 		if (u.bits.manh == 0) {
-			m = 1lu << (LDBL_MANL_SIZE - 1);
+			m = 1llu << (LDBL_MANL_SIZE - 1);
 			for (b = LDBL_MANH_SIZE; !(u.bits.manl & m); m >>= 1)
 				b++;
 		} else {
-			m = 1lu << (LDBL_MANH_SIZE - 1);
+			m = 1llu << (LDBL_MANH_SIZE - 1);
 			for (b = 0; !(u.bits.manh & m); m >>= 1)
 				b++;
 		}
diff --git a/newlib/libm/ld/s_lround.c b/newlib/libm/ld/s_lround.c
index 1dd8e697f..f67f9fbeb 100644
--- a/newlib/libm/ld/s_lround.c
+++ b/newlib/libm/ld/s_lround.c
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-#include <sys/limits.h>
+#include <limits.h>
 #include <fenv.h>
 #include <math.h>
 
diff --git a/newlib/libm/ld/s_nearbyint.c b/newlib/libm/ld/s_nearbyintl.c
similarity index 94%
rename from newlib/libm/ld/s_nearbyint.c
rename to newlib/libm/ld/s_nearbyintl.c
index 796dbaf98..9befed4df 100644
--- a/newlib/libm/ld/s_nearbyint.c
+++ b/newlib/libm/ld/s_nearbyintl.c
@@ -56,6 +56,13 @@ fn(type x)			\
 	return (ret);		\
 }
 
+/*
+ * nearbyint and nearbyintf are defined elsewhere in
+ * newlib.  Ignore the freebsd versions and only compile
+ * nearbyintl.
+ */
+#if 0
 DECL(double, nearbyint, rint)
 DECL(float, nearbyintf, rintf)
+#endif
 DECL(long double, nearbyintl, rintl)
diff --git a/newlib/libm/ld128/Makefile.inc b/newlib/libm/ld128/Makefile.inc
new file mode 100644
index 000000000..d53aa5161
--- /dev/null
+++ b/newlib/libm/ld128/Makefile.inc
@@ -0,0 +1,13 @@
+%C%_lsrc = \
+	%D%/e_powl.c %D%/s_erfl.c %D%/s_exp2l.c %D%/s_expl.c \
+	%D%/s_logl.c %D%/b_tgammal.c 
+
+libm_a_CFLAGS_%C% = -fbuiltin -fno-math-errno
+
+if HAVE_LONG_DOUBLE
+libm_a_SOURCES += $(%C%_lsrc)
+endif # HAVE_LONG_DOUBLE
+
+LIBM_CHEWOUT_FILES += 
+
+LIBM_CHAPTERS +=
diff --git a/newlib/libm/ld128/e_powl.c b/newlib/libm/ld128/e_powl.c
index 12b92a1a9..ea68f87ba 100644
--- a/newlib/libm/ld128/e_powl.c
+++ b/newlib/libm/ld128/e_powl.c
@@ -65,7 +65,7 @@ __FBSDID("$FreeBSD$");
 #include <float.h>
 #include <math.h>
 
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 static const long double bp[] = {
   1.0L,
diff --git a/newlib/libm/ld128/e_rem_pio2l.h b/newlib/libm/ld128/e_rem_pio2l.h
index 7516ced49..be1410283 100644
--- a/newlib/libm/ld128/e_rem_pio2l.h
+++ b/newlib/libm/ld128/e_rem_pio2l.h
@@ -25,7 +25,7 @@ __FBSDID("$FreeBSD$");
 #include <float.h>
 
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 #include "../ld/fpmath.h"
 
 #define	BIAS	(LDBL_MAX_EXP - 1)
diff --git a/newlib/libm/ld128/invtrig.h b/newlib/libm/ld128/invtrig.h
index 423b56847..eaa801d43 100644
--- a/newlib/libm/ld128/invtrig.h
+++ b/newlib/libm/ld128/invtrig.h
@@ -30,7 +30,7 @@
 
 #include <float.h>
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 
 #define	BIAS		(LDBL_MAX_EXP - 1)
 #define	MANH_SIZE	(LDBL_MANH_SIZE + 1)
diff --git a/newlib/libm/ld128/s_erfl.c b/newlib/libm/ld128/s_erfl.c
index e29c9691f..d9b17b59f 100644
--- a/newlib/libm/ld128/s_erfl.c
+++ b/newlib/libm/ld128/s_erfl.c
@@ -20,9 +20,9 @@ __FBSDID("$FreeBSD$");
  */
 #include <float.h>
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 /* XXX Prevent compilers from erroneously constant folding these: */
 static const volatile long double tiny = 0x1p-10000L;
diff --git a/newlib/libm/ld128/s_exp2l.c b/newlib/libm/ld128/s_exp2l.c
index ee3d2c782..da0d5f9e0 100644
--- a/newlib/libm/ld128/s_exp2l.c
+++ b/newlib/libm/ld128/s_exp2l.c
@@ -32,7 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <float.h>
 #include <stdint.h>
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
 
 #define	TBLBITS	7
diff --git a/newlib/libm/ld128/s_expl.c b/newlib/libm/ld128/s_expl.c
index 5b786af49..29fcda350 100644
--- a/newlib/libm/ld128/s_expl.c
+++ b/newlib/libm/ld128/s_expl.c
@@ -37,9 +37,9 @@ __FBSDID("$FreeBSD$");
 
 #include <float.h>
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 #include "k_expl.h"
 
 /* XXX Prevent compilers from erroneously constant folding these: */
diff --git a/newlib/libm/ld128/s_logl.c b/newlib/libm/ld128/s_logl.c
index 4774a271e..3b00d47ad 100644
--- a/newlib/libm/ld128/s_logl.c
+++ b/newlib/libm/ld128/s_logl.c
@@ -81,12 +81,12 @@ __FBSDID("$FreeBSD$");
 #include <fenv.h>
 #endif
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
 #ifndef NO_STRUCT_RETURN
 #define	STRUCT_RETURN
 #endif
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 #if !defined(NO_UTAB) && !defined(NO_UTABL)
 #define	USE_UTAB
diff --git a/newlib/libm/ld80/Makefile.inc b/newlib/libm/ld80/Makefile.inc
new file mode 100644
index 000000000..c63c2bb18
--- /dev/null
+++ b/newlib/libm/ld80/Makefile.inc
@@ -0,0 +1,14 @@
+%C%_lsrc = \
+	%D%/b_tgammal.c %D%/e_powl.c %D%/s_erfl.c %D%/s_exp2l.c \
+	%D%/s_expl.c %D%/s_logl.c %D%/s_sinpil.c %D%/s_cospil.c
+
+
+libm_a_CFLAGS_%C% = -fbuiltin -fno-math-errno
+
+if HAVE_LONG_DOUBLE
+libm_a_SOURCES += $(%C%_lsrc)
+endif # HAVE_LONG_DOUBLE
+
+LIBM_CHEWOUT_FILES += 
+
+LIBM_CHAPTERS +=
diff --git a/newlib/libm/ld80/b_expl.c b/newlib/libm/ld80/b_expl.c
index 21bacf449..502fb4720 100644
--- a/newlib/libm/ld80/b_expl.c
+++ b/newlib/libm/ld80/b_expl.c
@@ -35,8 +35,8 @@
  * bsdrc/b_exp.c converted to long double by Steven G. Kargl.
  */
 
-#include "fpmath.h"
-#include "math_private.h"
+#include "../ld/fpmath.h"
+#include "../ld/math_private.h"
 
 static const union IEEEl2bits
     p0u = LD80C(0xaaaaaaaaaaaaaaab,    -3,  1.66666666666666666671e-01L),
diff --git a/newlib/libm/ld80/b_tgammal.c b/newlib/libm/ld80/b_tgammal.c
index 121248adb..e36557bcf 100644
--- a/newlib/libm/ld80/b_tgammal.c
+++ b/newlib/libm/ld80/b_tgammal.c
@@ -55,9 +55,12 @@
 #include <ieeefp.h>
 #endif
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
+
+long double sinpil(long double x);
+long double cospil(long double x);
 
 /* Used in b_log.c and below. */
 struct Double {
diff --git a/newlib/libm/ld80/e_powl.c b/newlib/libm/ld80/e_powl.c
index ea25354c2..6c11c73d0 100644
--- a/newlib/libm/ld80/e_powl.c
+++ b/newlib/libm/ld80/e_powl.c
@@ -19,7 +19,7 @@ __FBSDID("$FreeBSD$");
 
 #include <math.h>
 
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 /*
  * Polynomial evaluator:
@@ -122,7 +122,7 @@ __FBSDID("$FreeBSD$");
 #include <float.h>
 #include <math.h>
 
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 /* Table size */
 #define NXT 32
diff --git a/newlib/libm/ld80/e_rem_pio2l.h b/newlib/libm/ld80/e_rem_pio2l.h
index b7ef5d983..00b0eb74d 100644
--- a/newlib/libm/ld80/e_rem_pio2l.h
+++ b/newlib/libm/ld80/e_rem_pio2l.h
@@ -25,7 +25,7 @@ __FBSDID("$FreeBSD$");
 #include <float.h>
 
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 #include "../ld/fpmath.h"
 
 #define	BIAS	(LDBL_MAX_EXP - 1)
diff --git a/newlib/libm/ld80/invtrig.h b/newlib/libm/ld80/invtrig.h
index be06a044b..4a2469ed6 100644
--- a/newlib/libm/ld80/invtrig.h
+++ b/newlib/libm/ld80/invtrig.h
@@ -30,7 +30,7 @@
 
 #include <float.h>
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 
 #define	BIAS		(LDBL_MAX_EXP - 1)
 #define	MANH_SIZE	LDBL_MANH_SIZE
diff --git a/newlib/libm/ld80/s_cospil.c b/newlib/libm/ld80/s_cospil.c
index 199479e9e..75ec27d0c 100644
--- a/newlib/libm/ld80/s_cospil.c
+++ b/newlib/libm/ld80/s_cospil.c
@@ -33,9 +33,9 @@
 #endif
 #include <stdint.h>
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 static const double
 pi_hi = 3.1415926814079285e+00,	/* 0x400921fb 0x58000000 */
diff --git a/newlib/libm/ld80/s_erfl.c b/newlib/libm/ld80/s_erfl.c
index 1ae2f9092..06fca5d28 100644
--- a/newlib/libm/ld80/s_erfl.c
+++ b/newlib/libm/ld80/s_erfl.c
@@ -23,9 +23,9 @@ __FBSDID("$FreeBSD$");
 #include <ieeefp.h>
 #endif
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 /* XXX Prevent compilers from erroneously constant folding: */
 static const volatile long double tiny = 0x1p-10000L;
diff --git a/newlib/libm/ld80/s_exp2l.c b/newlib/libm/ld80/s_exp2l.c
index 421d6e2e0..552956b8b 100644
--- a/newlib/libm/ld80/s_exp2l.c
+++ b/newlib/libm/ld80/s_exp2l.c
@@ -36,9 +36,9 @@ __FBSDID("$FreeBSD$");
 #include <ieeefp.h>
 #endif
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 #define	TBLBITS	7
 #define	TBLSIZE	(1 << TBLBITS)
diff --git a/newlib/libm/ld80/s_expl.c b/newlib/libm/ld80/s_expl.c
index e46e73f0c..81469e00f 100644
--- a/newlib/libm/ld80/s_expl.c
+++ b/newlib/libm/ld80/s_expl.c
@@ -47,9 +47,9 @@ __FBSDID("$FreeBSD$");
 #include <ieeefp.h>
 #endif
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 #include "k_expl.h"
 
 /* XXX Prevent compilers from erroneously constant folding these: */
diff --git a/newlib/libm/ld80/s_logl.c b/newlib/libm/ld80/s_logl.c
index c74519caf..01e541b49 100644
--- a/newlib/libm/ld80/s_logl.c
+++ b/newlib/libm/ld80/s_logl.c
@@ -85,13 +85,13 @@ __FBSDID("$FreeBSD$");
 #include <ieeefp.h>
 #endif
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
 #define	i386_SSE_GOOD
 #ifndef NO_STRUCT_RETURN
 #define	STRUCT_RETURN
 #endif
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 #if !defined(NO_UTAB) && !defined(NO_UTABL)
 #define	USE_UTAB
diff --git a/newlib/libm/ld80/s_sinpil.c b/newlib/libm/ld80/s_sinpil.c
index 4cefa9235..671a6a007 100644
--- a/newlib/libm/ld80/s_sinpil.c
+++ b/newlib/libm/ld80/s_sinpil.c
@@ -33,9 +33,9 @@
 #endif
 #include <stdint.h>
 
-#include "fpmath.h"
+#include "../ld/fpmath.h"
 #include "math.h"
-#include "math_private.h"
+#include "../ld/math_private.h"
 
 static const union IEEEl2bits
 pi_hi_u = LD80C(0xc90fdaa200000000,   1, 3.14159265346825122833e+00L),
-- 
2.31.1



More information about the Newlib mailing list