From 495ded2c8c1eb8c0ac4b54add2dd397852e19cba Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Thu, 28 Feb 2013 22:38:23 +0100 Subject: Promote a math test for sNaN handling to the top-level. --- ChangeLog | 8 + math/Makefile | 2 +- math/test-snan.c | 336 ++++++++++++++++++++++++++++++++ sysdeps/powerpc/fpu/Makefile | 1 - sysdeps/powerpc/fpu/test-powerpc-snan.c | 336 -------------------------------- 5 files changed, 345 insertions(+), 338 deletions(-) create mode 100644 math/test-snan.c delete mode 100644 sysdeps/powerpc/fpu/test-powerpc-snan.c diff --git a/ChangeLog b/ChangeLog index 6f751d4607..d445e604d8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2013-03-15 Thomas Schwinge + * sysdeps/powerpc/fpu/test-powerpc-snan.c: Rename to + math/test-snan.c. + * math/test-snan.c: Renamed from + sysdeps/powerpc/fpu/test-powerpc-snan.c. + * math/Makefile (tests): Add test-snan. + * sysdeps/powerpc/fpu/Makefile (libm-tests): Don't add + test-powerpc-snan. + * math/basic-test.c (TEST_FUNC): Replace NANFUNC argument with SUFFIX. Initialize qNaN_var with __builtin_nan family of functions. diff --git a/math/Makefile b/math/Makefile index 72cf3389f5..e216dfb96a 100644 --- a/math/Makefile +++ b/math/Makefile @@ -88,7 +88,7 @@ long-c-yes = $(calls:=l) tests = test-matherr test-fenv atest-exp atest-sincos atest-exp2 basic-test \ test-misc test-fpucw tst-definitions test-tgmath test-tgmath-ret \ bug-nextafter bug-nexttoward bug-tgmath1 test-tgmath-int \ - test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 + test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan # We do the `long double' tests only if this data type is available and # distinct from `double'. test-longdouble-yes = test-ldouble test-ildoubl diff --git a/math/test-snan.c b/math/test-snan.c new file mode 100644 index 0000000000..6ec9414e79 --- /dev/null +++ b/math/test-snan.c @@ -0,0 +1,336 @@ +/* Test signaling NaNs in isnan, isinf, and similar functions. + Copyright (C) 2008-2013 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger , 2005. + + 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 + . */ + +#define _GNU_SOURCE 1 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +int dest_offset; +char *dest_address; +double value = 123.456; +double zero = 0.0; + +static sigjmp_buf sigfpe_buf; + +typedef long double ldouble; + + +void +myFPsighandler(int signal, + siginfo_t *info, + void *context) +{ + siglongjmp(sigfpe_buf, 0); +} + +int +set_sigaction_FP(void) +{ + struct sigaction sa; + /* register RT signal handler via sigaction */ + sa.sa_flags = SA_SIGINFO; + sa.sa_sigaction = &myFPsighandler; + sigemptyset(&sa.sa_mask); + sigaction(SIGFPE, &sa, NULL); + + return 0; +} + +int +remove_sigaction_FP(void) +{ + struct sigaction sa; + /* restore default RT signal handler via sigaction */ + sa.sa_flags = SA_SIGINFO; + sa.sa_handler = SIG_DFL; + sigemptyset(&sa.sa_mask); + sigaction(SIGFPE, &sa, NULL); + + return 0; +} + +static int errors = 0; + +static void +check (const char *testname, int result) +{ + if (!result) { + printf ("Failure: %s\n", testname); + errors++; + } +} + +#define TEST_FUNC(NAME, FLOAT, SUFFIX) \ +static void \ +NAME (void) \ +{ \ + /* Variables are declared volatile to forbid some compiler \ + optimizations. */ \ + volatile FLOAT Inf_var, qNaN_var, zero_var, one_var; \ + /* A sNaN is only guaranteed to be representable in variables with */ \ + /* static (or thread-local) storage duration. */ \ + static volatile FLOAT sNaN_var = __builtin_nans ## SUFFIX (""); \ + fenv_t saved_fenv; \ + \ + zero_var = 0.0; \ + one_var = 1.0; \ + qNaN_var = __builtin_nan ## SUFFIX (""); \ + Inf_var = one_var / zero_var; \ + \ + (void) &zero_var; \ + (void) &one_var; \ + (void) &qNaN_var; \ + (void) &sNaN_var; \ + (void) &Inf_var; \ + \ + set_sigaction_FP (); \ + fegetenv(&saved_fenv); \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan (qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (qNaN)", isnan (qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan (-qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (-qNaN)", isnan (-qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan (sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (sNaN)", isnan (sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnan (-sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnan (-sNaN)", isnan (-sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf (qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (qNaN)", !isinf (qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf (-qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (-qNaN)", !isinf (-qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf (sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (sNaN)", !isinf (sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isinf (-sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isinf (-sNaN)", !isinf (-sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite (qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (qNaN)", !isfinite (qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite (-qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (-qNaN)", !isfinite (-qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite (sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (sNaN)", !isfinite (sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isfinite (-sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isfinite (-sNaN)", !isfinite (-sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal (qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (qNaN)", !isnormal (qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal (-qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (-qNaN)", !isnormal (-qNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal (sNaN) isnormal SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (sNaN)", !isnormal (sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " isnormal (-sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " isnormal (-sNaN)", !isnormal (-sNaN_var)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify (qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (qNaN)", (fpclassify (qNaN_var)==FP_NAN)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify (-qNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (-qNaN)", (fpclassify (-qNaN_var)==FP_NAN)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify (sNaN) isnormal SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (sNaN)", (fpclassify (sNaN_var)==FP_NAN)); \ + } \ + \ + feclearexcept(FE_ALL_EXCEPT); \ + feenableexcept (FE_ALL_EXCEPT); \ + if (sigsetjmp(sigfpe_buf, 0)) \ + { \ + printf (#FLOAT " fpclassify (-sNaN) raised SIGFPE\n"); \ + errors++; \ + } else { \ + check (#FLOAT " fpclassify (-sNaN)", (fpclassify (-sNaN_var)==FP_NAN)); \ + } \ + \ + fesetenv(&saved_fenv); /* restore saved fenv */ \ + remove_sigaction_FP(); \ +} + +TEST_FUNC (float_test, float, f) +TEST_FUNC (double_test, double, ) +#ifndef NO_LONG_DOUBLE +TEST_FUNC (ldouble_test, ldouble, l) +#endif + +static int +do_test (void) +{ + float_test(); + double_test(); +#ifndef NO_LONG_DOUBLE + ldouble_test(); +#endif + + return errors != 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/sysdeps/powerpc/fpu/Makefile b/sysdeps/powerpc/fpu/Makefile index ffacf1a754..fda59f9fa4 100644 --- a/sysdeps/powerpc/fpu/Makefile +++ b/sysdeps/powerpc/fpu/Makefile @@ -1,6 +1,5 @@ ifeq ($(subdir),math) libm-support += fenv_const fe_nomask fe_mask t_sqrt -libm-tests += test-powerpc-snan # libm needs ld.so to access dl_hwcap $(objpfx)libm.so: $(elfobjdir)/ld.so diff --git a/sysdeps/powerpc/fpu/test-powerpc-snan.c b/sysdeps/powerpc/fpu/test-powerpc-snan.c deleted file mode 100644 index 6ec9414e79..0000000000 --- a/sysdeps/powerpc/fpu/test-powerpc-snan.c +++ /dev/null @@ -1,336 +0,0 @@ -/* Test signaling NaNs in isnan, isinf, and similar functions. - Copyright (C) 2008-2013 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Andreas Jaeger , 2005. - - 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 - . */ - -#define _GNU_SOURCE 1 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int dest_offset; -char *dest_address; -double value = 123.456; -double zero = 0.0; - -static sigjmp_buf sigfpe_buf; - -typedef long double ldouble; - - -void -myFPsighandler(int signal, - siginfo_t *info, - void *context) -{ - siglongjmp(sigfpe_buf, 0); -} - -int -set_sigaction_FP(void) -{ - struct sigaction sa; - /* register RT signal handler via sigaction */ - sa.sa_flags = SA_SIGINFO; - sa.sa_sigaction = &myFPsighandler; - sigemptyset(&sa.sa_mask); - sigaction(SIGFPE, &sa, NULL); - - return 0; -} - -int -remove_sigaction_FP(void) -{ - struct sigaction sa; - /* restore default RT signal handler via sigaction */ - sa.sa_flags = SA_SIGINFO; - sa.sa_handler = SIG_DFL; - sigemptyset(&sa.sa_mask); - sigaction(SIGFPE, &sa, NULL); - - return 0; -} - -static int errors = 0; - -static void -check (const char *testname, int result) -{ - if (!result) { - printf ("Failure: %s\n", testname); - errors++; - } -} - -#define TEST_FUNC(NAME, FLOAT, SUFFIX) \ -static void \ -NAME (void) \ -{ \ - /* Variables are declared volatile to forbid some compiler \ - optimizations. */ \ - volatile FLOAT Inf_var, qNaN_var, zero_var, one_var; \ - /* A sNaN is only guaranteed to be representable in variables with */ \ - /* static (or thread-local) storage duration. */ \ - static volatile FLOAT sNaN_var = __builtin_nans ## SUFFIX (""); \ - fenv_t saved_fenv; \ - \ - zero_var = 0.0; \ - one_var = 1.0; \ - qNaN_var = __builtin_nan ## SUFFIX (""); \ - Inf_var = one_var / zero_var; \ - \ - (void) &zero_var; \ - (void) &one_var; \ - (void) &qNaN_var; \ - (void) &sNaN_var; \ - (void) &Inf_var; \ - \ - set_sigaction_FP (); \ - fegetenv(&saved_fenv); \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnan (qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnan (qNaN)", isnan (qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnan (-qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnan (-qNaN)", isnan (-qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnan (sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnan (sNaN)", isnan (sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnan (-sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnan (-sNaN)", isnan (-sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isinf (qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isinf (qNaN)", !isinf (qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isinf (-qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isinf (-qNaN)", !isinf (-qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isinf (sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isinf (sNaN)", !isinf (sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isinf (-sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isinf (-sNaN)", !isinf (-sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isfinite (qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isfinite (qNaN)", !isfinite (qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isfinite (-qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isfinite (-qNaN)", !isfinite (-qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isfinite (sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isfinite (sNaN)", !isfinite (sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isfinite (-sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isfinite (-sNaN)", !isfinite (-sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnormal (qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnormal (qNaN)", !isnormal (qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnormal (-qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnormal (-qNaN)", !isnormal (-qNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnormal (sNaN) isnormal SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnormal (sNaN)", !isnormal (sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " isnormal (-sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " isnormal (-sNaN)", !isnormal (-sNaN_var)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " fpclassify (qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " fpclassify (qNaN)", (fpclassify (qNaN_var)==FP_NAN)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " fpclassify (-qNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " fpclassify (-qNaN)", (fpclassify (-qNaN_var)==FP_NAN)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " fpclassify (sNaN) isnormal SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " fpclassify (sNaN)", (fpclassify (sNaN_var)==FP_NAN)); \ - } \ - \ - feclearexcept(FE_ALL_EXCEPT); \ - feenableexcept (FE_ALL_EXCEPT); \ - if (sigsetjmp(sigfpe_buf, 0)) \ - { \ - printf (#FLOAT " fpclassify (-sNaN) raised SIGFPE\n"); \ - errors++; \ - } else { \ - check (#FLOAT " fpclassify (-sNaN)", (fpclassify (-sNaN_var)==FP_NAN)); \ - } \ - \ - fesetenv(&saved_fenv); /* restore saved fenv */ \ - remove_sigaction_FP(); \ -} - -TEST_FUNC (float_test, float, f) -TEST_FUNC (double_test, double, ) -#ifndef NO_LONG_DOUBLE -TEST_FUNC (ldouble_test, ldouble, l) -#endif - -static int -do_test (void) -{ - float_test(); - double_test(); -#ifndef NO_LONG_DOUBLE - ldouble_test(); -#endif - - return errors != 0; -} - -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" -- cgit v1.2.1