armv6: Add fetcher for a8r8g8b8 nearest-neighbour transformed images

This is constrained to support X increments in the positive X direction only,
so this means scaled images (except those reflected in the Y axis) plus
parallelogram transformations which preserve the direction of the X axis.
It also doesn't attempt to support any form of image repeat.

With this optimisation, some operations constructed from fetcher and combiner
calls using general_composite_rect() now outperform the versions consructed
from FAST_NEAREST macros in pixman-fast-path.c, but unfortunately the
FAST_NEAREST ones have higher priority in fast path lookup. Here are some
benchmarks for the in_reverse_8888_8888 operation, which is not affected:

lowlevel-blt-bench -n :

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   10.2   0.0      27.1   0.2     100.0%      +164.8%
L2   8.2    0.1      23.0   0.4     100.0%      +179.2%
M    8.3    0.0      24.8   0.0     100.0%      +200.3%
HT   5.5    0.0      12.7   0.0     100.0%      +129.9%
VT   5.4    0.0      12.1   0.0     100.0%      +123.2%
R    5.4    0.0      11.9   0.1     100.0%      +122.7%
RT   2.8    0.0      5.4    0.1     100.0%      +91.9%

affine-bench for 5 different scaling factors:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  11.1   0.0      28.3   0.0     100.0%      +155.1%
0.75 10.5   0.0      26.4   0.0     100.0%      +152.2%
1.0  9.9    0.0      24.6   0.0     100.0%      +147.5%
1.5  9.0    0.0      21.8   0.0     100.0%      +141.4%
2.0  8.3    0.0      19.7   0.0     100.0%      +138.4%
armv6: Add fetcher for r5g6b5 nearest-neighbour transformed images

This is related to the a8r8g8b8 nearest-scaled-cover fetcher. Below are
benchmarks for src_0565_8888, which uses it.

lowlevel-blt-bench -n :

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   9.0    0.0      34.4   0.3     100.0%      +284.7%
L2   8.1    0.1      29.0   0.6     100.0%      +258.7%
M    8.4    0.0      33.2   0.1     100.0%      +297.6%
HT   5.8    0.0      16.5   0.3     100.0%      +183.6%
VT   5.8    0.0      16.0   0.3     100.0%      +175.6%
R    5.6    0.0      15.6   0.1     100.0%      +175.5%
RT   3.0    0.0      6.0    0.2     100.0%      +98.7%

affine-bench:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  11.2   0.0      52.0   0.1     100.0%      +363.2%
0.75 10.9   0.0      41.3   0.1     100.0%      +279.3%
1.0  10.6   0.0      33.4   0.1     100.0%      +216.7%
1.5  10.0   0.0      32.3   0.1     100.0%      +221.8%
2.0  9.4    0.0      31.7   0.0     100.0%      +236.0%
armv6: Add fetcher for x8r8g8b8 nearest-neighbour transformed images

This is related to the a8r8g8b8 nearest-scaled-cover fetcher. Below are
benchmarks for add_x888_8888, which uses it.

lowlevel-blt-bench -n :

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   12.0   0.0      45.0   0.5     100.0%      +275.3%
L2   9.2    0.1      30.4   1.2     100.0%      +231.6%
M    8.6    0.0      27.8   0.1     100.0%      +224.0%
HT   6.0    0.0      15.4   0.1     100.0%      +158.5%
VT   5.9    0.0      14.5   0.1     100.0%      +146.2%
R    5.7    0.0      14.1   0.1     100.0%      +145.8%
RT   2.9    0.0      5.6    0.1     100.0%      +91.4%

affine-bench:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  12.1   0.0      32.5   0.1     100.0%      +169.6%
0.75 11.3   0.0      30.0   0.0     100.0%      +165.1%
1.0  10.7   0.0      27.1   0.0     100.0%      +153.7%
1.5  9.6    0.0      24.1   0.0     100.0%      +151.6%
2.0  8.8    0.0      21.5   0.0     100.0%      +145.1%
armv6: Add fetcher for a8 nearest-neighbour transformed images

This is related to the a8r8g8b8 nearest-scaled-cover fetcher. Below are
benchmarks for src_8_8888, which uses it.

lowlevel-blt-bench -n :

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   15.1   0.1      55.5   0.3     100.0%      +267.2%
L2   13.7   0.1      45.3   0.8     100.0%      +230.0%
M    14.5   0.0      53.9   0.1     100.0%      +272.5%
HT   8.3    0.0      21.2   0.2     100.0%      +154.6%
VT   8.3    0.0      20.1   0.3     100.0%      +141.7%
R    8.0    0.0      19.2   0.3     100.0%      +140.5%
RT   3.6    0.0      6.8    0.1     100.0%      +88.4%

