On 32-bit x86, disable certain tests involving sNaN values.
authorThomas Schwinge <thomas@codesourcery.com>
Tue, 19 Mar 2013 09:16:49 +0000 (10:16 +0100)
committerThomas Schwinge <thomas@codesourcery.com>
Thu, 21 Mar 2013 15:05:29 +0000 (16:05 +0100)
Follow-up to commit 495ded2c8c1eb8c0ac4b54add2dd397852e19cba.

ChangeLog
math/test-snan.c
sysdeps/generic/math-tests.h [new file with mode: 0644]
sysdeps/i386/fpu/math-tests.h [new file with mode: 0644]

index dffd409..0e6798b 100644 (file)
--- 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]
index 83657ee..f185cbb 100644 (file)
@@ -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 (file)
index 0000000..76f738e
--- /dev/null
@@ -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 (file)
index 0000000..00c5f6c
--- /dev/null
@@ -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>