From 5aa4a1a1fd742479818a668d42d91ca9ec4a6318 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Tue, 19 Mar 2013 10:16:49 +0100 Subject: On 32-bit x86, disable certain tests involving sNaN values. Follow-up to commit 495ded2c8c1eb8c0ac4b54add2dd397852e19cba. --- ChangeLog | 7 +++++++ math/test-snan.c | 32 ++++++++++++++++++++++---------- sysdeps/generic/math-tests.h | 36 ++++++++++++++++++++++++++++++++++++ sysdeps/i386/fpu/math-tests.h | 26 ++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 10 deletions(-) create mode 100644 sysdeps/generic/math-tests.h create mode 100644 sysdeps/i386/fpu/math-tests.h diff --git a/ChangeLog b/ChangeLog index dffd409d5b..0e6798b1ae 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2013-03-21 Thomas Schwinge + + * 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 [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 #include +#include + + 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 + . */ + +/* 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 + . */ + +/* 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 -- cgit v1.2.3