This is the mail archive of the libc-ports@sources.redhat.com mailing list for the libc-ports project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Policy question -- libm-test: tests with sNaNs as inputs


Hi!

I'd like to propose the following patch, which adds several tests with
sNaNs as inputs to the libm-test framework.

The "problem" with it is that it uncovers a handful of issues --
different between different architectures and their several
floating-point datatypes -- where the results don't match what is
expected.  In particular, there are several math functions that upon sNaN
input don't return a qNaN whilst raising an INVALID exception, but
instead return the input sNaN unaltered.  For example, on x86-64, this
happens for long double for log, log10, log2, fdim; on 32-bit x86
additionally for asinh, atanh, and cbrt; or on 64-bit PowerPC hypot,
ceil, floor, trunc, sqrt, j0, j1, y0, y1 (not all of them for each
floating-point datatype).

Fixing these issues will typically not be difficult, and I have WIP fixes
for some of them already.  Typically this will just need to
arithmetically evaluate the input sNaN (adding to itself, for example)
before returning that as the result (this also is a no-op for a qNaN),
but I can't promise to solve all of these issues.  Apart from lack of
time and experience with the architectures, I don't even have access to
all the required hardware.

Now for the policy question: How to proceed in this case?  Commit the
patch after review, and then have the architecture maintainers solve the
(now uncovered) issues for their respective architecture?  Or, bad luck,
don't commit the patch at all until all issues are deemed fixed, so that
there are no testsuite "regressions"?

diff --git manual/arith.texi manual/arith.texi
index ce8844e..2784bce 100644
--- manual/arith.texi
+++ manual/arith.texi
@@ -1575,7 +1575,6 @@ sign (although not all implementations support it) and this is one of
 the few operations that can tell the difference.
 
 @code{copysign} never raises an exception.
-@c except signalling NaNs
 
 This function is defined in @w{IEC 559} (and the appendix with
 recommended functions in @w{IEEE 754}/@w{IEEE 854}).
diff --git math/gen-libm-test.pl math/gen-libm-test.pl
index aa60d9d..cca4fcd 100755
--- math/gen-libm-test.pl
+++ math/gen-libm-test.pl
@@ -59,6 +59,8 @@ use vars qw ($output_dir $ulps_file);
     "minus_infty" => "-inf",
     "plus_infty" => "inf",
     "qnan_value" => "qNaN",
+    "snan_value" => "sNaN",
+    "minus_snan_value" => "-sNaN",
     "M_El" => "e",
     "M_E2l" => "e^2",
     "M_E3l" => "e^3",
diff --git math/libm-test.inc math/libm-test.inc
index 1d3ba48..0cdb4f8 100644
--- math/libm-test.inc
+++ math/libm-test.inc
@@ -86,8 +86,7 @@
    overflow and underflow exceptions are tested.  Inexact exceptions
    aren't checked at the moment.
 
-   NaN values: There exist signalling and quiet NaNs.  This implementation
-   only uses quiet NaN as parameter.  Where the sign of a NaN is
+   NaN values: Where the sign of a NaN is
    significant, this is not tested.  The payload of NaNs is not examined.
 
    Inline functions: Inlining functions should give an improvement in
@@ -133,6 +132,8 @@
 #include <argp.h>
 #include <tininess.h>
 
+#include <math-tests.h>
+
 /* Allow platforms without all rounding modes to test properly,
    assuming they provide an __FE_UNDEFINED in <bits/fenv.h> which
    causes fesetround() to return failure.  */
@@ -226,6 +227,11 @@ static int ignore_max_ulp;	/* Should we ignore max_ulp?  */
 
 static FLOAT minus_zero, plus_zero;
 static FLOAT plus_infty, minus_infty, qnan_value, max_value, min_value;
+/* A sNaN is only guaranteed to be representable in variables with static (or
+   thread-local) storage duration.  TODO: also need to declared it volatile to
+   forbid some compiler optimizations.  */
+static volatile FLOAT snan_value = FUNC (__builtin_nans) ("");
+static volatile FLOAT minus_snan_value = -FUNC (__builtin_nans) ("");
 static FLOAT min_subnorm_value;
 
 static FLOAT max_error, real_max_error, imag_max_error;
