mirror of
https://github.com/bminor/glibc.git
synced 2026-06-24 08:48:41 +00:00
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.
This commit is contained in:
@@ -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.
|
||||
|
||||
|
||||
@@ -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
|
||||
<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 */
|
||||
@@ -1 +0,0 @@
|
||||
/* In s_lrint.c */
|
||||
@@ -1 +0,0 @@
|
||||
/* In s_lrintf.c */
|
||||
@@ -1 +0,0 @@
|
||||
/* In s_lround.c. */
|
||||
@@ -1 +0,0 @@
|
||||
/* In s_lroundf.c. */
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
Reference in New Issue
Block a user