[PATCHv3,09/11] Remove CHOOSE() macro from libm-tests.inc

Message ID 36f9507cac7b9dbadfe2cdda8743dbd1a1461d02.1464297421.git.murphyp@linux.vnet.ibm.com
State Committed
Headers

Commit Message

Paul E. Murphy May 26, 2016, 9:42 p.m. UTC
  Use gen-libm-test.pl to generate a list of macros
mapping to libm-test-ulps.h as this simplifies adding new
types without having to modify a growing number of
static headers each time a type is added.

This also removes the final usage of the TEST_(DOUBLE|FLOAT|LDOUBLE)
macros.  Thus, they too are removed.

	* math/gen-libm-test.pl (all_floats_pfx): New lookup table.
	(parse_ulps): Dynamically generate type name matching
	string from all_floats.
	(get_ulps): Generate the ulps as an array instead.
	(output_ulps): Dynamically compose the type based
	on the number of supported formats, and print
	the indices as type specific helper macros.

	* math/libm-test.inc: Remove comment about CHOOSE.
	(ulp_data): Generate the type in libm-test-ulps.h.
	(ULP_IDX): New macro.
	(find_ulps): Update usage of max_ulp.

	* math/test-double-vlen2.h (CHOOSE): Remove.
	* math/test-double-vlen4.h (CHOOSE): Likewise.
	* math/test-double-vlen8.h (CHOOSE): Likewise.
	* math/test-float.c (CHOOSE): Likewise.
	* math/test-float-finite.c (CHOOSE): Likewise.
	* math/test-double.c (CHOOSE): Likewise.
	* math/test-double-finite.c (CHOOSE): Likewise.
	* math/test-idouble.c (CHOOSE): Likewise.
	* math/test-ifloat.c (CHOOSE): Likewise.
	* math/test-ildoubl.c (CHOOSE): Likewise.
	* math/test-ldouble-finite.c (CHOOSE): Likewise.
	* math/test-ldouble.c (CHOOSE): Likewise.

	* math/test-float.h (TEST_FLOAT): Remove.
	* math/test-double.h (TEST_DOUBLE): Likewise.
	* math/test-ldouble.h (TEST_LDOUBLE): Likewise.
---
 math/gen-libm-test.pl      | 49 +++++++++++++++++++++++++++++++++++-----------
 math/libm-test.inc         | 13 +++---------
 math/test-double-finite.c  |  1 -
 math/test-double-vlen2.h   |  1 -
 math/test-double-vlen4.h   |  1 -
 math/test-double-vlen8.h   |  1 -
 math/test-double.c         |  1 -
 math/test-double.h         |  1 -
 math/test-float-finite.c   |  1 -
 math/test-float-vlen16.h   |  1 -
 math/test-float-vlen4.h    |  1 -
 math/test-float-vlen8.h    |  1 -
 math/test-float.c          |  1 -
 math/test-float.h          |  1 -
 math/test-idouble.c        |  1 -
 math/test-ifloat.c         |  1 -
 math/test-ildoubl.c        |  1 -
 math/test-ldouble-finite.c |  1 -
 math/test-ldouble.c        |  1 -
 math/test-ldouble.h        |  1 -
 20 files changed, 41 insertions(+), 39 deletions(-)
  

Comments

Joseph Myers June 3, 2016, 8:35 p.m. UTC | #1
On Thu, 26 May 2016, Paul E. Murphy wrote:

> Use gen-libm-test.pl to generate a list of macros
> mapping to libm-test-ulps.h as this simplifies adding new
> types without having to modify a growing number of
> static headers each time a type is added.
> 
> This also removes the final usage of the TEST_(DOUBLE|FLOAT|LDOUBLE)
> macros.  Thus, they too are removed.

OK.
  
Paul E. Murphy June 8, 2016, 8:02 p.m. UTC | #2
On 06/03/2016 03:35 PM, Joseph Myers wrote:
> On Thu, 26 May 2016, Paul E. Murphy wrote:
> 
>> Use gen-libm-test.pl to generate a list of macros
>> mapping to libm-test-ulps.h as this simplifies adding new
>> types without having to modify a growing number of
>> static headers each time a type is added.
>>
>> This also removes the final usage of the TEST_(DOUBLE|FLOAT|LDOUBLE)
>> macros.  Thus, they too are removed.
> 
> OK.
> 

