[QUESTION/PATCH] How to deal with 64bit long double on aarch64-w64-mingw32 and aarch64-pc-cygwin?
Corinna Vinschen
vinschen@redhat.com
Mon Jul 14 15:46:33 GMT 2025
Jeff, can you chime in here? Libm is something I never quite got my
head wrapped around.
Thanks,
Corinna
On Jul 11 11:13, Radek Barton wrote:
> Hello.
>
> Windows Arm64 ABI has `sizeof(long double) == 8` (https://godbolt.org/z/EYG74K67j) and `#define __LDBL_MANT_DIG__ 53` for which `aarch64-w64-mingw32` and `aarch64-pc-cygwin` build of `libm` fails on
>
> ```
> ../../../code/cygwin/newlib/libm/ld/invtrig.h:32:2: error: #error "Unsupported long double format"
> 32 | #error "Unsupported long double format"
> | ^~~~~
> ```
>
> How would you prefer to handle this situation?
>
> If disabling build of 80bit and 128bit math functions is the answer, please let me ask you for your feedback on the attached patch.
>
> Thank you,
>
> Radek
>
> ---
> >From 595e6e42a47e39c6964e26c2147bffc0ffef2f52 Mon Sep 17 00:00:00 2001
> From: Martin Vejbora <martin.vejbora@microsoft.com>
> Date: Tue, 28 Jan 2025 21:44:06 +0100
> Subject: [PATCH] newlib: disable 80bit or 128bit long double math for
> aarch64-w64-mingw32 and aarch64-pc-cygwin
> MIME-Version: 1.0
> Content-Type: text/plain; charset=UTF-8
> Content-Transfer-Encoding: 8bit
>
> Don't build long double newlib/libm for Windows on AArch64 as newlib/libm
> supports only 80bit or 128bit long doubles. Use 64bit math functions where
> needed.
>
> The newlib/Makefile.in file was updated using autoreconf command.
>
> Signed-off-by: Martin Vejbora <martin.vejbora@microsoft.com>
> Co-authored-by: Radek Barton <radek.barton@microsoft.com>
> ---
> newlib/Makefile.in | 60 +++++++++++++++++++++++++---------------
> newlib/configure | 10 ++++++-
> newlib/libc/acinclude.m4 | 9 +++++-
> newlib/libm/Makefile.inc | 4 ++-
> 4 files changed, 57 insertions(+), 26 deletions(-)
>
> diff --git a/newlib/Makefile.in b/newlib/Makefile.in
> index c5492c6b6..f850be805 100644
> --- a/newlib/Makefile.in
> +++ b/newlib/Makefile.in
> @@ -974,9 +974,9 @@ check_PROGRAMS =
> @HAVE_FPMATH_H_TRUE@am__append_141 =
> @HAVE_FPMATH_H_TRUE@am__append_142 =
> @HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_143 = $(libm_machine_aarch64_src)
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_144 = $(libm_ld128_lsrc)
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_145 =
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_146 =
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_144 = $(libm_ld128_lsrc)
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_145 =
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__append_146 =
> @HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__append_147 = $(libm_machine_amdgcn_src)
> @HAVE_LIBM_MACHINE_ARM_TRUE@am__append_148 = $(libm_machine_arm_src)
> @HAVE_LIBM_MACHINE_I386_TRUE@am__append_149 = $(libm_machine_i386_src)
> @@ -3262,6 +3262,32 @@ am__objects_159 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-fetestexcept.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-feupdateenv.$(OBJEXT)
> @HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_161 = $(am__objects_160)
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects_162 = libm/ld128/libm_a-e_powl.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_erfl.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_exp2l.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_expl.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_logl.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-b_tgammal.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-invtrig.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-e_lgammal_r.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-k_cosl.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-k_sinl.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-k_tanl.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_sinpil.$(OBJEXT) \
> +@HAVE_FPMATH_H_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_cospil.$(OBJEXT)
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_162 = libm/ld128/libm_a-e_powl.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_erfl.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_exp2l.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_expl.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_logl.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-b_tgammal.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-invtrig.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-e_lgammal_r.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_cosl.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_sinl.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_tanl.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_sinpil.$(OBJEXT) \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_cospil.$(OBJEXT)
> @HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects_162 = libm/ld128/libm_a-e_powl.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_erfl.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_exp2l.$(OBJEXT) \
> @@ -3275,20 +3301,7 @@ am__objects_159 = libm/fenv/libm_a-feclearexcept.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-k_tanl.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_sinpil.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/libm_a-s_cospil.$(OBJEXT)
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_162 = libm/ld128/libm_a-e_powl.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_erfl.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_exp2l.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_expl.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_logl.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-b_tgammal.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-invtrig.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-e_lgammal_r.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_cosl.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_sinl.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-k_tanl.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_sinpil.$(OBJEXT) \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_cospil.$(OBJEXT)
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_163 = $(am__objects_162)
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_163 = $(am__objects_162)
> @HAVE_LIBM_MACHINE_AMDGCN_TRUE@am__objects_164 = libm/machine/amdgcn/libm_a-v64_mathcnst.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64_reent.$(OBJEXT) \
> @HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/libm_a-v64df_acos.$(OBJEXT) \
> @@ -4006,6 +4019,7 @@ pdfdir = @pdfdir@
> prefix = @prefix@
> program_transform_name = @program_transform_name@
> psdir = @psdir@
> +runstatedir = @runstatedir@
> sbindir = @sbindir@
> shared_machine_dir = @shared_machine_dir@
> sharedstatedir = @sharedstatedir@
> @@ -5099,11 +5113,11 @@ libm_test_test_LDADD = $(CRT0) libm.a libc.a
> @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/fetestexcept.c \
> @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/feupdateenv.c
>
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@libm_ld128_lsrc = \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/e_powl.c libm/ld128/s_erfl.c libm/ld128/s_exp2l.c libm/ld128/s_expl.c \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/s_logl.c libm/ld128/b_tgammal.c libm/ld128/invtrig.c \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/e_lgammal_r.c libm/ld128/k_cosl.c libm/ld128/k_sinl.c \
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/k_tanl.c libm/ld128/s_sinpil.c libm/ld128/s_cospil.c
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@libm_ld128_lsrc = \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/e_powl.c libm/ld128/s_erfl.c libm/ld128/s_exp2l.c libm/ld128/s_expl.c \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/s_logl.c libm/ld128/b_tgammal.c libm/ld128/invtrig.c \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/e_lgammal_r.c libm/ld128/k_cosl.c libm/ld128/k_sinl.c \
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/k_tanl.c libm/ld128/s_sinpil.c libm/ld128/s_cospil.c
>
> @HAVE_LIBM_MACHINE_RISCV_TRUE@libm_ld128_lsrc = \
> @HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/e_powl.c libm/ld128/s_erfl.c libm/ld128/s_exp2l.c libm/ld128/s_expl.c \
> @@ -5111,7 +5125,7 @@ libm_test_test_LDADD = $(CRT0) libm.a libc.a
> @HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/e_lgammal_r.c libm/ld128/k_cosl.c libm/ld128/k_sinl.c \
> @HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128/k_tanl.c libm/ld128/s_sinpil.c libm/ld128/s_cospil.c
>
> -@HAVE_LIBM_MACHINE_AARCH64_TRUE@libm_a_CFLAGS_libm_ld128 = -fbuiltin -fno-math-errno
> +@HAVE_FPMATH_H_TRUE@@HAVE_LIBM_MACHINE_AARCH64_TRUE@libm_a_CFLAGS_libm_ld128 = -fbuiltin -fno-math-errno
> @HAVE_LIBM_MACHINE_RISCV_TRUE@libm_a_CFLAGS_libm_ld128 = -fbuiltin -fno-math-errno
> @HAVE_LIBM_MACHINE_AMDGCN_TRUE@libm_machine_amdgcn_src = \
> @HAVE_LIBM_MACHINE_AMDGCN_TRUE@ libm/machine/amdgcn/v64_mathcnst.c \
> diff --git a/newlib/configure b/newlib/configure
> index 33a2ed1c5..004a4a997 100755
> --- a/newlib/configure
> +++ b/newlib/configure
> @@ -6198,7 +6198,15 @@ else
> fi
>
>
> - if test -r "${srcdir}/libc/machine/${machine_dir}/machine/_fpmath.h"; then
> +case $host in
> + aarch64-*-mingw* | aarch64-*-cygwin*)
> + IS_AARCH64_WINDOWS=yes ;;
> + *)
> + IS_AARCH64_WINDOWS=no ;;
> +esac
> +
> +
> + if (test -r "${srcdir}/libc/machine/${machine_dir}/machine/_fpmath.h") && (test $IS_AARCH64_WINDOWS = no); then
> HAVE_FPMATH_H_TRUE=
> HAVE_FPMATH_H_FALSE='#'
> else
> diff --git a/newlib/libc/acinclude.m4 b/newlib/libc/acinclude.m4
> index 52a6c57cf..ef9fc1d27 100644
> --- a/newlib/libc/acinclude.m4
> +++ b/newlib/libc/acinclude.m4
> @@ -63,7 +63,14 @@ 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")
> +case $host in
> + aarch64-*-mingw* | aarch64-*-cygwin*)
> + IS_AARCH64_WINDOWS=yes ;;
> + *)
> + IS_AARCH64_WINDOWS=no ;;
> +esac
> +
> +AM_CONDITIONAL(HAVE_FPMATH_H, (test -r "${srcdir}/libc/machine/${machine_dir}/machine/_fpmath.h") && (test $IS_AARCH64_WINDOWS = no))
>
>
> AM_CONDITIONAL(MACH_ADD_SETJMP, test "x$mach_add_setjmp" = "xtrue")
> diff --git a/newlib/libm/Makefile.inc b/newlib/libm/Makefile.inc
> index bf31b1be7..c191a4473 100644
> --- a/newlib/libm/Makefile.inc
> +++ b/newlib/libm/Makefile.inc
> @@ -55,8 +55,10 @@ include %D%/test/Makefile.inc
>
> if HAVE_LIBM_MACHINE_AARCH64
> include %D%/machine/aarch64/Makefile.inc
> +if HAVE_FPMATH_H
> include %D%/ld128/Makefile.inc
> -endif
> +endif # HAVE_FPMATH_H
> +endif # HAVE_LIBM_MACHINE_AARCH64
> if HAVE_LIBM_MACHINE_AMDGCN
> include %D%/machine/amdgcn/Makefile.inc
> endif
> --
> 2.50.1.vfs.0.0
>
More information about the Newlib
mailing list