diff --git a/ChangeLog b/ChangeLog index 87fcf32f02..3c90d9c852 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 415ba3dcb9..fdcd7e7a0c 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 ea8ff48618..8dcd409cbd 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 1da1797198..38a4709802 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 467d7ed3b5..ff4e4d4292 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 9a1e112f72..7f4ceb744c 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 0000000000..892d8adc5f --- /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 0000000000..c40b5bc2b8 --- /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 0000000000..912a9a6bad --- /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 0000000000..eeb0c7f90b --- /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 838fedeacf..b50f029843 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 781d2d3571..01b01b72b3 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 f342c6b1da..9ba817d5ee 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 7a02fb1726..d9a6f6f9aa 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 bf40ddf929..75d4797084 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 92e94022c7..17b6d6d1ee 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 e2737a2ba9..d2d89785fe 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 7a02fb1726..d9a6f6f9aa 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 9af59d7d90..3edf8ae305 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 0b1f1360e0..e93410186d 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 2e2bb00738..88cd724c67 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 7daa595282..52d5cb306d 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 a36e2f32fc..37f7a88210 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 abe8c5d8a8..ad61a97f93 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 1c25f56c4c..85422382f6 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 9d19474c34..b2f06083db 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 cedb18945c..e5d36a1707 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 9b567c6356..457aa719c3 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 78a82fbd71..217d76b2b5 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 f98ade7642..d1da0df347 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 d2e8421967..1c582558b8 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 e000221432..6915c872d0 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 00e82c1425..6ebaa0f163 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 00e82c1425..6ebaa0f163 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 00e82c1425..6ebaa0f163 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 65b470817c..2e77c3db96 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 d35e9f0207..b9ccb1af65 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 0000000000..805f769f13 --- /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; +}