+ print "\n";
+}
+
+bench_copy [
+ map {
+ my $i = $_;
+ map {
+ my $j = $i + 8 * $_;
+ map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
+ } 0 .. 8;
+ } 0 .. 8
+], 'aligned, forward';
+
+bench_copy [
+ map {
+ my $i = $_;
+ map {
+ my $j = $i + 8 * $_;
+ map [ $j, $i, len($i, $j) - $_ ], 0 .. 8;
+ } 0 .. 8;
+ } 0 .. 8
+], 'aligned, backward';
+
+bench_copy [
+ map {
+ my $i = $_;
+ map {
+ my $j = $_;
+ map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
+ } 0 .. 8;
+ } 0 .. 8
+], 'misaligned';
+
+sub bench_move {
+ my ($tests, $desc) = @_;
+
+ my ($x, $y, $bv) = map "", 1 .. 2;
+ vec($_, $n - 1, 1) = 0 for $x, $y;
+ $bv = Bit::Vector->new($n, 1) if HAS_BV;
+
+ my ($i, $j, $k) = map 0, 1 .. 3;
+ my $m = @$tests;
+
+ print 'move';
+ print ", $desc" if defined $desc;
+ print ":\n";
+
+ cmpthese $run, {
+ vcopy => sub {
+ my ($u, $v, $w) = @{$tests->[$i]};
+ vcopy($x, $u, $x, $v, $w);
+ ++$i;
+ $i %= $m;
+ },
+ vcopy_pp => sub {
+ my ($u, $v, $w) = @{$tests->[$j]};
+ Scalar::Vec::Util::vcopy_pp($y, $u, $y, $v, $w);
+ ++$j;
+ $j %= $m;
+ },
+ (vcopy_bv => sub {
+ my ($u, $v, $w) = @{$tests->[$k]};
+ $bv->Interval_Copy($bv, $v, $u, $w);
+ ++$k;
+ $k %= $m;
+ }) x HAS_BV,
+ };
+
+ print "\n";
+}
+
+bench_move [
+ map {
+ my $i = $_;
+ map {
+ my $j = $i + 8 * $_;
+ map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
+ } 0 .. 8;
+ } 0 .. 8
+], 'aligned, forward';
+
+bench_move [
+ map {
+ my $i = $_;
+ map {
+ my $j = $i + 8 * $_;
+ map [ $j, $i, len($i, $j) - $_ ], 0 .. 8;
+ } 0 .. 8;
+ } 0 .. 8
+], 'aligned, backward';
+
+bench_move [
+ map {
+ my $i = $_;
+ map {
+ my $j = $_;
+ map [ $i, $j, len($i, $j) - $_ ], 0 .. 8;
+ } 0 .. 8;
+ } 0 .. 8
+], 'misaligned';
+
+my $i = 0;
+my $j = int $n / 2;
+my $x = '';