Add exception information to math-tests.h and use it in libm-test.inc.

This commit is contained in:
Joseph Myers 2013-06-11 15:44:31 +00:00
parent 94aca5e740
commit f1d73d30df
5 changed files with 60 additions and 18 deletions

View File

@ -1,3 +1,12 @@
2013-06-11 Joseph Myers <joseph@codesourcery.com>
* 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 <siddhesh@redhat.com>
* benchtests/Makefile (string-bench): Add strcpy_chk and

View File

@ -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);
}

View File

@ -1,3 +1,10 @@
2013-06-11 Joseph Myers <joseph@codesourcery.com>
* 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 <joseph@codesourcery.com>
* sysdeps/arm/math-tests.h: New file.

View File

@ -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 <math-tests.h>

View File

@ -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)