Committed as 9c665e0.
  

Patch

diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index 30b5406..9fb726d 100755
--- a/math/gen-libm-test.pl
+++ b/math/gen-libm-test.pl
@@ -39,7 +39,7 @@  use strict;
 
 use vars qw ($input $output $auto_input);
 use vars qw (%results);
-use vars qw (%beautify @all_floats);
+use vars qw (%beautify @all_floats %all_floats_pfx);
 use vars qw ($output_dir $ulps_file $srcdir);
 use vars qw (%auto_tests);
 
@@ -47,6 +47,13 @@  use vars qw (%auto_tests);
 @all_floats = ('double', 'float', 'idouble',
 	       'ifloat', 'ildouble', 'ldouble');
 
+# all_floats_pfx maps C types to their C like prefix for macros.
+%all_floats_pfx =
+  ( "double" => "DBL",
+    "ldouble" => "LDBL",
+    "float" => "FLT",
+  );
+
 %beautify =
   ( "minus_zero" => "-0",
     "plus_zero" => "+0",
@@ -603,7 +610,14 @@  sub generate_testfile {
 # Parse ulps file
 sub parse_ulps {
   my ($file) = @_;
-  my ($test, $type, $float, $eps);
+  my ($test, $type, $float, $eps, $float_regex);
+
+  # Build a basic regex to match type entries in the
+  # generated ULPS file.
+  foreach my $ftype (@all_floats) {
+    $float_regex .= "|" . $ftype;
+  }
+  $float_regex = "^" . substr ($float_regex, 1) . ":";
 
   # $type has the following values:
   # "normal": No complex variable
@@ -628,7 +642,7 @@  sub parse_ulps {
       ($test) = ($_ =~ /^Function:\s*\"([a-zA-Z0-9_]+)\"/);
       next;
     }
-    if (/^i?(float|double|ldouble):/) {
+    if (/$float_regex/) {
       ($float, $eps) = split /\s*:\s*/,$_,2;
 
       if ($eps eq "0") {
@@ -712,16 +726,13 @@  sub get_ulps {
 sub get_all_ulps_for_test {
   my ($test, $type) = @_;
   my ($ldouble, $double, $float, $ildouble, $idouble, $ifloat);
+  my ($ulps_str);
 
   if (exists $results{$test}{'has_ulps'}) {
-    # XXX use all_floats (change order!)
-    $ldouble = &get_ulps ($test, $type, "ldouble");
-    $double = &get_ulps ($test, $type, "double");
-    $float = &get_ulps ($test, $type, "float");
-    $ildouble = &get_ulps ($test, $type, "ildouble");
-    $idouble = &get_ulps ($test, $type, "idouble");
-    $ifloat = &get_ulps ($test, $type, "ifloat");
-    return "CHOOSE ($ldouble, $double, $float, $ildouble, $idouble, $ifloat)";
+    foreach $float (@all_floats) {
+      $ulps_str .= &get_ulps ($test, $type, $float) . ", ";
+    }
+    return "{" . substr ($ulps_str, 0, -2) . "}";
   } else {
     die "get_all_ulps_for_test called for \"$test\" with no ulps\n";
   }
@@ -739,6 +750,22 @@  sub output_ulps {
   print ULP "   from $ulps_filename with gen-libm-test.pl.\n";
   print ULP "   Don't change it - change instead the master files.  */\n\n";
 
+  print ULP "struct ulp_data\n";
+  print ULP "{\n";
+  print ULP "  const char *name;\n";
+  print ULP "  FLOAT max_ulp[" . @all_floats . "];\n";
+  print ULP "};\n\n";
+
+  for ($i = 0; $i <= $#all_floats; $i++) {
+    $type = $all_floats[$i];
+    print ULP "#define ULP_";
+    if ($type =~ /^i/) {
+      print ULP "I_";
+      $type = substr $type, 1;
+    }
+    print ULP "$all_floats_pfx{$type} $i\n";
+  }
+
   foreach $fct (keys %results) {
     $type = $results{$fct}{'type'};
     if ($type eq 'normal') {
diff --git a/math/libm-test.inc b/math/libm-test.inc
index 5d10460..cb10fa0 100644
--- a/math/libm-test.inc
+++ b/math/libm-test.inc
@@ -26,7 +26,6 @@ 
    name with correct suffix (e.g. cosl or cosf)
    FLOAT:	   floating point type to test
    - TEST_MSG:	   informal message to be displayed
-   CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat):
    chooses one of the parameters as delta for testing
    equality
    PRINTF_EXPR	   Floating point conversion specification to print a variable
@@ -131,14 +130,6 @@ 
 #include <math-tests.h>
 #include <math-tests-arch.h>
 
-/* Structure for ulp data for a function, or the real or imaginary
-   part of a function.  */
-struct ulp_data
-{
-  const char *name;
-  FLOAT max_ulp;
-};
-
 /* This header defines func_ulps, func_real_ulps and func_imag_ulps
    arrays.  */
 #include "libm-test-ulps.h"
@@ -202,8 +193,10 @@  struct ulp_data
 # define FSTR_MAX (128)
 
 #if TEST_INLINE
+# define ULP_IDX __CONCATX (ULP_I_, PREFIX)
 # define QTYPE_STR "i" TYPE_STR
 #else
+# define ULP_IDX __CONCATX (ULP_, PREFIX)
 # define QTYPE_STR TYPE_STR
 #endif
 
@@ -395,7 +388,7 @@  find_ulps (const char *name, const struct ulp_data *data, size_t nmemb)
   if (entry == NULL)
     return 0;
   else
-    return entry->max_ulp;
+    return entry->max_ulp[ULP_IDX];
 }
 
 static void
diff --git a/math/test-double-finite.c b/math/test-double-finite.c
index e7fa2a9..7f107aa 100644
--- a/math/test-double-finite.c
+++ b/math/test-double-finite.c
@@ -21,6 +21,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing double (finite-math-only)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble
 
 #include "libm-test.c"
diff --git a/math/test-double-vlen2.h b/math/test-double-vlen2.h
index 8a1d068..45351cb 100644
--- a/math/test-double-vlen2.h
+++ b/math/test-double-vlen2.h
@@ -21,7 +21,6 @@ 
 #include "test-math-vector.h"
 
 #define TEST_MSG "testing double vector math (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble
 
 #define EXCEPTION_TESTS_double 0
 #define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
diff --git a/math/test-double-vlen4.h b/math/test-double-vlen4.h
index 40ab58c..7078893 100644
--- a/math/test-double-vlen4.h
+++ b/math/test-double-vlen4.h
@@ -21,7 +21,6 @@ 
 #include "test-math-vector.h"
 
 #define TEST_MSG "testing double vector math (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble
 
 #define EXCEPTION_TESTS_double 0
 #define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
diff --git a/math/test-double-vlen8.h b/math/test-double-vlen8.h
index dddb52c..57168c5 100644
--- a/math/test-double-vlen8.h
+++ b/math/test-double-vlen8.h
@@ -21,7 +21,6 @@ 
 #include "test-math-vector.h"
 
 #define TEST_MSG "testing double vector math (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble
 
 #define EXCEPTION_TESTS_double 0
 #define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST)
diff --git a/math/test-double.c b/math/test-double.c
index 2647f66..3f84f40 100644
--- a/math/test-double.c
+++ b/math/test-double.c
@@ -23,6 +23,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing double (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cdouble
 
 #include "libm-test.c"
diff --git a/math/test-double.h b/math/test-double.h
index 3667883..b9e8cd8 100644
--- a/math/test-double.h
+++ b/math/test-double.h
@@ -21,7 +21,6 @@ 
 #define PRINTF_EXPR "e"
 #define PRINTF_XEXPR "a"
 #define PRINTF_NEXPR "f"
-#define TEST_DOUBLE 1
 #define BUILD_COMPLEX(real, imag) (CMPLX ((real), (imag)))
 #define PREFIX DBL
 #define LIT(x) (x)
diff --git a/math/test-float-finite.c b/math/test-float-finite.c
index bd25a7b..3f5fe19 100644
--- a/math/test-float-finite.c
+++ b/math/test-float-finite.c
@@ -21,6 +21,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing float (finite-math-only)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cfloat
 
 #include "libm-test.c"
diff --git a/math/test-float-vlen16.h b/math/test-float-vlen16.h
index a2db3a5..d31336a 100644
--- a/math/test-float-vlen16.h
+++ b/math/test-float-vlen16.h
@@ -21,7 +21,6 @@ 
 #include "test-math-vector.h"
 
 #define TEST_MSG "testing float vector math (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cfloat
 
 #define EXCEPTION_TESTS_float 0
 #define ROUNDING_TESTS_float(MODE) ((MODE) == FE_TONEAREST)
diff --git a/math/test-float-vlen4.h b/math/test-float-vlen4.h
index 164749d..5a88fb8 100644
--- a/math/test-float-vlen4.h
+++ b/math/test-float-vlen4.h
@@ -21,7 +21,6 @@ 
 #include "test-math-vector.h"
 
 #define TEST_MSG "testing float vector math (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cfloat
 
 #define EXCEPTION_TESTS_float 0
 #define ROUNDING_TESTS_float(MODE) ((MODE) == FE_TONEAREST)
diff --git a/math/test-float-vlen8.h b/math/test-float-vlen8.h
index ce32df2..d1e5e6e 100644
--- a/math/test-float-vlen8.h
+++ b/math/test-float-vlen8.h
@@ -21,7 +21,6 @@ 
 #include "test-math-vector.h"
 
 #define TEST_MSG "testing float vector math (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cfloat
 
 #define EXCEPTION_TESTS_float 0
 #define ROUNDING_TESTS_float(MODE) ((MODE) == FE_TONEAREST)
diff --git a/math/test-float.c b/math/test-float.c
index 153b9ad..6be57bb 100644
--- a/math/test-float.c
+++ b/math/test-float.c
@@ -23,6 +23,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing float (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cfloat
 
 #include "libm-test.c"
diff --git a/math/test-float.h b/math/test-float.h
index 4f9149f..e783c09 100644
--- a/math/test-float.h
+++ b/math/test-float.h
@@ -21,7 +21,6 @@ 
 #define PRINTF_EXPR "e"
 #define PRINTF_XEXPR "a"
 #define PRINTF_NEXPR "f"
-#define TEST_FLOAT 1
 #define BUILD_COMPLEX(real, imag) (CMPLXF ((real), (imag)))
 #define PREFIX FLT
 #define TYPE_STR "float"
diff --git a/math/test-idouble.c b/math/test-idouble.c
index fc1e8f8..10a3685 100644
--- a/math/test-idouble.c
+++ b/math/test-idouble.c
@@ -21,6 +21,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing double (inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cinlinedouble
 
 #include "libm-test.c"
diff --git a/math/test-ifloat.c b/math/test-ifloat.c
index 72c53ad..88bb5b8 100644
--- a/math/test-ifloat.c
+++ b/math/test-ifloat.c
@@ -21,6 +21,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing float (inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cinlinefloat
 
 #include "libm-test.c"
diff --git a/math/test-ildoubl.c b/math/test-ildoubl.c
index 08317ed..dc0efaa 100644
--- a/math/test-ildoubl.c
+++ b/math/test-ildoubl.c
@@ -21,6 +21,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing long double (inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Cinlinelongdouble
 
 #include "libm-test.c"
diff --git a/math/test-ldouble-finite.c b/math/test-ldouble-finite.c
index 4c09778..8ac2d33 100644
--- a/math/test-ldouble-finite.c
+++ b/math/test-ldouble-finite.c
@@ -21,6 +21,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing long double (finite-math-only)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Clongdouble
 
 #include "libm-test.c"
diff --git a/math/test-ldouble.c b/math/test-ldouble.c
index 944f6dd..a705fa4 100644
--- a/math/test-ldouble.c
+++ b/math/test-ldouble.c
@@ -23,6 +23,5 @@ 
 #include "test-math-scalar.h"
 
 #define TEST_MSG "testing long double (without inline functions)\n"
-#define CHOOSE(Clongdouble,Cdouble,Cfloat,Cinlinelongdouble,Cinlinedouble,Cinlinefloat) Clongdouble
 
 #include "libm-test.c"
diff --git a/math/test-ldouble.h b/math/test-ldouble.h
index f3a8d8d..b877711 100644
--- a/math/test-ldouble.h
+++ b/math/test-ldouble.h
@@ -21,7 +21,6 @@ 
 #define PRINTF_EXPR "Le"
 #define PRINTF_XEXPR "La"
 #define PRINTF_NEXPR "Lf"
-#define TEST_LDOUBLE 1
 #define BUILD_COMPLEX(real, imag) (CMPLXL ((real), (imag)))
 #define PREFIX LDBL
 #define TYPE_STR "ldouble"