diff options
40 files changed, 348 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog index d221a037ce..437667385a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,58 @@ +2016-10-06 Joseph Myers <joseph@codesourcery.com> + + * math/math.h [__GLIBC_USE (IEC_60559_BFP_EXT)] (iseqsig): New + macro. + * math/bits/mathcalls.h [__GLIBC_USE (IEC_60559_BFP_EXT)] + (__iseqsig): New declaration. + * math/s_iseqsig_template.c: New file. + * math/Versions (__iseqsigf): New libm symbol at version + GLIBC_2.25. + (__iseqsig): Likewise. + (__iseqsigl): Likewise. + * math/libm-test.inc (iseqsig_test_data): New array. + (iseqsig_test): New function. + (main): Call iseqsig_test. + * math/Makefile (gen-libm-calls): Add s_iseqsigF. + * manual/arith.texi (FP Comparison Functions): Document iseqsig. + * manual/libm-err-tab.pl: Update comment on interfaces without + ulps tabulated. + * sysdeps/generic/fix-fp-int-compare-invalid.h: New file. + * sysdeps/powerpc/fpu/fix-fp-int-compare-invalid.h: Likewise. + * sysdeps/x86/fpu/fix-fp-int-compare-invalid.h: Likewise. + * sysdeps/nacl/libm.abilist: Update. + * sysdeps/unix/sysv/linux/aarch64/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/alpha/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/arm/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/hppa/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/i386/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/ia64/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/microblaze/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/mips/mips32/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/nios2/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist: + Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist: + Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist: + Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist: + Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/sh/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist: + Likewise. + * sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist: + Likewise. + * sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/x86_64/64/libm.abilist: Likewise. + * sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist: Likewise. + 2016-10-06 Siddhesh Poyarekar <siddhesh@sourceware.org> * sysdeps/ieee754/dbl-64/s_sin.c (reduce_and_compute, do_sincos_1, diff --git a/NEWS b/NEWS index 0b2ca04d8f..b5894afce3 100644 --- a/NEWS +++ b/NEWS @@ -51,6 +51,8 @@ Version 2.25 * New <math.h> features are added from TS 18661-1:2014: + - Comparison macros: iseqsig. + - Classification macros: iscanonical, issubnormal, iszero. * The <sys/quota.h> header now includes the <linux/quota.h> header. Support diff --git a/manual/arith.texi b/manual/arith.texi index 6ecde21b7c..5fb18f3561 100644 --- a/manual/arith.texi +++ b/manual/arith.texi @@ -1873,7 +1873,8 @@ undesirable. @w{ISO C99} therefore defines comparison functions that do not raise exceptions when NaN is examined. All of the functions are implemented as macros which allow their arguments to be of any floating-point type. The macros are guaranteed to evaluate their -arguments only once. +arguments only once. TS 18661-1:2014 adds such a macro for an +equality comparison that @emph{does} raise an exception for a NaN argument. @comment math.h @comment ISO @@ -1932,6 +1933,16 @@ This macro determines whether its arguments are unordered. In other words, it is true if @var{x} or @var{y} are NaN, and false otherwise. @end deftypefn +@comment math.h +@comment ISO +@deftypefn Macro int iseqsig (@emph{real-floating} @var{x}, @emph{real-floating} @var{y}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +This macro determines whether its arguments are equal. It is +equivalent to @code{(@var{x}) == (@var{y})}, but it raises the invalid +exception and sets @code{errno} to @code{EDOM} is either argument is a +NaN. +@end deftypefn + Not all machines provide hardware support for these operations. On machines that don't, the macros can be very slow. Therefore, you should not use these functions when NaN is not a concern. diff --git a/manual/libm-err-tab.pl b/manual/libm-err-tab.pl index b36ef94325..451547871b 100755 --- a/manual/libm-err-tab.pl +++ b/manual/libm-err-tab.pl @@ -78,7 +78,7 @@ use vars qw (%results @all_floats %suffices @all_functions); "scalbn", "sin", "sincos", "sinh", "sqrt", "tan", "tanh", "tgamma", "trunc", "y0", "y1", "yn" ); # fpclassify, iscanonical, isnormal, isfinite, isinf, isnan, issignaling, -# issubnormal, iszero, signbit, isgreater, isgreaterequal, isless, +# issubnormal, iszero, signbit, iseqsig, isgreater, isgreaterequal, isless, # islessequal, islessgreater, isunordered are not tabulated. if ($#ARGV == 0) { diff --git a/math/Makefile b/math/Makefile index d2b4fd1153..a9f06080f4 100644 --- a/math/Makefile +++ b/math/Makefile @@ -51,7 +51,7 @@ gen-libm-calls = cargF conjF cimagF crealF cabsF s_cacosF \ k_casinhF s_csinhF k_casinhF s_csinhF s_catanhF s_catanF \ s_ctanF s_ctanhF s_cexpF s_clogF s_cprojF s_csqrtF \ s_cpowF s_clog10F s_fdimF s_nextdownF s_fmaxF s_fminF \ - s_nanF + s_nanF s_iseqsigF libm-calls = \ e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \ diff --git a/math/Versions b/math/Versions index f702051451..e658a1037c 100644 --- a/math/Versions +++ b/math/Versions @@ -216,6 +216,6 @@ libm { } GLIBC_2.25 { fesetexcept; fetestexceptflag; fegetmode; fesetmode; - __iscanonicall; + __iscanonicall; __iseqsigf; __iseqsig; __iseqsigl; } } diff --git a/math/bits/mathcalls.h b/math/bits/mathcalls.h index 951a3d0090..4fc18659f8 100644 --- a/math/bits/mathcalls.h +++ b/math/bits/mathcalls.h @@ -380,6 +380,9 @@ __END_NAMESPACE_C99 #endif #if __GLIBC_USE (IEC_60559_BFP_EXT) +/* Test equality. */ +__MATHDECL_1 (int, __iseqsig,, (_Mdouble_ __x, _Mdouble_ __y)); + /* Test for signaling NaN. */ __MATHDECL_1 (int, __issignaling,, (_Mdouble_ __value)) __attribute__ ((__const__)); diff --git a/math/libm-test.inc b/math/libm-test.inc index cbc7226aea..4573482f65 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -47,7 +47,7 @@ fabs, fdim, finite, floor, fma, fmax, fmin, fmod, fpclassify, frexp, gamma, hypot, ilogb, iscanonical, isfinite, isinf, isnan, isnormal, issignaling, - issubnormal, iszero, isless, islessequal, isgreater, + issubnormal, iszero, iseqsig, isless, islessequal, isgreater, isgreaterequal, islessgreater, isunordered, j0, j1, jn, ldexp, lgamma, log, log10, log1p, log2, logb, modf, nearbyint, nextafter, nexttoward, @@ -8185,6 +8185,64 @@ iscanonical_test (void) ALL_RM_TEST (iscanonical, 1, iscanonical_test_data, RUN_TEST_LOOP_f_b_tg, END); } +static const struct test_ff_i_data iseqsig_test_data[] = + { + TEST_ff_i (iseqsig, minus_zero, minus_zero, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, minus_zero, plus_zero, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, minus_zero, (FLOAT) 1, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, minus_zero, qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, minus_zero, -qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, minus_zero, snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, minus_zero, -snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, plus_zero, minus_zero, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, plus_zero, plus_zero, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, plus_zero, (FLOAT) 1, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, plus_zero, qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, plus_zero, -qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, plus_zero, snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, plus_zero, -snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, (FLOAT) 1, minus_zero, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, (FLOAT) 1, plus_zero, 0, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, (FLOAT) 1, (FLOAT) 1, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), + TEST_ff_i (iseqsig, (FLOAT) 1, qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, (FLOAT) 1, -qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, (FLOAT) 1, snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, (FLOAT) 1, -snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, qnan_value, minus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -qnan_value, minus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, qnan_value, plus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -qnan_value, plus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, qnan_value, (FLOAT) 1, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -qnan_value, (FLOAT) 1, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, snan_value, minus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -snan_value, minus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, snan_value, plus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -snan_value, plus_zero, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, snan_value, (FLOAT) 1, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -snan_value, (FLOAT) 1, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, qnan_value, qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, qnan_value, -qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -qnan_value, qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -qnan_value, -qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, snan_value, qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, snan_value, -qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -snan_value, qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -snan_value, -qnan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, qnan_value, snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, qnan_value, -snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -qnan_value, snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -qnan_value, -snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, snan_value, snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, snan_value, -snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -snan_value, snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + TEST_ff_i (iseqsig, -snan_value, -snan_value, 0, NO_INEXACT_EXCEPTION|INVALID_EXCEPTION|ERRNO_EDOM), + }; + +static void +iseqsig_test (void) +{ + ALL_RM_TEST (iseqsig, 1, iseqsig_test_data, RUN_TEST_LOOP_ff_i_tg, END); +} static const struct test_f_i_data isfinite_test_data[] = { TEST_f_b (isfinite, 0, 1, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED), @@ -12834,6 +12892,7 @@ main (int argc, char **argv) fma_test (); /* Comparison macros: */ + iseqsig_test (); isgreater_test (); isgreaterequal_test (); isless_test (); diff --git a/math/math.h b/math/math.h index 8cd641688d..394cefae02 100644 --- a/math/math.h +++ b/math/math.h @@ -531,6 +531,24 @@ extern int matherr (struct exception *__exc); #endif +#if __GLIBC_USE (IEC_60559_BFP_EXT) +/* Return X == Y but raising "invalid" and setting errno if X or Y is + a NaN. */ +# ifdef __NO_LONG_DOUBLE_MATH +# define iseqsig(x, y) \ + (sizeof ((x) + (y)) == sizeof (float) \ + ? __iseqsigf ((x), (y)) \ + : __iseqsig ((x), (y))) +# else +# define iseqsig(x, y) \ + (sizeof ((x) + (y)) == sizeof (float) \ + ? __iseqsigf ((x), (y)) \ + : sizeof ((x) + (y)) == sizeof (double) \ + ? __iseqsig ((x), (y)) \ + : __iseqsigl ((x), (y))) +# endif +#endif + __END_DECLS diff --git a/math/s_iseqsig_template.c b/math/s_iseqsig_template.c new file mode 100644 index 0000000000..ebdae6493c --- /dev/null +++ b/math/s_iseqsig_template.c @@ -0,0 +1,42 @@ +/* Test whether X == Y. + Copyright (C) 2016 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 + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <fenv.h> +#include <math.h> +#include <stdbool.h> +#include <fix-fp-int-compare-invalid.h> + +int +M_DECL_FUNC (__iseqsig) (FLOAT x, FLOAT y) +{ + /* Comparing <= and >= is sufficient to determine both whether X and + Y are equal, and whether they are unordered, while raising the + "invalid" exception if they are unordered. */ + bool cmp1 = x <= y; + bool cmp2 = x >= y; + if (cmp1 && cmp2) + return 1; + else if (!cmp1 && !cmp2) + { + if (FIX_COMPARE_INVALID) + feraiseexcept (FE_INVALID); + __set_errno (EDOM); + } + return 0; +} diff --git a/sysdeps/generic/fix-fp-int-compare-invalid.h b/sysdeps/generic/fix-fp-int-compare-invalid.h new file mode 100644 index 0000000000..42e3d1241b --- /dev/null +++ b/sysdeps/generic/fix-fp-int-compare-invalid.h @@ -0,0 +1,27 @@ +/* Fix for missing "invalid" exceptions from floating-point + comparisons. Generic version. + Copyright (C) 2016 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef FIX_FP_INT_COMPARE_INVALID_H +#define FIX_FP_INT_COMPARE_INVALID_H 1 + +/* Define this macro to 1 to work around ordered comparison operators + in C failing to raise the "invalid" exception for NaN operands. */ +#define FIX_COMPARE_INVALID 0 + +#endif /* fix-fp-int-compare-invalid.h */ diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist index 85ee684a1a..cdc65c3069 100644 --- a/sysdeps/nacl/libm.abilist +++ b/sysdeps/nacl/libm.abilist @@ -380,6 +380,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/powerpc/fpu/fix-fp-int-compare-invalid.h b/sysdeps/powerpc/fpu/fix-fp-int-compare-invalid.h new file mode 100644 index 0000000000..cb2a272d72 --- /dev/null +++ b/sysdeps/powerpc/fpu/fix-fp-int-compare-invalid.h @@ -0,0 +1,28 @@ +/* Fix for missing "invalid" exceptions from floating-point + comparisons. PowerPC version. + Copyright (C) 2016 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef FIX_FP_INT_COMPARE_INVALID_H +#define FIX_FP_INT_COMPARE_INVALID_H 1 + +/* As of GCC 5, comparisons use unordered comparison instructions when + they should use ordered comparisons + <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58684>. */ +#define FIX_COMPARE_INVALID 1 + +#endif /* fix-fp-int-compare-invalid.h */ diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist index aee63a105c..1ec00012c8 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist @@ -411,6 +411,9 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist index 339b896ac7..1edbb96e87 100644 --- a/sysdeps/unix/sysv/linux/alpha/libm.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist @@ -421,6 +421,9 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist index f7b824413b..26d9cc674b 100644 --- a/sysdeps/unix/sysv/linux/arm/libm.abilist +++ b/sysdeps/unix/sysv/linux/arm/libm.abilist @@ -69,6 +69,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist index 576b514a53..a191cd8e0b 100644 --- a/sysdeps/unix/sysv/linux/hppa/libm.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist @@ -381,6 +381,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist index 19e9792931..0a0383f016 100644 --- a/sysdeps/unix/sysv/linux/i386/libm.abilist +++ b/sysdeps/unix/sysv/linux/i386/libm.abilist @@ -424,6 +424,9 @@ GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist index 1a32e2c07d..017b0f9f7a 100644 --- a/sysdeps/unix/sysv/linux/ia64/libm.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist @@ -353,6 +353,9 @@ GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist index f7b824413b..26d9cc674b 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist @@ -69,6 +69,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist index 2a8cba458e..945d51e325 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist @@ -422,6 +422,9 @@ GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist index c59437fe73..deb4189844 100644 --- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist @@ -380,6 +380,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist index 31d6f9eb70..ceb12918e9 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist @@ -382,6 +382,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist index 83e031125b..003fe7b567 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist @@ -413,6 +413,9 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist index 151574d670..d57c3ebc1c 100644 --- a/sysdeps/unix/sysv/linux/nios2/libm.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist @@ -380,6 +380,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist index 155daf5ecd..b22ec56740 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist @@ -424,6 +424,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __fe_dfl_mode D 0x8 GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist index 7b38632475..777a39d0e1 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist @@ -423,6 +423,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __fe_dfl_mode D 0x8 GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist index 26c8d41330..1b900c7144 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist @@ -418,6 +418,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __fe_dfl_mode D 0x8 GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist index 0e76e88f7b..0a8600e29d 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist @@ -99,6 +99,9 @@ GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __fe_dfl_mode D 0x8 GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist index 377cea952a..d7fff5327f 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist @@ -411,6 +411,9 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist index dafbff15a6..4d682e604f 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist @@ -409,6 +409,9 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist index a38baceb8f..0092b62a24 100644 --- a/sysdeps/unix/sysv/linux/sh/libm.abilist +++ b/sysdeps/unix/sysv/linux/sh/libm.abilist @@ -381,6 +381,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist index 27166beb55..4ad593cbae 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist @@ -414,6 +414,9 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist index 46f7973465..90a2bd57ed 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist @@ -412,6 +412,9 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist index ec6f0b3600..5d502c0bc8 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist @@ -381,6 +381,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist index ec6f0b3600..5d502c0bc8 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist @@ -381,6 +381,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist index ec6f0b3600..5d502c0bc8 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist @@ -381,6 +381,8 @@ GLIBC_2.24 nextup F GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist index 1965316647..3364b0271d 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist @@ -413,6 +413,9 @@ GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist index 82207c9d70..6a3a3ce0ca 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist @@ -412,6 +412,9 @@ GLIBC_2.24 nextupf F GLIBC_2.24 nextupl F GLIBC_2.25 GLIBC_2.25 A GLIBC_2.25 __iscanonicall F +GLIBC_2.25 __iseqsig F +GLIBC_2.25 __iseqsigf F +GLIBC_2.25 __iseqsigl F GLIBC_2.25 fegetmode F GLIBC_2.25 fesetexcept F GLIBC_2.25 fesetmode F diff --git a/sysdeps/x86/fpu/fix-fp-int-compare-invalid.h b/sysdeps/x86/fpu/fix-fp-int-compare-invalid.h new file mode 100644 index 0000000000..6052280371 --- /dev/null +++ b/sysdeps/x86/fpu/fix-fp-int-compare-invalid.h @@ -0,0 +1,28 @@ +/* Fix for missing "invalid" exceptions from floating-point + comparisons. x86 version. + Copyright (C) 2016 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 + <http://www.gnu.org/licenses/>. */ + +#ifndef FIX_FP_INT_COMPARE_INVALID_H +#define FIX_FP_INT_COMPARE_INVALID_H 1 + +/* As of GCC 5, both x87 and SSE comparisons use unordered comparison + instructions when they should use ordered comparisons + <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52451>. */ +#define FIX_COMPARE_INVALID 1 + +#endif /* fix-fp-int-compare-invalid.h */ |