aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog23
-rw-r--r--benchtests/Makefile51
-rw-r--r--benchtests/README35
-rw-r--r--benchtests/acos-inputs3
-rw-r--r--benchtests/acosh-inputs3
-rw-r--r--benchtests/asin-inputs3
-rw-r--r--benchtests/asinh-inputs3
-rw-r--r--benchtests/atan-inputs3
-rw-r--r--benchtests/atanh-inputs3
-rw-r--r--benchtests/cos-inputs3
-rw-r--r--benchtests/cosh-inputs3
-rw-r--r--benchtests/exp-inputs3
-rw-r--r--benchtests/log-inputs3
-rw-r--r--benchtests/pow-inputs3
-rw-r--r--benchtests/rint-inputs3
-rw-r--r--benchtests/sin-inputs3
-rw-r--r--benchtests/sinh-inputs3
-rw-r--r--benchtests/tan-inputs3
-rw-r--r--benchtests/tanh-inputs3
-rwxr-xr-xscripts/bench.pl134
20 files changed, 160 insertions, 131 deletions
diff --git a/ChangeLog b/ChangeLog
index 44ebf726d3..0983299137 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,26 @@
+2013-10-07 Siddhesh Poyarekar <siddhesh@redhat.com>
+
+ * 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 <amodra@gmail.com>
* 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 strict;
use warnings;
# Generate a benchmark source file for a given input.
-if (@ARGV < 2) {
- die "Usage: bench.pl <function> [parameter types] [return type]"
+if (@ARGV < 1) {
+ die "Usage: bench.pl <function>"
}
-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 (<INPUTS>) {
+ 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 @@ else {
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 (<INPUTS>) {
- 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 @@ else {
$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 = ";
}