aboutsummaryrefslogtreecommitdiff
path: root/math/test-fenv-preserve.c
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2014-03-26 18:59:08 +0000
committerJoseph Myers <joseph@codesourcery.com>2014-03-26 18:59:08 +0000
commit9be36fb8cb5bcdab5bbbc7a36388dc9a3d1cc397 (patch)
tree2cc35309dc7cb65fbe9f8fe46762edf8a50a7f02 /math/test-fenv-preserve.c
parent60a2f3c166cebf56048d00cee47b9ed1969844d6 (diff)
downloadglibc-9be36fb8cb5bcdab5bbbc7a36388dc9a3d1cc397.zip
glibc-9be36fb8cb5bcdab5bbbc7a36388dc9a3d1cc397.tar.gz
glibc-9be36fb8cb5bcdab5bbbc7a36388dc9a3d1cc397.tar.bz2
Make x86_64 fegetenv preserve exception mask (bug 16198).
Bug 16198 is x86_64 fegetenv wrongly masking exceptions for which traps are enabled, because that's a side-effect of the fnstenv instruction. This patch fixes it to use fldenv immediately after fnstenv, like the i386 version. Tested x86_64 and x86. [BZ #16198] * sysdeps/x86_64/fpu/fegetenv.c (fegetenv): Use fldenv after fnstenv. * math/test-fenv-preserve.c: New file. * math/Makefile (tests): Add test-fenv-preserve.
Diffstat (limited to 'math/test-fenv-preserve.c')
-rw-r--r--math/test-fenv-preserve.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/math/test-fenv-preserve.c b/math/test-fenv-preserve.c
new file mode 100644
index 0000000..8288b2c
--- /dev/null
+++ b/math/test-fenv-preserve.c
@@ -0,0 +1,53 @@
+/* Test fegetenv preserves exception mask (bug 16198).
+ Copyright (C) 2014 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 <fenv.h>
+#include <stdio.h>
+
+static int
+do_test (void)
+{
+ fenv_t env;
+
+ if (feenableexcept (FE_INVALID) != 0)
+ {
+ puts ("feenableexcept (FE_INVALID) failed, cannot test");
+ return 0;
+ }
+
+ if (fegetenv (&env) != 0)
+ {
+ puts ("fegetenv failed, cannot test");
+ return 0;
+ }
+
+ int ret = fegetexcept ();
+ if (ret == FE_INVALID)
+ {
+ puts ("fegetenv preserved exception mask, OK");
+ return 0;
+ }
+ else
+ {
+ printf ("fegetexcept returned %d, expected %d\n", ret, FE_INVALID);
+ return 1;
+ }
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"