about summary refs log tree commit diff
path: root/math
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-05-19 14:45:41 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-05-19 14:45:41 +0000
commitdb62a9075305963281572cb990d1c766948bae7b (patch)
tree4e0917803301441db899bb45a674c7fefb280a0e /math
parentf16cc3eb810be5419aa2fc07d6e05f93624df9ce (diff)
downloadglibc-db62a9075305963281572cb990d1c766948bae7b.tar.gz
glibc-db62a9075305963281572cb990d1c766948bae7b.tar.xz
glibc-db62a9075305963281572cb990d1c766948bae7b.zip
Handle sincos with generic libm-test logic.
Diffstat (limited to 'math')
-rw-r--r--math/README.libm-test5
-rwxr-xr-xmath/gen-libm-test.pl36
-rw-r--r--math/libm-test.inc101
3 files changed, 56 insertions, 86 deletions
diff --git a/math/README.libm-test b/math/README.libm-test
index cea0392070..a083a6d62a 100644
--- a/math/README.libm-test
+++ b/math/README.libm-test
@@ -103,8 +103,3 @@ The accepted parameter types are:
 - "L" for long long int.
 - "F" for the address of a FLOAT (only as input parameter)
 - "I" for the address of an int (only as input parameter)
-
-Some functions need special handling.  For example gamma sets the
-global variable signgam and frexp takes an argument to &int.  This
-special treatment is coded in "gen-libm-test.pl" and used while
-parsing "libm-test.inc".
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index e9f7f9bbe2..c50e27d44a 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -156,33 +156,6 @@ sub show_exceptions {
   }
 }
 