@@ -824,6 +830,8 @@ acos_test (void)
 
   START (acos);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (acos, plus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (acos, minus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (acos, qnan_value, qnan_value);
@@ -992,6 +1000,8 @@ acosh_test (void)
   TEST_f_f (acosh, plus_infty, plus_infty);
   TEST_f_f (acosh, minus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (acosh, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (acosh, snan_value, qnan_value, INVALID_EXCEPTION);
 
   /* x < 1:  */
   TEST_f_f (acosh, -1.125L, qnan_value, INVALID_EXCEPTION);
@@ -1014,6 +1024,8 @@ asin_test (void)
 
   START (asin);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (asin, plus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (asin, minus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (asin, qnan_value, qnan_value);
@@ -1185,6 +1197,8 @@ asinh_test (void)
   TEST_f_f (asinh, minus_infty, minus_infty);
 #endif
   TEST_f_f (asinh, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (asinh, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (asinh, 0.75L, 0.693147180559945309417232121458176568L);
 
   END (asinh);
@@ -1207,6 +1221,8 @@ atan_test (void)
   TEST_f_f (atan, plus_infty, M_PI_2l);
   TEST_f_f (atan, minus_infty, -M_PI_2l);
   TEST_f_f (atan, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (atan, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (atan, max_value, M_PI_2l);
   TEST_f_f (atan, -max_value, -M_PI_2l);
 
@@ -1246,6 +1262,8 @@ atanh_test (void)
   TEST_f_f (atanh, 1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
   TEST_f_f (atanh, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
   TEST_f_f (atanh, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (atanh, snan_value, qnan_value, INVALID_EXCEPTION);
 
   /* atanh (x) == qNaN plus invalid exception if |x| > 1.  */
   TEST_f_f (atanh, 1.125L, qnan_value, INVALID_EXCEPTION);
@@ -1269,6 +1287,8 @@ atan2_test (void)
 
   START (atan2);
 
+  /* TODO: missing sNaN tests.  */
+
   /* atan2 (0,x) == 0 for x > 0.  */
   TEST_ff_f (atan2, 0, 1, 0);
 
@@ -1354,6 +1374,8 @@ cabs_test (void)
 
   START (cabs);
 
+  /* TODO: missing sNaN tests.  */
+
   /* cabs (x + iy) is specified as hypot (x,y) */
 
   /* cabs (+inf + i x) == +inf.  */
@@ -1362,7 +1384,6 @@ cabs_test (void)
   TEST_c_f (cabs, minus_infty, 1.0, plus_infty);
 
   TEST_c_f (cabs, minus_infty, qnan_value, plus_infty);
-  TEST_c_f (cabs, minus_infty, qnan_value, plus_infty);
 
   TEST_c_f (cabs, qnan_value, qnan_value, qnan_value);
 
@@ -1401,6 +1422,7 @@ cacos_test (void)
 
   START (cacos);
 
+  /* TODO: missing sNaN tests.  */
 
   TEST_c_c (cacos, 0, 0, M_PI_2l, minus_zero);
   TEST_c_c (cacos, minus_zero, 0, M_PI_2l, minus_zero);
@@ -2095,6 +2117,7 @@ cacosh_test (void)
 
   START (cacosh);
 
+  /* TODO: missing sNaN tests.  */
 
   TEST_c_c (cacosh, 0, 0, 0.0, M_PI_2l);
   TEST_c_c (cacosh, minus_zero, 0, 0.0, M_PI_2l);
@@ -2178,6 +2201,8 @@ carg_test (void)
 {
   START (carg);
 
+  /* TODO: missing sNaN tests.  */
+
   /* carg (x + iy) is specified as atan2 (y, x) */
 
   /* carg (x + i 0) == 0 for x > 0.  */
@@ -2251,6 +2276,8 @@ casin_test (void)
 
   START (casin);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (casin, 0, 0, 0.0, 0.0);
   TEST_c_c (casin, minus_zero, 0, minus_zero, 0.0);
   TEST_c_c (casin, 0, minus_zero, 0.0, minus_zero);
@@ -2949,6 +2976,8 @@ casinh_test (void)
 
   START (casinh);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (casinh, 0, 0, 0.0, 0.0);
   TEST_c_c (casinh, minus_zero, 0, minus_zero, 0);
   TEST_c_c (casinh, 0, minus_zero, 0.0, minus_zero);
@@ -3647,6 +3676,8 @@ catan_test (void)
 
   START (catan);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (catan, 0, 0, 0, 0);
   TEST_c_c (catan, minus_zero, 0, minus_zero, 0);
   TEST_c_c (catan, 0, minus_zero, 0, minus_zero);
@@ -3714,6 +3745,8 @@ catanh_test (void)
 
   START (catanh);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (catanh, 0, 0, 0.0, 0.0);
   TEST_c_c (catanh, minus_zero, 0, minus_zero, 0.0);
   TEST_c_c (catanh, 0, minus_zero, 0.0, minus_zero);
@@ -3786,6 +3819,8 @@ cbrt_test (void)
   TEST_f_f (cbrt, plus_infty, plus_infty);
   TEST_f_f (cbrt, minus_infty, minus_infty);
   TEST_f_f (cbrt, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (cbrt, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (cbrt, -0.001L, -0.1L);
   TEST_f_f (cbrt, 8, 2);
@@ -3808,6 +3843,8 @@ ccos_test (void)
 
   START (ccos);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (ccos, 0.0, 0.0, 1.0, minus_zero);
   TEST_c_c (ccos, minus_zero, 0.0, 1.0, 0.0);
   TEST_c_c (ccos, 0.0, minus_zero, 1.0, 0.0);
@@ -3907,6 +3944,8 @@ ccosh_test (void)
 
   START (ccosh);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (ccosh, 0.0, 0.0, 1.0, 0.0);
   TEST_c_c (ccosh, minus_zero, 0.0, 1.0, minus_zero);
   TEST_c_c (ccosh, 0.0, minus_zero, 1.0, minus_zero);
@@ -4006,6 +4045,8 @@ ceil_test (void)
   TEST_f_f (ceil, plus_infty, plus_infty);
   TEST_f_f (ceil, minus_infty, minus_infty);
   TEST_f_f (ceil, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (ceil, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (ceil, M_PIl, 4.0);
   TEST_f_f (ceil, -M_PIl, -3.0);
@@ -4101,6 +4142,8 @@ cexp_test (void)
 
   START (cexp);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (cexp, plus_zero, plus_zero, 1, 0.0);
   TEST_c_c (cexp, minus_zero, plus_zero, 1, 0.0);
   TEST_c_c (cexp, plus_zero, minus_zero, 1, minus_zero);
@@ -4202,6 +4245,9 @@ static void
 cimag_test (void)
 {
   START (cimag);
+
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_f (cimag, 1.0, 0.0, 0.0);
   TEST_c_f (cimag, 1.0, minus_zero, minus_zero);
   TEST_c_f (cimag, 1.0, qnan_value, qnan_value);
@@ -4224,6 +4270,8 @@ clog_test (void)
 
   START (clog);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (clog, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
   TEST_c_c (clog, minus_zero, minus_zero, minus_infty, -M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
 
@@ -4445,6 +4493,8 @@ clog10_test (void)
 
   START (clog10);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (clog10, minus_zero, 0, minus_infty, M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
   TEST_c_c (clog10, minus_zero, minus_zero, minus_infty, -M_PIl, DIVIDE_BY_ZERO_EXCEPTION);
 
@@ -4658,6 +4708,9 @@ static void
 conj_test (void)
 {
   START (conj);
+
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (conj, 0.0, 0.0, 0.0, minus_zero);
   TEST_c_c (conj, 0.0, minus_zero, 0.0, 0.0);
   TEST_c_c (conj, qnan_value, qnan_value, qnan_value, qnan_value);
@@ -4692,9 +4745,17 @@ copysign_test (void)
 
   /* XXX More correctly we would have to check the sign of the NaN.  */
   TEST_ff_f (copysign, qnan_value, 0, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (copysign, snan_value, 0, snan_value);
   TEST_ff_f (copysign, qnan_value, minus_zero, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (copysign, snan_value, minus_zero, snan_value);
   TEST_ff_f (copysign, -qnan_value, 0, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (copysign, minus_snan_value, 0, snan_value);
   TEST_ff_f (copysign, -qnan_value, minus_zero, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (copysign, minus_snan_value, minus_zero, snan_value);
 
   END (copysign);
 }
@@ -4722,6 +4783,12 @@ cos_test (void)
   errno = 0;
   TEST_f_f (cos, qnan_value, qnan_value);
   check_int ("errno for cos(qNaN) unchanged", errno, 0, 0, 0, 0);
+  if (SNAN_TESTS (FLOAT))
+    {
+      errno = 0;
+      TEST_f_f (cos, snan_value, qnan_value, INVALID_EXCEPTION);
+      check_int ("errno for cos(sNaN) unchanged", errno, 0, 0, 0, 0);
+    }
 
   TEST_f_f (cos, M_PI_6l * 2.0, 0.5);
   TEST_f_f (cos, M_PI_6l * 4.0, -0.5);
@@ -4912,6 +4979,8 @@ cosh_test (void)
   TEST_f_f (cosh, minus_infty, plus_infty);
 #endif
   TEST_f_f (cosh, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (cosh, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (cosh, 0.75L, 1.29468328467684468784170818539018176L);
 
@@ -5043,6 +5112,8 @@ cpow_test (void)
 
   START (cpow);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_cc_c (cpow, 1, 0, 0, 0, 1.0, 0.0);
   TEST_cc_c (cpow, 2, 0, 10, 0, 1024.0, 0.0);
 
@@ -5064,6 +5135,9 @@ static void
 cproj_test (void)
 {
   START (cproj);
+
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (cproj, 0.0, 0.0, 0.0, 0.0);
   TEST_c_c (cproj, minus_zero, minus_zero, minus_zero, minus_zero);
   TEST_c_c (cproj, 0.0, minus_zero, 0.0, minus_zero);
@@ -5087,6 +5161,9 @@ static void
 creal_test (void)
 {
   START (creal);
+
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_f (creal, 0.0, 1.0, 0.0);
   TEST_c_f (creal, minus_zero, 1.0, minus_zero);
   TEST_c_f (creal, qnan_value, 1.0, qnan_value);
@@ -5109,6 +5186,8 @@ csin_test (void)
 
   START (csin);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (csin, 0.0, 0.0, 0.0, 0.0);
   TEST_c_c (csin, minus_zero, 0.0, minus_zero, 0.0);
   TEST_c_c (csin, 0.0, minus_zero, 0, minus_zero);
@@ -5208,6 +5287,8 @@ csinh_test (void)
 
   START (csinh);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (csinh, 0.0, 0.0, 0.0, 0.0);
   TEST_c_c (csinh, minus_zero, 0.0, minus_zero, 0.0);
   TEST_c_c (csinh, 0.0, minus_zero, 0.0, minus_zero);
@@ -5307,6 +5388,8 @@ csqrt_test (void)
 
   START (csqrt);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (csqrt, 0, 0, 0.0, 0.0);
   TEST_c_c (csqrt, 0, minus_zero, 0, minus_zero);
   TEST_c_c (csqrt, minus_zero, 0, 0.0, 0.0);
@@ -5428,6 +5511,8 @@ ctan_test (void)
 
   START (ctan);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (ctan, 0, 0, 0.0, 0.0);
   TEST_c_c (ctan, 0, minus_zero, 0.0, minus_zero);
   TEST_c_c (ctan, minus_zero, 0, minus_zero, 0.0);
@@ -5648,6 +5733,8 @@ ctanh_test (void)
 
   START (ctanh);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_c_c (ctanh, 0, 0, 0.0, 0.0);
   TEST_c_c (ctanh, 0, minus_zero, 0.0, minus_zero);
   TEST_c_c (ctanh, minus_zero, 0, minus_zero, 0.0);
@@ -5874,6 +5961,8 @@ erf_test (void)
   TEST_f_f (erf, plus_infty, 1);
   TEST_f_f (erf, minus_infty, -1);
   TEST_f_f (erf, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (erf, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (erf, 0.125L, 0.140316204801333817393029446521623398L);
   TEST_f_f (erf, 0.75L, 0.711155633653515131598937834591410777L);
@@ -5902,6 +5991,8 @@ erfc_test (void)
   TEST_f_f (erfc, 0.0, 1.0);
   TEST_f_f (erfc, minus_zero, 1.0);
   TEST_f_f (erfc, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (erfc, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (erfc, 0.125L, 0.859683795198666182606970553478376602L);
   TEST_f_f (erfc, 0.75L, 0.288844366346484868401062165408589223L);
@@ -5936,6 +6027,8 @@ exp_test (void)
 
   START (exp);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (exp, 0, 1);
   TEST_f_f (exp, minus_zero, 1);
 
@@ -6090,12 +6183,15 @@ exp10_test (void)
 
   START (exp10);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (exp10, 0, 1);
   TEST_f_f (exp10, minus_zero, 1);
 
   TEST_f_f (exp10, plus_infty, plus_infty);
   TEST_f_f (exp10, minus_infty, 0);
   TEST_f_f (exp10, qnan_value, qnan_value);
+
   TEST_f_f (exp10, 3, 1000);
   TEST_f_f (exp10, -1, 0.1L);
   TEST_f_f (exp10, 36, 1.0e36L);
@@ -6129,6 +6225,8 @@ exp2_test (void)
 
   START (exp2);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (exp2, 0, 1);
   TEST_f_f (exp2, minus_zero, 1);
   TEST_f_f (exp2, plus_infty, plus_infty);
@@ -6173,6 +6271,8 @@ expm1_test (void)
 
   START (expm1);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (expm1, 0, 0);
   TEST_f_f (expm1, minus_zero, minus_zero);
 
@@ -6232,12 +6332,19 @@ fabs_test (void)
 {
   START (fabs);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (fabs, 0, 0);
   TEST_f_f (fabs, minus_zero, 0);
 
   TEST_f_f (fabs, plus_infty, plus_infty);
   TEST_f_f (fabs, minus_infty, plus_infty);
   TEST_f_f (fabs, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (fabs, snan_value, snan_value);
+  TEST_f_f (fabs, -qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (fabs, minus_snan_value, snan_value);
 
   TEST_f_f (fabs, 38.0, 38.0);
   TEST_f_f (fabs, -M_El, M_El);
@@ -6267,15 +6374,39 @@ fdim_test (void)
   TEST_ff_f (fdim, -9, plus_infty, 0);
 
   TEST_ff_f (fdim, 0, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, 0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, 9, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, 9, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, -9, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, -9, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, qnan_value, 9, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, snan_value, 9, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, qnan_value, -9, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, snan_value, -9, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, plus_infty, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, plus_infty, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, minus_infty, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, minus_infty, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, qnan_value, plus_infty, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, snan_value, plus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, qnan_value, minus_infty, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, snan_value, minus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (fdim, qnan_value, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, snan_value, qnan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, qnan_value, snan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fdim, snan_value, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_ff_f (fdim, plus_infty, plus_infty, 0);
 
@@ -6295,6 +6426,10 @@ finite_test (void)
   TEST_f_b (finite, plus_infty, 0);
   TEST_f_b (finite, minus_infty, 0);
   TEST_f_b (finite, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (finite, snan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (finite, minus_snan_value, 0);
 
   END (finite);
 }
@@ -6310,6 +6445,8 @@ floor_test (void)
   TEST_f_f (floor, plus_infty, plus_infty);
   TEST_f_f (floor, minus_infty, minus_infty);
   TEST_f_f (floor, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (floor, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (floor, M_PIl, 3.0);
   TEST_f_f (floor, -M_PIl, -4.0);
@@ -6408,12 +6545,26 @@ fma_test (void)
 
   TEST_fff_f (fma, 1.0, 2.0, 3.0, 5.0);
   TEST_fff_f (fma, qnan_value, 2.0, 3.0, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fff_f (fma, snan_value, 2.0, 3.0, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, 1.0, qnan_value, 3.0, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fff_f (fma, 1.0, snan_value, 3.0, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, 1.0, 2.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fff_f (fma, 1.0, 2.0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, plus_infty, 0.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fff_f (fma, plus_infty, 0.0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, minus_infty, 0.0, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fff_f (fma, minus_infty, 0.0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, 0.0, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fff_f (fma, 0.0, plus_infty, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, 0.0, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION_OK);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fff_f (fma, 0.0, minus_infty, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, plus_infty, 0.0, 1.0, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, minus_infty, 0.0, 1.0, qnan_value, INVALID_EXCEPTION);
   TEST_fff_f (fma, 0.0, plus_infty, 1.0, qnan_value, INVALID_EXCEPTION);
@@ -7357,6 +7508,8 @@ fmax_test (void)
 {
   START (fmax);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_ff_f (fmax, 0, 0, 0);
   TEST_ff_f (fmax, minus_zero, minus_zero, minus_zero);
   TEST_ff_f (fmax, 9, 0, 9);
@@ -7395,6 +7548,8 @@ fmin_test (void)
 {
   START (fmin);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_ff_f (fmin, 0, 0, 0);
   TEST_ff_f (fmin, minus_zero, minus_zero, minus_zero);
   TEST_ff_f (fmin, 9, 0, 0);
@@ -7465,6 +7620,12 @@ fmod_test (void)
   TEST_ff_f (fmod, 3.0, minus_infty, 3.0);
 
   TEST_ff_f (fmod, qnan_value, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fmod, snan_value, qnan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fmod, qnan_value, snan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (fmod, snan_value, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_ff_f (fmod, 6.5, 2.25L, 2.0L);
   TEST_ff_f (fmod, -6.5, 2.25L, -2.0L);
@@ -7489,6 +7650,10 @@ fpclassify_test (void)
   START (fpclassify);
 
   TEST_f_i (fpclassify, qnan_value, FP_NAN);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_i (fpclassify, snan_value, FP_NAN);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_i (fpclassify, minus_snan_value, FP_NAN);
   TEST_f_i (fpclassify, plus_infty, FP_INFINITE);
   TEST_f_i (fpclassify, minus_infty, FP_INFINITE);
   TEST_f_i (fpclassify, plus_zero, FP_ZERO);
@@ -7507,6 +7672,8 @@ frexp_test (void)
 
   START (frexp);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_fI_f1 (frexp, plus_infty, plus_infty, IGNORE);
   TEST_fI_f1 (frexp, minus_infty, minus_infty, IGNORE);
   TEST_fI_f1 (frexp, qnan_value, qnan_value, IGNORE);
@@ -7538,6 +7705,8 @@ gamma_test (void)
   TEST_f_f (gamma, -3, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
   TEST_f_f (gamma, minus_infty, plus_infty);
   TEST_f_f (gamma, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (gamma, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f1 (gamma, 1, 0, 1);
   TEST_f_f1 (gamma, 3, M_LN2l, 1);
@@ -7564,12 +7733,26 @@ hypot_test (void)
 
 #ifndef TEST_INLINE
   TEST_ff_f (hypot, plus_infty, qnan_value, plus_infty);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (hypot, plus_infty, snan_value, plus_infty, INVALID_EXCEPTION);
   TEST_ff_f (hypot, minus_infty, qnan_value, plus_infty);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (hypot, minus_infty, snan_value, plus_infty, INVALID_EXCEPTION);
   TEST_ff_f (hypot, qnan_value, plus_infty, plus_infty);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (hypot, snan_value, plus_infty, plus_infty, INVALID_EXCEPTION);
   TEST_ff_f (hypot, qnan_value, minus_infty, plus_infty);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (hypot, snan_value, minus_infty, plus_infty, INVALID_EXCEPTION);
 #endif
 
   TEST_ff_f (hypot, qnan_value, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (hypot, snan_value, qnan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (hypot, qnan_value, snan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (hypot, snan_value, snan_value, qnan_value, INVALID_EXCEPTION);
 
   /* hypot (x,y) == hypot (+-x, +-y)  */
   TEST_ff_f (hypot, 0.7L, 12.4L, 12.419742348374220601176836866763271L);
@@ -7628,6 +7811,13 @@ ilogb_test (void)
   errno = 0;
   TEST_f_i (ilogb, qnan_value, FP_ILOGBNAN, INVALID_EXCEPTION);
   check_int ("errno for ilogb(qNaN) unchanged", errno, EDOM, 0, 0, 0);
+  /* ilogb (sNaN) == FP_ILOGBNAN plus invalid exception  */
+  if (SNAN_TESTS (FLOAT))
+    {
+      errno = 0;
+      TEST_f_i (ilogb, snan_value, FP_ILOGBNAN, INVALID_EXCEPTION);
+      check_int ("errno for ilogb(sNaN) unchanged", errno, EDOM, 0, 0, 0);
+    }
   /* ilogb (inf) == INT_MAX plus invalid exception  */
   errno = 0;
   TEST_f_i (ilogb, plus_infty, INT_MAX, INVALID_EXCEPTION);
@@ -7652,6 +7842,10 @@ isfinite_test (void)
   TEST_f_b (isfinite, plus_infty, 0);
   TEST_f_b (isfinite, minus_infty, 0);
   TEST_f_b (isfinite, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isfinite, snan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isfinite, minus_snan_value, 0);
 
   END (isfinite);
 }
@@ -7665,18 +7859,36 @@ isgreater_test (void)
   TEST_ff_i (isgreater, minus_zero, plus_zero, 0);
   TEST_ff_i (isgreater, minus_zero, (FLOAT) 1, 0);
   TEST_ff_i (isgreater, minus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, minus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreater, plus_zero, minus_zero, 0);
   TEST_ff_i (isgreater, plus_zero, plus_zero, 0);
   TEST_ff_i (isgreater, plus_zero, (FLOAT) 1, 0);
   TEST_ff_i (isgreater, plus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, plus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreater, (FLOAT) 1, minus_zero, 1);
   TEST_ff_i (isgreater, (FLOAT) 1, plus_zero, 1);
   TEST_ff_i (isgreater, (FLOAT) 1, (FLOAT) 1, 0);
   TEST_ff_i (isgreater, (FLOAT) 1, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, (FLOAT) 1, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreater, qnan_value, minus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, snan_value, minus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreater, qnan_value, plus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, snan_value, plus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreater, qnan_value, (FLOAT) 1, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, snan_value, (FLOAT) 1, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreater, qnan_value, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, snan_value, qnan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, qnan_value, snan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreater, snan_value, snan_value, 0, INVALID_EXCEPTION);
 
   END (isgreater);
 }
@@ -7690,18 +7902,36 @@ isgreaterequal_test (void)
   TEST_ff_i (isgreaterequal, minus_zero, plus_zero, 1);
   TEST_ff_i (isgreaterequal, minus_zero, (FLOAT) 1, 0);
   TEST_ff_i (isgreaterequal, minus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, minus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreaterequal, plus_zero, minus_zero, 1);
   TEST_ff_i (isgreaterequal, plus_zero, plus_zero, 1);
   TEST_ff_i (isgreaterequal, plus_zero, (FLOAT) 1, 0);
   TEST_ff_i (isgreaterequal, plus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, plus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreaterequal, (FLOAT) 1, minus_zero, 1);
   TEST_ff_i (isgreaterequal, (FLOAT) 1, plus_zero, 1);
   TEST_ff_i (isgreaterequal, (FLOAT) 1, (FLOAT) 1, 1);
   TEST_ff_i (isgreaterequal, (FLOAT) 1, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, (FLOAT) 1, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreaterequal, qnan_value, minus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, snan_value, minus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreaterequal, qnan_value, plus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, snan_value, plus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreaterequal, qnan_value, (FLOAT) 1, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, snan_value, (FLOAT) 1, 0, INVALID_EXCEPTION);
   TEST_ff_i (isgreaterequal, qnan_value, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, snan_value, qnan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, qnan_value, snan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isgreaterequal, snan_value, snan_value, 0, INVALID_EXCEPTION);
 
   END (isgreaterequal);
 }
@@ -7718,6 +7948,10 @@ isinf_test (void)
   TEST_f_b (isinf, plus_infty, 1);
   TEST_f_b (isinf, minus_infty, 1);
   TEST_f_b (isinf, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isinf, snan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isinf, minus_snan_value, 0);
 
   END (isinf);
 }
@@ -7731,18 +7965,36 @@ isless_test (void)
   TEST_ff_i (isless, minus_zero, plus_zero, 0);
   TEST_ff_i (isless, minus_zero, (FLOAT) 1, 1);
   TEST_ff_i (isless, minus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, minus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isless, plus_zero, minus_zero, 0);
   TEST_ff_i (isless, plus_zero, plus_zero, 0);
   TEST_ff_i (isless, plus_zero, (FLOAT) 1, 1);
   TEST_ff_i (isless, plus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, plus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isless, (FLOAT) 1, minus_zero, 0);
   TEST_ff_i (isless, (FLOAT) 1, plus_zero, 0);
   TEST_ff_i (isless, (FLOAT) 1, (FLOAT) 1, 0);
   TEST_ff_i (isless, (FLOAT) 1, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, (FLOAT) 1, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (isless, qnan_value, minus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, snan_value, minus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (isless, qnan_value, plus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, snan_value, plus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (isless, qnan_value, (FLOAT) 1, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, snan_value, (FLOAT) 1, 0, INVALID_EXCEPTION);
   TEST_ff_i (isless, qnan_value, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, snan_value, qnan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, qnan_value, snan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isless, snan_value, snan_value, 0, INVALID_EXCEPTION);
 
   END (isless);
 }
@@ -7756,18 +8008,36 @@ islessequal_test (void)
   TEST_ff_i (islessequal, minus_zero, plus_zero, 1);
   TEST_ff_i (islessequal, minus_zero, (FLOAT) 1, 1);
   TEST_ff_i (islessequal, minus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, minus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessequal, plus_zero, minus_zero, 1);
   TEST_ff_i (islessequal, plus_zero, plus_zero, 1);
   TEST_ff_i (islessequal, plus_zero, (FLOAT) 1, 1);
   TEST_ff_i (islessequal, plus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, plus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessequal, (FLOAT) 1, minus_zero, 0);
   TEST_ff_i (islessequal, (FLOAT) 1, plus_zero, 0);
   TEST_ff_i (islessequal, (FLOAT) 1, (FLOAT) 1, 1);
   TEST_ff_i (islessequal, (FLOAT) 1, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, (FLOAT) 1, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessequal, qnan_value, minus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, snan_value, minus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessequal, qnan_value, plus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, snan_value, plus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessequal, qnan_value, (FLOAT) 1, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, snan_value, (FLOAT) 1, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessequal, qnan_value, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, snan_value, qnan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, qnan_value, snan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessequal, snan_value, snan_value, 0, INVALID_EXCEPTION);
 
   END (islessequal);
 }
@@ -7781,18 +8051,36 @@ islessgreater_test (void)
   TEST_ff_i (islessgreater, minus_zero, plus_zero, 0);
   TEST_ff_i (islessgreater, minus_zero, (FLOAT) 1, 1);
   TEST_ff_i (islessgreater, minus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, minus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessgreater, plus_zero, minus_zero, 0);
   TEST_ff_i (islessgreater, plus_zero, plus_zero, 0);
   TEST_ff_i (islessgreater, plus_zero, (FLOAT) 1, 1);
   TEST_ff_i (islessgreater, plus_zero, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, plus_zero, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessgreater, (FLOAT) 1, minus_zero, 1);
   TEST_ff_i (islessgreater, (FLOAT) 1, plus_zero, 1);
   TEST_ff_i (islessgreater, (FLOAT) 1, (FLOAT) 1, 0);
   TEST_ff_i (islessgreater, (FLOAT) 1, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, (FLOAT) 1, snan_value, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessgreater, qnan_value, minus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, snan_value, minus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessgreater, qnan_value, plus_zero, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, snan_value, plus_zero, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessgreater, qnan_value, (FLOAT) 1, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, snan_value, (FLOAT) 1, 0, INVALID_EXCEPTION);
   TEST_ff_i (islessgreater, qnan_value, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, snan_value, qnan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, qnan_value, snan_value, 0, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (islessgreater, snan_value, snan_value, 0, INVALID_EXCEPTION);
 
   END (islessgreater);
 }
@@ -7809,6 +8097,10 @@ isnan_test (void)
   TEST_f_b (isnan, plus_infty, 0);
   TEST_f_b (isnan, minus_infty, 0);
   TEST_f_b (isnan, qnan_value, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isnan, snan_value, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isnan, minus_snan_value, 1);
 
   END (isnan);
 }
@@ -7825,6 +8117,10 @@ isnormal_test (void)
   TEST_f_b (isnormal, plus_infty, 0);
   TEST_f_b (isnormal, minus_infty, 0);
   TEST_f_b (isnormal, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isnormal, snan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (isnormal, minus_snan_value, 0);
 
   END (isnormal);
 }
@@ -7841,6 +8137,10 @@ issignaling_test (void)
   TEST_f_b (issignaling, plus_infty, 0);
   TEST_f_b (issignaling, minus_infty, 0);
   TEST_f_b (issignaling, qnan_value, 0);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (issignaling, snan_value, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_b (issignaling, minus_snan_value, 1);
 
   END (issignaling);
 }
@@ -7854,18 +8154,36 @@ isunordered_test (void)
   TEST_ff_i (isunordered, minus_zero, plus_zero, 0);
   TEST_ff_i (isunordered, minus_zero, (FLOAT) 1, 0);
   TEST_ff_i (isunordered, minus_zero, qnan_value, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, minus_zero, snan_value, 1, INVALID_EXCEPTION);
   TEST_ff_i (isunordered, plus_zero, minus_zero, 0);
   TEST_ff_i (isunordered, plus_zero, plus_zero, 0);
   TEST_ff_i (isunordered, plus_zero, (FLOAT) 1, 0);
   TEST_ff_i (isunordered, plus_zero, qnan_value, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, plus_zero, snan_value, 1, INVALID_EXCEPTION);
   TEST_ff_i (isunordered, (FLOAT) 1, minus_zero, 0);
   TEST_ff_i (isunordered, (FLOAT) 1, plus_zero, 0);
   TEST_ff_i (isunordered, (FLOAT) 1, (FLOAT) 1, 0);
   TEST_ff_i (isunordered, (FLOAT) 1, qnan_value, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, (FLOAT) 1, snan_value, 1, INVALID_EXCEPTION);
   TEST_ff_i (isunordered, qnan_value, minus_zero, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, snan_value, minus_zero, 1, INVALID_EXCEPTION);
   TEST_ff_i (isunordered, qnan_value, plus_zero, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, snan_value, plus_zero, 1, INVALID_EXCEPTION);
   TEST_ff_i (isunordered, qnan_value, (FLOAT) 1, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, snan_value, (FLOAT) 1, 1, INVALID_EXCEPTION);
   TEST_ff_i (isunordered, qnan_value, qnan_value, 1);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, snan_value, qnan_value, 1, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, qnan_value, snan_value, 1, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_i (isunordered, snan_value, snan_value, 1, INVALID_EXCEPTION);
 
   END (isunordered);
 }
@@ -7888,6 +8206,8 @@ j0_test (void)
 
   /* j0 is the Bessel function of the first kind of order 0 */
   TEST_f_f (j0, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (j0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (j0, plus_infty, 0);
   TEST_f_f (j0, -1.0, 0.765197686557966551449717526102663221L);
   TEST_f_f (j0, 0.0, 1.0);
@@ -7936,6 +8256,8 @@ j1_test (void)
   START (j1);
 
   TEST_f_f (j1, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (j1, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (j1, plus_infty, 0);
 
   TEST_f_f (j1, -1.0, -0.440050585744933515959682203718914913L);
@@ -7982,6 +8304,8 @@ jn_test (void)
 
   /* jn (0, x) == j0 (x)  */
   TEST_ff_f (jn, 0, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (jn, 0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (jn, 0, plus_infty, 0);
   TEST_ff_f (jn, 0, -1.0, 0.765197686557966551449717526102663221L);
   TEST_ff_f (jn, 0, 0.0, 1.0);
@@ -7997,6 +8321,8 @@ jn_test (void)
 
   /* jn (1, x) == j1 (x)  */
   TEST_ff_f (jn, 1, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (jn, 1, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (jn, 1, plus_infty, 0);
   TEST_ff_f (jn, 1, -1.0, -0.440050585744933515959682203718914913L);
   TEST_ff_f (jn, 1, 0.0, 0.0);
@@ -8010,6 +8336,8 @@ jn_test (void)
 
   /* jn (3, x)  */
   TEST_ff_f (jn, 3, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (jn, 3, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (jn, 3, plus_infty, 0);
 
   TEST_ff_f (jn, 3, -1.0, -0.0195633539826684059189053216217515083L);
@@ -8022,6 +8350,8 @@ jn_test (void)
 
   /*  jn (10, x)  */
   TEST_ff_f (jn, 10, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (jn, 10, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (jn, 10, plus_infty, 0);
 
   TEST_ff_f (jn, 10, -1.0, 0.263061512368745320699785368779050294e-9L);
@@ -8054,6 +8384,8 @@ ldexp_test (void)
 {
   START (ldexp);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_ff_f (ldexp, 0, 0, 0);
   TEST_ff_f (ldexp, minus_zero, 0, minus_zero);
 
@@ -8088,6 +8420,8 @@ lgamma_test (void)
   TEST_f_f (lgamma, minus_zero, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
   check_int ("signgam for lgamma(-0) == -1", signgam, -1, 0, 0, 0);
   TEST_f_f (lgamma, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (lgamma, snan_value, qnan_value, INVALID_EXCEPTION);
 
   /* lgamma (x) == +inf plus divide by zero exception for integer x <= 0.  */
   errno = 0;
@@ -8116,7 +8450,7 @@ lrint_test (void)
   /* XXX this test is incomplete.  We need to have a way to specifiy
      the rounding method and test the critical cases.  So far, only
      unproblematic numbers are tested.  */
-  /* TODO: missing +/-Inf as well as qNaN tests.  */
+  /* TODO: missing +/-Inf as well as qNaN and sNaN tests.  */
 
   START (lrint);
 
@@ -8309,7 +8643,7 @@ llrint_test (void)
   /* XXX this test is incomplete.  We need to have a way to specifiy
      the rounding method and test the critical cases.  So far, only
      unproblematic numbers are tested.  */
-  /* TODO: missing +/-Inf as well as qNaN tests.  */
+  /* TODO: missing +/-Inf as well as qNaN and sNaN tests.  */
 
   START (llrint);
 
@@ -9003,6 +9337,8 @@ log_test (void)
   TEST_f_f (log, minus_infty, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (log, plus_infty, plus_infty);
   TEST_f_f (log, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (log, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (log, M_El, 1);
   TEST_f_f (log, 1.0 / M_El, -1);
@@ -9037,6 +9373,8 @@ log10_test (void)
 
   TEST_f_f (log10, plus_infty, plus_infty);
   TEST_f_f (log10, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (log10, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (log10, 0.1L, -1);
   TEST_f_f (log10, 10.0, 1);
@@ -9060,6 +9398,8 @@ log1p_test (void)
 
   START (log1p);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (log1p, 0, 0);
   TEST_f_f (log1p, minus_zero, minus_zero);
 
@@ -9102,6 +9442,8 @@ log2_test (void)
 
   TEST_f_f (log2, plus_infty, plus_infty);
   TEST_f_f (log2, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (log2, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (log2, M_El, M_LOG2El);
   TEST_f_f (log2, 2.0, 1);
@@ -9125,6 +9467,8 @@ logb_test (void)
 
   TEST_f_f (logb, minus_zero, minus_infty, DIVIDE_BY_ZERO_EXCEPTION);
   TEST_f_f (logb, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (logb, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (logb, 1, 0);
   TEST_f_f (logb, M_El, 1);
@@ -9188,7 +9532,7 @@ logb_test_downward (void)
 static void
 lround_test (void)
 {
-  /* TODO: missing +/-Inf as well as qNaN tests.  */
+  /* TODO: missing +/-Inf as well as qNaN and sNaN tests.  */
 
   START (lround);
 
@@ -9232,7 +9576,7 @@ lround_test (void)
 static void
 llround_test (void)
 {
-  /* TODO: missing +/-Inf as well as qNaN tests.  */
+  /* TODO: missing +/-Inf as well as qNaN and sNaN tests.  */
 
   START (llround);
 
@@ -9408,6 +9752,8 @@ modf_test (void)
 
   START (modf);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_fF_f1 (modf, plus_infty, 0, plus_infty);
   TEST_fF_f1 (modf, minus_infty, minus_zero, minus_infty);
   TEST_fF_f1 (modf, qnan_value, qnan_value, qnan_value);
@@ -9428,6 +9774,8 @@ nearbyint_test (void)
 {
   START (nearbyint);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (nearbyint, 0.0, 0.0);
   TEST_f_f (nearbyint, minus_zero, minus_zero);
   TEST_f_f (nearbyint, plus_infty, plus_infty);
@@ -9492,8 +9840,18 @@ nextafter_test (void)
   TEST_ff_f (nextafter, minus_infty, minus_infty, minus_infty);
 
   TEST_ff_f (nextafter, qnan_value, 1.1L, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nextafter, snan_value, 1.1L, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (nextafter, 1.1L, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nextafter, 1.1L, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (nextafter, qnan_value, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nextafter, snan_value, qnan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nextafter, qnan_value, snan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nextafter, snan_value, snan_value, qnan_value, INVALID_EXCEPTION);
 
   FLOAT fltmax = CHOOSE (LDBL_MAX, DBL_MAX, FLT_MAX,
 			 LDBL_MAX, DBL_MAX, FLT_MAX);
@@ -9527,8 +9885,18 @@ nexttoward_test (void)
   TEST_ff_f (nexttoward, minus_infty, minus_infty, minus_infty);
 
   TEST_ff_f (nexttoward, qnan_value, 1.1L, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nexttoward, snan_value, 1.1L, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (nexttoward, 1.1L, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nexttoward, 1.1L, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (nexttoward, qnan_value, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nexttoward, snan_value, qnan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nexttoward, qnan_value, snan_value, qnan_value, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (nexttoward, snan_value, snan_value, qnan_value, INVALID_EXCEPTION);
 
 #ifdef TEST_FLOAT
   TEST_ff_f (nexttoward, 1.0, 1.1L, 0x1.000002p0);
@@ -9614,6 +9982,8 @@ pow_test (void)
 
   START (pow);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_ff_f (pow, 0, 0, 1);
   TEST_ff_f (pow, 0, minus_zero, 1);
   TEST_ff_f (pow, minus_zero, 0, 1);
@@ -9693,7 +10063,6 @@ pow_test (void)
   TEST_ff_f (pow, qnan_value, 1, qnan_value);
   TEST_ff_f (pow, qnan_value, -1, qnan_value);
 
-  /* pow (x, qNaN) == qNaN.  */
   TEST_ff_f (pow, 3.0, qnan_value, qnan_value);
   TEST_ff_f (pow, minus_zero, qnan_value, qnan_value);
   TEST_ff_f (pow, plus_infty, qnan_value, qnan_value);
@@ -10493,6 +10862,8 @@ remainder_test (void)
 
   START (remainder);
 
+  /* TODO: missing sNaN tests.  */
+
   errno = 0;
   TEST_ff_f (remainder, 1, 0, qnan_value, INVALID_EXCEPTION);
   check_int ("errno for remainder(1, 0) = EDOM ", errno, EDOM, 0, 0, 0);
@@ -10544,6 +10915,12 @@ remquo_test (void)
   TEST_ffI_f1 (remquo, plus_infty, 1, qnan_value, IGNORE, INVALID_EXCEPTION);
   TEST_ffI_f1 (remquo, minus_infty, 1, qnan_value, IGNORE, INVALID_EXCEPTION);
   TEST_ffI_f1 (remquo, qnan_value, qnan_value, qnan_value, IGNORE);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ffI_f1 (remquo, snan_value, qnan_value, qnan_value, IGNORE, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ffI_f1 (remquo, qnan_value, snan_value, qnan_value, IGNORE, INVALID_EXCEPTION);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ffI_f1 (remquo, snan_value, snan_value, qnan_value, IGNORE, INVALID_EXCEPTION);
 
   TEST_ffI_f1 (remquo, 1.625, 1.0, -0.375, 2);
   TEST_ffI_f1 (remquo, -1.625, 1.0, 0.375, -2);
@@ -10559,7 +10936,7 @@ remquo_test (void)
 static void
 rint_test (void)
 {
-  /* TODO: missing qNaN tests.  */
+  /* TODO: missing qNaN and sNaN tests.  */
 
   START (rint);
 
@@ -11026,7 +11403,7 @@ rint_test_upward (void)
 static void
 round_test (void)
 {
-  /* TODO: missing +/-Inf as well as qNaN tests.  */
+  /* TODO: missing +/-Inf as well as qNaN and sNaN tests.  */
 
   START (round);
 
@@ -11130,6 +11507,8 @@ scalb_test (void)
 
   START (scalb);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_ff_f (scalb, 2.0, 0.5, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (scalb, 3.0, -2.5, qnan_value, INVALID_EXCEPTION);
 
@@ -11196,6 +11575,8 @@ scalbn_test (void)
   TEST_fi_f (scalbn, plus_infty, 1, plus_infty);
   TEST_fi_f (scalbn, minus_infty, 1, minus_infty);
   TEST_fi_f (scalbn, qnan_value, 1, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fi_f (scalbn, snan_value, 1, qnan_value, INVALID_EXCEPTION);
 
   TEST_fi_f (scalbn, 0.8L, 4, 12.8L);
   TEST_fi_f (scalbn, -0.854375L, 5, -27.34L);
@@ -11227,6 +11608,8 @@ scalbln_test (void)
   TEST_fl_f (scalbln, plus_infty, 1, plus_infty);
   TEST_fl_f (scalbln, minus_infty, 1, minus_infty);
   TEST_fl_f (scalbln, qnan_value, 1, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_fl_f (scalbln, snan_value, 1, qnan_value, INVALID_EXCEPTION);
 
   TEST_fl_f (scalbln, 0.8L, 4, 12.8L);
   TEST_fl_f (scalbln, -0.854375L, 5, -27.34L);
@@ -11269,7 +11652,7 @@ scalbln_test (void)
 static void
 signbit_test (void)
 {
-  /* TODO: missing qNaN tests.  */
+  /* TODO: missing qNaN and sNaN tests.  */
 
   START (signbit);
 
@@ -11309,6 +11692,12 @@ sin_test (void)
   errno = 0;
   TEST_f_f (sin, qnan_value, qnan_value);
   check_int ("errno for sin(qNaN) unchanged", errno, 0, 0, 0, 0);
+  if (SNAN_TESTS (FLOAT))
+    {
+      errno = 0;
+      TEST_f_f (sin, snan_value, qnan_value, INVALID_EXCEPTION);
+      check_int ("errno for sin(sNaN) unchanged", errno, 0, 0, 0, 0);
+    }
 
   TEST_f_f (sin, M_PI_6l, 0.5);
   TEST_f_f (sin, -M_PI_6l, -0.5);
@@ -11503,6 +11892,8 @@ sincos_test (void)
   TEST_extra (sincos, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
   TEST_extra (sincos, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION);
   TEST_extra (sincos, qnan_value, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_extra (sincos, snan_value, qnan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_extra (sincos, M_PI_2l, 1, 0);
   TEST_extra (sincos, M_PI_6l, 0.5, 0.86602540378443864676372317075293616L);
@@ -11553,6 +11944,8 @@ sinh_test (void)
   TEST_f_f (sinh, minus_infty, minus_infty);
 #endif
   TEST_f_f (sinh, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (sinh, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (sinh, 0.75L, 0.822316731935829980703661634446913849L);
   TEST_f_f (sinh, 0x8p-32L, 1.86264514923095703232705808926175479e-9L);
@@ -11682,6 +12075,8 @@ sqrt_test (void)
 
   TEST_f_f (sqrt, 0, 0);
   TEST_f_f (sqrt, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (sqrt, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (sqrt, plus_infty, plus_infty);
 
   TEST_f_f (sqrt, minus_zero, minus_zero);
@@ -11725,6 +12120,12 @@ tan_test (void)
   errno = 0;
   TEST_f_f (tan, qnan_value, qnan_value);
   check_int ("errno for tan(qNaN) == 0", errno, 0, 0, 0, 0);
+  if (SNAN_TESTS (FLOAT))
+    {
+      errno = 0;
+      TEST_f_f (tan, snan_value, qnan_value, INVALID_EXCEPTION);
+      check_int ("errno for tan(sNaN) == 0", errno, 0, 0, 0, 0);
+    }
 
   TEST_f_f (tan, M_PI_4l, 1);
   TEST_f_f (tan, 0.75L, 0.931596459944072461165202756573936428L);
@@ -11938,6 +12339,8 @@ tanh_test (void)
   TEST_f_f (tanh, minus_infty, -1);
 #endif
   TEST_f_f (tanh, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (tanh, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (tanh, 0.75L, 0.635148952387287319214434357312496495L);
   TEST_f_f (tanh, -0.75L, -0.635148952387287319214434357312496495L);
@@ -11962,6 +12365,8 @@ tgamma_test (void)
 
   START (tgamma);
 
+  /* TODO: missing sNaN tests.  */
+
   TEST_f_f (tgamma, plus_infty, plus_infty);
   TEST_f_f (tgamma, max_value, plus_infty, OVERFLOW_EXCEPTION);
   TEST_f_f (tgamma, 0, plus_infty, DIVIDE_BY_ZERO_EXCEPTION);
@@ -11993,6 +12398,8 @@ trunc_test (void)
   TEST_f_f (trunc, plus_infty, plus_infty);
   TEST_f_f (trunc, minus_infty, minus_infty);
   TEST_f_f (trunc, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (trunc, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (trunc, 0, 0);
   TEST_f_f (trunc, minus_zero, minus_zero);
@@ -12115,6 +12522,8 @@ y0_test (void)
   TEST_f_f (y0, -max_value, minus_infty, INVALID_EXCEPTION);
   TEST_f_f (y0, 0.0, minus_infty);
   TEST_f_f (y0, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (y0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_f_f (y0, plus_infty, 0);
 
   TEST_f_f (y0, 0.125L, -1.38968062514384052915582277745018693L);
@@ -12175,6 +12584,8 @@ y1_test (void)
   TEST_f_f (y1, 0.0, minus_infty);
   TEST_f_f (y1, plus_infty, 0);
   TEST_f_f (y1, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_f_f (y1, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_f_f (y1, 0.125L, -5.19993611253477499595928744876579921L);
   TEST_f_f (y1, 0.75L, -1.03759455076928541973767132140642198L);
@@ -12234,6 +12645,8 @@ yn_test (void)
   TEST_ff_f (yn, 0, -max_value, minus_infty, INVALID_EXCEPTION);
   TEST_ff_f (yn, 0, 0.0, minus_infty);
   TEST_ff_f (yn, 0, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (yn, 0, snan_value, qnan_value, INVALID_EXCEPTION);
   TEST_ff_f (yn, 0, plus_infty, 0);
 
   TEST_ff_f (yn, 0, 0.125L, -1.38968062514384052915582277745018693L);
@@ -12249,6 +12662,8 @@ yn_test (void)
   TEST_ff_f (yn, 1, 0.0, minus_infty);
   TEST_ff_f (yn, 1, plus_infty, 0);
   TEST_ff_f (yn, 1, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (yn, 1, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_ff_f (yn, 1, 0.125L, -5.19993611253477499595928744876579921L);
   TEST_ff_f (yn, 1, 0.75L, -1.03759455076928541973767132140642198L);
@@ -12261,6 +12676,8 @@ yn_test (void)
   /* yn (3, x)  */
   TEST_ff_f (yn, 3, plus_infty, 0);
   TEST_ff_f (yn, 3, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (yn, 3, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_ff_f (yn, 3, 0.125L, -2612.69757350066712600220955744091741L);
   TEST_ff_f (yn, 3, 0.75L, -12.9877176234475433186319774484809207L);
@@ -12271,6 +12688,8 @@ yn_test (void)
   /* yn (10, x)  */
   TEST_ff_f (yn, 10, plus_infty, 0);
   TEST_ff_f (yn, 10, qnan_value, qnan_value);
+  if (SNAN_TESTS (FLOAT))
+    TEST_ff_f (yn, 10, snan_value, qnan_value, INVALID_EXCEPTION);
 
   TEST_ff_f (yn, 10, 0.125L, -127057845771019398.252538486899753195L);
   TEST_ff_f (yn, 10, 0.75L, -2133501638.90573424452445412893839236L);
@@ -12295,7 +12714,7 @@ significand_test (void)
 {
   /* significand returns the mantissa of the exponential representation.  */
 
-  /* TODO: missing +/-Inf as well as qNaN tests.  */
+  /* TODO: missing +/-Inf as well as qNaN and sNaN tests.  */
 
   START (significand);
 
@@ -12332,6 +12751,8 @@ initialize (void)
 
   (void) &plus_zero;
   (void) &qnan_value;
+  (void) &snan_value;
+  (void) &minus_snan_value;
   (void) &minus_zero;
   (void) &plus_infty;
   (void) &minus_infty;


GrÃÃe,
 Thomas

Attachment: pgpBymcBb0nTt.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]