about summary refs log tree commit diff
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 = ";
 }