-# Treat some functions especially.
-# Currently only sincos needs extra treatment.
-sub special_functions {
-  my ($file, $args) = @_;
-  my (@args, $str, $test, $cline);
-
-  @args = split /,\s*/, $args;
-
-  unless ($args[0] =~ /sincos/) {
-    die ("Don't know how to handle $args[0] extra.");
-  }
-  $cline = "    { $args[1]";
-
-  $str = 'sincos (' . &beautify ($args[1]) . ', &sin_res, &cos_res)';
-  # handle sin
-  $test = $str . ' puts ' . &beautify ($args[2]) . ' in sin_res';
-
-  $cline .= ", \"$test\", $args[2]";
-
-  # handle cos
-  $test = $str . ' puts ' . &beautify ($args[3]) . ' in cos_res';
-  $cline .= ", \"$test\", $args[3]";
-  $cline .= show_exceptions ($args[4]);
-  $cline .= " },\n";
-  print $file $cline;
-}
-
 # Parse the arguments to TEST_x_y
 sub parse_args {
   my ($file, $descr, $fct, $args) = @_;
@@ -191,10 +164,6 @@ sub parse_args {
   my (@special);
   my ($call);
 
-  if ($descr eq 'extra') {
-    &special_functions ($file, $args);
-    return;
-  }
   ($descr_args, $descr_res) = split /_/,$descr, 2;
 
   @args = split /,\s*/, $args;
@@ -284,15 +253,14 @@ sub parse_args {
       next;
     }
   }
-  $cline .= ", ";
 
   @descr = split //,$descr_res;
   foreach (@descr) {
     if ($_ =~ /b|f|i|l|L/ ) {
-      $cline .= $args[$current_arg];
+      $cline .= ", $args[$current_arg]";
       $current_arg++;
     } elsif ($_ eq 'c') {
-      $cline .= "$args[$current_arg], $args[$current_arg+1]";
+      $cline .= ", $args[$current_arg], $args[$current_arg+1]";
       $current_arg += 2;
     } elsif ($_ eq '1') {
       push @special, $args[$current_arg];
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 0cff2592c2..3374ce99c0 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -1053,14 +1053,17 @@ struct test_f_L_data
   long long int expected;
   int exceptions;
 };
-struct test_sincos_data
+struct test_fFF_11_data
 {
+  const char *test_name;
   FLOAT arg;
-  const char *test_name_sin;
-  FLOAT expected_sin;
-  const char *test_name_cos;
-  FLOAT expected_cos;
   int exceptions;
+  const char *extra1_name;
+  int extra1_test;
+  FLOAT extra1_expected;
+  const char *extra2_name;
+  int extra2_test;
+  FLOAT extra2_expected;
 };
 
 /* Set the rounding mode, or restore the saved value.  */
@@ -1319,26 +1322,31 @@ struct test_sincos_data
       RUN_TEST_f_L ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
 		    (ARRAY)[i].expected, (ARRAY)[i].exceptions);	\
   ROUND_RESTORE_ ## ROUNDING_MODE
-#define RUN_TEST_sincos(ARG, TEST_NAME_SIN, SIN_RES_VAR,		\
-			EXPECTED_SIN, TEST_NAME_COS, COS_RES_VAR,	\
-			EXPECTED_COS, EXCEPTIONS)			\
+#define RUN_TEST_fFF_11(TEST_NAME, FUNC_NAME, ARG, EXCEPTIONS,		\
+			EXTRA1_NAME, EXTRA1_VAR, EXTRA1_TEST,		\
+			EXTRA1_EXPECTED, EXTRA2_NAME, EXTRA2_VAR,	\
+			EXTRA2_TEST, EXTRA2_EXPECTED)			\
   do									\
     {									\
-      FUNC (sincos) (ARG, &(SIN_RES_VAR), &(COS_RES_VAR));		\
-      check_float (TEST_NAME_SIN, SIN_RES_VAR,				\
-		   EXPECTED_SIN, EXCEPTIONS);				\
-      check_float (TEST_NAME_COS, COS_RES_VAR,				\
-		   EXPECTED_COS, 0);					\
+      FUNC (FUNC_NAME) (ARG, &(EXTRA1_VAR), &(EXTRA2_VAR));		\
+      if (EXTRA1_TEST)							\
+	check_float (EXTRA1_NAME, EXTRA1_VAR, EXTRA1_EXPECTED,		\
+		     EXCEPTIONS);					\
+      if (EXTRA2_TEST)							\
+	check_float (EXTRA2_NAME, EXTRA2_VAR, EXTRA2_EXPECTED, 0);	\
     }									\
   while (0)
-#define RUN_TEST_LOOP_sincos(ARRAY, ROUNDING_MODE, SIN_RES_VAR,		\
-			     COS_RES_VAR)				\
+#define RUN_TEST_LOOP_fFF_11(FUNC_NAME, ARRAY, ROUNDING_MODE,		\
+			     EXTRA1_VAR, EXTRA2_VAR)			\
   IF_ROUND_INIT_ ## ROUNDING_MODE					\
     for (size_t i = 0; i < sizeof (ARRAY) / sizeof (ARRAY)[0]; i++)	\
-      RUN_TEST_sincos ((ARRAY)[i].arg, (ARRAY)[i].test_name_sin,	\
-		       SIN_RES_VAR, (ARRAY)[i].expected_sin,		\
-		       (ARRAY)[i].test_name_cos, COS_RES_VAR,		\
-		       (ARRAY)[i].expected_cos, (ARRAY)[i].exceptions);	\
+      RUN_TEST_fFF_11 ((ARRAY)[i].test_name, FUNC_NAME, (ARRAY)[i].arg,	\
+		       (ARRAY)[i].exceptions, (ARRAY)[i].extra1_name,	\
+		       EXTRA1_VAR, (ARRAY)[i].extra1_test,		\
+		       (ARRAY)[i].extra1_expected,			\
+		       (ARRAY)[i].extra2_name, EXTRA2_VAR,		\
+		       (ARRAY)[i].extra2_test,				\
+		       (ARRAY)[i].extra2_expected);			\
   ROUND_RESTORE_ ## ROUNDING_MODE
 
 
