From: Adhemerval Zanella Date: Mon, 25 Aug 2025 15:53:56 +0000 (-0300) Subject: alpha: Fix missing inexact-flag raising in a lot of cases X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Fazanella%2Falpha-fixes;p=thirdparty%2Fglibc.git alpha: Fix missing inexact-flag raising in a lot of cases The alpha uses -mieee, which is fully IEEE-compliant code except that the inexact-flag. However, a lot of functions now assumes fully IEEE compliant, including inexact-flag. This patch changes it to use -mieee-with-inexact instead, which is simpler and more comprensible to just turn is implementation by implementation (as done for fma). The l*[rint|round]f codes uses alpha inline assembly, which also not fully IEEE compliant. Use the software fallback implementation instead. --- diff --git a/sysdeps/alpha/Makefile b/sysdeps/alpha/Makefile index 5e143b335ba..5f2666d3344 100644 --- a/sysdeps/alpha/Makefile +++ b/sysdeps/alpha/Makefile @@ -38,19 +38,17 @@ CFLAGS-rtld.c = -mbuild-constants endif ifeq ($(subdir),math) -# The fma routines rely on inexact being raised for correct results. -CFLAGS-s_fma.c = -mieee-with-inexact -CFLAGS-s_fmaf.c = -mieee-with-inexact # This test tries to check for inexact being raised by arithmetic. CFLAGS-test-misc.c += -mieee-with-inexact # Avoid "conflicting types for built-in function" warnings CFLAGS-s_isnan.c += -fno-builtin-isnanf endif -# Build everything with full IEEE math support, and with dynamic rounding; -# there are a number of math routines that are defined to work with the -# "current" rounding mode, and it's easiest to set this with all of them. -sysdep-CFLAGS += -mieee -mfp-rounding-mode=d +# Build everything with full IEEE math support (including inexact-flag)), +# and with dynamic rounding; there are a number of math routines that are +# defined to work with the "current" rounding mode, and it's easiest to set +# this with all of them. +sysdep-CFLAGS += -mieee-with-inexact -mfp-rounding-mode=d # Software floating-point emulation. diff --git a/sysdeps/alpha/fpu/s_lrint.c b/sysdeps/alpha/fix-fp-int-convert-overflow.h similarity index 55% rename from sysdeps/alpha/fpu/s_lrint.c rename to sysdeps/alpha/fix-fp-int-convert-overflow.h index 998918c839d..a14a3d962b0 100644 --- a/sysdeps/alpha/fpu/s_lrint.c +++ b/sysdeps/alpha/fix-fp-int-convert-overflow.h @@ -1,4 +1,5 @@ -/* Copyright (C) 2007-2025 Free Software Foundation, Inc. +/* Fix for conversion of floating point to integer overflow. Alpha version. + Copyright (C) 2025 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -12,27 +13,18 @@ Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see + License along with the GNU C Library; if not, see . */ -#define __llrint not___llrint -#define llrint not_llrint -#include -#include -#include -#undef __llrint -#undef llrint +#ifndef FIX_FP_INT_CONVERT_OVERFLOW_H +#define FIX_FP_INT_CONVERT_OVERFLOW_H 1 -long int -__lrint (double x) -{ - long ret; +#define FIX_FLT_LLONG_CONVERT_OVERFLOW 1 +#define FIX_DBL_LLONG_CONVERT_OVERFLOW 1 +#define FIX_LDBL_LLONG_CONVERT_OVERFLOW 1 - __asm ("cvttq/svd %1,%0" : "=&f"(ret) : "f"(x)); +#define FIX_FLT_LONG_CONVERT_OVERFLOW 1 +#define FIX_DBL_LONG_CONVERT_OVERFLOW 1 +#define FIX_LDBL_LONG_CONVERT_OVERFLOW 1 - return ret; -} - -strong_alias (__lrint, __llrint) -libm_alias_double (__lrint, lrint) -libm_alias_double (__llrint, llrint) +#endif /* fix-fp-int-convert-overflow.h */ diff --git a/sysdeps/alpha/fpu/s_llrint.c b/sysdeps/alpha/fpu/s_llrint.c deleted file mode 100644 index 5db97be037d..00000000000 --- a/sysdeps/alpha/fpu/s_llrint.c +++ /dev/null @@ -1 +0,0 @@ -/* In s_lrint.c */ diff --git a/sysdeps/alpha/fpu/s_llrintf.c b/sysdeps/alpha/fpu/s_llrintf.c deleted file mode 100644 index 18f2885ef79..00000000000 --- a/sysdeps/alpha/fpu/s_llrintf.c +++ /dev/null @@ -1 +0,0 @@ -/* In s_lrintf.c */ diff --git a/sysdeps/alpha/fpu/s_llround.c b/sysdeps/alpha/fpu/s_llround.c deleted file mode 100644 index b212fbd8e54..00000000000 --- a/sysdeps/alpha/fpu/s_llround.c +++ /dev/null @@ -1 +0,0 @@ -/* In s_lround.c. */ diff --git a/sysdeps/alpha/fpu/s_llroundf.c b/sysdeps/alpha/fpu/s_llroundf.c deleted file mode 100644 index 73bdf3103fb..00000000000 --- a/sysdeps/alpha/fpu/s_llroundf.c +++ /dev/null @@ -1 +0,0 @@ -/* In s_lroundf.c. */ diff --git a/sysdeps/alpha/fpu/s_lrintf.c b/sysdeps/alpha/fpu/s_lrintf.c deleted file mode 100644 index 47894c9952d..00000000000 --- a/sysdeps/alpha/fpu/s_lrintf.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 2007-2025 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#define __llrintf not___llrintf -#define llrintf not_llrintf -#include -#include -#undef __llrintf -#undef llrintf - -long int -__lrintf (float x) -{ - double tmp; - long ret; - - __asm ("cvtst/s %2,%1\n\tcvttq/svd %1,%0" - : "=&f"(ret), "=&f"(tmp) : "f"(x)); - - return ret; -} - -strong_alias (__lrintf, __llrintf) -libm_alias_float (__lrint, lrint) -libm_alias_float (__llrint, llrint) diff --git a/sysdeps/alpha/fpu/s_lround.c b/sysdeps/alpha/fpu/s_lround.c deleted file mode 100644 index 25a5a5a2fce..00000000000 --- a/sysdeps/alpha/fpu/s_lround.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2007-2025 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#define __llround not___llround -#define llround not_llround -#include -#include -#include -#undef __llround -#undef llround - -long int -__lround (double x) -{ - double adj, y; - - adj = copysign (0.5, x); - asm("addt/suc %1,%2,%0" : "=&f"(y) : "f"(x), "f"(adj)); - return y; -} - -strong_alias (__lround, __llround) -libm_alias_double (__lround, lround) -libm_alias_double (__llround, llround) diff --git a/sysdeps/alpha/fpu/s_lroundf.c b/sysdeps/alpha/fpu/s_lroundf.c deleted file mode 100644 index 300cd4613bc..00000000000 --- a/sysdeps/alpha/fpu/s_lroundf.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2007-2025 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - . */ - -#define __llroundf not___llroundf -#define llroundf not_llroundf -#include -#include -#undef __llroundf -#undef llroundf - - -long int -__lroundf (float x) -{ - float adj, y; - - adj = copysignf (0.5f, x); - asm("adds/suc %1,%2,%0" : "=&f"(y) : "f"(x), "f"(adj)); - return y; -} - -strong_alias (__lroundf, __llroundf) -libm_alias_float (__lround, lround) -libm_alias_float (__llround, llround)