affine-bench:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  17.2   0.0      76.5   0.1     100.0%      +344.4%
0.75 16.7   0.0      67.1   0.1     100.0%      +300.8%
1.0  16.4   0.0      54.3   0.1     100.0%      +232.2%
1.5  15.7   0.0      52.4   0.1     100.0%      +234.6%
2.0  14.8   0.0      50.8   0.1     100.0%      +243.9%
armv6: Add nearest-scaled-cover src_8888_8888 fast path

Without this patch, any such operations are matched against the fast path
implementation in pixman-fast-path.c before general_composite_rect(), so
we never get to use the armv6-optimised assembly fetcher routines.

This patch adds a C wrapper to the same assembly routine used for the
nearest-scaled-cover fetcher, adapted to perform a 2D plot rather than a
single scanlne. The C is macroised so that later patches can use the same
approach to build more complex fast paths from combinations of armv6
fetcher/combiner/writeback routines in a similar manner to
pixcman_composite_rect().

lowlevel-blt-bench -n src_8888_8888:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   117.2  1.6      79.2   1.1     100.0%      -32.4%
L2   44.1   3.1      49.9   2.4     100.0%      +13.2%
M    40.0   0.1      72.5   0.1     100.0%      +81.4%
HT   20.1   0.1      29.5   0.3     100.0%      +46.5%
VT   19.4   0.1      27.7   0.2     100.0%      +42.7%
R    18.2   0.1      26.2   0.2     100.0%      +44.1%
RT   8.7    0.2      10.0   0.2     100.0%      +15.8%

affine-bench * 0 0 1 src a8r8g8b8 a8r8g8b8:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  46.6   0.1      110.5  0.1     100.0%      +137.2%
0.75 39.1   0.1      88.5   0.1     100.0%      +126.1%
1.0  36.3   0.2      71.7   0.1     100.0%      +97.7%
1.5  26.7   0.1      55.3   0.1     100.0%      +106.8%
2.0  19.9   0.0      43.5   0.0     100.0%      +119.2%
armv6: Add nearest-scaled-cover src_0565_0565 fast path

This is adapted from the nearest scaled cover scanline fetcher, modified to
pack output data in 16-bit units.

lowlevel-blt-bench -n src_0565_0565:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   119.6  4.1      72.5   1.1     100.0%      -39.4%
L2   45.2   1.4      55.4   2.0     100.0%      +22.5%
M    47.1   0.1      71.3   0.1     100.0%      +51.4%
HT   26.4   0.2      31.8   0.3     100.0%      +20.3%
VT   25.0   0.2      30.0   0.3     100.0%      +20.3%
R    22.6   0.2      27.6   0.2     100.0%      +22.0%
RT   9.7    0.2      10.3   0.2     100.0%      +5.6%

affine-bench * 0 0 1 src r5g6b5 r5g6b5:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  59.6   0.1      129.6  0.1     100.0%      +117.2%
0.75 52.0   0.1      106.3  0.1     100.0%      +104.6%
1.0  47.2   0.1      71.7   0.0     100.0%      +52.0%
1.5  39.1   0.1      68.1   0.1     100.0%      +74.2%
2.0  37.7   0.1      68.7   0.1     100.0%      +82.2%
armv6: Add four more nearest-scaled-cover fast paths

These complete the set of fast paths where currently pixman-fast-path.c
provides versions that get selected in preference to the armv6-optimised
scanline fetchers/combiners/writeback routines.

Because generation of these fast paths is macroised, the patch required
to add them is fairly simple.

lowlevel-blt-bench -n over_8888_8888:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   13.8   0.0      26.5   0.2     100.0%      +91.7%
L2   9.4    0.2      22.9   0.4     100.0%      +142.6%
M    8.6    0.0      23.8   0.0     100.0%      +176.1%
HT   7.4    0.0      14.1   0.1     100.0%      +91.2%
VT   7.3    0.0      13.4   0.1     100.0%      +84.1%
R    7.0    0.0      13.0   0.1     100.0%      +85.9%
RT   4.5    0.1      6.2    0.1     100.0%      +36.6%

