From: Joseph Myers Date: Tue, 16 Aug 2016 16:16:10 +0000 (+0000) Subject: Add fesetexcept. X-Git-Tag: glibc-2.25~622 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5146356f5a72c3c660cd782c9eaafbe767817050;p=thirdparty%2Fglibc.git Add fesetexcept. TS 18661-1 defines an fesetexcept function for setting floating-point exception flags without the side-effect of causing enabled traps to be taken. This patch series implements this function for glibc. The present patch adds the fallback stub implementation, x86 and x86_64 implementations, documentation, tests and ABI baseline updates. The remaining patches, some of them untested, add implementations for other architectures. The implementations generally follow those of the fesetexceptflag function. As for fesetexceptflag, the approach taken for architectures where setting flags causes enabled traps to be taken is to set the flags (and potentially cause traps) rather than refusing to set the flags and returning an error. Since ISO C and TS 18661 provide no way to enable traps, this is formally in accordance with the standards. The NEWS entry should be considered a placeholder, since this patch series is intended to be followed by further such series adding other TS 18661-1 features, so that the NEWS entry would end up looking more like * New features from TS 18661-1:2014 are added to libm: the fesetexcept, fetestexceptflag, fegetmode and fesetmode functions, the femode_t type and the FE_DFL_MODE macro. with hopefully more such entries for other features, rather than having an entry for a single function in the end. I believe we have consensus for adding TS 18661-1 interfaces as per . Tested for x86_64, x86, mips64 (hard float, and soft float to test the fallback version), arm (hard float) and powerpc (hard float, soft float and e500). * math/fesetexcept.c: New file. * sysdeps/i386/fpu/fesetexcept.c: Likewise. * sysdeps/x86_64/fpu/fesetexcept.c: Likewise. * math/fenv.h: Define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include instead of including . [__GLIBC_USE (IEC_60559_BFP_EXT)] (fesetexcept): New function declaration. * manual/arith.texi (fesetexcept): Document function. * math/Versions (fesetexcept): New libm symbol at version GLIBC_2.25. * math/Makefile (libm-support): Add fesetexcept. (tests): Add test-fesetexcept and test-fesetexcept-traps. * math/test-fesetexcept.c: New file. * math/test-fesetexcept-traps.c: 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. --- diff --git a/ChangeLog b/ChangeLog index 87fcf32f026..3c90d9c852e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,54 @@ +2016-08-16 Joseph Myers + + * math/fesetexcept.c: New file. + * sysdeps/i386/fpu/fesetexcept.c: Likewise. + * sysdeps/x86_64/fpu/fesetexcept.c: Likewise. + * math/fenv.h: Define + __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION and include + instead of including . + [__GLIBC_USE (IEC_60559_BFP_EXT)] (fesetexcept): New function + declaration. + * manual/arith.texi (fesetexcept): Document function. + * math/Versions (fesetexcept): New libm symbol at version + GLIBC_2.25. + * math/Makefile (libm-support): Add fesetexcept. + (tests): Add test-fesetexcept and test-fesetexcept-traps. + * math/test-fesetexcept.c: New file. + * math/test-fesetexcept-traps.c: 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-08-16 Florian Weimer * nptl/tst-tls3.c (default_stack_size_in_mb, stack_size_in_mb): diff --git a/NEWS b/NEWS index 415ba3dcb9a..fdcd7e7a0cf 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,8 @@ Version 2.25 presently cannot avoid being compiled under _GNU_SOURCE, exacerbating the problem. +* The fesetexcept function from TS 18661-1:2014 is added to libm. + Security related changes: On ARM EABI (32-bit), generating a backtrace for execution contexts which diff --git a/manual/arith.texi b/manual/arith.texi index ea8ff48618e..8dcd409cbd4 100644 --- a/manual/arith.texi +++ b/manual/arith.texi @@ -757,6 +757,18 @@ The function returns zero in case the operation was successful, a non-zero value otherwise. @end deftypefun +@comment fenv.h +@comment ISO +@deftypefun int fesetexcept (int @var{excepts}) +@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}} +This function sets the supported exception flags indicated by +@var{excepts}, like @code{feraiseexcept}, but without causing enabled +traps to be taken. @code{fesetexcept} is from TS 18661-1:2014. + +The function returns zero in case the operation was successful, a +non-zero value otherwise. +@end deftypefun + @comment fenv.h @comment ISO @deftypefun int fetestexcept (int @var{excepts}) diff --git a/math/Makefile b/math/Makefile index 1da17971982..38a47098022 100644 --- a/math/Makefile +++ b/math/Makefile @@ -41,7 +41,7 @@ libm-support = s_lib_version s_matherr s_signgam \ fclrexcpt fgetexcptflg fraiseexcpt fsetexcptflg \ ftestexcept fegetround fesetround fegetenv feholdexcpt \ fesetenv feupdateenv t_exp fedisblxcpt feenablxcpt \ - fegetexcept + fegetexcept fesetexcept libm-calls = \ e_acosF e_acoshF e_asinF e_atan2F e_atanhF e_coshF e_expF e_fmodF \ @@ -146,7 +146,8 @@ tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \ test-nearbyint-except-2 test-signgam-uchar test-signgam-uchar-init \ test-signgam-uint test-signgam-uint-init test-signgam-ullong \ test-signgam-ullong-init test-nan-overflow test-nan-payload \ - test-fexcept test-fexcept-traps $(tests-static) + test-fexcept test-fexcept-traps test-fesetexcept \ + test-fesetexcept-traps $(tests-static) tests-static = test-fpucw-static test-fpucw-ieee-static \ test-signgam-uchar-static test-signgam-uchar-init-static \ test-signgam-uint-static test-signgam-uint-init-static \ diff --git a/math/Versions b/math/Versions index 467d7ed3b51..ff4e4d42925 100644 --- a/math/Versions +++ b/math/Versions @@ -214,4 +214,7 @@ libm { nextup; nextupf; nextupl; nextdown; nextdownf; nextdownl; } + GLIBC_2.25 { + fesetexcept; + } } diff --git a/math/fenv.h b/math/fenv.h index 9a1e112f72f..7f4ceb744ca 100644 --- a/math/fenv.h +++ b/math/fenv.h @@ -22,7 +22,8 @@ #ifndef _FENV_H #define _FENV_H 1 -#include +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include /* Get the architecture dependend definitions. The following definitions are expected to be done: @@ -70,6 +71,12 @@ extern int fegetexceptflag (fexcept_t *__flagp, int __excepts) __THROW; /* Raise the supported exceptions represented by EXCEPTS. */ extern int feraiseexcept (int __excepts) __THROW; +#if __GLIBC_USE (IEC_60559_BFP_EXT) +/* Set the supported exception flags represented by EXCEPTS, without + causing enabled traps to be taken. */ +extern int fesetexcept (int __excepts) __THROW; +#endif + /* Set complete status for exceptions indicated by EXCEPTS according to the representation in the object pointed to by FLAGP. */ extern int fesetexceptflag (const fexcept_t *__flagp, int __excepts) __THROW; diff --git a/math/fesetexcept.c b/math/fesetexcept.c new file mode 100644 index 00000000000..892d8adc5f0 --- /dev/null +++ b/math/fesetexcept.c @@ -0,0 +1,27 @@ +/* Set given exception flags. + 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 + . */ + +#include + +int +fesetexcept (int excepts) +{ + /* This always fails unless nothing needs to be done. */ + return (excepts != 0); +} +stub_warning (fesetexcept) diff --git a/math/test-fesetexcept-traps.c b/math/test-fesetexcept-traps.c new file mode 100644 index 00000000000..c40b5bc2b84 --- /dev/null +++ b/math/test-fesetexcept-traps.c @@ -0,0 +1,68 @@ +/* Test fesetexcept: exception traps enabled. + 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 + . */ + +#include +#include +#include + +static int +do_test (void) +{ + int result = 0; + + fedisableexcept (FE_ALL_EXCEPT); + int ret = feenableexcept (FE_ALL_EXCEPT); + if (!EXCEPTION_ENABLE_SUPPORTED (FE_ALL_EXCEPT) && (ret == -1)) + { + puts ("feenableexcept (FE_ALL_EXCEPT) not supported, cannot test"); + return 77; + } + else if (ret != 0) + { + puts ("feenableexcept (FE_ALL_EXCEPT) failed"); + result = 1; + return result; + } + + if (EXCEPTION_SET_FORCES_TRAP) + { + puts ("setting exceptions traps, cannot test on this architecture"); + return 77; + } + /* Verify fesetexcept does not cause exception traps. */ + ret = fesetexcept (FE_ALL_EXCEPT); + if (ret == 0) + puts ("fesetexcept (FE_ALL_EXCEPT) succeeded"); + else + { + puts ("fesetexcept (FE_ALL_EXCEPT) failed"); + if (EXCEPTION_TESTS (float)) + { + puts ("failure of fesetexcept was unexpected"); + result = 1; + } + else + puts ("failure of fesetexcept OK"); + } + feclearexcept (FE_ALL_EXCEPT); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/math/test-fesetexcept.c b/math/test-fesetexcept.c new file mode 100644 index 00000000000..912a9a6bade --- /dev/null +++ b/math/test-fesetexcept.c @@ -0,0 +1,129 @@ +/* Test fesetexcept. + 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 + . */ + +#include +#include +#include + +static int +test_fesetexcept (int exc, const char *exc_name) +{ + int result = 0; + + printf ("Testing %s\n", exc_name); + feclearexcept (FE_ALL_EXCEPT); + int ret = fesetexcept (exc); + if (ret == 0) + printf ("fesetexcept (%s) succeeded\n", exc_name); + else + { + printf ("fesetexcept (%s) failed\n", exc_name); + if (exc == 0 || EXCEPTION_TESTS (float)) + { + puts ("failure of fesetexcept was unexpected"); + result = 1; + } + else + puts ("failure of fesetexcept OK, skipping further tests"); + return result; + } + ret = fetestexcept (FE_ALL_EXCEPT); + if (ret != exc) + { + printf ("raised exceptions %x, expected %x\n", + (unsigned int) ret, (unsigned int) exc); + result = 1; + } + + ret = feraiseexcept (FE_ALL_EXCEPT); + if (ret != 0) + { + if (exc == 0 && !EXCEPTION_TESTS (float)) + { + puts ("feraiseexcept (FE_ALL_EXCEPT) failed, skipping further tests"); + return result; + } + puts ("feraiseexcept (FE_ALL_EXCEPT) unexpectedly failed"); + result = 1; + } + ret = fesetexcept (exc); + if (ret != 0) + { + puts ("fesetexcept (second test) unexpectedly failed"); + result = 1; + } + ret = fetestexcept (FE_ALL_EXCEPT); + if (ret != FE_ALL_EXCEPT) + { + printf ("raised exceptions (second test) %x, expected %x\n", + (unsigned int) ret, (unsigned int) FE_ALL_EXCEPT); + result = 1; + } + + feclearexcept (FE_ALL_EXCEPT); + ret = feraiseexcept (FE_ALL_EXCEPT & ~exc); + if (ret != 0) + { + puts ("feraiseexcept (third test) unexpectedly failed"); + result = 1; + } + ret = fesetexcept (exc); + if (ret != 0) + { + puts ("fesetexcept (third test) unexpectedly failed"); + result = 1; + } + ret = fetestexcept (FE_ALL_EXCEPT); + if (ret != FE_ALL_EXCEPT) + { + printf ("raised exceptions (third test) %x, expected %x\n", + (unsigned int) ret, (unsigned int) FE_ALL_EXCEPT); + result = 1; + } + + return result; +} + +static int +do_test (void) +{ + int result = 0; + + result |= test_fesetexcept (0, "0"); + result |= test_fesetexcept (FE_ALL_EXCEPT, "FE_ALL_EXCEPT"); +#ifdef FE_DIVBYZERO + result |= test_fesetexcept (FE_DIVBYZERO, "FE_DIVBYZERO"); +#endif +#ifdef FE_INEXACT + result |= test_fesetexcept (FE_INEXACT, "FE_INEXACT"); +#endif +#ifdef FE_INVALID + result |= test_fesetexcept (FE_INVALID, "FE_INVALID"); +#endif +#ifdef FE_OVERFLOW + result |= test_fesetexcept (FE_OVERFLOW, "FE_OVERFLOW"); +#endif +#ifdef FE_UNDERFLOW + result |= test_fesetexcept (FE_UNDERFLOW, "FE_UNDERFLOW"); +#endif + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/i386/fpu/fesetexcept.c b/sysdeps/i386/fpu/fesetexcept.c new file mode 100644 index 00000000000..eeb0c7f90b7 --- /dev/null +++ b/sysdeps/i386/fpu/fesetexcept.c @@ -0,0 +1,31 @@ +/* Set given exception flags. i386 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 + . */ + +#include + +int +fesetexcept (int excepts) +{ + fenv_t temp; + + __asm__ ("fnstenv %0" : "=m" (*&temp)); + temp.__status_word |= excepts & FE_ALL_EXCEPT; + __asm__ ("fldenv %0" : : "m" (*&temp)); + + return 0; +} diff --git a/sysdeps/nacl/libm.abilist b/sysdeps/nacl/libm.abilist index 838fedeacf8..b50f0298435 100644 --- a/sysdeps/nacl/libm.abilist +++ b/sysdeps/nacl/libm.abilist @@ -379,3 +379,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/aarch64/libm.abilist b/sysdeps/unix/sysv/linux/aarch64/libm.abilist index 781d2d35716..01b01b72b3d 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libm.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libm.abilist @@ -410,3 +410,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/alpha/libm.abilist b/sysdeps/unix/sysv/linux/alpha/libm.abilist index f342c6b1dad..9ba817d5ee2 100644 --- a/sysdeps/unix/sysv/linux/alpha/libm.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libm.abilist @@ -420,6 +420,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.3.4 GLIBC_2.3.4 A GLIBC_2.3.4 __c1_cabsf F GLIBC_2.3.4 __c1_cacosf F diff --git a/sysdeps/unix/sysv/linux/arm/libm.abilist b/sysdeps/unix/sysv/linux/arm/libm.abilist index 7a02fb1726e..d9a6f6f9aa3 100644 --- a/sysdeps/unix/sysv/linux/arm/libm.abilist +++ b/sysdeps/unix/sysv/linux/arm/libm.abilist @@ -68,6 +68,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 _LIB_VERSION D 0x4 GLIBC_2.4 __clog10 F diff --git a/sysdeps/unix/sysv/linux/hppa/libm.abilist b/sysdeps/unix/sysv/linux/hppa/libm.abilist index bf40ddf929a..75d4797084b 100644 --- a/sysdeps/unix/sysv/linux/hppa/libm.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libm.abilist @@ -380,5 +380,7 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 exp2l F diff --git a/sysdeps/unix/sysv/linux/i386/libm.abilist b/sysdeps/unix/sysv/linux/i386/libm.abilist index 92e94022c71..17b6d6d1ee4 100644 --- a/sysdeps/unix/sysv/linux/i386/libm.abilist +++ b/sysdeps/unix/sysv/linux/i386/libm.abilist @@ -422,4 +422,6 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A diff --git a/sysdeps/unix/sysv/linux/ia64/libm.abilist b/sysdeps/unix/sysv/linux/ia64/libm.abilist index e2737a2ba96..d2d89785fe7 100644 --- a/sysdeps/unix/sysv/linux/ia64/libm.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libm.abilist @@ -351,4 +351,6 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist index 7a02fb1726e..d9a6f6f9aa3 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libm.abilist @@ -68,6 +68,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 _LIB_VERSION D 0x4 GLIBC_2.4 __clog10 F diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist index 9af59d7d905..3edf8ae305b 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libm.abilist @@ -420,4 +420,6 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A diff --git a/sysdeps/unix/sysv/linux/microblaze/libm.abilist b/sysdeps/unix/sysv/linux/microblaze/libm.abilist index 0b1f1360e0c..e93410186db 100644 --- a/sysdeps/unix/sysv/linux/microblaze/libm.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/libm.abilist @@ -379,3 +379,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist index 2e2bb007385..88cd724c67f 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/libm.abilist @@ -381,6 +381,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 exp2l F _gp_disp _gp_disp A diff --git a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist index 7daa5952822..52d5cb306de 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/libm.abilist @@ -412,4 +412,6 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A diff --git a/sysdeps/unix/sysv/linux/nios2/libm.abilist b/sysdeps/unix/sysv/linux/nios2/libm.abilist index a36e2f32fc5..37f7a882106 100644 --- a/sysdeps/unix/sysv/linux/nios2/libm.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libm.abilist @@ -379,3 +379,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist index abe8c5d8a8b..ad61a97f938 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libm.abilist @@ -421,6 +421,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 __clog10l F GLIBC_2.4 __finitel F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist index 1c25f56c4ca..85422382f60 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libm.abilist @@ -420,6 +420,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 __clog10l F GLIBC_2.4 __finitel F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist index 9d19474c34e..b2f06083db9 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm-le.abilist @@ -415,3 +415,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist index cedb18945cb..e5d36a1707e 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/libm.abilist @@ -96,6 +96,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.3 GLIBC_2.3 A GLIBC_2.3 _LIB_VERSION D 0x4 GLIBC_2.3 __clog10 F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist index 9b567c6356b..457aa719c35 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libm.abilist @@ -410,6 +410,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 __clog10l F GLIBC_2.4 __finitel F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist index 78a82fbd715..217d76b2b5f 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libm.abilist @@ -408,6 +408,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 __clog10l F GLIBC_2.4 __finitel F diff --git a/sysdeps/unix/sysv/linux/sh/libm.abilist b/sysdeps/unix/sysv/linux/sh/libm.abilist index f98ade7642d..d1da0df347a 100644 --- a/sysdeps/unix/sysv/linux/sh/libm.abilist +++ b/sysdeps/unix/sysv/linux/sh/libm.abilist @@ -380,5 +380,7 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 exp2l F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist index d2e84219678..1c582558b8e 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libm.abilist @@ -413,6 +413,8 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A GLIBC_2.4 __clog10l F GLIBC_2.4 __finitel F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist index e0002214321..6915c872d01 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libm.abilist @@ -411,4 +411,6 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist index 00e82c14250..6ebaa0f163b 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx32/libm.abilist @@ -380,3 +380,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist index 00e82c14250..6ebaa0f163b 100644 --- a/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilegx/tilegx64/libm.abilist @@ -380,3 +380,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist index 00e82c14250..6ebaa0f163b 100644 --- a/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist +++ b/sysdeps/unix/sysv/linux/tile/tilepro/libm.abilist @@ -380,3 +380,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist index 65b470817c6..2e77c3db968 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libm.abilist @@ -411,4 +411,6 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F GLIBC_2.4 GLIBC_2.4 A diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist index d35e9f02078..b9ccb1af65f 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libm.abilist @@ -410,3 +410,5 @@ GLIBC_2.24 nextdownl F 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 fesetexcept F diff --git a/sysdeps/x86_64/fpu/fesetexcept.c b/sysdeps/x86_64/fpu/fesetexcept.c new file mode 100644 index 00000000000..805f769f13e --- /dev/null +++ b/sysdeps/x86_64/fpu/fesetexcept.c @@ -0,0 +1,31 @@ +/* Set given exception flags. x86_64 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 + . */ + +#include + +int +fesetexcept (int excepts) +{ + unsigned int mxcsr; + + __asm__ ("stmxcsr %0" : "=m" (*&mxcsr)); + mxcsr |= excepts & FE_ALL_EXCEPT; + __asm__ ("ldmxcsr %0" : : "m" (*&mxcsr)); + + return 0; +}