diff --git a/ChangeLog b/ChangeLog index 44ebf726d3..0983299137 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,26 @@ +2013-10-07 Siddhesh Poyarekar + + * benchtests/Makefile: Remove ARGLIST and RET variables. + ($(objpfx)bench-%.c): Pass only function name to the script. + * benchtests/README: Update documentation. + * benchtests/acos-inputs: Add new directives. + * benchtests/acosh-inputs: Likewise. + * benchtests/asin-inputs: Likewise. + * benchtests/asinh-inputs: Likewise. + * benchtests/atan-inputs: Likewise. + * benchtests/atanh-inputs: Likewise. + * benchtests/cos-inputs: Likewise. + * benchtests/cosh-inputs: Likewise. + * benchtests/exp-inputs: Likewise. + * benchtests/log-inputs: Likewise. + * benchtests/pow-inputs: Likewise. + * benchtests/rint-inputs: Likewise. + * benchtests/sin-inputs: Likewise. + * benchtests/sinh-inputs: Likewise. + * benchtests/tan-inputs: Likewise. + * benchtests/tanh-inputs: Likewise. + * scripts/bench.pl: Add support for new directives. + 2013-10-07 Alan Modra * README: Fix careless merge. diff --git a/benchtests/Makefile b/benchtests/Makefile index 4f4bd5408a..aec395a814 100644 --- a/benchtests/Makefile +++ b/benchtests/Makefile @@ -34,70 +34,22 @@ string-bench-all := $(string-bench) $(string-bench-ifunc) benchset := $(string-bench-all) -acos-ARGLIST = double -acos-RET = double LDLIBS-bench-acos = -lm - -acosh-ARGLIST = double -acosh-RET = double LDLIBS-bench-acosh = -lm - -asin-ARGLIST = double -asin-RET = double LDLIBS-bench-asin = -lm - -asinh-ARGLIST = double -asinh-RET = double LDLIBS-bench-asinh = -lm - -atan-ARGLIST = double -atan-RET = double LDLIBS-bench-atan = -lm - -atanh-ARGLIST = double -atanh-RET = double LDLIBS-bench-atanh = -lm - -cos-ARGLIST = double -cos-RET = double LDLIBS-bench-cos = -lm - -cosh-ARGLIST = double -cosh-RET = double LDLIBS-bench-cosh = -lm - -exp-ARGLIST = double -exp-RET = double LDLIBS-bench-exp = -lm - -log-ARGLIST = double -log-RET = double LDLIBS-bench-log = -lm - -pow-ARGLIST = double:double -pow-RET = double LDLIBS-bench-pow = -lm - -rint-ARGLIST = double -rint-RET = double LDLIBS-bench-rint = -lm - -sin-ARGLIST = double -sin-RET = double LDLIBS-bench-sin = -lm - -sinh-ARGLIST = double -sinh-RET = double LDLIBS-bench-sinh = -lm - -tan-ARGLIST = double -tan-RET = double LDLIBS-bench-tan = -lm - -tanh-ARGLIST = double -tanh-RET = double LDLIBS-bench-tanh = -lm - LDLIBS-bench-sincos = -lm @@ -171,6 +123,5 @@ $(objpfx)bench-%.c: %-inputs $(bench-deps) { if [ -n "$($*-INCLUDE)" ]; then \ cat $($*-INCLUDE); \ fi; \ - $(..)scripts/bench.pl $(patsubst %-inputs,%,$<) \ - $($*-ARGLIST) $($*-RET); } > $@-tmp + $(..)scripts/bench.pl $(patsubst %-inputs,%,$<); } > $@-tmp mv -f $@-tmp $@ diff --git a/benchtests/README b/benchtests/README index 045b7a673d..5faca53511 100644 --- a/benchtests/README +++ b/benchtests/README @@ -40,23 +40,24 @@ one to add `foo' to the bench tests: - Append the function name to the bench variable in the Makefile. -- Define foo-ARGLIST as a colon separated list of types of the input - arguments. Use `void' if function does not take any inputs. Put in quotes - if the input argument is a pointer, e.g.: - - malloc-ARGLIST: "void *" - -- Define foo-RET as the type the function returns. Skip if the function - returns void. One could even skip foo-ARGLIST if the function does not - take any inputs AND the function returns void. - -- Make a file called `foo-inputs` with one input value per line, an input - being a comma separated list of arguments to be passed into the function. - See pow-inputs for an example. - - The script that parses the -inputs file treats lines beginning with a single - `#' as comments. Lines beginning with two hashes `##' are treated specially - as `directives'. +- Make a file called `foo-inputs` to provide the definition and input for the + function. The file should have some directives telling the parser script + about the function and then one input per line. Directives are lines that + have a special meaning for the parser and they begin with two hashes '##'. + The following directives are recognized: + + - args: This should be assigned a colon separated list of types of the input + arguments. This directive may be skipped if the function does not take any + inputs. + - ret: This should be assigned the type that the function returns. This + directive may be skipped if the function does not return a value. + - includes: This should be assigned a comma separated list of headers that + need to be included to provide declarations for the function and types it + may need. + - name: See following section for instructions on how to use this directive. + + Lines beginning with a single hash '#' are treated as comments. See + pow-inputs for an example of an input file. Multiple execution units per function: ===================================== diff --git a/benchtests/acos-inputs b/benchtests/acos-inputs index b527af35e4..080a4e916e 100644 --- a/benchtests/acos-inputs +++ b/benchtests/acos-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.5 0.1 0.2 diff --git a/benchtests/acosh-inputs b/benchtests/acosh-inputs index 3c8c546f0c..84a603dc3d 100644 --- a/benchtests/acosh-inputs +++ b/benchtests/acosh-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.1 0.2 0.3 diff --git a/benchtests/asin-inputs b/benchtests/asin-inputs index b527af35e4..080a4e916e 100644 --- a/benchtests/asin-inputs +++ b/benchtests/asin-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.5 0.1 0.2 diff --git a/benchtests/asinh-inputs b/benchtests/asinh-inputs index 3c8c546f0c..84a603dc3d 100644 --- a/benchtests/asinh-inputs +++ b/benchtests/asinh-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.1 0.2 0.3 diff --git a/benchtests/atan-inputs b/benchtests/atan-inputs index 4a2cf3aca3..e88e384346 100644 --- a/benchtests/atan-inputs +++ b/benchtests/atan-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0x1.000000c5cba86p0 0x1.000001883003ap0 0x1.00000dfb2b674p0 diff --git a/benchtests/atanh-inputs b/benchtests/atanh-inputs index 3c8c546f0c..84a603dc3d 100644 --- a/benchtests/atanh-inputs +++ b/benchtests/atanh-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.1 0.2 0.3 diff --git a/benchtests/cos-inputs b/benchtests/cos-inputs index 82a40609cd..c7bbaad151 100644 --- a/benchtests/cos-inputs +++ b/benchtests/cos-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0x1.000000cf4a2a1p0 0x1.0000010b239a8p0 0x1.00000162a932ap0 diff --git a/benchtests/cosh-inputs b/benchtests/cosh-inputs index 3c8c546f0c..84a603dc3d 100644 --- a/benchtests/cosh-inputs +++ b/benchtests/cosh-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.1 0.2 0.3 diff --git a/benchtests/exp-inputs b/benchtests/exp-inputs index e9d33a3d1c..593ad7c74b 100644 --- a/benchtests/exp-inputs +++ b/benchtests/exp-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 42 # Slowest path with computation in 768 bit precision. # Implemented in: sysdeps/ieee754/dbl-64/mpexp.c diff --git a/benchtests/log-inputs b/benchtests/log-inputs index 713c2229f5..c92d78ce6f 100644 --- a/benchtests/log-inputs +++ b/benchtests/log-inputs @@ -1 +1,4 @@ +## args: double +## ret: double +## includes: math.h 42.0 diff --git a/benchtests/pow-inputs b/benchtests/pow-inputs index dad65059aa..96b1b6c2ad 100644 --- a/benchtests/pow-inputs +++ b/benchtests/pow-inputs @@ -1,3 +1,6 @@ +## args: double:double +## ret: double +## includes: math.h 42.0, 42.0 # pow slowest path at 768 bits # Implemented in sysdeps/ieee754/dbl-64/slowpow.c diff --git a/benchtests/rint-inputs b/benchtests/rint-inputs index a5f83dc8f9..e9001f92e8 100644 --- a/benchtests/rint-inputs +++ b/benchtests/rint-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 78.5 -78.5 4503599627370497.0 diff --git a/benchtests/sin-inputs b/benchtests/sin-inputs index 08192d8f09..ae452a82df 100644 --- a/benchtests/sin-inputs +++ b/benchtests/sin-inputs @@ -1,3 +1,6 @@ +## includes: math.h +## args: double +## ret: double 0.9 2.3 3.7 diff --git a/benchtests/sinh-inputs b/benchtests/sinh-inputs index 3c8c546f0c..84a603dc3d 100644 --- a/benchtests/sinh-inputs +++ b/benchtests/sinh-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.1 0.2 0.3 diff --git a/benchtests/tan-inputs b/benchtests/tan-inputs index 629414fc73..f489ddde8e 100644 --- a/benchtests/tan-inputs +++ b/benchtests/tan-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0x1.dffffffffff1ep-22 # tan slowest path at 768 bits # Implemented in sysdeps/ieee754/dbl-64/mptan.c diff --git a/benchtests/tanh-inputs b/benchtests/tanh-inputs index 3c8c546f0c..84a603dc3d 100644 --- a/benchtests/tanh-inputs +++ b/benchtests/tanh-inputs @@ -1,3 +1,6 @@ +## args: double +## ret: double +## includes: math.h 0.1 0.2 0.3 diff --git a/scripts/bench.pl b/scripts/bench.pl index dcf1355282..5fe95d0c2f 100755 --- a/scripts/bench.pl +++ b/scripts/bench.pl @@ -21,40 +21,78 @@ use warnings; # Generate a benchmark source file for a given input. -if (@ARGV < 2) { - die "Usage: bench.pl [parameter types] [return type]" +if (@ARGV < 1) { + die "Usage: bench.pl " } -my $arg; my $func = $ARGV[0]; my @args; my $ret = "void"; my $getret = ""; -my $retval = ""; -if (@ARGV >= 2) { - @args = split(':', $ARGV[1]); -} +# We create a hash of inputs for each variant of the test. +my $variant = ""; +my @curvals; +my %vals; +my @include_files; +my $incl; + +open INPUTS, "<$func-inputs" or die $!; + +LINE:while () { + chomp; + + # Directives. + if (/^## (\w+): (.*)/) { + # Function argument types. + if ($1 eq "args") { + @args = split(":", $2); + } + + # Function return type. + elsif ($1 eq "ret") { + $ret = $2; + } -if (@ARGV == 3) { - $ret = $ARGV[2]; + elsif ($1 eq "includes") { + @include_files = split (",", $2); + } + + # New variant. This is the only directive allowed in the body of the + # inputs to separate inputs into variants. All others should be at the + # top or else all hell will break loose. + elsif ($1 eq "name") { + + # Save values in the previous variant. + my @copy = @curvals; + $vals{$variant} = \@copy; + + # Prepare for the next. + $variant=$2; + undef @curvals; + next LINE; + } + } + + # Skip over comments. + if (/^#/) { + next LINE; + } + push (@curvals, $_); } -my $decl = "extern $ret $func ("; -# Function has no arguments. -if (@args == 0 || $args[0] eq "void") { - print "$decl void);\n"; - print "#define CALL_BENCH_FUNC(i,j) $func();\n"; - print "#define NUM_VARIANTS (1)\n"; - print "#define NUM_SAMPLES(v) (1)\n"; - print "#define VARIANT(v) FUNCNAME \"()\"\n" +my $bench_func = "#define CALL_BENCH_FUNC(v, i) $func ("; + + +# Print the definitions and macros. +foreach $incl (@include_files) { + print "#include <" . $incl . ">\n"; } -# The function has arguments, so parse them and populate the inputs. -else { - my $num = 0; - my $bench_func = "#define CALL_BENCH_FUNC(v, i) $func ("; +if (@args > 0) { + # Save values in the last variant. + $vals{$variant} = \@curvals; my $struct = "struct _variants { @@ -65,60 +103,21 @@ my $arg_struct = "struct args {"; + my $num = 0; + my $arg; foreach $arg (@args) { if ($num > 0) { $bench_func = "$bench_func,"; - $decl = "$decl,"; } $arg_struct = "$arg_struct volatile $arg arg$num;"; $bench_func = "$bench_func variants[v].in[i].arg$num"; - $decl = "$decl $arg"; $num = $num + 1; } $arg_struct = $arg_struct . "};\n"; - $decl = $decl . ");\n"; $bench_func = $bench_func . ");\n"; - # We create a hash of inputs for each variant of the test. - my $variant = ""; - my @curvals; - my %vals; - - open INPUTS, "<$func-inputs" or die $!; - - LINE:while () { - chomp; - - # New variant. - if (/^## (\w+): (\w+)/) { - #We only identify Name for now. - if ($1 ne "name") { - next LINE; - } - - # Save values in the last variant. - my @copy = @curvals; - $vals{$variant} = \@copy; - - # Prepare for the next. - $variant=$2; - undef @curvals; - next LINE; - } - - # Skip over comments. - if (/^#/) { - next LINE; - } - push (@curvals, $_); - } - - $vals{$variant} = \@curvals; - - # Print the definitions and macros. - print $decl; print $bench_func; print $arg_struct; print $struct; @@ -147,17 +146,24 @@ $c += 1; } print "};\n\n"; - # Finally, print the last set of macros. print "#define NUM_VARIANTS $c\n"; print "#define NUM_SAMPLES(i) (variants[i].count)\n"; print "#define VARIANT(i) (variants[i].name)\n"; } +else { + print $bench_func . ");\n"; + print "#define NUM_VARIANTS (1)\n"; + print "#define NUM_SAMPLES(v) (1)\n"; + print "#define VARIANT(v) FUNCNAME \"()\"\n" +} + + # In some cases not storing a return value seems to result in the function call # being optimized out. if ($ret ne "void") { - print "static volatile $ret ret = 0.0;\n"; + print "static volatile $ret ret;\n"; $getret = "ret = "; }