]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
alpha: Fix missing inexact-flag raising in a lot of cases azanella/alpha-fixes
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 25 Aug 2025 15:53:56 +0000 (12:53 -0300)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 25 Aug 2025 16:08:39 +0000 (13:08 -0300)
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.

sysdeps/alpha/Makefile
sysdeps/alpha/fix-fp-int-convert-overflow.h [moved from sysdeps/alpha/fpu/s_lrint.c with 55% similarity]
sysdeps/alpha/fpu/s_llrint.c [deleted file]
sysdeps/alpha/fpu/s_llrintf.c [deleted file]
sysdeps/alpha/fpu/s_llround.c [deleted file]
sysdeps/alpha/fpu/s_llroundf.c [deleted file]
sysdeps/alpha/fpu/s_lrintf.c [deleted file]
sysdeps/alpha/fpu/s_lround.c [deleted file]
sysdeps/alpha/fpu/s_lroundf.c [deleted file]

index 5e143b335bafaab49bf95b8b97b7dd0391208320..5f2666d3344bc93e942c2f34a168d6d491568374 100644 (file)
@@ -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.
 
similarity index 55%
rename from sysdeps/alpha/fpu/s_lrint.c
rename to sysdeps/alpha/fix-fp-int-convert-overflow.h
index 998918c839dda7d12ff8fe488f068c2a398d0fe6..a14a3d962b0f036ca329252d8478ade9faa8255b 100644 (file)
@@ -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
    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
    <https://www.gnu.org/licenses/>.  */
 
-#define __llrint       not___llrint
-#define llrint         not_llrint
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <libm-alias-double.h>
-#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 (file)
index 5db97be..0000000
+++ /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 (file)
index 18f2885..0000000
+++ /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 (file)
index b212fbd..0000000
+++ /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 (file)
index 73bdf31..0000000
+++ /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 (file)
index 47894c9..0000000
+++ /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
-   <https://www.gnu.org/licenses/>.  */
-
-#define __llrintf      not___llrintf
-#define llrintf                not_llrintf
-#include <math.h>
-#include <libm-alias-float.h>
-#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 (file)
index 25a5a5a..0000000
+++ /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
-   <https://www.gnu.org/licenses/>.  */
-
-#define __llround      not___llround
-#define llround                not_llround
-#include <math.h>
-#include <math_ldbl_opt.h>
-#include <libm-alias-double.h>
-#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 (file)
index 300cd46..0000000
+++ /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
-   <https://www.gnu.org/licenses/>.  */
-
-#define __llroundf     not___llroundf
-#define llroundf       not_llroundf
-#include <math.h>
-#include <libm-alias-float.h>
-#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)