@@ -13394,16 +13402,15 @@ sin_test_upward (void)
 }
 
 
-static const struct test_sincos_data sincos_test_data[] =
+static const struct test_fFF_11_data sincos_test_data[] =
   {
     START_DATA (sincos),
-    /* sincos is treated differently because it returns void.  */
-    TEST_extra (sincos, 0, 0, 1),
+    TEST_fFF_11 (sincos, 0, 0, 1),
 
-    TEST_extra (sincos, minus_zero, minus_zero, 1),
-    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),
+    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),
 
     /* 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
@@ -13411,51 +13418,51 @@ static const struct test_sincos_data sincos_test_data[] =
        to each type.  */
 #ifdef TEST_FLOAT
     /* 32-bit float.  */
-    TEST_extra (sincos, M_PI_2l, 1, -0x1.777a5cp-25L),
+    TEST_fFF_11 (sincos, M_PI_2l, 1, -0x1.777a5cp-25L),
 #endif
 #if defined TEST_DOUBLE || (defined TEST_LDOUBLE && LDBL_MANT_DIG == 53)
     /* 64-bit double or 64-bit long double.  */
-    TEST_extra (sincos, M_PI_2l, 1, 0x1.1a62633145c07p-54L),
+    TEST_fFF_11 (sincos, M_PI_2l, 1, 0x1.1a62633145c07p-54L),
 #endif
 #if defined TEST_LDOUBLE && LDBL_MANT_DIG == 64
     /* 96-bit long double.  */
-    TEST_extra (sincos, M_PI_2l, 1, -0xe.ce675d1fc8f8cbbp-69L),
+    TEST_fFF_11 (sincos, M_PI_2l, 1, -0xe.ce675d1fc8f8cbbp-69L),
 #endif
 #if defined TEST_LDOUBLE && LDBL_MANT_DIG == 106
     /* 128-bit IBM long double.  */
-    TEST_extra (sincos, M_PI_2l, 1, 0x1.c1cd129024e088a67cc74020bcp-107L),
+    TEST_fFF_11 (sincos, M_PI_2l, 1, 0x1.c1cd129024e088a67cc74020bcp-107L),
 #endif
 #if defined TEST_LDOUBLE && LDBL_MANT_DIG == 113
     /* 128-bit long double.  */
-    TEST_extra (sincos, M_PI_2l, 1, 0x1.cd129024e088a67cc74020bbea64p-115L),
+    TEST_fFF_11 (sincos, M_PI_2l, 1, 0x1.cd129024e088a67cc74020bbea64p-115L),
 #endif
 
-    TEST_extra (sincos, M_PI_6l, 0.5, 0.86602540378443864676372317075293616L),
-    TEST_extra (sincos, M_PI_6l*2.0, 0.86602540378443864676372317075293616L, 0.5),
-    TEST_extra (sincos, 0.75L, 0.681638760023334166733241952779893935L, 0.731688868873820886311838753000084544L),
+    TEST_fFF_11 (sincos, M_PI_6l, 0.5, 0.86602540378443864676372317075293616L),
+    TEST_fFF_11 (sincos, M_PI_6l*2.0, 0.86602540378443864676372317075293616L, 0.5),
+    TEST_fFF_11 (sincos, 0.75L, 0.681638760023334166733241952779893935L, 0.731688868873820886311838753000084544L),
 
-    TEST_extra (sincos, 0x1p65, -0.047183876212354673805106149805700013943218L, 0.99888622066058013610642172179340364209972L),
-    TEST_extra (sincos, -0x1p65, 0.047183876212354673805106149805700013943218L, 0.99888622066058013610642172179340364209972L),
+    TEST_fFF_11 (sincos, 0x1p65, -0.047183876212354673805106149805700013943218L, 0.99888622066058013610642172179340364209972L),
+    TEST_fFF_11 (sincos, -0x1p65, 0.047183876212354673805106149805700013943218L, 0.99888622066058013610642172179340364209972L),
 
 #ifdef TEST_DOUBLE
