summaryrefslogtreecommitdiff
path: root/scripts/bench.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/bench.pl')
-rwxr-xr-xscripts/bench.pl117
1 files changed, 96 insertions, 21 deletions
diff --git a/scripts/bench.pl b/scripts/bench.pl
index bb7f64897e..dcf1355282 100755
--- a/scripts/bench.pl
+++ b/scripts/bench.pl
@@ -22,36 +22,48 @@ use warnings;
# Generate a benchmark source file for a given input.
if (@ARGV < 2) {
- die "Usage: bench.pl <function> <iterations> [parameter types] [return type]"
+ die "Usage: bench.pl <function> [parameter types] [return type]"
}
my $arg;
my $func = $ARGV[0];
-my $iters = $ARGV[1];
my @args;
my $ret = "void";
my $getret = "";
my $retval = "";
-if (@ARGV >= 3) {
- @args = split(':', $ARGV[2]);
+if (@ARGV >= 2) {
+ @args = split(':', $ARGV[1]);
}
-if (@ARGV == 4) {
- $ret = $ARGV[3];
+if (@ARGV == 3) {
+ $ret = $ARGV[2];
}
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(j) $func();\n";
- print "#define NUM_SAMPLES (1)\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"
}
+# The function has arguments, so parse them and populate the inputs.
else {
my $num = 0;
- my $bench_func = "#define CALL_BENCH_FUNC(j) $func (";
- my $struct = "struct args {";
+ my $bench_func = "#define CALL_BENCH_FUNC(v, i) $func (";
+
+ my $struct =
+ "struct _variants
+ {
+ const char *name;
+ int count;
+ struct args *in;
+ };\n";
+
+ my $arg_struct = "struct args {";
foreach $arg (@args) {
if ($num > 0) {
@@ -59,24 +71,87 @@ else {
$decl = "$decl,";
}
- $struct = "$struct $arg arg$num;";
- $bench_func = "$bench_func in[j].arg$num";
+ $arg_struct = "$arg_struct volatile $arg arg$num;";
+ $bench_func = "$bench_func variants[v].in[i].arg$num";
$decl = "$decl $arg";
$num = $num + 1;
}
- print "$decl);\n";
- print "$bench_func);\n";
- print "$struct } in[] = {";
+ $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 $!;
- while (<INPUTS>) {
+ LINE:while (<INPUTS>) {
chomp;
- print "{$_},\n";
+
+ # 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, $_);
}
- print "};\n";
- print "#define NUM_SAMPLES (sizeof (in) / sizeof (struct args))\n"
+
+ $vals{$variant} = \@curvals;
+
+ # Print the definitions and macros.
+ print $decl;
+ print $bench_func;
+ print $arg_struct;
+ print $struct;
+
+ my $c = 0;
+ my $key;
+
+ # Print the input arrays.
+ foreach $key (keys %vals) {
+ my @arr = @{$vals{$key}};
+
+ print "struct args in" . $c . "[" . @arr . "] = {\n";
+ foreach (@arr) {
+ print "{$_},\n";
+ }
+ print "};\n\n";
+ $c += 1;
+ }
+
+ # The variants. Each variant then points to the appropriate input array we
+ # defined above.
+ print "struct _variants variants[" . (keys %vals) . "] = {\n";
+ $c = 0;
+ foreach $key (keys %vals) {
+ print "{\"$func($key)\", " . @{$vals{$key}} . ", in$c},\n";
+ $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";
}
# In some cases not storing a return value seems to result in the function call
@@ -86,8 +161,8 @@ if ($ret ne "void") {
$getret = "ret = ";
}
-print "#define BENCH_FUNC(j) ({$getret CALL_BENCH_FUNC (j);})\n";
+# And we're done.
+print "#define BENCH_FUNC(i, j) ({$getret CALL_BENCH_FUNC (i, j);})\n";
-print "#define ITER $iters\n";
print "#define FUNCNAME \"$func\"\n";
print "#include \"bench-skeleton.c\"\n";