Re: [QUESTION/PATCH] How to deal with 64bit long double on aarch64-w64-mingw32 and aarch64-pc-cygwin?
Corinna Vinschen via Newlib <[email protected]>
| Newsgroups | gmane.comp.lib.newlib |
|---|---|
| Message-ID | <[email protected]> |
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 <[email protected]> > 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 <[email protected]> > Co-authored-by: Radek Barton <[email protected]> > --- > 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 >