This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc 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]

GNU C Library master sources branch master updated. glibc-2.18-395-gce66581


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  ce66581742e7ae1d6ce59e5d2d4859b2ae41218c (commit)
       via  ee1466a953527d550bd0a7eed3ac46ba187ed65f (commit)
       via  14407b7e60d8e8f74ba5751c321051f5f3341cd4 (commit)
       via  ca07f1973bb0aecdd3d12532d3512663807e0b6d (commit)
       via  66294491665029eff0cf3ebd5fb6f04582da6c1e (commit)
      from  b46d046e7bf7e0f96e41e522da731b89177e31ab (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=ce66581742e7ae1d6ce59e5d2d4859b2ae41218c

commit ce66581742e7ae1d6ce59e5d2d4859b2ae41218c
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Sat Nov 16 12:48:35 2013 +0000

    Test signs of NaNs in libm-test.inc where appropriate.

diff --git a/ChangeLog b/ChangeLog
index 96c22ba..7e543af 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,22 @@
 2013-11-16  Joseph Myers  <joseph@codesourcery.com>
 
+	* math/libm-test.inc (TEST_NAN_SIGN): New macro.
+	(NO_TEST_INLINE): Update value.
+	(ERRNO_UNCHANGED): Likewise.
+	(ERRNO_EDOM): Likewise.
+	(ERRNO_ERANGE): Likewise.
+	(IGNORE_RESULT): Likewise.
+	(check_float_internal): Check signs of NaN results if
+	TEST_NAN_SIGN used.
+	(check_complex): Pass TEST_NAN_SIGN flag through to second
+	check_float_internal call.
+	(copysign_test_data): Add tests with quiet NaNs as second
+	argument.  Use TEST_NAN_SIGN.
+	(fabs_test_data): Add test of negative quiet NaN argument.  Use
+	TEST_NAN_SIGN.
+	(signbit_test_data): Add tests of quiet NaN argument.
+	* math/gen-libm-test.pl (parse_args): Handle TEST_NAN_SIGN.
+
 	* math/gen-libm-test.pl (show_exceptions): Take extra argument
 	$ignore_result.
 	(parse_args): Handle function results specified as IGNORE.
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index 98112ed..bd701d7 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -218,7 +218,7 @@ sub parse_args {
   # consistency check
   if ($current_arg == $#args) {
     die ("wrong number of arguments")
-      unless ($args[$current_arg] =~ /EXCEPTION|ERRNO|IGNORE_ZERO_INF_SIGN|NO_TEST_INLINE/);
+      unless ($args[$current_arg] =~ /EXCEPTION|ERRNO|IGNORE_ZERO_INF_SIGN|TEST_NAN_SIGN|NO_TEST_INLINE/);
   } elsif ($current_arg < $#args) {
     die ("wrong number of arguments");
   } elsif ($current_arg > ($#args+1)) {
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 790fcc8..0c88abc 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -173,13 +173,14 @@ struct ulp_data
 #define EXCEPTIONS_OK INVALID_EXCEPTION_OK+DIVIDE_BY_ZERO_EXCEPTION_OK
 /* Some special test flags, passed together with exceptions.  */
 #define IGNORE_ZERO_INF_SIGN		0x400
-#define NO_TEST_INLINE			0x800
+#define TEST_NAN_SIGN			0x800
+#define NO_TEST_INLINE			0x1000
 /* Indicate errno settings required or disallowed.  */
-#define ERRNO_UNCHANGED			0x1000
-#define ERRNO_EDOM			0x2000
-#define ERRNO_ERANGE			0x4000
+#define ERRNO_UNCHANGED			0x2000
+#define ERRNO_EDOM			0x4000
+#define ERRNO_ERANGE			0x8000
 /* Flags generated by gen-libm-test.pl, not entered here manually.  */
-#define IGNORE_RESULT			0x8000
+#define IGNORE_RESULT			0x10000
 
 /* Values underflowing only for float.  */
 #ifdef TEST_FLOAT
@@ -732,11 +733,29 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected,
     goto out;
   FLOAT max_ulp = find_test_ulps (test_name);
   if (issignaling (computed) && issignaling (expected))
-    ok = 1;
+    {
+      if ((exceptions & TEST_NAN_SIGN) != 0
+	  && signbit (computed) != signbit (expected))
+	{
+	  ok = 0;
+	  printf ("signaling NaN has wrong sign.\n");
+	}
+      else
+	ok = 1;
+    }
   else if (issignaling (computed) || issignaling (expected))
     ok = 0;
   else if (isnan (computed) && isnan (expected))
-    ok = 1;
+    {
+      if ((exceptions & TEST_NAN_SIGN) != 0
+	  && signbit (computed) != signbit (expected))
+	{
+	  ok = 0;
+	  printf ("quiet NaN has wrong sign.\n");
+	}
+      else
+	ok = 1;
+    }
   else if (isinf (computed) && isinf (expected))
     {
       /* Test for sign of infinities.  */
@@ -834,7 +853,9 @@ check_complex (const char *test_name, __complex__ FLOAT computed,
   /* Don't check again for exceptions or errno, just pass through the
      other relevant flags.  */
   check_float_internal (str, part_comp, part_exp,
-			exception & (IGNORE_ZERO_INF_SIGN | IGNORE_RESULT),
+			exception & (IGNORE_ZERO_INF_SIGN
+				     | TEST_NAN_SIGN
+				     | IGNORE_RESULT),
 			&imag_max_error);
   free (str);
 }
@@ -6815,11 +6836,15 @@ static const struct test_ff_f_data copysign_test_data[] =
     TEST_ff_f (copysign, minus_zero, plus_infty, 0, NO_INEXACT_EXCEPTION),
     TEST_ff_f (copysign, minus_zero, minus_zero, minus_zero, NO_INEXACT_EXCEPTION),
 
-    /* XXX More correctly we would have to check the sign of the NaN.  */
-    TEST_ff_f (copysign, qnan_value, 0, qnan_value, NO_INEXACT_EXCEPTION),
-    TEST_ff_f (copysign, qnan_value, minus_zero, qnan_value, NO_INEXACT_EXCEPTION),
-    TEST_ff_f (copysign, -qnan_value, 0, qnan_value, NO_INEXACT_EXCEPTION),
-    TEST_ff_f (copysign, -qnan_value, minus_zero, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (copysign, 0, qnan_value, 0, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (copysign, 0, -qnan_value, minus_zero, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (copysign, minus_zero, qnan_value, 0, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (copysign, minus_zero, -qnan_value, minus_zero, NO_INEXACT_EXCEPTION),
+
+    TEST_ff_f (copysign, qnan_value, 0, qnan_value, NO_INEXACT_EXCEPTION|TEST_NAN_SIGN),
+    TEST_ff_f (copysign, qnan_value, minus_zero, -qnan_value, NO_INEXACT_EXCEPTION|TEST_NAN_SIGN),
+    TEST_ff_f (copysign, -qnan_value, 0, qnan_value, NO_INEXACT_EXCEPTION|TEST_NAN_SIGN),
+    TEST_ff_f (copysign, -qnan_value, minus_zero, -qnan_value, NO_INEXACT_EXCEPTION|TEST_NAN_SIGN),
   };
 
 static void
@@ -8196,7 +8221,8 @@ static const struct test_f_f_data fabs_test_data[] =
 
     TEST_f_f (fabs, plus_infty, plus_infty, NO_INEXACT_EXCEPTION),
     TEST_f_f (fabs, minus_infty, plus_infty, NO_INEXACT_EXCEPTION),
-    TEST_f_f (fabs, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_f_f (fabs, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|TEST_NAN_SIGN),
+    TEST_f_f (fabs, -qnan_value, qnan_value, NO_INEXACT_EXCEPTION|TEST_NAN_SIGN),
 
     TEST_f_f (fabs, 38.0, 38.0, NO_INEXACT_EXCEPTION),
     TEST_f_f (fabs, -M_El, M_El, NO_INEXACT_EXCEPTION),
@@ -13347,11 +13373,12 @@ scalbln_test (void)
 
 static const struct test_f_i_data signbit_test_data[] =
   {
-    /* TODO: missing qNaN tests.  */
     TEST_f_b (signbit, 0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_b (signbit, minus_zero, 1, NO_INEXACT_EXCEPTION),
     TEST_f_b (signbit, plus_infty, 0, NO_INEXACT_EXCEPTION),
     TEST_f_b (signbit, minus_infty, 1, NO_INEXACT_EXCEPTION),
+    TEST_f_b (signbit, qnan_value, 0, NO_INEXACT_EXCEPTION),
+    TEST_f_b (signbit, -qnan_value, 1, NO_INEXACT_EXCEPTION),
 
     /* signbit (x) != 0 for x < 0.  */
     TEST_f_b (signbit, -1, 1, NO_INEXACT_EXCEPTION),

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=ee1466a953527d550bd0a7eed3ac46ba187ed65f

commit ee1466a953527d550bd0a7eed3ac46ba187ed65f
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Sat Nov 16 12:47:38 2013 +0000

    Add libm-test support for ignored return value, add more lrint / llrint / lround / llround tests.

diff --git a/ChangeLog b/ChangeLog
index 1c9bb6a..96c22ba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,31 @@
 2013-11-16  Joseph Myers  <joseph@codesourcery.com>
 
+	* math/gen-libm-test.pl (show_exceptions): Take extra argument
+	$ignore_result.
+	(parse_args): Handle function results specified as IGNORE.
+	* math/libm-test.inc (IGNORE_RESULT): New macro.
+	(check_float_internal): Do not check numerical result if flag
+	IGNORE_RESULT set.
+	(check_complex): Pass through IGNORE_RESULT to second
+	check_float_internal call.
+	(check_int): Do not check numerical result if flag IGNORE_RESULT
+	set.
+	(check_long): Likewise.
+	(check_bool): Likewise.
+	(check_longlong): Likewise.
+	(lrint_test_data): Add tests of infinite and NaN arguments.
+	(lrint_tonearest_test_data): Likewise.
+	(lrint_towardzero_test_data): Likewise.
+	(lrint_downward_test_data): Likewise.
+	(lrint_upward_test_data): Likewise.
+	(llrint_test_data): Likewise.
+	(llrint_tonearest_test_data): Likewise.
+	(llrint_towardzero_test_data): Likewise.
+	(llrint_downward_test_data): Likewise.
+	(llrint_upward_test_data): Likewise.
+	(lround_test_data): Likewise.
+	(llround_test_data): Likewise.
+
 	* math/libm-test.inc (NO_TEST_INLINE): New macro.
 	(ERRNO_UNCHANGED): Update value.
 	(ERRNO_EDOM): Likewise.
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index b7083a2..98112ed 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -147,11 +147,12 @@ sub build_complex_beautify {
 # Return the text to put in an initializer for a test's exception
 # information.
 sub show_exceptions {
-  my ($exception) = @_;
+  my ($ignore_result, $exception) = @_;
+  $ignore_result = ($ignore_result ? "IGNORE_RESULT|" : "");
   if (defined $exception) {
-    return ", $exception";
+    return ", ${ignore_result}$exception";
   } else {
-    return ', 0';
+    return ", ${ignore_result}0";
   }
 }
 
@@ -162,6 +163,7 @@ sub parse_args {
   my ($current_arg, $cline, $i);
   my (@special);
   my ($call_args);
+  my ($ignore_result_any, $ignore_result_all);
 
   ($descr_args, $descr_res) = split /_/,$descr, 2;
 
@@ -249,20 +251,47 @@ sub parse_args {
   }
 
   @descr = split //,$descr_res;
+  $ignore_result_any = 0;
+  $ignore_result_all = 1;
   foreach (@descr) {
     if ($_ =~ /b|f|i|l|L/ ) {
-      $cline .= ", $args[$current_arg]";
+      my ($result) = $args[$current_arg];
+      if ($result eq "IGNORE") {
+	$ignore_result_any = 1;
+	$result = "0";
+      } else {
+	$ignore_result_all = 0;
+      }
+      $cline .= ", $result";
       $current_arg++;
     } elsif ($_ eq 'c') {
-      $cline .= ", $args[$current_arg], $args[$current_arg+1]";
+      my ($result1) = $args[$current_arg];
+      if ($result1 eq "IGNORE") {
+	$ignore_result_any = 1;
+	$result1 = "0";
+      } else {
+	$ignore_result_all = 0;
+      }
+      my ($result2) = $args[$current_arg + 1];
+      if ($result2 eq "IGNORE") {
+	$ignore_result_any = 1;
+	$result2 = "0";
+      } else {
+	$ignore_result_all = 0;
+      }
+      $cline .= ", $result1, $result2";
       $current_arg += 2;
     } elsif ($_ eq '1') {
       push @special, $args[$current_arg];
       ++$current_arg;
     }
   }
+  if ($ignore_result_any && !$ignore_result_all) {
+    die ("some but not all function results ignored\n");
+  }
   # Add exceptions.
-  $cline .= show_exceptions (($current_arg <= $#args)
+  $cline .= show_exceptions ($ignore_result_any,
+			     ($current_arg <= $#args)
 			     ? $args[$current_arg]
 			     : undef);
 
diff --git a/math/libm-test.inc b/math/libm-test.inc
index cbc9996..790fcc8 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -178,6 +178,8 @@ struct ulp_data
 #define ERRNO_UNCHANGED			0x1000
 #define ERRNO_EDOM			0x2000
 #define ERRNO_ERANGE			0x4000
+/* Flags generated by gen-libm-test.pl, not entered here manually.  */
+#define IGNORE_RESULT			0x8000
 
 /* Values underflowing only for float.  */
 #ifdef TEST_FLOAT
@@ -726,6 +728,8 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected,
 
   test_exceptions (test_name, exceptions);
   test_errno (test_name, errno_value, exceptions);
+  if (exceptions & IGNORE_RESULT)
+    goto out;
   FLOAT max_ulp = find_test_ulps (test_name);
   if (issignaling (computed) && issignaling (expected))
     ok = 1;
@@ -788,6 +792,7 @@ check_float_internal (const char *test_name, FLOAT computed, FLOAT expected,
     }
   update_stats (ok);
 
+ out:
   fpstack_test (test_name);
   errno = 0;
 }
@@ -827,9 +832,9 @@ check_complex (const char *test_name, __complex__ FLOAT computed,
   part_exp = __imag__ expected;
 
   /* Don't check again for exceptions or errno, just pass through the
-     zero/inf sign test.  */
+     other relevant flags.  */
   check_float_internal (str, part_comp, part_exp,
-			exception & IGNORE_ZERO_INF_SIGN,
+			exception & (IGNORE_ZERO_INF_SIGN | IGNORE_RESULT),
 			&imag_max_error);
   free (str);
 }
@@ -845,6 +850,8 @@ check_int (const char *test_name, int computed, int expected,
 
   test_exceptions (test_name, exceptions);
   test_errno (test_name, errno_value, exceptions);
+  if (exceptions & IGNORE_RESULT)
+    goto out;
   noTests++;
   if (computed == expected)
     ok = 1;
@@ -860,6 +867,7 @@ check_int (const char *test_name, int computed, int expected,
     }
 
   update_stats (ok);
+ out:
   fpstack_test (test_name);
   errno = 0;
 }
@@ -875,6 +883,8 @@ check_long (const char *test_name, long int computed, long int expected,
 
   test_exceptions (test_name, exceptions);
   test_errno (test_name, errno_value, exceptions);
+  if (exceptions & IGNORE_RESULT)
+    goto out;
   noTests++;
   if (computed == expected)
     ok = 1;
@@ -890,6 +900,7 @@ check_long (const char *test_name, long int computed, long int expected,
     }
 
   update_stats (ok);
+ out:
   fpstack_test (test_name);
   errno = 0;
 }
@@ -905,6 +916,8 @@ check_bool (const char *test_name, int computed, int expected,
 
   test_exceptions (test_name, exceptions);
   test_errno (test_name, errno_value, exceptions);
+  if (exceptions & IGNORE_RESULT)
+    goto out;
   noTests++;
   if ((computed == 0) == (expected == 0))
     ok = 1;
@@ -920,6 +933,7 @@ check_bool (const char *test_name, int computed, int expected,
     }
 
   update_stats (ok);
+ out:
   fpstack_test (test_name);
   errno = 0;
 }
@@ -936,6 +950,8 @@ check_longlong (const char *test_name, long long int computed,
 
   test_exceptions (test_name, exceptions);
   test_errno (test_name, errno_value, exceptions);
+  if (exceptions & IGNORE_RESULT)
+    goto out;
   noTests++;
   if (computed == expected)
     ok = 1;
@@ -951,6 +967,7 @@ check_longlong (const char *test_name, long long int computed,
     }
 
   update_stats (ok);
+ out:
   fpstack_test (test_name);
   errno = 0;
 }
@@ -10112,7 +10129,9 @@ static const struct test_f_l_data lrint_test_data[] =
     /* 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.  */
+    TEST_f_l (lrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_l (lrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10144,6 +10163,9 @@ lrint_test (void)
 
 static const struct test_f_l_data lrint_tonearest_test_data[] =
   {
+    TEST_f_l (lrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_l (lrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10179,6 +10201,9 @@ lrint_test_tonearest (void)
 
 static const struct test_f_l_data lrint_towardzero_test_data[] =
   {
+    TEST_f_l (lrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_l (lrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10214,6 +10239,9 @@ lrint_test_towardzero (void)
 
 static const struct test_f_l_data lrint_downward_test_data[] =
   {
+    TEST_f_l (lrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_l (lrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10249,6 +10277,9 @@ lrint_test_downward (void)
 
 static const struct test_f_l_data lrint_upward_test_data[] =
   {
+    TEST_f_l (lrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_l (lrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_l (lrint, 0.2L, 1, INEXACT_EXCEPTION),
@@ -10287,7 +10318,9 @@ static const struct test_f_L_data llrint_test_data[] =
     /* 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.  */
+    TEST_f_L (llrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_L (llrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10423,6 +10456,9 @@ llrint_test (void)
 
 static const struct test_f_L_data llrint_tonearest_test_data[] =
   {
+    TEST_f_L (llrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_L (llrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10558,6 +10594,9 @@ llrint_test_tonearest (void)
 
 static const struct test_f_L_data llrint_towardzero_test_data[] =
   {
+    TEST_f_L (llrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_L (llrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10693,6 +10732,9 @@ llrint_test_towardzero (void)
 
 static const struct test_f_L_data llrint_downward_test_data[] =
   {
+    TEST_f_L (llrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_L (llrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, 0.2L, 0, INEXACT_EXCEPTION),
@@ -10824,6 +10866,9 @@ llrint_test_downward (void)
 
 static const struct test_f_L_data llrint_upward_test_data[] =
   {
+    TEST_f_L (llrint, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llrint, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_L (llrint, 0.0, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, minus_zero, 0, NO_INEXACT_EXCEPTION),
     TEST_f_L (llrint, 0.2L, 1, INEXACT_EXCEPTION),
@@ -11135,7 +11180,9 @@ logb_test_downward (void)
 
 static const struct test_f_l_data lround_test_data[] =
   {
-    /* TODO: missing +/-Inf as well as qNaN tests.  */
+    TEST_f_l (lround, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lround, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_l (lround, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_l (lround, 0, 0),
     TEST_f_l (lround, minus_zero, 0),
     TEST_f_l (lround, 0.2L, 0.0),
@@ -11182,7 +11229,9 @@ lround_test (void)
 
 static const struct test_f_L_data llround_test_data[] =
   {
-    /* TODO: missing +/-Inf as well as qNaN tests.  */
+    TEST_f_L (llround, plus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llround, minus_infty, IGNORE, INVALID_EXCEPTION),
+    TEST_f_L (llround, qnan_value, IGNORE, INVALID_EXCEPTION),
     TEST_f_L (llround, 0, 0),
     TEST_f_L (llround, minus_zero, 0),
     TEST_f_L (llround, 0.2L, 0.0),

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=14407b7e60d8e8f74ba5751c321051f5f3341cd4

commit 14407b7e60d8e8f74ba5751c321051f5f3341cd4
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Sat Nov 16 12:46:52 2013 +0000

    Replace libm-test.inc TEST_INLINE conditionals with NO_TEST_INLINE flag.

diff --git a/ChangeLog b/ChangeLog
index a99b0bb..1c9bb6a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,42 @@
 2013-11-16  Joseph Myers  <joseph@codesourcery.com>
 
+	* math/libm-test.inc (NO_TEST_INLINE): New macro.
+	(ERRNO_UNCHANGED): Update value.
+	(ERRNO_EDOM): Likewise.
+	(ERRNO_ERANGE): Likewise.
+	(NO_TEST_INLINE_FLOAT): New macro.
+	(NO_TEST_INLINE_DOUBLE): Likewise.
+	(enable_test): New function.
+	(RUN_TEST_f_f): Check enable_test before running test.
+	(RUN_TEST_2_f): Likewise.
+	(RUN_TEST_fff_f): Likewise.
+	(RUN_TEST_c_f): Likewise.
+	(RUN_TEST_f_f1): Likewise.
+	(RUN_TEST_fF_f1): Likewise.
+	(RUN_TEST_fI_f1): Likewise.
+	(RUN_TEST_ffI_f1): Likewise.
+	(RUN_TEST_c_c): Likewise.
+	(RUN_TEST_cc_c): Likewise.
+	(RUN_TEST_f_i): Likewise.
+	(RUN_TEST_f_i_tg): Likewise.
+	(RUN_TEST_ff_i_tg): Likewise.
+	(RUN_TEST_f_b): Likewise.
+	(RUN_TEST_f_b_tg): Likewise.
+	(RUN_TEST_f_l): Likewise.
+	(RUN_TEST_f_L): Likewise.
+	(RUN_TEST_fFF_11): Likewise.
+	(asinh_test_data): Use NO_TEST_INLINE instead of [!TEST_INLINE]
+	conditionals.
+	(cosh_test_data): Likewise.
+	(exp_test_data): Likewise.
+	(expm1_test_data): Likewise.
+	(hypot_test_data): Likewise.
+	(pow_test_data): Likewise.
+	(sinh_test_data): Likewise.
+	(tanh_test_data): Likewise.
+	* math/gen-libm-test.pl (parse_args): Allow NO_TEST_INLINE as
+	flags argument.
+
 	* libm-test.inc (acos_test_data): Disallow inexact exceptions for
 	tests with quiet NaN input and output.
 	(acosh_test_data): Likewise.
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index c2d10d3..b7083a2 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -216,7 +216,7 @@ sub parse_args {
   # consistency check
   if ($current_arg == $#args) {
     die ("wrong number of arguments")
-      unless ($args[$current_arg] =~ /EXCEPTION|ERRNO|IGNORE_ZERO_INF_SIGN/);
+      unless ($args[$current_arg] =~ /EXCEPTION|ERRNO|IGNORE_ZERO_INF_SIGN|NO_TEST_INLINE/);
   } elsif ($current_arg < $#args) {
     die ("wrong number of arguments");
   } elsif ($current_arg > ($#args+1)) {
diff --git a/math/libm-test.inc b/math/libm-test.inc
index cdb1b41..cbc9996 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -173,10 +173,11 @@ struct ulp_data
 #define EXCEPTIONS_OK INVALID_EXCEPTION_OK+DIVIDE_BY_ZERO_EXCEPTION_OK
 /* Some special test flags, passed together with exceptions.  */
 #define IGNORE_ZERO_INF_SIGN		0x400
+#define NO_TEST_INLINE			0x800
 /* Indicate errno settings required or disallowed.  */
-#define ERRNO_UNCHANGED			0x800
-#define ERRNO_EDOM			0x1000
-#define ERRNO_ERANGE			0x2000
+#define ERRNO_UNCHANGED			0x1000
+#define ERRNO_EDOM			0x2000
+#define ERRNO_ERANGE			0x4000
 
 /* Values underflowing only for float.  */
 #ifdef TEST_FLOAT
@@ -209,6 +210,18 @@ struct ulp_data
 						 ? 0			\
 						 : UNDERFLOW_EXCEPTION)
 
+/* Inline tests disabled for particular types.  */
+#ifdef TEST_FLOAT
+# define NO_TEST_INLINE_FLOAT	NO_TEST_INLINE
+#else
+# define NO_TEST_INLINE_FLOAT	0
+#endif
+#ifdef TEST_DOUBLE
+# define NO_TEST_INLINE_DOUBLE	NO_TEST_INLINE
+#else
+# define NO_TEST_INLINE_DOUBLE	0
+#endif
+
 /* Various constants (we must supply them precalculated for accuracy).  */
 #define M_PI_6l			.52359877559829887307710723054658383L
 #define M_E2l			7.389056098930650227230427460575008L
@@ -942,6 +955,17 @@ check_longlong (const char *test_name, long long int computed,
   errno = 0;
 }
 
+/* Return whether a test with flags EXCEPTIONS should be run.  */
+static int
+enable_test (int exceptions)
+{
+#ifdef TEST_INLINE
+  if (exceptions & NO_TEST_INLINE)
+    return 0;
+#endif
+  return 1;
+}
+
 /* Structures for each kind of test.  */
 struct test_f_f_data
 {
@@ -1137,15 +1161,16 @@ struct test_fFF_11_data
 
 /* Run an individual test, including any required setup and checking
    of results, or loop over all tests in an array.  */
-#define RUN_TEST_f_f(ARG_STR, FUNC_NAME, ARG, EXPECTED,	\
-		     EXCEPTIONS)				\
-  do								\
-    {								\
-      COMMON_TEST_SETUP (ARG_STR);				\
-      check_float (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
-		   EXCEPTIONS);					\
-      COMMON_TEST_CLEANUP;					\
-    }								\
+#define RUN_TEST_f_f(ARG_STR, FUNC_NAME, ARG, EXPECTED,			\
+		     EXCEPTIONS)					\
+  do									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_float (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+		     EXCEPTIONS);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1153,15 +1178,16 @@ struct test_fFF_11_data
       RUN_TEST_f_f ((ARRAY)[i].arg_str, FUNC_NAME, (ARRAY)[i].arg,	\
 		    (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_2_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,		\
-		     EXCEPTIONS)					\
-  do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_float (test_name, FUNC (FUNC_NAME) (ARG1, ARG2), EXPECTED,	\
-		   EXCEPTIONS);						\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+#define RUN_TEST_2_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
+		     EXCEPTIONS)				\
+  do								\
+    if (enable_test (EXCEPTIONS))				\
+      {								\
+	COMMON_TEST_SETUP (ARG_STR);				\
+	check_float (test_name, FUNC (FUNC_NAME) (ARG1, ARG2),	\
+		     EXPECTED, EXCEPTIONS);			\
+	COMMON_TEST_CLEANUP;					\
+      }								\
   while (0)
 #define RUN_TEST_LOOP_2_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1181,12 +1207,13 @@ struct test_fFF_11_data
 #define RUN_TEST_fff_f(ARG_STR, FUNC_NAME, ARG1, ARG2, ARG3,		\
 		       EXPECTED, EXCEPTIONS)				\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_float (test_name, FUNC (FUNC_NAME) (ARG1, ARG2, ARG3),	\
-		   EXPECTED, EXCEPTIONS);				\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_float (test_name, FUNC (FUNC_NAME) (ARG1, ARG2, ARG3),	\
+		     EXPECTED, EXCEPTIONS);				\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_fff_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1198,13 +1225,14 @@ struct test_fFF_11_data
 #define RUN_TEST_c_f(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,		\
 		     EXCEPTIONS)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_float (test_name,						\
-		   FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1, ARG2)),	\
-		   EXPECTED, EXCEPTIONS);				\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_float (test_name,						\
+		     FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1, ARG2)),	\
+		     EXPECTED, EXCEPTIONS);				\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_c_f(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1213,21 +1241,22 @@ struct test_fFF_11_data
 		    (ARRAY)[i].argc, (ARRAY)[i].expected,		\
 		    (ARRAY)[i].exceptions);				\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_f_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED,	\
-		      EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,	\
-		      EXTRA_EXPECTED)				\
-  do								\
-    {								\
-      COMMON_TEST_SETUP (ARG_STR);				\
-      (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;		\
-      check_float (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
-		   EXCEPTIONS);					\
-      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);			\
-      if (EXTRA_TEST)						\
-	check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
-      EXTRA_OUTPUT_TEST_CLEANUP (1);				\
-      COMMON_TEST_CLEANUP;					\
-    }								\
+#define RUN_TEST_f_f1(ARG_STR, FUNC_NAME, ARG, EXPECTED,		\
+		      EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,		\
+		      EXTRA_EXPECTED)					\
+  do									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
+	check_float (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+		     EXCEPTIONS);					\
+	EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
+	if (EXTRA_TEST)							\
+	  check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
+	EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR)	\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1241,17 +1270,18 @@ struct test_fFF_11_data
 		       EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,		\
 		       EXTRA_EXPECTED)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
-      check_float (test_name, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
-		   EXPECTED, EXCEPTIONS);				\
-      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
-      if (EXTRA_TEST)							\
-	check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
-      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
+	check_float (test_name, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
+		     EXPECTED, EXCEPTIONS);				\
+	EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
+	if (EXTRA_TEST)							\
+	  check_float (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
+	EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_fF_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR)	\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1265,17 +1295,18 @@ struct test_fFF_11_data
 		       EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,		\
 		       EXTRA_EXPECTED)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
-      check_float (test_name, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
-		   EXPECTED, EXCEPTIONS);				\
-      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
-      if (EXTRA_TEST)							\
-	check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);		\
-      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
+	check_float (test_name, FUNC (FUNC_NAME) (ARG, &(EXTRA_VAR)),	\
+		     EXPECTED, EXCEPTIONS);				\
+	EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
+	if (EXTRA_TEST)							\
+	  check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
+	EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_fI_f1(FUNC_NAME, ARRAY, ROUNDING_MODE, EXTRA_VAR)	\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1289,18 +1320,19 @@ struct test_fFF_11_data
 			EXCEPTIONS, EXTRA_VAR, EXTRA_TEST,		\
 			EXTRA_EXPECTED)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      (EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
-      check_float (test_name,						\
-		   FUNC (FUNC_NAME) (ARG1, ARG2, &(EXTRA_VAR)),		\
-		   EXPECTED, EXCEPTIONS);				\
-      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
-      if (EXTRA_TEST)							\
-	check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);		\
-      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	(EXTRA_VAR) = (EXTRA_EXPECTED) == 0 ? 1 : 0;			\
+	check_float (test_name,						\
+		     FUNC (FUNC_NAME) (ARG1, ARG2, &(EXTRA_VAR)),	\
+		     EXPECTED, EXCEPTIONS);				\
+	EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
+	if (EXTRA_TEST)							\
+	  check_int (extra1_name, EXTRA_VAR, EXTRA_EXPECTED, 0);	\
+	EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_ffI_f1(FUNC_NAME, ARRAY, ROUNDING_MODE,		\
 			     EXTRA_VAR)					\
@@ -1315,13 +1347,14 @@ struct test_fFF_11_data
 #define RUN_TEST_c_c(ARG_STR, FUNC_NAME, ARGR, ARGC, EXPR, EXPC,	\
 		     EXCEPTIONS)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_complex (test_name,						\
-		     FUNC (FUNC_NAME) (BUILD_COMPLEX (ARGR, ARGC)),	\
-		     BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS);		\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_complex (test_name,					\
+		       FUNC (FUNC_NAME) (BUILD_COMPLEX (ARGR, ARGC)),	\
+		       BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS);		\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_c_c(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1333,14 +1366,15 @@ struct test_fFF_11_data
 #define RUN_TEST_cc_c(ARG_STR, FUNC_NAME, ARG1R, ARG1C, ARG2R, ARG2C,	\
 		      EXPR, EXPC, EXCEPTIONS)				\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_complex (test_name,						\
-		     FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1R, ARG1C),	\
-				       BUILD_COMPLEX (ARG2R, ARG2C)),	\
-		     BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS);		\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_complex (test_name,					\
+		       FUNC (FUNC_NAME) (BUILD_COMPLEX (ARG1R, ARG1C),	\
+					 BUILD_COMPLEX (ARG2R, ARG2C)),	\
+		       BUILD_COMPLEX (EXPR, EXPC), EXCEPTIONS);		\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_cc_c(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1352,12 +1386,13 @@ struct test_fFF_11_data
   ROUND_RESTORE_ ## ROUNDING_MODE
 #define RUN_TEST_f_i(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_int (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
-		 EXCEPTIONS);						\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_int (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
+		   EXCEPTIONS);						\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_i(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1368,11 +1403,12 @@ struct test_fFF_11_data
 #define RUN_TEST_f_i_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED,		\
 			EXCEPTIONS)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_int (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS);	\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_int (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS);	\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1383,12 +1419,13 @@ struct test_fFF_11_data
 #define RUN_TEST_ff_i_tg(ARG_STR, FUNC_NAME, ARG1, ARG2, EXPECTED,	\
 			 EXCEPTIONS)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_int (test_name, FUNC_NAME (ARG1, ARG2), EXPECTED,		\
-		 EXCEPTIONS);						\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_int (test_name, FUNC_NAME (ARG1, ARG2), EXPECTED,		\
+		   EXCEPTIONS);						\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_ff_i_tg(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1399,12 +1436,13 @@ struct test_fFF_11_data
   ROUND_RESTORE_ ## ROUNDING_MODE
 #define RUN_TEST_f_b(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_bool (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
-		  EXCEPTIONS);						\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_bool (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+		    EXCEPTIONS);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_b(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1415,11 +1453,12 @@ struct test_fFF_11_data
 #define RUN_TEST_f_b_tg(ARG_STR, FUNC_NAME, ARG, EXPECTED,		\
 			EXCEPTIONS)					\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_bool (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS);	\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_bool (test_name, FUNC_NAME (ARG), EXPECTED, EXCEPTIONS);	\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_b_tg(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1429,12 +1468,13 @@ struct test_fFF_11_data
   ROUND_RESTORE_ ## ROUNDING_MODE
 #define RUN_TEST_f_l(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_long (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,		\
-		  EXCEPTIONS);						\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_long (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+		    EXCEPTIONS);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_l(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1444,12 +1484,13 @@ struct test_fFF_11_data
   ROUND_RESTORE_ ## ROUNDING_MODE
 #define RUN_TEST_f_L(ARG_STR, FUNC_NAME, ARG, EXPECTED, EXCEPTIONS)	\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      check_longlong (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
-		      EXCEPTIONS);					\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	check_longlong (test_name, FUNC (FUNC_NAME) (ARG), EXPECTED,	\
+			EXCEPTIONS);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_f_L(FUNC_NAME, ARRAY, ROUNDING_MODE)		\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
@@ -1462,20 +1503,21 @@ struct test_fFF_11_data
 			EXTRA1_EXPECTED, EXTRA2_VAR,			\
 			EXTRA2_TEST, EXTRA2_EXPECTED)			\
   do									\
-    {									\
-      COMMON_TEST_SETUP (ARG_STR);					\
-      FUNC (FUNC_NAME) (ARG, &(EXTRA1_VAR), &(EXTRA2_VAR));		\
-      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
-      if (EXTRA1_TEST)							\
-	check_float (extra1_name, EXTRA1_VAR, EXTRA1_EXPECTED,		\
-		     EXCEPTIONS);					\
-      EXTRA_OUTPUT_TEST_CLEANUP (1);					\
-      EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 2);				\
-      if (EXTRA2_TEST)							\
-	check_float (extra2_name, EXTRA2_VAR, EXTRA2_EXPECTED, 0);	\
-      EXTRA_OUTPUT_TEST_CLEANUP (2);					\
-      COMMON_TEST_CLEANUP;						\
-    }									\
+    if (enable_test (EXCEPTIONS))					\
+      {									\
+	COMMON_TEST_SETUP (ARG_STR);					\
+	FUNC (FUNC_NAME) (ARG, &(EXTRA1_VAR), &(EXTRA2_VAR));		\
+	EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 1);				\
+	if (EXTRA1_TEST)						\
+	  check_float (extra1_name, EXTRA1_VAR, EXTRA1_EXPECTED,	\
+		       EXCEPTIONS);					\
+	EXTRA_OUTPUT_TEST_CLEANUP (1);					\
+	EXTRA_OUTPUT_TEST_SETUP (ARG_STR, 2);				\
+	if (EXTRA2_TEST)						\
+	  check_float (extra2_name, EXTRA2_VAR, EXTRA2_EXPECTED, 0);	\
+	EXTRA_OUTPUT_TEST_CLEANUP (2);					\
+	COMMON_TEST_CLEANUP;						\
+      }									\
   while (0)
 #define RUN_TEST_LOOP_fFF_11(FUNC_NAME, ARRAY, ROUNDING_MODE,		\
 			     EXTRA1_VAR, EXTRA2_VAR)			\
@@ -1774,10 +1816,8 @@ static const struct test_f_f_data asinh_test_data[] =
   {
     TEST_f_f (asinh, 0, 0),
     TEST_f_f (asinh, minus_zero, minus_zero),
-#ifndef TEST_INLINE
-    TEST_f_f (asinh, plus_infty, plus_infty),
-    TEST_f_f (asinh, minus_infty, minus_infty),
-#endif
+    TEST_f_f (asinh, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_f_f (asinh, minus_infty, minus_infty, NO_TEST_INLINE),
     TEST_f_f (asinh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (asinh, 0.75L, 0.693147180559945309417232121458176568L),
   };
@@ -6952,10 +6992,8 @@ static const struct test_f_f_data cosh_test_data[] =
     TEST_f_f (cosh, 0, 1),
     TEST_f_f (cosh, minus_zero, 1),
 
-#ifndef TEST_INLINE
-    TEST_f_f (cosh, plus_infty, plus_infty),
-    TEST_f_f (cosh, minus_infty, plus_infty),
-#endif
+    TEST_f_f (cosh, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_f_f (cosh, minus_infty, plus_infty, NO_TEST_INLINE),
     TEST_f_f (cosh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (cosh, 0.75L, 1.29468328467684468784170818539018176L),
@@ -7890,10 +7928,8 @@ static const struct test_f_f_data exp_test_data[] =
     TEST_f_f (exp, 0, 1),
     TEST_f_f (exp, minus_zero, 1),
 
-#ifndef TEST_INLINE
-    TEST_f_f (exp, plus_infty, plus_infty),
-    TEST_f_f (exp, minus_infty, 0),
-#endif
+    TEST_f_f (exp, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_f_f (exp, minus_infty, 0, NO_TEST_INLINE),
     TEST_f_f (exp, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (exp, 1, M_El),
 
@@ -8083,10 +8119,8 @@ static const struct test_f_f_data expm1_test_data[] =
     TEST_f_f (expm1, 0, 0),
     TEST_f_f (expm1, minus_zero, minus_zero),
 
-#ifndef TEST_INLINE
-    TEST_f_f (expm1, plus_infty, plus_infty),
-    TEST_f_f (expm1, minus_infty, -1),
-#endif
+    TEST_f_f (expm1, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_f_f (expm1, minus_infty, -1, NO_TEST_INLINE),
     TEST_f_f (expm1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (expm1, 1, M_El - 1.0),
@@ -9430,12 +9464,10 @@ static const struct test_ff_f_data hypot_test_data[] =
     TEST_ff_f (hypot, plus_infty, 1, plus_infty),
     TEST_ff_f (hypot, minus_infty, 1, plus_infty),
 
-#ifndef TEST_INLINE
-    TEST_ff_f (hypot, plus_infty, qnan_value, plus_infty),
-    TEST_ff_f (hypot, minus_infty, qnan_value, plus_infty),
-    TEST_ff_f (hypot, qnan_value, plus_infty, plus_infty),
-    TEST_ff_f (hypot, qnan_value, minus_infty, plus_infty),
-#endif
+    TEST_ff_f (hypot, plus_infty, qnan_value, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (hypot, minus_infty, qnan_value, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (hypot, qnan_value, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (hypot, qnan_value, minus_infty, plus_infty, NO_TEST_INLINE),
 
     TEST_ff_f (hypot, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
@@ -9462,18 +9494,16 @@ static const struct test_ff_f_data hypot_test_data[] =
     TEST_ff_f (hypot, 0x1.23456789abcdef0123456789ab8p-500L, 0x1.23456789abcdef0123456789ab8p-500L, 4.9155782399407039128612180934736799735113e-151L),
 #endif
 
-#if !(defined TEST_FLOAT && defined TEST_INLINE)
-    TEST_ff_f (hypot, 0x3p125L, 0x4p125L, 0x5p125L),
-    TEST_ff_f (hypot, 0x1.234566p-126L, 0x1.234566p-126L, 1.891441686191081936598531534017449451173e-38L),
-#endif
+    TEST_ff_f (hypot, 0x3p125L, 0x4p125L, 0x5p125L, NO_TEST_INLINE_FLOAT),
+    TEST_ff_f (hypot, 0x1.234566p-126L, 0x1.234566p-126L, 1.891441686191081936598531534017449451173e-38L, NO_TEST_INLINE_FLOAT),
 
-#if !defined TEST_FLOAT && !(defined TEST_DOUBLE && defined TEST_INLINE)
-    TEST_ff_f (hypot, 0x3p1021L, 0x4p1021L, 0x5p1021L),
-    TEST_ff_f (hypot, 0x1p+0L, 0x0.3ep-1022L, 0x1p+0L),
+#ifndef TEST_FLOAT
+    TEST_ff_f (hypot, 0x3p1021L, 0x4p1021L, 0x5p1021L, NO_TEST_INLINE_DOUBLE),
+    TEST_ff_f (hypot, 0x1p+0L, 0x0.3ep-1022L, 0x1p+0L, NO_TEST_INLINE_DOUBLE),
 #endif
 
-#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384 && !defined TEST_INLINE
-    TEST_ff_f (hypot, 0x3p16381L, 0x4p16381L, 0x5p16381L),
+#if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384
+    TEST_ff_f (hypot, 0x3p16381L, 0x4p16381L, 0x5p16381L, NO_TEST_INLINE),
 #endif
 
     TEST_ff_f (hypot, 0x1p-149L, 0x1p-149L, 1.9817352931807469938024533350782879785095e-45L, UNDERFLOW_EXCEPTION_FLOAT),
@@ -9482,10 +9512,10 @@ static const struct test_ff_f_data hypot_test_data[] =
     TEST_ff_f (hypot, 0x1p-1074L, 0x1p-1074L, 6.9871433705131320800651344656990806305791e-324L, UNDERFLOW_EXCEPTION_DOUBLE),
 #endif
 
-#if defined TEST_LDOUBLE && LDBL_MIN_EXP <= -16381 && !defined TEST_INLINE
-    TEST_ff_f (hypot, 0x1p-16445L, 0x1p-16445L, 5.1550906155442528702558159159596215039925e-4951L, UNDERFLOW_EXCEPTION),
+#if defined TEST_LDOUBLE && LDBL_MIN_EXP <= -16381
+    TEST_ff_f (hypot, 0x1p-16445L, 0x1p-16445L, 5.1550906155442528702558159159596215039925e-4951L, UNDERFLOW_EXCEPTION|NO_TEST_INLINE),
 # if LDBL_MANT_DIG >= 113
-    TEST_ff_f (hypot, 0x1p-16494L, 0x1p-16494L, 9.1572804726500807075521065242888978445857e-4966L, UNDERFLOW_EXCEPTION),
+    TEST_ff_f (hypot, 0x1p-16494L, 0x1p-16494L, 9.1572804726500807075521065242888978445857e-4966L, UNDERFLOW_EXCEPTION|NO_TEST_INLINE),
 # endif
 #endif
   };
@@ -11551,63 +11581,61 @@ static const struct test_ff_f_data pow_test_data[] =
     TEST_ff_f (pow, qnan_value, 0, 1),
     TEST_ff_f (pow, qnan_value, minus_zero, 1),
 
-#ifndef TEST_INLINE
-    TEST_ff_f (pow, 1.1L, plus_infty, plus_infty),
-    TEST_ff_f (pow, plus_infty, plus_infty, plus_infty),
-    TEST_ff_f (pow, -1.1L, plus_infty, plus_infty),
-    TEST_ff_f (pow, minus_infty, plus_infty, plus_infty),
-
-    TEST_ff_f (pow, 0.9L, plus_infty, 0),
-    TEST_ff_f (pow, 1e-7L, plus_infty, 0),
-    TEST_ff_f (pow, -0.9L, plus_infty, 0),
-    TEST_ff_f (pow, -1e-7L, plus_infty, 0),
-
-    TEST_ff_f (pow, 1.1L, minus_infty, 0),
-    TEST_ff_f (pow, plus_infty, minus_infty, 0),
-    TEST_ff_f (pow, -1.1L, minus_infty, 0),
-    TEST_ff_f (pow, minus_infty, minus_infty, 0),
-
-    TEST_ff_f (pow, 0.9L, minus_infty, plus_infty),
-    TEST_ff_f (pow, 1e-7L, minus_infty, plus_infty),
-    TEST_ff_f (pow, -0.9L, minus_infty, plus_infty),
-    TEST_ff_f (pow, -1e-7L, minus_infty, plus_infty),
-
-    TEST_ff_f (pow, plus_infty, 1e-7L, plus_infty),
-    TEST_ff_f (pow, plus_infty, 1, plus_infty),
-    TEST_ff_f (pow, plus_infty, 1e7L, plus_infty),
-    TEST_ff_f (pow, plus_infty, min_subnorm_value, plus_infty),
-
-    TEST_ff_f (pow, plus_infty, -1e-7L, 0),
-    TEST_ff_f (pow, plus_infty, -1, 0),
-    TEST_ff_f (pow, plus_infty, -1e7L, 0),
-    TEST_ff_f (pow, plus_infty, -min_subnorm_value, 0),
-
-    TEST_ff_f (pow, minus_infty, 1, minus_infty),
-    TEST_ff_f (pow, minus_infty, 11, minus_infty),
-    TEST_ff_f (pow, minus_infty, 1001, minus_infty),
-
-    TEST_ff_f (pow, minus_infty, 2, plus_infty),
-    TEST_ff_f (pow, minus_infty, 12, plus_infty),
-    TEST_ff_f (pow, minus_infty, 1002, plus_infty),
-    TEST_ff_f (pow, minus_infty, 0.1L, plus_infty),
-    TEST_ff_f (pow, minus_infty, 1.1L, plus_infty),
-    TEST_ff_f (pow, minus_infty, 11.1L, plus_infty),
-    TEST_ff_f (pow, minus_infty, 1001.1L, plus_infty),
-    TEST_ff_f (pow, minus_infty, min_subnorm_value, plus_infty),
-
-    TEST_ff_f (pow, minus_infty, -1, minus_zero),
-    TEST_ff_f (pow, minus_infty, -11, minus_zero),
-    TEST_ff_f (pow, minus_infty, -1001, minus_zero),
-
-    TEST_ff_f (pow, minus_infty, -2, 0),
-    TEST_ff_f (pow, minus_infty, -12, 0),
-    TEST_ff_f (pow, minus_infty, -1002, 0),
-    TEST_ff_f (pow, minus_infty, -0.1L, 0),
-    TEST_ff_f (pow, minus_infty, -1.1L, 0),
-    TEST_ff_f (pow, minus_infty, -11.1L, 0),
-    TEST_ff_f (pow, minus_infty, -1001.1L, 0),
-    TEST_ff_f (pow, minus_infty, -min_subnorm_value, 0),
-#endif
+    TEST_ff_f (pow, 1.1L, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, -1.1L, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, plus_infty, plus_infty, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, 0.9L, plus_infty, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, 1e-7L, plus_infty, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, -0.9L, plus_infty, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, -1e-7L, plus_infty, 0, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, 1.1L, minus_infty, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, minus_infty, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, -1.1L, minus_infty, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, minus_infty, 0, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, 0.9L, minus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, 1e-7L, minus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, -0.9L, minus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, -1e-7L, minus_infty, plus_infty, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, plus_infty, 1e-7L, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, 1, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, 1e7L, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, min_subnorm_value, plus_infty, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, plus_infty, -1e-7L, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, -1, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, -1e7L, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, plus_infty, -min_subnorm_value, 0, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, minus_infty, 1, minus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 11, minus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 1001, minus_infty, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, minus_infty, 2, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 12, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 1002, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 0.1L, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 1.1L, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 11.1L, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, 1001.1L, plus_infty, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, min_subnorm_value, plus_infty, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, minus_infty, -1, minus_zero, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -11, minus_zero, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -1001, minus_zero, NO_TEST_INLINE),
+
+    TEST_ff_f (pow, minus_infty, -2, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -12, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -1002, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -0.1L, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -1.1L, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -11.1L, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -1001.1L, 0, NO_TEST_INLINE),
+    TEST_ff_f (pow, minus_infty, -min_subnorm_value, 0, NO_TEST_INLINE),
 
     TEST_ff_f (pow, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_ff_f (pow, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
@@ -11744,19 +11772,17 @@ static const struct test_ff_f_data pow_test_data[] =
     TEST_ff_f (pow, 0, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK),
     TEST_ff_f (pow, minus_zero, minus_infty, plus_infty, DIVIDE_BY_ZERO_EXCEPTION_OK),
 
-#ifndef TEST_INLINE
     /* pow (x, +inf) == +inf for |x| > 1.  */
-    TEST_ff_f (pow, 1.5, plus_infty, plus_infty),
+    TEST_ff_f (pow, 1.5, plus_infty, plus_infty, NO_TEST_INLINE),
 
     /* pow (x, +inf) == +0 for |x| < 1.  */
-    TEST_ff_f (pow, 0.5, plus_infty, 0.0),
+    TEST_ff_f (pow, 0.5, plus_infty, 0.0, NO_TEST_INLINE),
 
     /* pow (x, -inf) == +0 for |x| > 1.  */
-    TEST_ff_f (pow, 1.5, minus_infty, 0.0),
+    TEST_ff_f (pow, 1.5, minus_infty, 0.0, NO_TEST_INLINE),
 
     /* pow (x, -inf) == +inf for |x| < 1.  */
-    TEST_ff_f (pow, 0.5, minus_infty, plus_infty),
-#endif
+    TEST_ff_f (pow, 0.5, minus_infty, plus_infty, NO_TEST_INLINE),
 
     /* pow (+inf, y) == +inf for y > 0.  */
     TEST_ff_f (pow, plus_infty, 2, plus_infty),
@@ -13522,10 +13548,8 @@ static const struct test_f_f_data sinh_test_data[] =
     TEST_f_f (sinh, 0, 0),
     TEST_f_f (sinh, minus_zero, minus_zero),
 
-#ifndef TEST_INLINE
-    TEST_f_f (sinh, plus_infty, plus_infty),
-    TEST_f_f (sinh, minus_infty, minus_infty),
-#endif
+    TEST_f_f (sinh, plus_infty, plus_infty, NO_TEST_INLINE),
+    TEST_f_f (sinh, minus_infty, minus_infty, NO_TEST_INLINE),
     TEST_f_f (sinh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (sinh, 0.75L, 0.822316731935829980703661634446913849L),
@@ -13804,10 +13828,8 @@ static const struct test_f_f_data tanh_test_data[] =
     TEST_f_f (tanh, 0, 0),
     TEST_f_f (tanh, minus_zero, minus_zero),
 
-#ifndef TEST_INLINE
-    TEST_f_f (tanh, plus_infty, 1),
-    TEST_f_f (tanh, minus_infty, -1),
-#endif
+    TEST_f_f (tanh, plus_infty, 1, NO_TEST_INLINE),
+    TEST_f_f (tanh, minus_infty, -1, NO_TEST_INLINE),
     TEST_f_f (tanh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (tanh, 0.75L, 0.635148952387287319214434357312496495L),

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=ca07f1973bb0aecdd3d12532d3512663807e0b6d

commit ca07f1973bb0aecdd3d12532d3512663807e0b6d
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Sat Nov 16 12:46:03 2013 +0000

    Make libm-test.inc check for "inexact" exceptions for NaN argument.

diff --git a/ChangeLog b/ChangeLog
index ce26384..a99b0bb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,43 @@
 2013-11-16  Joseph Myers  <joseph@codesourcery.com>
 
+	* libm-test.inc (acos_test_data): Disallow inexact exceptions for
+	tests with quiet NaN input and output.
+	(acosh_test_data): Likewise.
+	(asin_test_data): Likewise.
+	(asinh_test_data): Likewise.
+	(atan_test_data): Likewise.
+	(atanh_test_data): Likewise.
+	(atan2_test_data): Likewise.
+	(cbrt_test_data): Likewise.
+	(cos_test_data): Likewise.
+	(cosh_test_data): Likewise.
+	(erf_test_data): Likewise.
+	(erfc_test_data): Likewise.
+	(exp_test_data): Likewise.
+	(exp10_test_data): Likewise.
+	(exp2_test_data): Likewise.
+	(expm1_test_data): Likewise.
+	(hypot_test_data): Likewise.
+	(j0_test_data): Likewise.
+	(j1_test_data): Likewise.
+	(jn_test_data): Likewise.
+	(lgamma_test_data): Likewise.
+	(log_test_data): Likewise.
+	(log10_test_data): Likewise.
+	(log1p_test_data): Likewise.
+	(log2_test_data): Likewise.
+	(pow_test_data): Likewise.
+	(scalb_test_data): Likewise.
+	(sin_test_data): Likewise.
+	(sincos_test_data): Likewise.
+	(sinh_test_data): Likewise.
+	(tan_test_data): Likewise.
+	(tanh_test_data): Likewise.
+	(tgamma_test_data): Likewise.
+	(y0_test_data): Likewise.
+	(y1_test_data): Likewise.
+	(yn_test_data): Likewise.
+
 	[BZ #16167]
 	* sysdeps/i386/fpu/e_pow.S (__ieee754_pow): Check for first
 	argument being NaN and avoid computations with second argument in
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 9677052..cdb1b41 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -1516,7 +1516,7 @@ static const struct test_f_f_data acos_test_data[] =
   {
     TEST_f_f (acos, plus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (acos, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
-    TEST_f_f (acos, qnan_value, qnan_value),
+    TEST_f_f (acos, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     /* |x| > 1: */
     TEST_f_f (acos, 1.125L, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
@@ -1635,7 +1635,7 @@ static const struct test_f_f_data acosh_test_data[] =
   {
     TEST_f_f (acosh, plus_infty, plus_infty),
     TEST_f_f (acosh, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
-    TEST_f_f (acosh, qnan_value, qnan_value),
+    TEST_f_f (acosh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     /* x < 1:  */
     TEST_f_f (acosh, -1.125L, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
@@ -1657,7 +1657,7 @@ static const struct test_f_f_data asin_test_data[] =
   {
     TEST_f_f (asin, plus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (asin, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
-    TEST_f_f (asin, qnan_value, qnan_value),
+    TEST_f_f (asin, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     /* asin x == qNaN plus invalid exception for |x| > 1.  */
     TEST_f_f (asin, 1.125L, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
@@ -1778,7 +1778,7 @@ static const struct test_f_f_data asinh_test_data[] =
     TEST_f_f (asinh, plus_infty, plus_infty),
     TEST_f_f (asinh, minus_infty, minus_infty),
 #endif
-    TEST_f_f (asinh, qnan_value, qnan_value),
+    TEST_f_f (asinh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (asinh, 0.75L, 0.693147180559945309417232121458176568L),
   };
 
@@ -1797,7 +1797,7 @@ static const struct test_f_f_data atan_test_data[] =
 
     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),
+    TEST_f_f (atan, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (atan, max_value, M_PI_2l),
     TEST_f_f (atan, -max_value, -M_PI_2l),
 
@@ -1832,7 +1832,7 @@ static const struct test_f_f_data atanh_test_data[] =
 
     TEST_f_f (atanh, 1, plus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
     TEST_f_f (atanh, -1, minus_infty, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
-    TEST_f_f (atanh, qnan_value, qnan_value),
+    TEST_f_f (atanh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     /* atanh (x) == qNaN plus invalid exception if |x| > 1.  */
     TEST_f_f (atanh, 1.125L, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
@@ -1905,7 +1905,7 @@ static const struct test_ff_f_data atan2_test_data[] =
     TEST_ff_f (atan2, minus_infty, plus_infty, -M_PI_4l),
     TEST_ff_f (atan2, plus_infty, minus_infty, M_PI_34l),
     TEST_ff_f (atan2, minus_infty, minus_infty, -M_PI_34l),
-    TEST_ff_f (atan2, qnan_value, qnan_value, qnan_value),
+    TEST_ff_f (atan2, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_ff_f (atan2, max_value, max_value, M_PI_4l),
 
@@ -5838,7 +5838,7 @@ static const struct test_f_f_data cbrt_test_data[] =
 
     TEST_f_f (cbrt, plus_infty, plus_infty),
     TEST_f_f (cbrt, minus_infty, minus_infty),
-    TEST_f_f (cbrt, qnan_value, qnan_value),
+    TEST_f_f (cbrt, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (cbrt, -0.001L, -0.1L),
     TEST_f_f (cbrt, 8, 2),
@@ -6780,7 +6780,7 @@ static const struct test_f_f_data cos_test_data[] =
     TEST_f_f (cos, minus_zero, 1),
     TEST_f_f (cos, plus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (cos, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
-    TEST_f_f (cos, qnan_value, qnan_value, ERRNO_UNCHANGED),
+    TEST_f_f (cos, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
     TEST_f_f (cos, M_PI_6l * 2.0, 0.5),
     TEST_f_f (cos, M_PI_6l * 4.0, -0.5),
@@ -6956,7 +6956,7 @@ static const struct test_f_f_data cosh_test_data[] =
     TEST_f_f (cosh, plus_infty, plus_infty),
     TEST_f_f (cosh, minus_infty, plus_infty),
 #endif
-    TEST_f_f (cosh, qnan_value, qnan_value),
+    TEST_f_f (cosh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (cosh, 0.75L, 1.29468328467684468784170818539018176L),
 
@@ -7821,7 +7821,7 @@ static const struct test_f_f_data erf_test_data[] =
     TEST_f_f (erf, minus_zero, minus_zero),
     TEST_f_f (erf, plus_infty, 1),
     TEST_f_f (erf, minus_infty, -1),
-    TEST_f_f (erf, qnan_value, qnan_value),
+    TEST_f_f (erf, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (erf, 0.125L, 0.140316204801333817393029446521623398L),
     TEST_f_f (erf, 0.75L, 0.711155633653515131598937834591410777L),
@@ -7851,7 +7851,7 @@ static const struct test_f_f_data erfc_test_data[] =
     TEST_f_f (erfc, minus_infty, 2.0),
     TEST_f_f (erfc, 0.0, 1.0),
     TEST_f_f (erfc, minus_zero, 1.0),
-    TEST_f_f (erfc, qnan_value, qnan_value),
+    TEST_f_f (erfc, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (erfc, 0.125L, 0.859683795198666182606970553478376602L),
     TEST_f_f (erfc, 0.75L, 0.288844366346484868401062165408589223L),
@@ -7894,7 +7894,7 @@ static const struct test_f_f_data exp_test_data[] =
     TEST_f_f (exp, plus_infty, plus_infty),
     TEST_f_f (exp, minus_infty, 0),
 #endif
-    TEST_f_f (exp, qnan_value, qnan_value),
+    TEST_f_f (exp, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (exp, 1, M_El),
 
     TEST_f_f (exp, 2, M_E2l),
@@ -7999,7 +7999,7 @@ static const struct test_f_f_data exp10_test_data[] =
 
     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, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (exp10, 3, 1000),
     TEST_f_f (exp10, -1, 0.1L),
     TEST_f_f (exp10, 36, 1.0e36L),
@@ -8043,7 +8043,7 @@ static const struct test_f_f_data exp2_test_data[] =
     TEST_f_f (exp2, minus_zero, 1),
     TEST_f_f (exp2, plus_infty, plus_infty),
     TEST_f_f (exp2, minus_infty, 0),
-    TEST_f_f (exp2, qnan_value, qnan_value),
+    TEST_f_f (exp2, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (exp2, 10, 1024),
     TEST_f_f (exp2, -1, 0.5),
@@ -8087,7 +8087,7 @@ static const struct test_f_f_data expm1_test_data[] =
     TEST_f_f (expm1, plus_infty, plus_infty),
     TEST_f_f (expm1, minus_infty, -1),
 #endif
-    TEST_f_f (expm1, qnan_value, qnan_value),
+    TEST_f_f (expm1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (expm1, 1, M_El - 1.0),
     TEST_f_f (expm1, 0.75L, 1.11700001661267466854536981983709561L),
@@ -9437,7 +9437,7 @@ static const struct test_ff_f_data hypot_test_data[] =
     TEST_ff_f (hypot, qnan_value, minus_infty, plus_infty),
 #endif
 
-    TEST_ff_f (hypot, qnan_value, qnan_value, qnan_value),
+    TEST_ff_f (hypot, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     /* hypot (x,y) == hypot (+-x, +-y)  */
     TEST_ff_f (hypot, 0.7L, 12.4L, 12.419742348374220601176836866763271L),
@@ -9799,7 +9799,7 @@ isunordered_test (void)
 static const struct test_f_f_data j0_test_data[] =
   {
     /* j0 is the Bessel function of the first kind of order 0 */
-    TEST_f_f (j0, qnan_value, qnan_value),
+    TEST_f_f (j0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (j0, plus_infty, 0),
     TEST_f_f (j0, -1.0, 0.765197686557966551449717526102663221L),
     TEST_f_f (j0, 0.0, 1.0),
@@ -9838,7 +9838,7 @@ j0_test (void)
 static const struct test_f_f_data j1_test_data[] =
   {
     /* j1 is the Bessel function of the first kind of order 1 */
-    TEST_f_f (j1, qnan_value, qnan_value),
+    TEST_f_f (j1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (j1, plus_infty, 0),
 
     TEST_f_f (j1, -1.0, -0.440050585744933515959682203718914913L),
@@ -9876,7 +9876,7 @@ static const struct test_if_f_data jn_test_data[] =
   {
     /* jn is the Bessel function of the first kind of order n.  */
     /* jn (0, x) == j0 (x)  */
-    TEST_if_f (jn, 0, qnan_value, qnan_value),
+    TEST_if_f (jn, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_if_f (jn, 0, plus_infty, 0),
     TEST_if_f (jn, 0, -1.0, 0.765197686557966551449717526102663221L),
     TEST_if_f (jn, 0, 0.0, 1.0),
@@ -9891,7 +9891,7 @@ static const struct test_if_f_data jn_test_data[] =
     TEST_if_f (jn, 0, -4.0, -3.9714980986384737228659076845169804197562E-1L),
 
     /* jn (1, x) == j1 (x)  */
-    TEST_if_f (jn, 1, qnan_value, qnan_value),
+    TEST_if_f (jn, 1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_if_f (jn, 1, plus_infty, 0),
     TEST_if_f (jn, 1, -1.0, -0.440050585744933515959682203718914913L),
     TEST_if_f (jn, 1, 0.0, 0.0),
@@ -9904,7 +9904,7 @@ static const struct test_if_f_data jn_test_data[] =
     TEST_if_f (jn, 1, 10.0, 0.0434727461688614366697487680258592883L),
 
     /* jn (3, x)  */
-    TEST_if_f (jn, 3, qnan_value, qnan_value),
+    TEST_if_f (jn, 3, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_if_f (jn, 3, plus_infty, 0),
 
     TEST_if_f (jn, 3, -1.0, -0.0195633539826684059189053216217515083L),
@@ -9916,7 +9916,7 @@ static const struct test_if_f_data jn_test_data[] =
     TEST_if_f (jn, 3, 10.0, 0.0583793793051868123429354784103409563L),
 
     /*  jn (10, x)  */
-    TEST_if_f (jn, 10, qnan_value, qnan_value),
+    TEST_if_f (jn, 10, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_if_f (jn, 10, plus_infty, 0),
 
     TEST_if_f (jn, 10, -1.0, 0.263061512368745320699785368779050294e-9L),
@@ -9986,7 +9986,7 @@ static const struct test_f_f1_data lgamma_test_data[] =
     TEST_f_f1 (lgamma, plus_infty, plus_infty, 1),
     TEST_f_f1 (lgamma, 0, plus_infty, 1, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
     TEST_f_f1 (lgamma, minus_zero, plus_infty, -1, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
-    TEST_f_f1 (lgamma, qnan_value, qnan_value, IGNORE),
+    TEST_f_f1 (lgamma, qnan_value, qnan_value, IGNORE, NO_INEXACT_EXCEPTION),
 
     /* lgamma (x) == +inf plus divide by zero exception for integer x <= 0.  */
     TEST_f_f1 (lgamma, -3, plus_infty, IGNORE, DIVIDE_BY_ZERO_EXCEPTION|ERRNO_ERANGE),
@@ -10933,7 +10933,7 @@ static const struct test_f_f_data log_test_data[] =
     TEST_f_f (log, -max_value, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (log, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (log, plus_infty, plus_infty),
-    TEST_f_f (log, qnan_value, qnan_value),
+    TEST_f_f (log, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (log, M_El, 1),
     TEST_f_f (log, M_1_DIV_El, -1),
@@ -10964,7 +10964,7 @@ static const struct test_f_f_data log10_test_data[] =
     TEST_f_f (log10, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
 
     TEST_f_f (log10, plus_infty, plus_infty),
-    TEST_f_f (log10, qnan_value, qnan_value),
+    TEST_f_f (log10, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (log10, 0.1L, -1),
     TEST_f_f (log10, 10.0, 1),
@@ -10994,7 +10994,7 @@ static const struct test_f_f_data log1p_test_data[] =
     TEST_f_f (log1p, minus_infty, qnan_value, INVALID_EXCEPTION),
 
     TEST_f_f (log1p, plus_infty, plus_infty),
-    TEST_f_f (log1p, qnan_value, qnan_value),
+    TEST_f_f (log1p, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (log1p, M_El - 1.0, 1),
 
@@ -11023,7 +11023,7 @@ static const struct test_f_f_data log2_test_data[] =
     TEST_f_f (log2, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
 
     TEST_f_f (log2, plus_infty, plus_infty),
-    TEST_f_f (log2, qnan_value, qnan_value),
+    TEST_f_f (log2, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (log2, M_El, M_LOG2El),
     TEST_f_f (log2, 2.0, 1),
@@ -11609,28 +11609,28 @@ static const struct test_ff_f_data pow_test_data[] =
     TEST_ff_f (pow, minus_infty, -min_subnorm_value, 0),
 #endif
 
-    TEST_ff_f (pow, qnan_value, qnan_value, qnan_value),
-    TEST_ff_f (pow, 0, qnan_value, qnan_value),
-    TEST_ff_f (pow, 1, qnan_value, 1),
-    TEST_ff_f (pow, -1, qnan_value, qnan_value),
-    TEST_ff_f (pow, qnan_value, 1, qnan_value),
-    TEST_ff_f (pow, qnan_value, -1, qnan_value),
+    TEST_ff_f (pow, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, 1, qnan_value, 1, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, -1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, 1, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, -1, qnan_value, NO_INEXACT_EXCEPTION),
 
     /* 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),
-    TEST_ff_f (pow, -3.0, qnan_value, qnan_value),
-    TEST_ff_f (pow, minus_infty, qnan_value, qnan_value),
-
-    TEST_ff_f (pow, qnan_value, 3.0, qnan_value),
-    TEST_ff_f (pow, qnan_value, -3.0, qnan_value),
-    TEST_ff_f (pow, qnan_value, plus_infty, qnan_value),
-    TEST_ff_f (pow, qnan_value, minus_infty, qnan_value),
-    TEST_ff_f (pow, qnan_value, 2.5, qnan_value),
-    TEST_ff_f (pow, qnan_value, -2.5, qnan_value),
-    TEST_ff_f (pow, qnan_value, min_subnorm_value, qnan_value),
-    TEST_ff_f (pow, qnan_value, -min_subnorm_value, qnan_value),
+    TEST_ff_f (pow, 3.0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, minus_zero, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, plus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, -3.0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, minus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+
+    TEST_ff_f (pow, qnan_value, 3.0, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, -3.0, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, plus_infty, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, minus_infty, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, 2.5, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, -2.5, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, min_subnorm_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (pow, qnan_value, -min_subnorm_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_ff_f (pow, 1, plus_infty, 1),
     TEST_ff_f (pow, -1, plus_infty, 1),
@@ -13124,8 +13124,8 @@ static const struct test_ff_f_data scalb_test_data[] =
     TEST_ff_f (scalb, 2.0, 0.5, qnan_value, INVALID_EXCEPTION),
     TEST_ff_f (scalb, 3.0, -2.5, qnan_value, INVALID_EXCEPTION),
 
-    TEST_ff_f (scalb, 0, qnan_value, qnan_value),
-    TEST_ff_f (scalb, 1, qnan_value, qnan_value),
+    TEST_ff_f (scalb, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (scalb, 1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_ff_f (scalb, 1, 0, 1),
     TEST_ff_f (scalb, -1, 0, -1),
@@ -13160,13 +13160,13 @@ static const struct test_ff_f_data scalb_test_data[] =
     TEST_ff_f (scalb, plus_infty, minus_infty, qnan_value, INVALID_EXCEPTION),
     TEST_ff_f (scalb, minus_infty, minus_infty, qnan_value, INVALID_EXCEPTION),
 
-    TEST_ff_f (scalb, qnan_value, 1, qnan_value),
-    TEST_ff_f (scalb, 1, qnan_value, qnan_value),
-    TEST_ff_f (scalb, qnan_value, 0, qnan_value),
-    TEST_ff_f (scalb, 0, qnan_value, qnan_value),
-    TEST_ff_f (scalb, qnan_value, plus_infty, qnan_value),
-    TEST_ff_f (scalb, plus_infty, qnan_value, qnan_value),
-    TEST_ff_f (scalb, qnan_value, qnan_value, qnan_value),
+    TEST_ff_f (scalb, qnan_value, 1, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (scalb, 1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (scalb, qnan_value, 0, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (scalb, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (scalb, qnan_value, plus_infty, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (scalb, plus_infty, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
+    TEST_ff_f (scalb, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_ff_f (scalb, 0.8L, 4, 12.8L),
     TEST_ff_f (scalb, -0.854375L, 5, -27.34L),
@@ -13299,7 +13299,7 @@ static const struct test_f_f_data sin_test_data[] =
     TEST_f_f (sin, minus_zero, minus_zero),
     TEST_f_f (sin, plus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (sin, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
-    TEST_f_f (sin, qnan_value, qnan_value, ERRNO_UNCHANGED),
+    TEST_f_f (sin, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
     TEST_f_f (sin, M_PI_6l, 0.5),
     TEST_f_f (sin, -M_PI_6l, -0.5),
@@ -13452,7 +13452,7 @@ static const struct test_fFF_11_data sincos_test_data[] =
     TEST_fFF_11 (sincos, minus_zero, minus_zero, 1),
     TEST_fFF_11 (sincos, plus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
     TEST_fFF_11 (sincos, minus_infty, qnan_value, qnan_value, INVALID_EXCEPTION),
-    TEST_fFF_11 (sincos, qnan_value, qnan_value, qnan_value),
+    TEST_fFF_11 (sincos, qnan_value, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     /* The value of M_PI_2l is never exactly PI/2, and therefore the
        answer is never exactly zero. The answer is equal to the error
@@ -13526,7 +13526,7 @@ static const struct test_f_f_data sinh_test_data[] =
     TEST_f_f (sinh, plus_infty, plus_infty),
     TEST_f_f (sinh, minus_infty, minus_infty),
 #endif
-    TEST_f_f (sinh, qnan_value, qnan_value),
+    TEST_f_f (sinh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (sinh, 0.75L, 0.822316731935829980703661634446913849L),
     TEST_f_f (sinh, 0x8p-32L, 1.86264514923095703232705808926175479e-9L),
@@ -13642,7 +13642,7 @@ static const struct test_f_f_data tan_test_data[] =
     TEST_f_f (tan, minus_zero, minus_zero),
     TEST_f_f (tan, plus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (tan, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
-    TEST_f_f (tan, qnan_value, qnan_value, ERRNO_UNCHANGED),
+    TEST_f_f (tan, qnan_value, qnan_value, NO_INEXACT_EXCEPTION|ERRNO_UNCHANGED),
 
     TEST_f_f (tan, M_PI_4l, 1),
     TEST_f_f (tan, 0.75L, 0.931596459944072461165202756573936428L),
@@ -13808,7 +13808,7 @@ static const struct test_f_f_data tanh_test_data[] =
     TEST_f_f (tanh, plus_infty, 1),
     TEST_f_f (tanh, minus_infty, -1),
 #endif
-    TEST_f_f (tanh, qnan_value, qnan_value),
+    TEST_f_f (tanh, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (tanh, 0.75L, 0.635148952387287319214434357312496495L),
     TEST_f_f (tanh, -0.75L, -0.635148952387287319214434357312496495L),
@@ -13838,7 +13838,7 @@ static const struct test_f_f_data tgamma_test_data[] =
     TEST_f_f (tgamma, -2, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (tgamma, -max_value, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (tgamma, minus_infty, qnan_value, INVALID_EXCEPTION|ERRNO_EDOM),
-    TEST_f_f (tgamma, qnan_value, qnan_value),
+    TEST_f_f (tgamma, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (tgamma, 0.5, M_SQRT_PIl),
     TEST_f_f (tgamma, -0.5, -M_2_SQRT_PIl),
@@ -14478,7 +14478,7 @@ static const struct test_f_f_data y0_test_data[] =
     TEST_f_f (y0, -1.0, minus_infty, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (y0, -max_value, minus_infty, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (y0, 0.0, minus_infty),
-    TEST_f_f (y0, qnan_value, qnan_value),
+    TEST_f_f (y0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_f_f (y0, plus_infty, 0),
 
     TEST_f_f (y0, 0.125L, -1.38968062514384052915582277745018693L),
@@ -14530,7 +14530,7 @@ static const struct test_f_f_data y1_test_data[] =
     TEST_f_f (y1, -max_value, minus_infty, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_f_f (y1, 0.0, minus_infty),
     TEST_f_f (y1, plus_infty, 0),
-    TEST_f_f (y1, qnan_value, qnan_value),
+    TEST_f_f (y1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_f_f (y1, 0.125L, -5.19993611253477499595928744876579921L),
     TEST_f_f (y1, 0.75L, -1.03759455076928541973767132140642198L),
@@ -14581,7 +14581,7 @@ static const struct test_if_f_data yn_test_data[] =
     TEST_if_f (yn, 0, -1.0, minus_infty, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_if_f (yn, 0, -max_value, minus_infty, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_if_f (yn, 0, 0.0, minus_infty),
-    TEST_if_f (yn, 0, qnan_value, qnan_value),
+    TEST_if_f (yn, 0, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
     TEST_if_f (yn, 0, plus_infty, 0),
 
     TEST_if_f (yn, 0, 0.125L, -1.38968062514384052915582277745018693L),
@@ -14596,7 +14596,7 @@ static const struct test_if_f_data yn_test_data[] =
     TEST_if_f (yn, 1, -1.0, minus_infty, INVALID_EXCEPTION|ERRNO_EDOM),
     TEST_if_f (yn, 1, 0.0, minus_infty),
     TEST_if_f (yn, 1, plus_infty, 0),
-    TEST_if_f (yn, 1, qnan_value, qnan_value),
+    TEST_if_f (yn, 1, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_if_f (yn, 1, 0.125L, -5.19993611253477499595928744876579921L),
     TEST_if_f (yn, 1, 0.75L, -1.03759455076928541973767132140642198L),
@@ -14608,7 +14608,7 @@ static const struct test_if_f_data yn_test_data[] =
 
     /* yn (3, x)  */
     TEST_if_f (yn, 3, plus_infty, 0),
-    TEST_if_f (yn, 3, qnan_value, qnan_value),
+    TEST_if_f (yn, 3, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_if_f (yn, 3, 0.125L, -2612.69757350066712600220955744091741L),
     TEST_if_f (yn, 3, 0.75L, -12.9877176234475433186319774484809207L),
@@ -14618,7 +14618,7 @@ static const struct test_if_f_data yn_test_data[] =
 
     /* yn (10, x)  */
     TEST_if_f (yn, 10, plus_infty, 0),
-    TEST_if_f (yn, 10, qnan_value, qnan_value),
+    TEST_if_f (yn, 10, qnan_value, qnan_value, NO_INEXACT_EXCEPTION),
 
     TEST_if_f (yn, 10, 0.125L, -127057845771019398.252538486899753195L),
     TEST_if_f (yn, 10, 0.75L, -2133501638.90573424452445412893839236L),

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=66294491665029eff0cf3ebd5fb6f04582da6c1e

commit 66294491665029eff0cf3ebd5fb6f04582da6c1e
Author: Joseph Myers <joseph@codesourcery.com>
Date:   Sat Nov 16 12:45:11 2013 +0000

    Fix spurious "inexact" exceptions from x86 pow with NaN argument (bug 16167).

diff --git a/ChangeLog b/ChangeLog
index 574e07e..ce26384 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-11-16  Joseph Myers  <joseph@codesourcery.com>
+
+	[BZ #16167]
+	* sysdeps/i386/fpu/e_pow.S (__ieee754_pow): Check for first
+	argument being NaN and avoid computations with second argument in
+	that case.
+	* sysdeps/i386/fpu/e_powf.S (__ieee754_powf): Likewise.
+	* sysdeps/i386/fpu/e_powl.S (__ieee754_powl): Likewise.
+	* sysdeps/x86_64/fpu/e_powl.S (__ieee754_powl): Likewise.
+
 2013-11-15  Arun Kumar Pyasi <arun@chitwanix.com>
 
 	* locale/iso-639.def: Add Chitwani Tharu (the).
diff --git a/NEWS b/NEWS
index 37c2390..e3effb6 100644
--- a/NEWS
+++ b/NEWS
@@ -18,7 +18,7 @@ Version 2.19
   15887, 15890, 15892, 15893, 15895, 15897, 15905, 15909, 15917, 15919,
   15921, 15923, 15939, 15948, 15963, 15966, 15985, 15988, 15997, 16032,
   16034, 16036, 16037, 16041, 16071, 16072, 16074, 16078, 16103, 16112,
-  16143, 16150, 16151, 16153, 16172.
+  16143, 16150, 16151, 16153, 16167, 16172.
 
 * CVE-2012-4412 The strcoll implementation caches indices and rules for
   large collation sequences to optimize multiple passes.  This cache
diff --git a/sysdeps/i386/fpu/e_pow.S b/sysdeps/i386/fpu/e_pow.S
index 109c395..835c39b 100644
--- a/sysdeps/i386/fpu/e_pow.S
+++ b/sysdeps/i386/fpu/e_pow.S
@@ -98,6 +98,9 @@ ENTRY(__ieee754_pow)
 	cmpb	$0x05, %ah
 	je	15f		// x is ±inf
 
+	cmpb	$0x01, %ah
+	je	32f		// x is NaN
+
 	fxch			// y : x
 
 	/* fistpll raises invalid exception for |y| >= 1L<<63.  */
@@ -166,6 +169,12 @@ ENTRY(__ieee754_pow)
 	ret
 
 	cfi_adjust_cfa_offset (8)
+32:	addl	$8, %esp
+	cfi_adjust_cfa_offset (-8)
+	fstp	%st(1)
+	ret
+
+	cfi_adjust_cfa_offset (8)
 	.align ALIGNARG(4)
 2:	// y is a large integer (absolute value at least 1L<<10), but
 	// may be odd unless at least 1L<<64.  So it may be necessary
diff --git a/sysdeps/i386/fpu/e_powf.S b/sysdeps/i386/fpu/e_powf.S
index 7fad90f..90d3d0c 100644
--- a/sysdeps/i386/fpu/e_powf.S
+++ b/sysdeps/i386/fpu/e_powf.S
@@ -95,6 +95,9 @@ ENTRY(__ieee754_powf)
 	cmpb	$0x05, %ah
 	je	15f		// x is ±inf
 
+	cmpb	$0x01, %ah
+	je	32f		// x is NaN
+
 	fxch			// y : x
 
 	/* fistpl raises invalid exception for |y| >= 1L<<31.  */
@@ -180,7 +183,7 @@ ENTRY(__ieee754_powf)
 	f2xm1			// 2^fract(y*log2(x))-1 : int(y*log2(x))
 	faddl	MO(one)		// 2^fract(y*log2(x)) : int(y*log2(x))
 	fscale			// 2^fract(y*log2(x))*2^int(y*log2(x)) : int(y*log2(x))
-	addl	$4, %esp
+32:	addl	$4, %esp
 	cfi_adjust_cfa_offset (-4)
 	fstp	%st(1)		// 2^fract(y*log2(x))*2^int(y*log2(x))
 	ret
diff --git a/sysdeps/i386/fpu/e_powl.S b/sysdeps/i386/fpu/e_powl.S
index 3c23117..91e22c8 100644
--- a/sysdeps/i386/fpu/e_powl.S
+++ b/sysdeps/i386/fpu/e_powl.S
@@ -104,6 +104,9 @@ ENTRY(__ieee754_powl)
 	cmpb	$0x05, %ah
 	je	15f		// x is ±inf
 
+	cmpb	$0x01, %ah
+	je	32f		// x is NaN
+
 	fxch			// y : x
 
 	/* fistpll raises invalid exception for |y| >= 1L<<63.  */
@@ -188,6 +191,12 @@ ENTRY(__ieee754_powl)
 	ret
 
 	cfi_adjust_cfa_offset (8)
+32:	addl	$8, %esp
+	cfi_adjust_cfa_offset (-8)
+	fstp	%st(1)
+	ret
+
+	cfi_adjust_cfa_offset (8)
 	.align ALIGNARG(4)
 2:	// y is a large integer (absolute value at least 8), but
 	// may be odd unless at least 1L<<64.  So it may be necessary
diff --git a/sysdeps/x86_64/fpu/e_powl.S b/sysdeps/x86_64/fpu/e_powl.S
index e101726..590223b 100644
--- a/sysdeps/x86_64/fpu/e_powl.S
+++ b/sysdeps/x86_64/fpu/e_powl.S
@@ -96,6 +96,9 @@ ENTRY(__ieee754_powl)
 	cmpb	$0x05, %ah
 	je	15f		// x is ±inf
 
+	cmpb	$0x01, %ah
+	je	31f		// x is NaN
+
 	fxch			// y : x
 
 	/* fistpll raises invalid exception for |y| >= 1L<<63.  */

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                   |  128 +++++++
 NEWS                        |    2 +-
 math/gen-libm-test.pl       |   43 ++-
 math/libm-test.inc          |  782 ++++++++++++++++++++++++-------------------
 sysdeps/i386/fpu/e_pow.S    |    9 +
 sysdeps/i386/fpu/e_powf.S   |    5 +-
 sysdeps/i386/fpu/e_powl.S   |    9 +
 sysdeps/x86_64/fpu/e_powl.S |    3 +
 8 files changed, 630 insertions(+), 351 deletions(-)


hooks/post-receive
-- 
GNU C Library master sources


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