affine-bench * 0 0 1 over a8r8g8b8 a8r8g8b8:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  9.4    0.0      28.0   0.0     100.0%      +197.4%
0.75 9.0    0.0      26.1   0.0     100.0%      +190.2%
1.0  8.6    0.0      24.4   0.0     100.0%      +184.6%
1.5  7.9    0.0      21.7   0.0     100.0%      +173.4%
2.0  7.3    0.0      19.6   0.0     100.0%      +166.6%

lowlevel-blt-bench -n src_x888_8888:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   108.6  2.0      66.3   0.9     100.0%      -39.0%
L2   32.4   1.5      44.3   2.1     100.0%      +36.8%
M    27.5   0.1      62.0   0.1     100.0%      +125.6%
HT   20.3   0.1      28.7   0.2     100.0%      +41.2%
VT   19.9   0.1      26.7   0.1     100.0%      +34.4%
R    18.6   0.1      25.3   0.2     100.0%      +36.3%
RT   8.7    0.1      9.8    0.2     100.0%      +12.6%

affine-bench * 0 0 1 src x8r8g8b8 a8r8g8b8:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  45.2   0.0      97.2   0.1     100.0%      +115.1%
0.75 35.9   0.1      76.7   0.1     100.0%      +113.9%
1.0  29.6   0.1      61.1   0.1     100.0%      +106.4%
1.5  21.4   0.0      52.7   0.1     100.0%      +145.9%
2.0  16.7   0.0      43.0   0.1     100.0%      +156.9%

lowlevel-blt-bench -n src_8888_0565:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   57.2   0.7      43.1   0.4     100.0%      -24.7%
L2   23.0   1.0      32.8   1.0     100.0%      +42.5%
M    24.8   0.0      42.2   0.0     100.0%      +70.0%
HT   18.0   0.1      22.1   0.1     100.0%      +22.5%
VT   17.1   0.1      21.0   0.1     100.0%      +22.5%
R    16.5   0.1      20.0   0.1     100.0%      +21.4%
RT   8.3    0.2      8.4    0.1     95.0%       +1.0%  (insignificant)

affine-bench * 0 0 1 src a8r8g8b8 r5g6b5:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  34.9   0.0      55.3   0.0     100.0%      +58.7%
0.75 29.3   0.0      49.1   0.0     100.0%      +67.4%
1.0  24.8   0.0      42.6   0.1     100.0%      +71.6%
1.5  19.0   0.0      38.2   0.1     100.0%      +100.7%
2.0  15.4   0.0      31.8   0.0     100.0%      +107.1%

lowlevel-blt-bench -n over_8888_0565:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
L1   9.8    0.0      15.3   0.1     100.0%      +56.6%
L2   7.4    0.0      14.3   0.2     100.0%      +91.7%
M    7.5    0.0      15.4   0.0     100.0%      +106.0%
HT   6.5    0.0      10.1   0.0     100.0%      +54.5%
VT   6.4    0.0      9.9    0.0     100.0%      +54.6%
R    6.2    0.0      9.5    0.0     100.0%      +52.1%
RT   4.2    0.0      4.6    0.1     100.0%      +9.8%

affine-bench * 0 0 1 over a8r8g8b8 r5g6b5:

     Before          After
     Mean   StdDev   Mean   StdDev  Confidence  Change
0.5  8.0    0.0      17.3   0.0     100.0%      +116.1%
0.75 7.8    0.0      16.5   0.0     100.0%      +112.9%
1.0  7.5    0.0      15.7   0.0     100.0%      +110.5%
1.5  7.0    0.0      14.8   0.0     100.0%      +112.8%
2.0  6.5    0.0      13.7   0.0     100.0%      +111.4%
pixman-fast-path: Add fast path for "pad" type repeats

Similar in concept to fast_composite_tiled_repeat(), this breaks up any
unscaled composites, where source/mask areas outside the bitmap grid are
not clipped, into a series of simpler composites (either bitmap to bitmap
or solid to bitmap). These simpler composites are usually likely to match
existing fast path implementations, and so should benefit all platforms.

This produces some significant speedups for some cairo-perf-trace tests.
For example, timings on ARMv6 (using Siarhei's trimmed traces) are

Before:
[ # ]  backend                         test   min(s) median(s) stddev. count
[ # ]    image: pixman 0.29.3
[  0]    image         t-firefox-chalkboard   35.715   35.736   0.03%    6/6

After:
[ # ]  backend                         test   min(s) median(s) stddev. count
[ # ]    image: pixman 0.29.3
[  0]    image         t-firefox-chalkboard    9.254    9.261   0.15%    6/6

That's a speedup of 3.86x.

Also added a simple test program to check different repeat types.