aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Schwinge <thomas@codesourcery.com>2013-03-19 10:16:49 +0100
committerThomas Schwinge <thomas@codesourcery.com>2013-03-21 16:05:29 +0100
commit5aa4a1a1fd742479818a668d42d91ca9ec4a6318 (patch)
tree33ff8dddda5606d8646047fc8fedf63630849832
parent98c48fe5cc4317123a168490a8fb37540e23f104 (diff)
downloadglibc-5aa4a1a1fd742479818a668d42d91ca9ec4a6318.tar
glibc-5aa4a1a1fd742479818a668d42d91ca9ec4a6318.tar.gz
glibc-5aa4a1a1fd742479818a668d42d91ca9ec4a6318.tar.bz2
glibc-5aa4a1a1fd742479818a668d42d91ca9ec4a6318.zip
On 32-bit x86, disable certain tests involving sNaN values.
Follow-up to commit 495ded2c8c1eb8c0ac4b54add2dd397852e19cba.
-rw-r--r--ChangeLog7
-rw-r--r--math/test-snan.c32
-rw-r--r--sysdeps/generic/math-tests.h36
-rw-r--r--sysdeps/i386/fpu/math-tests.h26
4 files changed, 91 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index dffd409d5b..0e6798b1ae 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-03-21 Thomas Schwinge <thomas@codesourcery.com>
+
+ * sysdeps/generic/math-tests.h: New file.
+ * sysdeps/i386/fpu/math-tests.h: Likewise.
+ * math/test-snan.c: Include it.
+ (TEST_FUNC): Use SNAN_TESTS to short-circuit certain tests.
+
2013-03-21 Joseph Myers <joseph@codesourcery.com>
[BZ #15285]
diff --git a/math/test-snan.c b/math/test-snan.c
index 83657eef01..f185cbb45c 100644
--- a/math/test-snan.c
+++ b/math/test-snan.c
@@ -29,6 +29,9 @@
#include <setjmp.h>
#include <errno.h>
+#include <math-tests.h>
+
+
int dest_offset;
char *dest_address;
double value = 123.456;
@@ -139,7 +142,8 @@ NAME (void) \
printf (#FLOAT " isnan (sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnan (sNaN)", isnan (sNaN_var)); \
+ check (#FLOAT " isnan (sNaN)", \
+ SNAN_TESTS (FLOAT) ? isnan (sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -149,7 +153,8 @@ NAME (void) \
printf (#FLOAT " isnan (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnan (-sNaN)", isnan (minus_sNaN_var)); \
+ check (#FLOAT " isnan (-sNaN)", \
+ SNAN_TESTS (FLOAT) ? isnan (minus_sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -179,7 +184,8 @@ NAME (void) \
printf (#FLOAT " isinf (sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isinf (sNaN)", !isinf (sNaN_var)); \
+ check (#FLOAT " isinf (sNaN)", \
+ SNAN_TESTS (FLOAT) ? !isinf (sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -189,7 +195,8 @@ NAME (void) \
printf (#FLOAT " isinf (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isinf (-sNaN)", !isinf (minus_sNaN_var)); \
+ check (#FLOAT " isinf (-sNaN)", \
+ SNAN_TESTS (FLOAT) ? !isinf (minus_sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -219,7 +226,8 @@ NAME (void) \
printf (#FLOAT " isfinite (sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isfinite (sNaN)", !isfinite (sNaN_var)); \
+ check (#FLOAT " isfinite (sNaN)", \
+ SNAN_TESTS (FLOAT) ? !isfinite (sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -229,7 +237,8 @@ NAME (void) \
printf (#FLOAT " isfinite (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isfinite (-sNaN)", !isfinite (minus_sNaN_var)); \
+ check (#FLOAT " isfinite (-sNaN)", \
+ SNAN_TESTS (FLOAT) ? !isfinite (minus_sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -259,7 +268,8 @@ NAME (void) \
printf (#FLOAT " isnormal (sNaN) isnormal SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnormal (sNaN)", !isnormal (sNaN_var)); \
+ check (#FLOAT " isnormal (sNaN)", \
+ SNAN_TESTS (FLOAT) ? !isnormal (sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -269,7 +279,8 @@ NAME (void) \
printf (#FLOAT " isnormal (-sNaN) raised SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " isnormal (-sNaN)", !isnormal (minus_sNaN_var)); \
+ check (#FLOAT " isnormal (-sNaN)", \
+ SNAN_TESTS (FLOAT) ? !isnormal (minus_sNaN_var) : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -299,7 +310,8 @@ NAME (void) \
printf (#FLOAT " fpclassify (sNaN) isnormal SIGFPE\n"); \
errors++; \
} else { \
- check (#FLOAT " fpclassify (sNaN)", fpclassify (sNaN_var) == FP_NAN); \
+ check (#FLOAT " fpclassify (sNaN)", \
+ SNAN_TESTS (FLOAT) ? fpclassify (sNaN_var) == FP_NAN : 1); \
} \
\
feclearexcept(FE_ALL_EXCEPT); \
@@ -310,7 +322,7 @@ NAME (void) \
errors++; \
} else { \
check (#FLOAT " fpclassify (-sNaN)", \
- fpclassify (minus_sNaN_var) == FP_NAN); \
+ SNAN_TESTS (FLOAT) ? fpclassify (minus_sNaN_var) == FP_NAN : 1); \
} \
\
fesetenv(&saved_fenv); /* restore saved fenv */ \
diff --git a/sysdeps/generic/math-tests.h b/sysdeps/generic/math-tests.h
new file mode 100644
index 0000000000..76f738ee99
--- /dev/null
+++ b/sysdeps/generic/math-tests.h
@@ -0,0 +1,36 @@
+/* Configuration for math tests. Generic version.
+ Copyright (C) 2013 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/>. */
+
+/* Indicate whether to run tests involving sNaN values for the float, double,
+ and long double C data types, respectively. All are run unless
+ overridden. */
+#ifndef SNAN_TESTS_float
+# define SNAN_TESTS_float 1
+#endif
+#ifndef SNAN_TESTS_double
+# define SNAN_TESTS_double 1
+#endif
+#ifndef SNAN_TESTS_long_double
+# define SNAN_TESTS_long_double 1
+#endif
+
+/* Return nonzero value if to run tests involving sNaN values for X. */
+#define SNAN_TESTS(x) \
+ (sizeof (x) == sizeof (float) ? SNAN_TESTS_float \
+ : sizeof (x) == sizeof (double) ? SNAN_TESTS_double \
+ : SNAN_TESTS_long_double)
diff --git a/sysdeps/i386/fpu/math-tests.h b/sysdeps/i386/fpu/math-tests.h
new file mode 100644
index 0000000000..00c5f6c4d1
--- /dev/null
+++ b/sysdeps/i386/fpu/math-tests.h
@@ -0,0 +1,26 @@
+/* Configuration for math tests. 32-bit x86 version.
+ Copyright (C) 2013 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/>. */
+
+/* On 32-bit x86, versions of GCC up to at least 4.8 are happy to use FPU load
+ instructions for sNaN values, and loading a float or double sNaN value will
+ already raise an INVALID exception as well as turn the sNaN into a qNaN,
+ rendering certain tests infeasible in this scenario. */
+#define SNAN_TESTS_float 0
+#define SNAN_TESTS_double 0
+
+#include_next <math-tests.h>