aboutsummaryrefslogtreecommitdiff
path: root/math/gen-libm-test.pl
diff options
context:
space:
mode:
Diffstat (limited to 'math/gen-libm-test.pl')
-rwxr-xr-xmath/gen-libm-test.pl49
1 files changed, 38 insertions, 11 deletions
diff --git a/math/gen-libm-test.pl b/math/gen-libm-test.pl
index 9d0fc006ba..9cdcc4343a 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",
@@ -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') {