Remove CHOOSE() macro from libm-tests.inc

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.
This commit is contained in:
Paul E. Murphy 2016-06-08 14:37:15 -05:00
parent 8938513484
commit 9c665e085f
21 changed files with 73 additions and 39 deletions

View File

@ -1,3 +1,35 @@
2016-06-08 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
* 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.
2016-06-08 Paul E. Murphy <murphyp@linux.vnet.ibm.com>
* math/gen-libm-test.pl: (apply_lit): New subroutine.

View File

@ -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",
@ -586,7 +593,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
@ -611,7 +625,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") {
@ -695,16 +709,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";
}
@ -722,6 +733,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') {

View File

@ -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
@ -369,7 +362,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

View File

@ -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"

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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"

View File

@ -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)

View File

@ -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"

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"

View File

@ -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"