-    TEST_extra (sincos, 0.80190127184058835, 0.71867942238767868, 0.69534156199418473),
+    TEST_fFF_11 (sincos, 0.80190127184058835, 0.71867942238767868, 0.69534156199418473),
 #endif
 
 #ifndef TEST_FLOAT
-    TEST_extra (sincos, 1e22, -0.8522008497671888017727058937530293682618L, 0.5232147853951389454975944733847094921409L),
-    TEST_extra (sincos, 0x1p1023, 0.5631277798508840134529434079444683477104L, -0.826369834614147994500785680811743734805L),
+    TEST_fFF_11 (sincos, 1e22, -0.8522008497671888017727058937530293682618L, 0.5232147853951389454975944733847094921409L),
+    TEST_fFF_11 (sincos, 0x1p1023, 0.5631277798508840134529434079444683477104L, -0.826369834614147994500785680811743734805L),
 #endif
 
 #if defined TEST_LDOUBLE && LDBL_MAX_EXP >= 16384
-    TEST_extra (sincos, 0x1p16383L, 0.3893629985894208126948115852610595405563L, 0.9210843909921906206874509522505756251609L),
+    TEST_fFF_11 (sincos, 0x1p16383L, 0.3893629985894208126948115852610595405563L, 0.9210843909921906206874509522505756251609L),
 #endif
 
-    TEST_extra (sincos, 0x1p+120, 3.77820109360752022655548470056922991960587e-01L, -9.25879022854837867303861764107414946730833e-01L),
-    TEST_extra (sincos, 0x1p+127, 6.23385512955870240370428801097126489001833e-01L, 7.81914638714960072263910298466369236613162e-01L),
-    TEST_extra (sincos, 0x1.fffff8p+127, 4.85786063130487339701113680434728152037092e-02L, 9.98819362551949040703862043664101081064641e-01L),
-    TEST_extra (sincos, 0x1.fffffep+127, -5.21876523333658540551505357019806722935726e-01L, 8.53021039830304158051791467692161107353094e-01L),
-    TEST_extra (sincos, 0x1p+50, 4.96396515208940840876821859865411368093356e-01L, 8.68095904660550604334592502063501320395739e-01L),
-    TEST_extra (sincos, 0x1p+28, -9.86198211836975655703110310527108292055548e-01L, -1.65568979490578758865468278195361551113358e-01L),
+    TEST_fFF_11 (sincos, 0x1p+120, 3.77820109360752022655548470056922991960587e-01L, -9.25879022854837867303861764107414946730833e-01L),
+    TEST_fFF_11 (sincos, 0x1p+127, 6.23385512955870240370428801097126489001833e-01L, 7.81914638714960072263910298466369236613162e-01L),
+    TEST_fFF_11 (sincos, 0x1.fffff8p+127, 4.85786063130487339701113680434728152037092e-02L, 9.98819362551949040703862043664101081064641e-01L),
+    TEST_fFF_11 (sincos, 0x1.fffffep+127, -5.21876523333658540551505357019806722935726e-01L, 8.53021039830304158051791467692161107353094e-01L),
+    TEST_fFF_11 (sincos, 0x1p+50, 4.96396515208940840876821859865411368093356e-01L, 8.68095904660550604334592502063501320395739e-01L),
+    TEST_fFF_11 (sincos, 0x1p+28, -9.86198211836975655703110310527108292055548e-01L, -1.65568979490578758865468278195361551113358e-01L),
     END_DATA (sincos)
   };
 
@@ -13465,7 +13472,7 @@ sincos_test (void)
   FLOAT sin_res, cos_res;
 
   START (sincos);
-  RUN_TEST_LOOP_sincos (sincos_test_data, , sin_res, cos_res);
+  RUN_TEST_LOOP_fFF_11 (sincos, sincos_test_data, , sin_res, cos_res);
   END (sincos);
 }