From f1d73d30dfe6b5ebec071542835f1b6c2b2f8fcf Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 11 Jun 2013 15:44:31 +0000 Subject: [PATCH] Add exception information to math-tests.h and use it in libm-test.inc. --- ChangeLog | 9 ++++++++ math/libm-test.inc | 38 +++++++++++++++++++--------------- ports/ChangeLog.arm | 7 +++++++ ports/sysdeps/arm/math-tests.h | 6 +++++- sysdeps/generic/math-tests.h | 18 ++++++++++++++++ 5 files changed, 60 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3a451b4efc..af730b1fa5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2013-06-11 Joseph Myers + + * sysdeps/generic/math-tests.h (EXCEPTION_TESTS_float): New macro. + (EXCEPTION_TESTS_double): Likewise. + (EXCEPTION_TESTS_long_double): Likewise. + (EXCEPTION_TESTS): Likewise. + * math/libm-test.inc (test_exceptions): Only test exceptions if + EXCEPTION_TESTS (FLOAT). + 2013-06-11 Siddhesh Poyarekar * benchtests/Makefile (string-bench): Add strcpy_chk and diff --git a/math/libm-test.inc b/math/libm-test.inc index ed050cb9ed..088bf5123e 100644 --- a/math/libm-test.inc +++ b/math/libm-test.inc @@ -591,33 +591,37 @@ test_single_exception (const char *test_name, static void test_exceptions (const char *test_name, int exception) { - ++noExcTests; + if (EXCEPTION_TESTS (FLOAT)) + { + ++noExcTests; #ifdef FE_DIVBYZERO - if ((exception & DIVIDE_BY_ZERO_EXCEPTION_OK) == 0) - test_single_exception (test_name, exception, - DIVIDE_BY_ZERO_EXCEPTION, FE_DIVBYZERO, - "Divide by zero"); + if ((exception & DIVIDE_BY_ZERO_EXCEPTION_OK) == 0) + test_single_exception (test_name, exception, + DIVIDE_BY_ZERO_EXCEPTION, FE_DIVBYZERO, + "Divide by zero"); #endif #ifdef FE_INVALID - if ((exception & INVALID_EXCEPTION_OK) == 0) - test_single_exception (test_name, exception, INVALID_EXCEPTION, FE_INVALID, - "Invalid operation"); + if ((exception & INVALID_EXCEPTION_OK) == 0) + test_single_exception (test_name, exception, + INVALID_EXCEPTION, FE_INVALID, + "Invalid operation"); #endif #ifdef FE_OVERFLOW - if ((exception & OVERFLOW_EXCEPTION_OK) == 0) - test_single_exception (test_name, exception, OVERFLOW_EXCEPTION, - FE_OVERFLOW, "Overflow"); + if ((exception & OVERFLOW_EXCEPTION_OK) == 0) + test_single_exception (test_name, exception, OVERFLOW_EXCEPTION, + FE_OVERFLOW, "Overflow"); #endif #ifdef FE_UNDERFLOW - if ((exception & UNDERFLOW_EXCEPTION_OK) == 0) - test_single_exception (test_name, exception, UNDERFLOW_EXCEPTION, - FE_UNDERFLOW, "Underflow"); + if ((exception & UNDERFLOW_EXCEPTION_OK) == 0) + test_single_exception (test_name, exception, UNDERFLOW_EXCEPTION, + FE_UNDERFLOW, "Underflow"); #endif #ifdef FE_INEXACT - if ((exception & (INEXACT_EXCEPTION | NO_INEXACT_EXCEPTION)) != 0) - test_single_exception (test_name, exception, INEXACT_EXCEPTION, - FE_INEXACT, "Inexact"); + if ((exception & (INEXACT_EXCEPTION | NO_INEXACT_EXCEPTION)) != 0) + test_single_exception (test_name, exception, INEXACT_EXCEPTION, + FE_INEXACT, "Inexact"); #endif + } feclearexcept (FE_ALL_EXCEPT); } diff --git a/ports/ChangeLog.arm b/ports/ChangeLog.arm index 6b0310b013..28ebfdf5ba 100644 --- a/ports/ChangeLog.arm +++ b/ports/ChangeLog.arm @@ -1,3 +1,10 @@ +2013-06-11 Joseph Myers + + * sysdeps/arm/math-tests.h [__SOFTFP__] (EXCEPTION_TESTS_float): + Define to 0. + [__SOFTFP__] (EXCEPTION_TESTS_double): Likewise. + [__SOFTFP__] (EXCEPTION_TESTS_long_double): Likewise. + 2013-06-10 Joseph Myers * sysdeps/arm/math-tests.h: New file. diff --git a/ports/sysdeps/arm/math-tests.h b/ports/sysdeps/arm/math-tests.h index 6b8e089d59..6fd17edca2 100644 --- a/ports/sysdeps/arm/math-tests.h +++ b/ports/sysdeps/arm/math-tests.h @@ -18,11 +18,15 @@ /* On systems with VFP support, but where glibc is built for soft-float, the libgcc functions used in libc and libm do not - support rounding modes, although fesetround succeeds. */ + support rounding modes, although fesetround succeeds, and do not + support exceptions. */ #ifdef __SOFTFP__ # define ROUNDING_TESTS_float(MODE) ((MODE) == FE_TONEAREST) # define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST) # define ROUNDING_TESTS_long_double(MODE) ((MODE) == FE_TONEAREST) +# define EXCEPTION_TESTS_float 0 +# define EXCEPTION_TESTS_double 0 +# define EXCEPTION_TESTS_long_double 0 #endif #include_next diff --git a/sysdeps/generic/math-tests.h b/sysdeps/generic/math-tests.h index b1e9fd72a7..89b2260d0f 100644 --- a/sysdeps/generic/math-tests.h +++ b/sysdeps/generic/math-tests.h @@ -58,3 +58,21 @@ (sizeof (TYPE) == sizeof (float) ? ROUNDING_TESTS_float (MODE) \ : sizeof (TYPE) == sizeof (double) ? ROUNDING_TESTS_double (MODE) \ : ROUNDING_TESTS_long_double (MODE)) + +/* Indicate whether to run tests of floating-point exceptions for a + given floating-point type, given that the exception macros are + defined. All are run unless overridden. */ +#ifndef EXCEPTION_TESTS_float +# define EXCEPTION_TESTS_float 1 +#endif +#ifndef EXCEPTION_TESTS_double +# define EXCEPTION_TESTS_double 1 +#endif +#ifndef EXCEPTION_TESTS_long_double +# define EXCEPTION_TESTS_long_double 1 +#endif + +#define EXCEPTION_TESTS(TYPE) \ + (sizeof (TYPE) == sizeof (float) ? EXCEPTION_TESTS_float \ + : sizeof (TYPE) == sizeof (double) ? EXCEPTION_TESTS_double \ + : EXCEPTION_TESTS_long_double)