Patchwork [3/4] sparc: Use default memcpy for rtld objects

login
register
mail settings
Submitter Adhemerval Zanella Netto
Date Oct. 5, 2017, 1:51 p.m.
Message ID <1507211472-1194-3-git-send-email-adhemerval.zanella@linaro.org>
Download mbox | patch
Permalink /patch/23347/
State New
Headers show

Comments

Adhemerval Zanella Netto - Oct. 5, 2017, 1:51 p.m.
Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
a default assembly implemented memcpy.  Since it should not be any
restriction about it them on the loader object and assuming they are
faster than generic ones this patch uses them for rtld objects.

Also, there is no indication neither on original patch [1] or in commit
message why the generic one where used instead of the sparc optimized
ones.

Checked on sparc64-linux-gnu and sparcv9-linux-gnu.

	* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S: New file.
	* sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S: Likewise.
	* sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c: Remove
	file.
	* sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c: Likewise.
	* sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c: Likewise.
	* sysdeps/sparc/sparc64/rtld-memcpy.c: Likewise.
---
 ChangeLog                                             | 8 ++++++++
 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S | 1 +
 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c | 1 -
 sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c           | 1 -
 sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S         | 1 +
 sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c         | 1 -
 sysdeps/sparc/sparc64/rtld-memcpy.c                   | 3 ---
 7 files changed, 10 insertions(+), 6 deletions(-)
 create mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S
 delete mode 100644 sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c
 delete mode 100644 sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c
 create mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S
 delete mode 100644 sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c
 delete mode 100644 sysdeps/sparc/sparc64/rtld-memcpy.c
David Miller - Oct. 5, 2017, 4:49 p.m.
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Thu,  5 Oct 2017 10:51:11 -0300

> Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
> a default assembly implemented memcpy.  Since it should not be any
> restriction about it them on the loader object and assuming they are
> faster than generic ones this patch uses them for rtld objects.
> 
> Also, there is no indication neither on original patch [1] or in commit
> message why the generic one where used instead of the sparc optimized
> ones.

The ultra1 memcpy is really an extremely non-ideal variant to use as
the default for anything.

It's much slower on newer cpus, as the block loads and stores used in
the ultra1 version aren't optimized the same way they were in those
older chips.

The C version is faster on newer cpus and definitely a better choice
as a default, especially because it doesn't use any cpu specific
instructions like the ultra1 variant does.

In the Linux kernel we have an assembler version we use as the default
which doesn't use any special instructions.
Adhemerval Zanella Netto - Oct. 5, 2017, 6:02 p.m.
On 05/10/2017 13:49, David Miller wrote:
> From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> Date: Thu,  5 Oct 2017 10:51:11 -0300
> 
>> Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
>> a default assembly implemented memcpy.  Since it should not be any
>> restriction about it them on the loader object and assuming they are
>> faster than generic ones this patch uses them for rtld objects.
>>
>> Also, there is no indication neither on original patch [1] or in commit
>> message why the generic one where used instead of the sparc optimized
>> ones.
> 
> The ultra1 memcpy is really an extremely non-ideal variant to use as
> the default for anything.
> 
> It's much slower on newer cpus, as the block loads and stores used in
> the ultra1 version aren't optimized the same way they were in those
> older chips.
> 
> The C version is faster on newer cpus and definitely a better choice
> as a default, especially because it doesn't use any cpu specific
> instructions like the ultra1 variant does.
> 
> In the Linux kernel we have an assembler version we use as the default
> which doesn't use any special instructions.

Thanks for the explanation, although it does not explain why the ultra1
is currently the default for sparc64 (sysdeps/sparc/sparc64/memcpy.S)
and also the default selection for multiarch.  The C version is used
solely for loader currently.

I tried to check which are the performance of C implementation against
ultra1 one on a niagara5 and results are:

  - on bench-memcpy the C version is slight slower for sizes up to
    32 (about 4% faster for sizes up to 16, 40% from 16 to 32 and
    50% up to 32).  It is definitely faster for sizes higher than
    64 (62% faster for sizes from 64 to 128 and 85% for sizes
    higher than 128).

  - on bench-memcpy-random shows no performance difference, however
    bench-memcpy-large shows the C implementation is indeed faster
    for all inputs.

So I think that instead of using default memcpy for rtld, the best
strategy would to use the C implementation instead as default and
add ultra1 as another option for ifunc resolution.
{
 "timing_type": "hp_timing",
 "functions": {
  "memcpy": {
   "bench-variant": "random",
   "ifuncs": ["__memcpy_niagara4", "__memcpy_niagara2", "__memcpy_niagara1", "__memcpy_ultra1", "__memcpy_c"],
   "results": [
    {
     "max-size": 4096,
     "timings": [295019, 285867, 335106, 304419, 302071]
    },
    {
     "max-size": 8192,
     "timings": [280727, 277078, 323454, 296089, 296732]
    },
    {
     "max-size": 16384,
     "timings": [306328, 296740, 346874, 314423, 313847]
    },
    {
     "max-size": 32768,
     "timings": [313908, 308621, 354756, 324550, 323395]
    },
    {
     "max-size": 65536,
     "timings": [344289, 336540, 394800, 353721, 357068]
    }]
  }
 }
}
{
 "timing_type": "hp_timing",
 "functions": {
  "memcpy": {
   "bench-variant": "default",
   "ifuncs": ["builtin_memcpy", "simple_memcpy", "__memcpy_niagara4", "__memcpy_niagara2", "__memcpy_niagara1", "__memcpy_ultra1", "__memcpy_c"],
   "results": [
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [1104.31, 13.0625, 16.7656, 47.4062, 34.625, 40.7969, 36.1562]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [20.7344, 10.6562, 14.2969, 18.0781, 18.0938, 17.0469, 19.3438]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [19.8281, 10.6562, 14.2812, 17.6094, 17.7344, 17.4219, 19.0625]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [19.4844, 10.6562, 14.2812, 17.5469, 16.4531, 16.75, 19.8281]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 0,
     "timings": [21.7344, 22.0312, 18.7031, 31.2188, 26.2031, 25.4688, 28.8438]
    },
    {
     "length": 2,
     "align1": 1,
     "align2": 0,
     "timings": [19.5938, 19.9688, 14.8906, 24.7812, 23.6094, 16.2188, 27.2812]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 1,
     "timings": [20.5, 19.8906, 15.2031, 24.2812, 22.9688, 15.8906, 28.1562]
    },
    {
     "length": 2,
     "align1": 1,
     "align2": 1,
     "timings": [20.1562, 19.0938, 14.8438, 22.7188, 22.0781, 15.8906, 27.375]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 0,
     "timings": [25.0938, 34.6562, 25.625, 21.2656, 20, 28.0156, 37.9375]
    },
    {
     "length": 4,
     "align1": 2,
     "align2": 0,
     "timings": [74.9375, 25.3281, 79.0938, 35.0312, 31.7969, 28.0156, 34.2188]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 2,
     "timings": [69.0938, 24.1094, 68.0625, 28.0469, 28.5312, 27.8906, 34.1875]
    },
    {
     "length": 4,
     "align1": 2,
     "align2": 2,
     "timings": [70.0312, 24.0312, 66.7031, 28.1094, 25.5938, 26.5625, 34.1875]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 0,
     "timings": [29.6094, 48.9688, 24.2656, 45.4375, 39.5, 40.3906, 51.7812]
    },
    {
     "length": 8,
     "align1": 3,
     "align2": 0,
     "timings": [88.1094, 37.4375, 81.4219, 44.1875, 45.8906, 34.7344, 46.4219]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 3,
     "timings": [81.4375, 36.9219, 76.7656, 37.2656, 36.9531, 34.2656, 46.625]
    },
    {
     "length": 8,
     "align1": 3,
     "align2": 3,
     "timings": [81.2969, 35.6094, 76.0469, 34.6094, 36.0781, 34.1719, 44.9688]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 0,
     "timings": [67.9688, 68.5469, 58.4844, 34.9688, 45.8281, 57.8594, 75.8438]
    },
    {
     "length": 16,
     "align1": 4,
     "align2": 0,
     "timings": [60.6094, 58.9062, 53.0938, 54.3281, 64.6719, 60.1719, 59.8125]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 4,
     "timings": [61.4688, 58.9844, 53.0625, 87.1406, 108.625, 37.25, 88.0312]
    },
    {
     "length": 16,
     "align1": 4,
     "align2": 4,
     "timings": [60.0938, 58.9844, 53.1875, 57.0312, 57.5156, 31.2344, 88.5625]
    },
    {
     "length": 32,
     "align1": 0,
     "align2": 0,
     "timings": [41.1875, 117.203, 33, 39, 42.3125, 37.5625, 57.7969]
    },
    {
     "length": 32,
     "align1": 5,
     "align2": 0,
     "timings": [70.625, 106.547, 57.3906, 59.2188, 57.7812, 162.266, 53.4375]
    },
    {
     "length": 32,
     "align1": 0,
     "align2": 5,
     "timings": [157.828, 107, 139.047, 105.859, 110.266, 245.234, 107.547]
    },
    {
     "length": 32,
     "align1": 5,
     "align2": 5,
     "timings": [134.656, 107.844, 101.062, 94.5, 93.3438, 65.5938, 110.469]
    },
    {
     "length": 64,
     "align1": 0,
     "align2": 0,
     "timings": [50.0625, 226.016, 44.8438, 55.9062, 50.5625, 56.6094, 56.9062]
    },
    {
     "length": 64,
     "align1": 6,
     "align2": 0,
     "timings": [77.2812, 225.797, 68.8281, 73.9531, 74.0312, 161.359, 66.7188]
    },
    {
     "length": 64,
     "align1": 0,
     "align2": 6,
     "timings": [145.203, 225.188, 133.656, 104.484, 109.891, 243.031, 98.4531]
    },
    {
     "length": 64,
     "align1": 6,
     "align2": 6,
     "timings": [79.5156, 226.047, 62.9844, 89.5938, 82.4219, 70.4844, 87.8906]
    },
    {
     "length": 128,
     "align1": 0,
     "align2": 0,
     "timings": [133.938, 417.578, 118.594, 72.3594, 259.328, 72.2656, 67.9375]
    },
    {
     "length": 128,
     "align1": 7,
     "align2": 0,
     "timings": [228.891, 417.172, 217.547, 110.438, 294.781, 186.047, 96.3594]
    },
    {
     "length": 128,
     "align1": 0,
     "align2": 7,
     "timings": [328.031, 417.812, 309.719, 138.609, 504.922, 267.328, 126.469]
    },
    {
     "length": 128,
     "align1": 7,
     "align2": 7,
     "timings": [233.844, 417.578, 222.875, 130.875, 482.609, 96.5156, 105.906]
    },
    {
     "length": 256,
     "align1": 0,
     "align2": 0,
     "timings": [164.125, 801.594, 156.891, 528.234, 314.219, 95.6406, 109.969]
    },
    {
     "length": 256,
     "align1": 8,
     "align2": 0,
     "timings": [157.922, 801.609, 151.578, 563.484, 313.734, 89.5938, 93.5469]
    },
    {
     "length": 256,
     "align1": 0,
     "align2": 8,
     "timings": [262.906, 801.578, 221.078, 832.297, 538.25, 82.2656, 92.4688]
    },
    {
     "length": 256,
     "align1": 8,
     "align2": 8,
     "timings": [254.406, 801.594, 218.344, 751.828, 523.703, 82.2656, 92.5]
    },
    {
     "length": 512,
     "align1": 0,
     "align2": 0,
     "timings": [246.5, 1569.56, 236.594, 673.062, 386.234, 835.203, 172.469]
    },
    {
     "length": 512,
     "align1": 9,
     "align2": 0,
     "timings": [333.781, 1569.56, 321.031, 695.219, 478.188, 783.531, 257.078]
    },
    {
     "length": 512,
     "align1": 0,
     "align2": 9,
     "timings": [439.859, 1569.58, 419.5, 907.453, 700.703, 897.172, 365.938]
    },
    {
     "length": 512,
     "align1": 9,
     "align2": 9,
     "timings": [381.547, 1569.58, 364.719, 886.172, 618, 873.188, 219.172]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 0,
     "timings": [403.312, 3105.58, 390.469, 957.469, 551.234, 976.844, 320.156]
    },
    {
     "length": 1024,
     "align1": 10,
     "align2": 0,
     "timings": [493.016, 3105.81, 479.688, 970.844, 751.703, 962.5, 485.938]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 10,
     "timings": [595.266, 3106.25, 573.953, 1197.27, 993.641, 1116.22, 519.031]
    },
    {
     "length": 1024,
     "align1": 10,
     "align2": 10,
     "timings": [558.875, 3105.81, 538.188, 1172.83, 778.375, 1104.25, 5235.78]
    },
    {
     "length": 2048,
     "align1": 0,
     "align2": 0,
     "timings": [711.922, 6177.8, 698, 1520.27, 949.188, 1389.56, 580.172]
    },
    {
     "length": 2048,
     "align1": 11,
     "align2": 0,
     "timings": [843, 6177.84, 832.828, 1535.2, 1322, 1380.7, 904.141]
    },
    {
     "length": 2048,
     "align1": 0,
     "align2": 11,
     "timings": [903.672, 6182.53, 891.219, 1802.75, 1522.86, 1495.52, 935.75]
    },
    {
     "length": 2048,
     "align1": 11,
     "align2": 11,
     "timings": [857.234, 6178.23, 845.109, 1729.52, 1195.28, 1476.55, 623.656]
    },
    {
     "length": 4096,
     "align1": 0,
     "align2": 0,
     "timings": [1326.77, 12707.1, 1313, 2647.8, 1772.73, 2197.03, 1090.64]
    },
    {
     "length": 4096,
     "align1": 12,
     "align2": 0,
     "timings": [1434.52, 12331.8, 1402.78, 2664.81, 2403.75, 2198.64, 1739.91]
    },
    {
     "length": 4096,
     "align1": 0,
     "align2": 12,
     "timings": [1512.84, 12324.8, 1493.83, 3052.48, 2642.42, 2287.92, 1768.97]
    },
    {
     "length": 4096,
     "align1": 12,
     "align2": 12,
     "timings": [1407.02, 12322, 1429.42, 2865.95, 2021.94, 2272.27, 1126.33]
    },
    {
     "length": 8192,
     "align1": 0,
     "align2": 0,
     "timings": [2570.88, 24617.4, 2553.47, 4901.33, 3598.92, 3859.39, 2125.73]
    },
    {
     "length": 8192,
     "align1": 13,
     "align2": 0,
     "timings": [2836.59, 24611.1, 2809.27, 4921.42, 4582.08, 3859.48, 3433.42]
    },
    {
     "length": 8192,
     "align1": 0,
     "align2": 13,
     "timings": [3545.12, 24610.6, 2933.81, 5491.77, 4795.16, 3967.22, 3494.17]
    },
    {
     "length": 8192,
     "align1": 13,
     "align2": 13,
     "timings": [2729.34, 24610.6, 2715.8, 5122.61, 3799.27, 3953.42, 2224.47]
    },
    {
     "length": 16384,
     "align1": 0,
     "align2": 0,
     "timings": [5097.59, 49188.8, 5085.94, 10186.9, 7338.25, 7847.52, 5902.27]
    },
    {
     "length": 16384,
     "align1": 14,
     "align2": 0,
     "timings": [5286.89, 49199.9, 5252.14, 10273.5, 8998.58, 7602.14, 6832.72]
    },
    {
     "length": 16384,
     "align1": 0,
     "align2": 14,
     "timings": [5955.66, 49190.6, 5340.47, 10428.8, 9190.97, 7826.78, 6839.39]
    },
    {
     "length": 16384,
     "align1": 14,
     "align2": 14,
     "timings": [5292.27, 49199.2, 5255.86, 10330.3, 7578.17, 7961.38, 6285.44]
    },
    {
     "length": 32768,
     "align1": 0,
     "align2": 0,
     "timings": [12813.5, 98343, 11937.2, 19630, 16859.4, 17639.8, 10210.5]
    },
    {
     "length": 32768,
     "align1": 15,
     "align2": 0,
     "timings": [11274.9, 100272, 11503.1, 20330.9, 17764.6, 17054.2, 13730]
    },
    {
     "length": 32768,
     "align1": 0,
     "align2": 15,
     "timings": [12425.5, 98343.9, 11262.3, 20399.2, 17928.7, 17039.4, 13831]
    },
    {
     "length": 32768,
     "align1": 15,
     "align2": 15,
     "timings": [12227.3, 98350.2, 12145, 19800.4, 16828.3, 20054.5, 10298.1]
    },
    {
     "length": 65536,
     "align1": 0,
     "align2": 0,
     "timings": [27778.3, 196774, 25230, 40669, 38732.3, 40669.8, 26624.9]
    },
    {
     "length": 65536,
     "align1": 16,
     "align2": 0,
     "timings": [25550.4, 198301, 25295.7, 41461.1, 38993.7, 40954.7, 26689.1]
    },
    {
     "length": 65536,
     "align1": 0,
     "align2": 16,
     "timings": [26350.3, 196825, 25459.6, 46308, 42703.1, 45040.3, 26732.9]
    },
    {
     "length": 65536,
     "align1": 16,
     "align2": 16,
     "timings": [25633, 196870, 25355.7, 40868.4, 38262.7, 40633.9, 26703.8]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [27.625, 15.5, 14.0312, 18.2344, 18.1875, 17.8594, 20.625]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [17.4219, 12.7031, 11.7344, 12.8125, 15.1406, 14.0625, 18.6875]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [15.6875, 12.0938, 12.1094, 12.0312, 14.3281, 12.6562, 18.7031]
    },
    {
     "length": 0,
     "align1": 0,
     "align2": 0,
     "timings": [15.7344, 11.8125, 12.0938, 12.0625, 12.5156, 12.1719, 18.4219]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 0,
     "timings": [21.0156, 17.0156, 16.5469, 19.5625, 22.2812, 24.4688, 20.1406]
    },
    {
     "length": 1,
     "align1": 1,
     "align2": 0,
     "timings": [19.5469, 12.7344, 14.6094, 17.0781, 17.6094, 17.4375, 19.4375]
    },
    {
     "length": 1,
     "align1": 0,
     "align2": 1,
     "timings": [19.375, 11.5156, 14.625, 17.125, 17.9375, 17.9531, 18.9219]
    },
    {
     "length": 1,
     "align1": 1,
     "align2": 1,
     "timings": [18.6094, 11.0938, 13.9219, 16.0312, 17.625, 17.2812, 19.3281]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 0,
     "timings": [20.0781, 18.3906, 16.0625, 27.4219, 27.0938, 22.2188, 29.3125]
    },
    {
     "length": 2,
     "align1": 2,
     "align2": 0,
     "timings": [20.3594, 18.2969, 17.4062, 23.4531, 23.1094, 16.6719, 26.5781]
    },
    {
     "length": 2,
     "align1": 0,
     "align2": 2,
     "timings": [20.0156, 17.4219, 15.2969, 22.7031, 21.8906, 16.0938, 26.5469]
    },
    {
     "length": 2,
     "align1": 2,
     "align2": 2,
     "timings": [19.125, 18, 14.9531, 21.9062, 21.4844, 16.0938, 26.9688]
    },
    {
     "length": 3,
     "align1": 0,
     "align2": 0,
     "timings": [34.1719, 47.7969, 23.4844, 59.0156, 63.375, 26.3438, 59.375]
    },
    {
     "length": 3,
     "align1": 3,
     "align2": 0,
     "timings": [21.4531, 44.625, 17.2969, 52.5938, 65.3125, 19.7969, 54.5469]
    },
    {
     "length": 3,
     "align1": 0,
     "align2": 3,
     "timings": [21.5312, 43.7344, 17.2812, 51.2031, 65.2188, 19.5625, 54.0781]
    },
    {
     "length": 3,
     "align1": 3,
     "align2": 3,
     "timings": [20.7188, 43.7188, 16.8906, 56.5469, 51.2188, 18.7031, 54.0312]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 0,
     "timings": [29.6719, 32.9062, 22.375, 19.2188, 18.5312, 27.7344, 59.0625]
    },
    {
     "length": 4,
     "align1": 4,
     "align2": 0,
     "timings": [24.25, 26.3125, 20.5469, 16.375, 16.2344, 27.3438, 33.25]
    },
    {
     "length": 4,
     "align1": 0,
     "align2": 4,
     "timings": [25.4062, 24.9062, 17.0469, 16.375, 15.8594, 26.9062, 32.9375]
    },
    {
     "length": 4,
     "align1": 4,
     "align2": 4,
     "timings": [22.7344, 24.0781, 17.9219, 16.375, 15.6406, 26.5625, 32.625]
    },
    {
     "length": 5,
     "align1": 0,
     "align2": 0,
     "timings": [32.0469, 35.25, 23.2188, 35.0938, 44.4062, 31, 37.9531]
    },
    {
     "length": 5,
     "align1": 5,
     "align2": 0,
     "timings": [78.8281, 26.4844, 78.2344, 30.7031, 31.6406, 27.5781, 36.75]
    },
    {
     "length": 5,
     "align1": 0,
     "align2": 5,
     "timings": [75.9688, 25.5938, 69.4844, 28.0625, 28.5156, 26.4531, 36.4062]
    },
    {
     "length": 5,
     "align1": 5,
     "align2": 5,
     "timings": [74.375, 25.625, 69.0781, 30.7031, 27.6406, 25.5938, 36.375]
    },
    {
     "length": 6,
     "align1": 0,
     "align2": 0,
     "timings": [39.3125, 35.0625, 36.2031, 34.2031, 36.25, 33.6406, 44.1094]
    },
    {
     "length": 6,
     "align1": 6,
     "align2": 0,
     "timings": [78.2031, 36.5938, 71.8906, 30.5625, 60.9062, 31.0938, 38.5938]
    },
    {
     "length": 6,
     "align1": 0,
     "align2": 6,
     "timings": [74.8594, 29.7969, 70.3594, 31.0156, 58.1406, 30.4531, 38.5625]
    },
    {
     "length": 6,
     "align1": 6,
     "align2": 6,
     "timings": [74.0469, 29.7188, 70.3438, 31.0156, 32.3125, 29.6406, 38.5938]
    },
    {
     "length": 7,
     "align1": 0,
     "align2": 0,
     "timings": [45.1875, 39.2969, 32.0469, 38.5938, 41.4062, 35.1875, 46.5469]
    },
    {
     "length": 7,
     "align1": 7,
     "align2": 0,
     "timings": [81.6562, 57.5781, 75.2656, 33.0312, 33.0938, 32.0938, 41.9375]
    },
    {
     "length": 7,
     "align1": 0,
     "align2": 7,
     "timings": [79.5156, 32.3125, 73.9375, 35.6719, 32.6875, 31.7188, 41.9375]
    },
    {
     "length": 7,
     "align1": 7,
     "align2": 7,
     "timings": [78.7031, 56.2656, 73.1875, 33.0312, 32.2812, 29.6719, 41.6094]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 0,
     "timings": [31.6719, 38.7812, 22.8281, 40.3125, 35.7656, 37.1719, 45.7031]
    },
    {
     "length": 8,
     "align1": 8,
     "align2": 0,
     "timings": [27.4531, 35.2969, 20.9219, 42.9062, 34.5469, 35.6094, 44.5156]
    },
    {
     "length": 8,
     "align1": 0,
     "align2": 8,
     "timings": [26.7344, 35.2969, 20.4531, 38.2344, 33.7969, 33.5781, 44.5156]
    },
    {
     "length": 8,
     "align1": 8,
     "align2": 8,
     "timings": [26.3281, 34.875, 21.3125, 36.4375, 33.375, 33.6719, 44.5156]
    },
    {
     "length": 9,
     "align1": 0,
     "align2": 0,
     "timings": [37.4375, 46.7188, 39.5312, 56.9531, 49.8125, 40.2344, 54.5156]
    },
    {
     "length": 9,
     "align1": 9,
     "align2": 0,
     "timings": [93.7031, 38.3125, 82.3906, 38.8906, 39.375, 33.625, 49.125]
    },
    {
     "length": 9,
     "align1": 0,
     "align2": 9,
     "timings": [84.9688, 37.9219, 79.3125, 40.7812, 39.875, 33.6094, 47.625]
    },
    {
     "length": 9,
     "align1": 9,
     "align2": 9,
     "timings": [84.5938, 38.7969, 79.3281, 38.0469, 38.5469, 33.7031, 47.625]
    },
    {
     "length": 10,
     "align1": 0,
     "align2": 0,
     "timings": [55.1406, 46.5156, 37.7969, 46.2969, 42.7656, 45.4062, 54.3906]
    },
    {
     "length": 10,
     "align1": 10,
     "align2": 0,
     "timings": [91.5781, 40.5938, 82.7969, 42.2812, 40.1719, 38, 52.1406]
    },
    {
     "length": 10,
     "align1": 0,
     "align2": 10,
     "timings": [86.1406, 40.6406, 81.9531, 40.6406, 39.3125, 37.625, 50.5469]
    },
    {
     "length": 10,
     "align1": 10,
     "align2": 10,
     "timings": [86.1406, 40.6406, 81.6406, 39.7188, 39.3125, 37.625, 50.5469]
    },
    {
     "length": 11,
     "align1": 0,
     "align2": 0,
     "timings": [40.5156, 50.9844, 36.7812, 52.5156, 51.4531, 44.8438, 55.9688]
    },
    {
     "length": 11,
     "align1": 11,
     "align2": 0,
     "timings": [92.9688, 44.0625, 85.5, 44.4062, 44.0625, 38.7969, 53.625]
    },
    {
     "length": 11,
     "align1": 0,
     "align2": 11,
     "timings": [90.3125, 43.5625, 85.5781, 43.6094, 45.1875, 38.0469, 53.6406]
    },
    {
     "length": 11,
     "align1": 11,
     "align2": 11,
     "timings": [89.1406, 43.1406, 85.0938, 43.2188, 44.0469, 37.6094, 53.6094]
    },
    {
     "length": 12,
     "align1": 0,
     "align2": 0,
     "timings": [39.8438, 52.1406, 32.2031, 30.7969, 29.1406, 46.3906, 61.75]
    },
    {
     "length": 12,
     "align1": 12,
     "align2": 0,
     "timings": [33.9375, 47.8281, 27.9688, 25.625, 25.125, 42.5312, 56.5781]
    },
    {
     "length": 12,
     "align1": 0,
     "align2": 12,
     "timings": [33.25, 47.4375, 27.5938, 26.4688, 24.7031, 43.0469, 56.9688]
    },
    {
     "length": 12,
     "align1": 12,
     "align2": 12,
     "timings": [33.6406, 46.5625, 27.4531, 25.0781, 25.6562, 42.1562, 56.625]
    },
    {
     "length": 13,
     "align1": 0,
     "align2": 0,
     "timings": [45.5469, 56.9531, 37.6562, 75.1562, 67.6406, 49.0469, 62.9375]
    },
    {
     "length": 13,
     "align1": 13,
     "align2": 0,
     "timings": [102.844, 49.5938, 101.469, 63.4688, 63.7344, 42.375, 59.6094]
    },
    {
     "length": 13,
     "align1": 0,
     "align2": 13,
     "timings": [99.4531, 49.6562, 92.4062, 63.0312, 64.1094, 41.6562, 59.6094]
    },
    {
     "length": 13,
     "align1": 13,
     "align2": 13,
     "timings": [96.7812, 49.5938, 92.2656, 62.5469, 66.5, 41.7031, 59.2344]
    },
    {
     "length": 14,
     "align1": 0,
     "align2": 0,
     "timings": [42.375, 54.9844, 39.5469, 58.5781, 55.1094, 49.7656, 65.4062]
    },
    {
     "length": 14,
     "align1": 14,
     "align2": 0,
     "timings": [101.906, 52.625, 99.3125, 50.3125, 54.4531, 46.6562, 62.9375]
    },
    {
     "length": 14,
     "align1": 0,
     "align2": 14,
     "timings": [103.25, 53.1875, 95.1094, 53.0625, 51.7656, 47.9531, 62.9375]
    },
    {
     "length": 14,
     "align1": 14,
     "align2": 14,
     "timings": [99.5625, 52.5781, 94.3125, 50.3125, 51.8125, 46.4688, 62.5469]
    },
    {
     "length": 15,
     "align1": 0,
     "align2": 0,
     "timings": [44.6094, 66.2188, 36.8906, 62.0781, 63.1094, 51.1406, 69.3906]
    },
    {
     "length": 15,
     "align1": 15,
     "align2": 0,
     "timings": [105.609, 55.6406, 98.4219, 58.25, 54.9219, 46.4531, 65.2344]
    },
    {
     "length": 15,
     "align1": 0,
     "align2": 15,
     "timings": [102.625, 55.6406, 97.5156, 52.6719, 53.625, 46.0938, 65.2344]
    },
    {
     "length": 15,
     "align1": 15,
     "align2": 15,
     "timings": [101.906, 55.6406, 97.5625, 52.6719, 54.1094, 46.0938, 65.2344]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 0,
     "timings": [61.4688, 62.9375, 53.0781, 41.7188, 37.3438, 59.875, 58.2969]
    },
    {
     "length": 16,
     "align1": 16,
     "align2": 0,
     "timings": [59.6875, 58.3906, 53.0781, 26.1562, 26.4688, 34.5312, 46.7031]
    },
    {
     "length": 16,
     "align1": 0,
     "align2": 16,
     "timings": [60.0781, 58.1406, 52.7031, 26.1094, 26.4531, 34.5, 46.0938]
    },
    {
     "length": 16,
     "align1": 16,
     "align2": 16,
     "timings": [59.7188, 58.1406, 53.125, 26.125, 27.1875, 34.1406, 46.0781]
    },
    {
     "length": 17,
     "align1": 0,
     "align2": 0,
     "timings": [93.4375, 72.5938, 75.8594, 50.5938, 43.6719, 44.6094, 54.0781]
    },
    {
     "length": 17,
     "align1": 17,
     "align2": 0,
     "timings": [117.547, 61.9219, 107.266, 46.4375, 60.0938, 148.781, 48.3281]
    },
    {
     "length": 17,
     "align1": 0,
     "align2": 17,
     "timings": [109.797, 61.6094, 103.781, 81.3125, 79.7031, 220.578, 85.3438]
    },
    {
     "length": 17,
     "align1": 17,
     "align2": 17,
     "timings": [108.047, 61.6094, 103.609, 74.875, 68.4844, 65.3281, 84.6094]
    },
    {
     "length": 18,
     "align1": 0,
     "align2": 0,
     "timings": [80.0625, 68.125, 61.7031, 41.7656, 45.0469, 39.2031, 61.2188]
    },
    {
     "length": 18,
     "align1": 18,
     "align2": 0,
     "timings": [117.812, 65.3125, 106.328, 47.625, 52.8281, 193.359, 53.6562]
    },
    {
     "length": 18,
     "align1": 0,
     "align2": 18,
     "timings": [111.406, 64.5625, 106.109, 65.3281, 72.75, 232.094, 81.75]
    },
    {
     "length": 18,
     "align1": 18,
     "align2": 18,
     "timings": [111.016, 65.3281, 106, 61.2969, 62.3594, 53.7344, 86.3125]
    },
    {
     "length": 19,
     "align1": 0,
     "align2": 0,
     "timings": [69.875, 71.5312, 67.0469, 69.6719, 69.1094, 47.9219, 81.9531]
    },
    {
     "length": 19,
     "align1": 19,
     "align2": 0,
     "timings": [119.656, 67.625, 111.219, 96.0156, 91.2812, 178.953, 99.2188]
    },
    {
     "length": 19,
     "align1": 0,
     "align2": 19,
     "timings": [114.766, 67.9375, 110.172, 74.2969, 74.8125, 204.219, 77.6562]
    },
    {
     "length": 19,
     "align1": 19,
     "align2": 19,
     "timings": [113.656, 67.1406, 109.875, 65.125, 62.8281, 65.2344, 85.4531]
    },
    {
     "length": 20,
     "align1": 0,
     "align2": 0,
     "timings": [67.5, 76.0781, 45.0938, 32.0156, 36.4219, 41.1562, 65.375]
    },
    {
     "length": 20,
     "align1": 20,
     "align2": 0,
     "timings": [102.344, 70.5469, 98.9844, 58.9219, 56.5, 50.0625, 65.2969]
    },
    {
     "length": 20,
     "align1": 0,
     "align2": 20,
     "timings": [70.0156, 70.8906, 56.6562, 74.0312, 61.7344, 34.5312, 64.3281]
    },
    {
     "length": 20,
     "align1": 20,
     "align2": 20,
     "timings": [66.3438, 71.0156, 56.9219, 62.625, 62.125, 35.2969, 67.5312]
    },
    {
     "length": 21,
     "align1": 0,
     "align2": 0,
     "timings": [55.125, 76.2812, 35.6094, 46.5312, 35.6719, 42.5781, 70.0938]
    },
    {
     "length": 21,
     "align1": 21,
     "align2": 0,
     "timings": [108.453, 73.1562, 99.2344, 63.8594, 62.3125, 212.109, 61.875]
    },
    {
     "length": 21,
     "align1": 0,
     "align2": 21,
     "timings": [132.453, 73.9219, 133.203, 84.5469, 83.8438, 207.5, 95.8281]
    },
    {
     "length": 21,
     "align1": 21,
     "align2": 21,
     "timings": [93.4531, 73.8906, 77.625, 82.1094, 89.9688, 52.9062, 92.3906]
    },
    {
     "length": 22,
     "align1": 0,
     "align2": 0,
     "timings": [44.8906, 81.2031, 38, 38.5781, 43.625, 41.8438, 74.8281]
    },
    {
     "length": 22,
     "align1": 22,
     "align2": 0,
     "timings": [102.016, 76.5156, 97.8906, 56.7031, 63.2812, 190.75, 62.8125]
    },
    {
     "length": 22,
     "align1": 0,
     "align2": 22,
     "timings": [110.516, 76.5781, 103.484, 67.2969, 66.2969, 239.797, 72.7969]
    },
    {
     "length": 22,
     "align1": 22,
     "align2": 22,
     "timings": [59.0469, 76.9219, 53.9375, 53.875, 49.2344, 45.125, 79.7344]
    },
    {
     "length": 23,
     "align1": 0,
     "align2": 0,
     "timings": [48.0312, 85.7656, 38.9062, 71.7031, 72.6094, 43.4531, 71.375]
    },
    {
     "length": 23,
     "align1": 23,
     "align2": 0,
     "timings": [110.125, 79.9219, 101.312, 63.2031, 61.7031, 191.938, 68.9219]
    },
    {
     "length": 23,
     "align1": 0,
     "align2": 23,
     "timings": [107.234, 79.1406, 99.625, 60.75, 67.7188, 207.094, 73.9688]
    },
    {
     "length": 23,
     "align1": 23,
     "align2": 23,
     "timings": [52.7188, 79.5312, 48.7656, 59.5625, 50.0312, 43.5938, 73.2188]
    },
    {
     "length": 24,
     "align1": 0,
     "align2": 0,
     "timings": [49.3594, 90.25, 36.3281, 31.3594, 39.2188, 45.0469, 58.375]
    },
    {
     "length": 24,
     "align1": 24,
     "align2": 0,
     "timings": [40.2188, 83.2969, 35.25, 29.375, 27.9688, 34.9688, 50.9062]
    },
    {
     "length": 24,
     "align1": 0,
     "align2": 24,
     "timings": [38.5938, 82.9531, 34.6406, 26.9375, 26.875, 34.0312, 48.9844]
    },
    {
     "length": 24,
     "align1": 24,
     "align2": 24,
     "timings": [38.9688, 83.2969, 34.2969, 27.75, 26.7969, 34.1094, 49.3438]
    },
    {
     "length": 25,
     "align1": 0,
     "align2": 0,
     "timings": [46.1562, 90.5938, 36.5938, 35.2188, 38.25, 43.6719, 59.8281]
    },
    {
     "length": 25,
     "align1": 25,
     "align2": 0,
     "timings": [97.5938, 87.1719, 89.9375, 47.9375, 46.375, 153.828, 53.5312]
    },
    {
     "length": 25,
     "align1": 0,
     "align2": 25,
     "timings": [133.156, 86.375, 109.859, 77.1562, 82.1875, 197.422, 89.5]
    },
    {
     "length": 25,
     "align1": 25,
     "align2": 25,
     "timings": [81.0312, 86.0625, 64.5469, 68.1406, 70.2344, 55.75, 80.7656]
    },
    {
     "length": 26,
     "align1": 0,
     "align2": 0,
     "timings": [46.4219, 96.8438, 38.125, 42.8906, 41.6875, 39.2656, 67.9844]
    },
    {
     "length": 26,
     "align1": 26,
     "align2": 0,
     "timings": [101.312, 88.5938, 91.4688, 54.2969, 56.125, 184.281, 57.1719]
    },
    {
     "length": 26,
     "align1": 0,
     "align2": 26,
     "timings": [121.547, 88.5625, 111.438, 83.3125, 78.5, 230.266, 88.625]
    },
    {
     "length": 26,
     "align1": 26,
     "align2": 26,
     "timings": [81.3438, 88.1406, 60.0625, 57.3125, 57.2344, 45.4062, 85.7188]
    },
    {
     "length": 27,
     "align1": 0,
     "align2": 0,
     "timings": [46.0781, 98.9531, 39.6719, 71.625, 70.6875, 44.625, 84.5938]
    },
    {
     "length": 27,
     "align1": 27,
     "align2": 0,
     "timings": [126.969, 91.9531, 115.891, 85.5781, 82.2188, 186.5, 85.0781]
    },
    {
     "length": 27,
     "align1": 0,
     "align2": 27,
     "timings": [126.859, 92.5938, 114.812, 79.125, 82.2031, 204.547, 83.8281]
    },
    {
     "length": 27,
     "align1": 27,
     "align2": 27,
     "timings": [71.4062, 92.7344, 62.375, 66.25, 64.7656, 48.7188, 85.7656]
    },
    {
     "length": 28,
     "align1": 0,
     "align2": 0,
     "timings": [44.4375, 102.891, 36.6719, 40.9844, 39.4531, 42.4375, 67.4062]
    },
    {
     "length": 28,
     "align1": 28,
     "align2": 0,
     "timings": [100.188, 95.375, 98.1875, 57.5156, 55.2188, 40.6875, 65.3438]
    },
    {
     "length": 28,
     "align1": 0,
     "align2": 28,
     "timings": [71.1875, 95.375, 59.9375, 68.75, 70.8125, 34.8438, 69.2656]
    },
    {
     "length": 28,
     "align1": 28,
     "align2": 28,
     "timings": [73.2344, 95.9219, 62.4531, 49.1406, 68.25, 37.4688, 74.8906]
    },
    {
     "length": 29,
     "align1": 0,
     "align2": 0,
     "timings": [49.8594, 108.391, 43.1094, 46.6562, 43.0938, 45.2344, 76.1562]
    },
    {
     "length": 29,
     "align1": 29,
     "align2": 0,
     "timings": [108.766, 97.1562, 99.0156, 59.9375, 60.9219, 191.719, 64.8281]
    },
    {
     "length": 29,
     "align1": 0,
     "align2": 29,
     "timings": [137.703, 97.1562, 123.578, 88.7188, 98.0938, 198.609, 93.7344]
    },
    {
     "length": 29,
     "align1": 29,
     "align2": 29,
     "timings": [110.578, 97.1562, 90, 88.75, 87.8281, 54.7031, 98.2344]
    },
    {
     "length": 30,
     "align1": 0,
     "align2": 0,
     "timings": [49.75, 108.625, 38.6719, 51.9375, 40.9688, 40.8125, 74.0781]
    },
    {
     "length": 30,
     "align1": 30,
     "align2": 0,
     "timings": [106.812, 100.141, 102.922, 58.7969, 60.1562, 193.969, 67.8281]
    },
    {
     "length": 30,
     "align1": 0,
     "align2": 30,
     "timings": [115.438, 100.141, 106.406, 74.0156, 69.5625, 241.219, 71.2031]
    },
    {
     "length": 30,
     "align1": 30,
     "align2": 30,
     "timings": [62.2812, 100.141, 52.9531, 47.3125, 51.4844, 47.5781, 81.7812]
    },
    {
     "length": 31,
     "align1": 0,
     "align2": 0,
     "timings": [50.6562, 111.703, 42.3438, 74.1406, 74.3125, 43.1406, 77.2812]
    },
    {
     "length": 31,
     "align1": 31,
     "align2": 0,
     "timings": [111.047, 103.594, 106.906, 63.7031, 62.4219, 196.844, 71.4219]
    },
    {
     "length": 31,
     "align1": 0,
     "align2": 31,
     "timings": [121.297, 103.156, 106.688, 70.7031, 73.2344, 199.281, 72.7656]
    },
    {
     "length": 31,
     "align1": 31,
     "align2": 31,
     "timings": [61.6406, 103.156, 50, 56.6719, 55.625, 45.2969, 76.6406]
    },
    {
     "length": 48,
     "align1": 0,
     "align2": 0,
     "timings": [52.7031, 178.375, 42.375, 43.6719, 50.0781, 50.5156, 52.7969]
    },
    {
     "length": 48,
     "align1": 3,
     "align2": 0,
     "timings": [66.2812, 177.172, 57.8438, 66.1094, 65.7031, 156.266, 67.8438]
    },
    {
     "length": 48,
     "align1": 0,
     "align2": 3,
     "timings": [157.219, 178.625, 150.703, 123.656, 140.797, 236.828, 115.719]
    },
    {
     "length": 48,
     "align1": 3,
     "align2": 3,
     "timings": [67.875, 177.172, 61.7031, 97.2969, 104.562, 60.9844, 106.75]
    },
    {
     "length": 80,
     "align1": 0,
     "align2": 0,
     "timings": [55.875, 273.281, 42.8906, 59.8594, 62.5312, 57.6562, 68.375]
    },
    {
     "length": 80,
     "align1": 5,
     "align2": 0,
     "timings": [90.5156, 273.25, 79.2031, 90.0156, 79.6875, 173.484, 73.2656]
    },
    {
     "length": 80,
     "align1": 0,
     "align2": 5,
     "timings": [175.797, 273.281, 169.094, 127.828, 125.609, 237.016, 135.516]
    },
    {
     "length": 80,
     "align1": 5,
     "align2": 5,
     "timings": [107.953, 273.25, 93.8438, 104.672, 100.328, 77.125, 124.453]
    },
    {
     "length": 96,
     "align1": 0,
     "align2": 0,
     "timings": [55.625, 321.188, 44.3438, 63.6875, 61.1406, 64.3281, 75.4219]
    },
    {
     "length": 96,
     "align1": 6,
     "align2": 0,
     "timings": [91.625, 321.188, 80.9375, 85.9219, 88.9062, 168.891, 76.8281]
    },
    {
     "length": 96,
     "align1": 0,
     "align2": 6,
     "timings": [153.969, 321.188, 146.188, 108.766, 118.359, 236.688, 110.719]
    },
    {
     "length": 96,
     "align1": 6,
     "align2": 6,
     "timings": [83.3125, 321.188, 71.8281, 86.3438, 92.4219, 71.3906, 100.547]
    },
    {
     "length": 112,
     "align1": 0,
     "align2": 0,
     "timings": [60.3594, 369.172, 56.375, 65.2031, 66.9688, 69.6719, 62.7188]
    },
    {
     "length": 112,
     "align1": 7,
     "align2": 0,
     "timings": [101.875, 369.812, 89.8906, 97.125, 99.2812, 180.438, 84.3125]
    },
    {
     "length": 112,
     "align1": 0,
     "align2": 7,
     "timings": [160.641, 369.844, 152.484, 119.734, 121.391, 239.672, 115.844]
    },
    {
     "length": 112,
     "align1": 7,
     "align2": 7,
     "timings": [78.1719, 369.172, 71.2969, 121.672, 120.781, 87.1094, 96.1875]
    },
    {
     "length": 144,
     "align1": 0,
     "align2": 0,
     "timings": [219.469, 465.172, 205.453, 79.9688, 331.578, 80.0625, 81.0312]
    },
    {
     "length": 144,
     "align1": 9,
     "align2": 0,
     "timings": [311, 465.172, 300.203, 113.734, 355.891, 198.078, 95.4219]
    },
    {
     "length": 144,
     "align1": 0,
     "align2": 9,
     "timings": [321.672, 465.172, 302.297, 148.016, 531.359, 234.75, 136.75]
    },
    {
     "length": 144,
     "align1": 9,
     "align2": 9,
     "timings": [259.391, 465.984, 228.391, 116.688, 521.031, 94.2812, 101.719]
    },
    {
     "length": 160,
     "align1": 0,
     "align2": 0,
     "timings": [189.734, 513.984, 173.141, 79.4531, 411.469, 60.8438, 74.9062]
    },
    {
     "length": 160,
     "align1": 10,
     "align2": 0,
     "timings": [256.094, 513.969, 241.703, 119.594, 440.312, 199.094, 106.469]
    },
    {
     "length": 160,
     "align1": 0,
     "align2": 10,
     "timings": [342, 513.578, 331.641, 146.484, 593.094, 290.562, 136.172]
    },
    {
     "length": 160,
     "align1": 10,
     "align2": 10,
     "timings": [246.5, 513.562, 225.219, 108.859, 581.203, 104.109, 114.203]
    },
    {
     "length": 176,
     "align1": 0,
     "align2": 0,
     "timings": [188.656, 561.578, 174.969, 83.7812, 430.734, 62.2344, 77.8281]
    },
    {
     "length": 176,
     "align1": 11,
     "align2": 0,
     "timings": [259.734, 561.969, 254.094, 133.312, 451.969, 207.688, 113.656]
    },
    {
     "length": 176,
     "align1": 0,
     "align2": 11,
     "timings": [345.047, 561.984, 338.859, 204.781, 633.328, 293.594, 195.969]
    },
    {
     "length": 176,
     "align1": 11,
     "align2": 11,
     "timings": [245.328, 561.969, 229.594, 136.859, 620.953, 106.906, 141.625]
    },
    {
     "length": 192,
     "align1": 0,
     "align2": 0,
     "timings": [145.703, 609.984, 137.594, 86.9375, 270.703, 65.6875, 85.8438]
    },
    {
     "length": 192,
     "align1": 12,
     "align2": 0,
     "timings": [241.047, 609.172, 230.703, 143.047, 307.438, 126.047, 120.484]
    },
    {
     "length": 192,
     "align1": 0,
     "align2": 12,
     "timings": [338.922, 609.172, 323.469, 165.938, 549.438, 110.125, 150.984]
    },
    {
     "length": 192,
     "align1": 12,
     "align2": 12,
     "timings": [248.047, 609.172, 232.906, 110.344, 529.031, 82.7344, 115.688]
    },
    {
     "length": 208,
     "align1": 0,
     "align2": 0,
     "timings": [238.141, 657.172, 223.703, 98.8125, 352.641, 67.3594, 94.125]
    },
    {
     "length": 208,
     "align1": 13,
     "align2": 0,
     "timings": [325.156, 657.188, 314.328, 151.266, 379.578, 230.391, 122.781]
    },
    {
     "length": 208,
     "align1": 0,
     "align2": 13,
     "timings": [357.406, 657.172, 341.422, 195.016, 574.438, 315.359, 177.906]
    },
    {
     "length": 208,
     "align1": 13,
     "align2": 13,
     "timings": [288.344, 658, 267.812, 142.469, 544.469, 115.156, 159.609]
    },
    {
     "length": 224,
     "align1": 0,
     "align2": 0,
     "timings": [199.625, 705.578, 187.812, 98.6406, 440.844, 71.4375, 92.5781]
    },
    {
     "length": 224,
     "align1": 14,
     "align2": 0,
     "timings": [273.719, 706.672, 258.312, 212.047, 472.828, 241.297, 131.719]
    },
    {
     "length": 224,
     "align1": 0,
     "align2": 14,
     "timings": [334.125, 706.672, 323.703, 185.547, 623.562, 293.469, 156.625]
    },
    {
     "length": 224,
     "align1": 14,
     "align2": 14,
     "timings": [256.047, 714.812, 232.203, 129.781, 604.656, 120.578, 125.547]
    },
    {
     "length": 240,
     "align1": 0,
     "align2": 0,
     "timings": [213.578, 753.578, 196.547, 104.984, 453.297, 74.9844, 94.0625]
    },
    {
     "length": 240,
     "align1": 15,
     "align2": 0,
     "timings": [279.859, 754, 270.906, 223.734, 484.203, 241.156, 134.766]
    },
    {
     "length": 240,
     "align1": 0,
     "align2": 15,
     "timings": [343.797, 753.984, 335.031, 187.422, 663.562, 322.578, 159.188]
    },
    {
     "length": 240,
     "align1": 15,
     "align2": 15,
     "timings": [262.688, 754.672, 237.688, 158.406, 642.266, 118.75, 119.5]
    },
    {
     "length": 272,
     "align1": 0,
     "align2": 0,
     "timings": [257.125, 850.656, 246.422, 610.656, 374.688, 96.4844, 108.203]
    },
    {
     "length": 272,
     "align1": 17,
     "align2": 0,
     "timings": [347.297, 849.156, 334.469, 633.719, 416.5, 311.969, 147.484]
    },
    {
     "length": 272,
     "align1": 0,
     "align2": 17,
     "timings": [356.844, 849.172, 337.562, 898.812, 654.781, 321.297, 185.734]
    },
    {
     "length": 272,
     "align1": 17,
     "align2": 17,
     "timings": [271.625, 849.969, 265.281, 826.125, 617.328, 133.078, 134.844]
    },
    {
     "length": 288,
     "align1": 0,
     "align2": 0,
     "timings": [215.562, 897.969, 210.453, 693.094, 466.391, 95.1562, 112.219]
    },
    {
     "length": 288,
     "align1": 18,
     "align2": 0,
     "timings": [287.984, 897.562, 274.625, 716.031, 508.859, 292.5, 155.516]
    },
    {
     "length": 288,
     "align1": 0,
     "align2": 18,
     "timings": [371.141, 897.984, 363.188, 901.5, 656.844, 397.406, 184.938]
    },
    {
     "length": 288,
     "align1": 18,
     "align2": 18,
     "timings": [280.719, 897.969, 266.406, 847.734, 622.812, 134.75, 142.016]
    },
    {
     "length": 304,
     "align1": 0,
     "align2": 0,
     "timings": [227.25, 945.984, 212.5, 708.812, 476.312, 93.1875, 108.641]
    },
    {
     "length": 304,
     "align1": 19,
     "align2": 0,
     "timings": [293.5, 945.984, 284.109, 728.938, 519.219, 329.125, 157.078]
    },
    {
     "length": 304,
     "align1": 0,
     "align2": 19,
     "timings": [380.516, 945.984, 374.719, 846.328, 570.734, 398.922, 239.938]
    },
    {
     "length": 304,
     "align1": 19,
     "align2": 19,
     "timings": [305.438, 945.172, 290.391, 755.016, 538.219, 157.562, 157.203]
    },
    {
     "length": 320,
     "align1": 0,
     "align2": 0,
     "timings": [189.984, 993.172, 180.875, 562.453, 324.922, 96.2969, 118.109]
    },
    {
     "length": 320,
     "align1": 20,
     "align2": 0,
     "timings": [275.75, 993.188, 266.766, 592.656, 382, 156.719, 171.516]
    },
    {
     "length": 320,
     "align1": 0,
     "align2": 20,
     "timings": [375.109, 993.562, 360.234, 829.594, 589.297, 165.734, 198.703]
    },
    {
     "length": 320,
     "align1": 20,
     "align2": 20,
     "timings": [265.094, 994, 240.344, 769.641, 542.922, 108.906, 173.344]
    },
    {
     "length": 336,
     "align1": 0,
     "align2": 0,
     "timings": [275.469, 1041.98, 258.016, 635.484, 390.75, 98.3125, 121.688]
    },
    {
     "length": 336,
     "align1": 21,
     "align2": 0,
     "timings": [361.656, 1041.17, 352.172, 660.172, 452.609, 309.516, 173.062]
    },
    {
     "length": 336,
     "align1": 0,
     "align2": 21,
     "timings": [387.297, 1041.56, 379.438, 922.359, 678.531, 403.172, 236.156]
    },
    {
     "length": 336,
     "align1": 21,
     "align2": 21,
     "timings": [307.297, 1041.98, 293.516, 860.609, 631.344, 167.656, 198.391]
    },
    {
     "length": 352,
     "align1": 0,
     "align2": 0,
     "timings": [234.125, 1089.97, 229.609, 728.469, 488.562, 102.656, 126.266]
    },
    {
     "length": 352,
     "align1": 22,
     "align2": 0,
     "timings": [303.812, 1089.98, 294.516, 752.594, 542.672, 315.984, 179.562]
    },
    {
     "length": 352,
     "align1": 0,
     "align2": 22,
     "timings": [373.844, 1089.98, 357.625, 934.828, 686.906, 382.938, 213.109]
    },
    {
     "length": 352,
     "align1": 22,
     "align2": 22,
     "timings": [283.422, 1089.59, 272.391, 872.094, 644.234, 166.969, 166.297]
    },
    {
     "length": 368,
     "align1": 0,
     "align2": 0,
     "timings": [234.891, 1137.98, 230.484, 740.125, 498.172, 107.359, 123.156]
    },
    {
     "length": 368,
     "align1": 23,
     "align2": 0,
     "timings": [311.734, 1137.98, 300.281, 763.281, 553.094, 346.047, 186.203]
    },
    {
     "length": 368,
     "align1": 0,
     "align2": 23,
     "timings": [377.594, 1137.98, 369.156, 828.172, 583.812, 394.344, 211.531]
    },
    {
     "length": 368,
     "align1": 23,
     "align2": 23,
     "timings": [297.203, 1137.16, 281.609, 763.391, 521.094, 166.188, 166.609]
    },
    {
     "length": 384,
     "align1": 0,
     "align2": 0,
     "timings": [204.656, 1185.17, 196.625, 601.594, 342.188, 718.828, 133.172]
    },
    {
     "length": 384,
     "align1": 24,
     "align2": 0,
     "timings": [199.156, 1185.16, 192.328, 675.047, 348.188, 738.828, 127.578]
    },
    {
     "length": 384,
     "align1": 0,
     "align2": 24,
     "timings": [288.297, 1185.17, 275, 890.891, 573.828, 785.297, 124.797]
    },
    {
     "length": 384,
     "align1": 24,
     "align2": 24,
     "timings": [280.234, 1185.56, 272.703, 832.375, 562.484, 755.328, 124.766]
    },
    {
     "length": 400,
     "align1": 0,
     "align2": 0,
     "timings": [289.781, 1233.98, 281.25, 677.469, 411.516, 708.828, 143.297]
    },
    {
     "length": 400,
     "align1": 25,
     "align2": 0,
     "timings": [381.844, 1233.16, 369.5, 736.484, 480.75, 713, 197.938]
    },
    {
     "length": 400,
     "align1": 0,
     "align2": 25,
     "timings": [393.703, 1233.17, 378.047, 927.859, 707.75, 813.172, 243.438]
    },
    {
     "length": 400,
     "align1": 25,
     "align2": 25,
     "timings": [306.75, 1233.56, 292.172, 894, 652.328, 794.406, 172.172]
    },
    {
     "length": 416,
     "align1": 0,
     "align2": 0,
     "timings": [260.375, 1282.64, 242.969, 768.047, 507.906, 713.203, 141.172]
    },
    {
     "length": 416,
     "align1": 26,
     "align2": 0,
     "timings": [320.453, 1281.97, 313.781, 827.453, 575.906, 716.016, 209.156]
    },
    {
     "length": 416,
     "align1": 0,
     "align2": 26,
     "timings": [408.641, 1281.98, 397.281, 960.578, 750.328, 823.422, 248.406]
    },
    {
     "length": 416,
     "align1": 26,
     "align2": 26,
     "timings": [326.094, 1281.84, 296.594, 935.25, 693.672, 818.422, 169.594]
    },
    {
     "length": 432,
     "align1": 0,
     "align2": 0,
     "timings": [270.172, 1329.98, 256.766, 783.859, 517.953, 729.719, 141.375]
    },
    {
     "length": 432,
     "align1": 27,
     "align2": 0,
     "timings": [330.516, 1329.98, 325.688, 839.891, 587.078, 727.438, 217.859]
    },
    {
     "length": 432,
     "align1": 0,
     "align2": 27,
     "timings": [416.172, 1329.98, 407.438, 854.609, 645.016, 806.797, 283.125]
    },
    {
     "length": 432,
     "align1": 27,
     "align2": 27,
     "timings": [338.609, 1331.08, 322.219, 828.109, 575.141, 820.094, 176.922]
    },
    {
     "length": 448,
     "align1": 0,
     "align2": 0,
     "timings": [231.344, 1377.56, 216.094, 635.031, 362.688, 737.953, 143.812]
    },
    {
     "length": 448,
     "align1": 28,
     "align2": 0,
     "timings": [314.891, 1377.17, 304.219, 694.641, 443.109, 734.766, 222.375]
    },
    {
     "length": 448,
     "align1": 0,
     "align2": 28,
     "timings": [407.281, 1377.17, 390.391, 890.344, 679.969, 812.719, 248.688]
    },
    {
     "length": 448,
     "align1": 28,
     "align2": 28,
     "timings": [329.453, 1377.97, 305.781, 876.422, 611.156, 798.406, 212.828]
    },
    {
     "length": 464,
     "align1": 0,
     "align2": 0,
     "timings": [315.312, 1425.97, 303.234, 707.969, 433.547, 739.312, 154.875]
    },
    {
     "length": 464,
     "align1": 29,
     "align2": 0,
     "timings": [393.266, 1425.19, 384.922, 766.75, 517.359, 738.188, 232.703]
    },
    {
     "length": 464,
     "align1": 0,
     "align2": 29,
     "timings": [429.141, 1425.17, 414.922, 956.078, 741.312, 831.141, 293.25]
    },
    {
     "length": 464,
     "align1": 29,
     "align2": 29,
     "timings": [345.828, 1425.59, 306.812, 932.625, 669.672, 805.484, 223.25]
    },
    {
     "length": 480,
     "align1": 0,
     "align2": 0,
     "timings": [277.594, 1473.97, 264.969, 800.703, 527.203, 741.75, 158.234]
    },
    {
     "length": 480,
     "align1": 30,
     "align2": 0,
     "timings": [344.281, 1473.98, 329.766, 861.438, 609.297, 741.297, 235.422]
    },
    {
     "length": 480,
     "align1": 0,
     "align2": 30,
     "timings": [410.969, 1473.58, 389.766, 995.266, 781.781, 826.828, 291.406]
    },
    {
     "length": 480,
     "align1": 30,
     "align2": 30,
     "timings": [316.562, 1473.58, 308.422, 973.844, 711.016, 812.781, 185.625]
    },
    {
     "length": 496,
     "align1": 0,
     "align2": 0,
     "timings": [283.469, 1521.97, 275.469, 816.094, 538.719, 745.703, 155.016]
    },
    {
     "length": 496,
     "align1": 31,
     "align2": 0,
     "timings": [351.406, 1521.97, 338.938, 874.141, 620.5, 749.047, 237.938]
    },
    {
     "length": 496,
     "align1": 0,
     "align2": 31,
     "timings": [418.375, 1521.98, 400.078, 883.062, 680.016, 830.828, 266.516]
    },
    {
     "length": 496,
     "align1": 31,
     "align2": 31,
     "timings": [339.422, 1521.56, 315.297, 862.031, 596.531, 831.453, 185.141]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 0,
     "timings": [404.047, 3105.58, 388.641, 953.391, 552.922, 972.109, 321.172]
    },
    {
     "length": 1024,
     "align1": 32,
     "align2": 0,
     "timings": [396.625, 3105.16, 390.953, 1006.23, 548.531, 975.594, 317.609]
    },
    {
     "length": 1024,
     "align1": 0,
     "align2": 32,
     "timings": [452.562, 3105.17, 436.453, 1227.55, 794.969, 1016.7, 316.844]
    },
    {
     "length": 1024,
     "align1": 32,
     "align2": 32,
     "timings": [444.594, 3105.95, 433.906, 1185.55, 791.547, 1002.55, 317.109]
    },
    {
     "length": 1056,
     "align1": 0,
     "align2": 0,
     "timings": [450.781, 3201.58, 438.203, 1126.55, 718.203, 974.625, 326.672]
    },
    {
     "length": 1056,
     "align1": 33,
     "align2": 0,
     "timings": [515.781, 3201.58, 503.391, 1162.8, 919.641, 979.312, 498.422]
    },
    {
     "length": 1056,
     "align1": 0,
     "align2": 33,
     "timings": [588.281, 3201.98, 563.469, 1173.05, 890.641, 1072.31, 542.438]
    },
    {
     "length": 1056,
     "align1": 33,
     "align2": 33,
     "timings": [528.062, 3201.17, 524.922, 1087.41, 682.109, 1067.45, 381.109]
    },
    {
     "length": 1088,
     "align1": 0,
     "align2": 0,
     "timings": [423.5, 3297.17, 412.5, 989.406, 571.766, 979.594, 335.188]
    },
    {
     "length": 1088,
     "align1": 34,
     "align2": 0,
     "timings": [506.234, 3297.19, 491.547, 1031.64, 786.75, 997.016, 511.219]
    },
    {
     "length": 1088,
     "align1": 0,
     "align2": 34,
     "timings": [596.391, 3297.17, 585.438, 1299.89, 1021, 1114.3, 550.234]
    },
    {
     "length": 1088,
     "align1": 34,
     "align2": 34,
     "timings": [539.375, 3297.98, 531.906, 1222.64, 811.125, 1109.98, 392.812]
    },
    {
     "length": 1120,
     "align1": 0,
     "align2": 0,
     "timings": [466.25, 3393.58, 459.297, 1160.28, 740.062, 990.922, 344.953]
    },
    {
     "length": 1120,
     "align1": 35,
     "align2": 0,
     "timings": [531.109, 3393.58, 519.641, 1199.16, 949.266, 997.172, 521.391]
    },
    {
     "length": 1120,
     "align1": 0,
     "align2": 35,
     "timings": [603.781, 3393.98, 585.203, 1232.61, 948.453, 1089.89, 552.484]
    },
    {
     "length": 1120,
     "align1": 35,
     "align2": 35,
     "timings": [573.266, 3393.17, 572.062, 1149.8, 732.953, 1076.14, 396.25]
    },
    {
     "length": 1152,
     "align1": 0,
     "align2": 0,
     "timings": [443.172, 3492.2, 426.312, 1030.33, 599.062, 1014.25, 352.031]
    },
    {
     "length": 1152,
     "align1": 36,
     "align2": 0,
     "timings": [527.344, 3489.19, 511.531, 1074.5, 826.125, 1022.59, 536.375]
    },
    {
     "length": 1152,
     "align1": 0,
     "align2": 36,
     "timings": [622.234, 3489.17, 605.156, 1344.38, 1051.19, 1085.39, 562.484]
    },
    {
     "length": 1152,
     "align1": 36,
     "align2": 36,
     "timings": [506.109, 3489.98, 496.25, 1259.08, 834.781, 1081.22, 390.953]
    },
    {
     "length": 1184,
     "align1": 0,
     "align2": 0,
     "timings": [491.375, 3585.97, 481.969, 1195.16, 761.734, 1028.31, 360.562]
    },
    {
     "length": 1184,
     "align1": 37,
     "align2": 0,
     "timings": [548.75, 3585.58, 539.641, 1241.2, 985.469, 1031.41, 547.859]
    },
    {
     "length": 1184,
     "align1": 0,
     "align2": 37,
     "timings": [649.219, 3585.98, 631.5, 1235.19, 955.656, 1118.53, 604.391]
    },
    {
     "length": 1184,
     "align1": 37,
     "align2": 37,
     "timings": [602.156, 3585.97, 593.953, 1160.95, 735.906, 1113.77, 425.812]
    },
    {
     "length": 1216,
     "align1": 0,
     "align2": 0,
     "timings": [454.016, 3681.97, 447.688, 1059.36, 614.438, 1039.3, 367.094]
    },
    {
     "length": 1216,
     "align1": 38,
     "align2": 0,
     "timings": [547.328, 3681.16, 530.547, 1128.67, 855.391, 1046.33, 561.453]
    },
    {
     "length": 1216,
     "align1": 0,
     "align2": 38,
     "timings": [645.203, 3681.84, 618.719, 1370.95, 1080.98, 1146.28, 589.062]
    },
    {
     "length": 1216,
     "align1": 38,
     "align2": 38,
     "timings": [569.828, 3682.66, 559.438, 1292.33, 857.594, 1137.8, 444.734]
    },
    {
     "length": 1248,
     "align1": 0,
     "align2": 0,
     "timings": [508.344, 3777.97, 499.172, 1231.67, 779.766, 1051.11, 376.547]
    },
    {
     "length": 1248,
     "align1": 39,
     "align2": 0,
     "timings": [566.766, 3777.56, 556.875, 1284.05, 1016.88, 1054.95, 573.859]
    },
    {
     "length": 1248,
     "align1": 0,
     "align2": 39,
     "timings": [638.172, 3778.02, 616.328, 1276.69, 978.609, 1157.16, 599.953]
    },
    {
     "length": 1248,
     "align1": 39,
     "align2": 39,
     "timings": [590.062, 3777.95, 587.828, 1194.73, 747.859, 1147.64, 425.922]
    },
    {
     "length": 1280,
     "align1": 0,
     "align2": 0,
     "timings": [476, 3873.58, 464.094, 1097.86, 641.375, 1066.12, 382.703]
    },
    {
     "length": 1280,
     "align1": 40,
     "align2": 0,
     "timings": [470.062, 3873.17, 464.25, 1194.92, 645.312, 1074.8, 381.188]
    },
    {
     "length": 1280,
     "align1": 0,
     "align2": 40,
     "timings": [524.688, 3873.17, 516.594, 1386.02, 886.641, 1120.55, 380.688]
    },
    {
     "length": 1280,
     "align1": 40,
     "align2": 40,
     "timings": [517.672, 3873.58, 515.375, 1298.89, 848.125, 1113.83, 380.25]
    },
    {
     "length": 1312,
     "align1": 0,
     "align2": 0,
     "timings": [525.406, 3969.97, 518.156, 1264.55, 808.688, 1074.48, 390.688]
    },
    {
     "length": 1312,
     "align1": 41,
     "align2": 0,
     "timings": [585.391, 3969.59, 576.578, 1338.25, 1059.75, 1070.48, 599.891]
    },
    {
     "length": 1312,
     "align1": 0,
     "align2": 41,
     "timings": [656.922, 3969.98, 638.391, 1300.5, 1013.78, 1176.86, 648.922]
    },
    {
     "length": 1312,
     "align1": 41,
     "align2": 41,
     "timings": [630.812, 3969.19, 623.938, 1225.44, 758.641, 1174.47, 449.219]
    },
    {
     "length": 1344,
     "align1": 0,
     "align2": 0,
     "timings": [494.297, 4065.17, 483.234, 1133.11, 666.578, 1089.22, 399.578]
    },
    {
     "length": 1344,
     "align1": 42,
     "align2": 0,
     "timings": [580.547, 4065.17, 566.312, 1216.09, 921.953, 1092.14, 614.078]
    },
    {
     "length": 1344,
     "align1": 0,
     "align2": 42,
     "timings": [672.266, 4065.17, 655.531, 1404.36, 1116.02, 1221.34, 657.344]
    },
    {
     "length": 1344,
     "align1": 42,
     "align2": 42,
     "timings": [619.609, 4065.58, 606.766, 1331.94, 864.172, 1201.98, 459.844]
    },
    {
     "length": 1376,
     "align1": 0,
     "align2": 0,
     "timings": [550.641, 4161.97, 534.875, 1301.58, 837.016, 1103.12, 408.891]
    },
    {
     "length": 1376,
     "align1": 43,
     "align2": 0,
     "timings": [603.375, 4162, 593.516, 1379.25, 1088.83, 1114.2, 625.953]
    },
    {
     "length": 1376,
     "align1": 0,
     "align2": 43,
     "timings": [667.906, 4162.02, 656.797, 1338.59, 1047.41, 1194.98, 656.047]
    },
    {
     "length": 1376,
     "align1": 43,
     "align2": 43,
     "timings": [643.984, 4163.41, 642.078, 1260.09, 787.672, 1188.88, 470.031]
    },
    {
     "length": 1408,
     "align1": 0,
     "align2": 0,
     "timings": [516.328, 4257.56, 504.422, 1168.27, 692.516, 1112.41, 414.984]
    },
    {
     "length": 1408,
     "align1": 44,
     "align2": 0,
     "timings": [595.875, 4257.17, 586.109, 1251.02, 957.266, 1116.97, 641.156]
    },
    {
     "length": 1408,
     "align1": 0,
     "align2": 44,
     "timings": [688.25, 4257.17, 670.375, 1442.59, 1151.61, 1196.58, 689.609]
    },
    {
     "length": 1408,
     "align1": 44,
     "align2": 44,
     "timings": [662.406, 4257.97, 567.359, 1366.59, 888.797, 1187.08, 453.188]
    },
    {
     "length": 1440,
     "align1": 0,
     "align2": 0,
     "timings": [565.688, 4353.97, 556.266, 1336.39, 854.328, 1132.12, 424.516]
    },
    {
     "length": 1440,
     "align1": 45,
     "align2": 0,
     "timings": [615.719, 4353.64, 610.438, 1421.84, 1117.83, 1127.44, 651.938]
    },
    {
     "length": 1440,
     "align1": 0,
     "align2": 45,
     "timings": [722.078, 4353.97, 698.969, 1373.27, 1088.58, 1220, 705.359]
    },
    {
     "length": 1440,
     "align1": 45,
     "align2": 45,
     "timings": [697.281, 4353.56, 684.516, 1307.61, 832.453, 1221.19, 490.75]
    },
    {
     "length": 1472,
     "align1": 0,
     "align2": 0,
     "timings": [530.219, 4449.97, 523.109, 1200.11, 712.609, 1137.41, 430.812]
    },
    {
     "length": 1472,
     "align1": 46,
     "align2": 0,
     "timings": [615.344, 4449.16, 600.969, 1301.91, 991.328, 1143.47, 666.875]
    },
    {
     "length": 1472,
     "align1": 0,
     "align2": 46,
     "timings": [708.875, 4449.84, 691.109, 1481.19, 1185.53, 1247.88, 690.344]
    },
    {
     "length": 1472,
     "align1": 46,
     "align2": 46,
     "timings": [645.141, 4450.28, 644.984, 1401.11, 914.828, 1239.41, 508]
    },
    {
     "length": 1504,
     "align1": 0,
     "align2": 0,
     "timings": [583.156, 4545.58, 576.047, 1369.84, 877.031, 1155.27, 440.125]
    },
    {
     "length": 1504,
     "align1": 47,
     "align2": 0,
     "timings": [637.844, 4546.02, 628.641, 1455.86, 1152.33, 1150.3, 679.016]
    },
    {
     "length": 1504,
     "align1": 0,
     "align2": 47,
     "timings": [709.344, 4545.58, 690.781, 1410.73, 1119.02, 1254.95, 702.078]
    },
    {
     "length": 1504,
     "align1": 47,
     "align2": 47,
     "timings": [681.078, 4545.58, 678.578, 1331.88, 839.047, 1249.64, 492.984]
    },
    {
     "length": 1536,
     "align1": 0,
     "align2": 0,
     "timings": [551.219, 4641.58, 545.281, 1237.25, 741.062, 1165.42, 445.875]
    },
    {
     "length": 1536,
     "align1": 48,
     "align2": 0,
     "timings": [548.953, 4641.19, 541.359, 1285.02, 732.578, 1173.58, 444.312]
    },
    {
     "length": 1536,
     "align1": 0,
     "align2": 48,
     "timings": [600.031, 4641.17, 592.047, 1509.72, 942.781, 1219.25, 445.234]
    },
    {
     "length": 1536,
     "align1": 48,
     "align2": 48,
     "timings": [593.547, 4641.59, 587.422, 1435.95, 937.938, 1210.77, 444.297]
    },
    {
     "length": 1568,
     "align1": 0,
     "align2": 0,
     "timings": [605.453, 4737.98, 594.078, 1401.61, 900.25, 1180.2, 454.766]
    },
    {
     "length": 1568,
     "align1": 49,
     "align2": 0,
     "timings": [667.812, 4738.02, 647.891, 1448.75, 1194.33, 1185.12, 704.062]
    },
    {
     "length": 1568,
     "align1": 0,
     "align2": 49,
     "timings": [728.344, 4738.02, 708.688, 1392.89, 1161.78, 1273.69, 754.516]
    },
    {
     "length": 1568,
     "align1": 49,
     "align2": 49,
     "timings": [737.938, 4737.17, 721.031, 1366.09, 873.266, 1267.41, 499.5]
    },
    {
     "length": 1600,
     "align1": 0,
     "align2": 0,
     "timings": [573.812, 4833.17, 562.672, 1273.28, 767.594, 1189.64, 466.422]
    },
    {
     "length": 1600,
     "align1": 50,
     "align2": 0,
     "timings": [649.203, 4833.19, 637.906, 1313.61, 1058.78, 1197.67, 718.047]
    },
    {
     "length": 1600,
     "align1": 0,
     "align2": 50,
     "timings": [738.906, 4833.17, 728.812, 1487.56, 1253.56, 1311.11, 763.594]
    },
    {
     "length": 1600,
     "align1": 50,
     "align2": 50,
     "timings": [1848.25, 4835.22, 684.859, 1514.25, 969.641, 1322.73, 509.359]
    },
    {
     "length": 1632,
     "align1": 0,
     "align2": 0,
     "timings": [628.406, 4929.58, 615.156, 1440.94, 927.969, 1203.36, 474.078]
    },
    {
     "length": 1632,
     "align1": 51,
     "align2": 0,
     "timings": [678.984, 4929.97, 670.984, 1483.52, 1229.19, 1211.53, 731.828]
    },
    {
     "length": 1632,
     "align1": 0,
     "align2": 51,
     "timings": [750.469, 4929.97, 731.25, 1416.7, 1186.8, 1319.16, 759.109]
    },
    {
     "length": 1632,
     "align1": 51,
     "align2": 51,
     "timings": [759.469, 4930.36, 738.828, 1397.47, 882.641, 1299.31, 518.328]
    },
    {
     "length": 1664,
     "align1": 0,
     "align2": 0,
     "timings": [587.953, 5025.97, 573.875, 1309.55, 795.375, 1216.59, 478.734]
    },
    {
     "length": 1664,
     "align1": 52,
     "align2": 0,
     "timings": [676.766, 5025.16, 661.594, 1353.22, 1091.8, 1224.91, 744.125]
    },
    {
     "length": 1664,
     "align1": 0,
     "align2": 52,
     "timings": [761.625, 5025.17, 750.312, 1521.12, 1283.78, 1297.27, 773.141]
    },
    {
     "length": 1664,
     "align1": 52,
     "align2": 52,
     "timings": [668.312, 5025.95, 726.859, 1503.52, 986.5, 1291.45, 516.125]
    },
    {
     "length": 1696,
     "align1": 0,
     "align2": 0,
     "timings": [639.891, 5121.97, 631.016, 1476.22, 951.703, 1230.77, 487.938]
    },
    {
     "length": 1696,
     "align1": 53,
     "align2": 0,
     "timings": [696.594, 5121.56, 689.469, 1522.42, 1254.41, 1239.25, 756.25]
    },
    {
     "length": 1696,
     "align1": 0,
     "align2": 53,
     "timings": [796.266, 5121.58, 775.562, 1449.92, 1221.2, 1324.97, 811.547]
    },
    {
     "length": 1696,
     "align1": 53,
     "align2": 53,
     "timings": [727.406, 5121.95, 740.312, 1428.44, 907.016, 1320.75, 546.438]
    },
    {
     "length": 1728,
     "align1": 0,
     "align2": 0,
     "timings": [611.359, 5217.97, 597.594, 1344.33, 820.312, 1241.41, 494.219]
    },
    {
     "length": 1728,
     "align1": 54,
     "align2": 0,
     "timings": [693.844, 5217.17, 675.109, 1386.94, 1125.25, 1252.48, 769.938]
    },
    {
     "length": 1728,
     "align1": 0,
     "align2": 54,
     "timings": [780.969, 5217.84, 768.391, 1554.88, 1315.42, 1338.53, 798.094]
    },
    {
     "length": 1728,
     "align1": 54,
     "align2": 54,
     "timings": [721.469, 5218.28, 711.516, 1534.77, 1011.7, 1330.19, 552.703]
    },
    {
     "length": 1760,
     "align1": 0,
     "align2": 0,
     "timings": [663.719, 5313.58, 650.688, 1508.02, 980.859, 1257.58, 504.656]
    },
    {
     "length": 1760,
     "align1": 55,
     "align2": 0,
     "timings": [717.328, 5314.03, 707.609, 1555.61, 1288.97, 1259.98, 782.656]
    },
    {
     "length": 1760,
     "align1": 0,
     "align2": 55,
     "timings": [784.547, 5313.97, 766.578, 1500.89, 1254.69, 1348.58, 805.797]
    },
    {
     "length": 1760,
     "align1": 55,
     "align2": 55,
     "timings": [741.078, 5313.98, 726.453, 1466.81, 938.656, 1348.67, 539.938]
    },
    {
     "length": 1792,
     "align1": 0,
     "align2": 0,
     "timings": [629.812, 5409.97, 618.688, 1380.47, 844.328, 1270.86, 510.438]
    },
    {
     "length": 1792,
     "align1": 56,
     "align2": 0,
     "timings": [626.578, 5409.17, 620.562, 1509.89, 842.266, 1317.36, 508.344]
    },
    {
     "length": 1792,
     "align1": 0,
     "align2": 56,
     "timings": [681.969, 5409.17, 671.391, 1597.55, 1049.25, 1320.11, 509.359]
    },
    {
     "length": 1792,
     "align1": 56,
     "align2": 56,
     "timings": [674.594, 5409.58, 672.547, 1573.75, 1038.89, 1311.62, 509.375]
    },
    {
     "length": 1824,
     "align1": 0,
     "align2": 0,
     "timings": [681.891, 5505.58, 669.781, 1549.06, 1006.05, 1284.5, 518.859]
    },
    {
     "length": 1824,
     "align1": 57,
     "align2": 0,
     "timings": [748.141, 5505.98, 724.859, 1668.44, 1329.25, 1286, 809.828]
    },
    {
     "length": 1824,
     "align1": 0,
     "align2": 57,
     "timings": [813.172, 5506.59, 781.266, 1540.52, 1312.55, 1344.41, 871.938]
    },
    {
     "length": 1824,
     "align1": 57,
     "align2": 57,
     "timings": [717.938, 5506, 702.844, 1507.94, 965.234, 1332.73, 556.594]
    },
    {
     "length": 1856,
     "align1": 0,
     "align2": 0,
     "timings": [651.094, 5601.97, 635.703, 1413.73, 868.188, 1293.81, 527.172]
    },
    {
     "length": 1856,
     "align1": 58,
     "align2": 0,
     "timings": [730.844, 5601.19, 710.312, 1536.14, 1198.28, 1305.62, 824.578]
    },
    {
     "length": 1856,
     "align1": 0,
     "align2": 58,
     "timings": [810.297, 5601.17, 799.844, 1630.56, 1383.09, 1388.17, 865.125]
    },
    {
     "length": 1856,
     "align1": 58,
     "align2": 58,
     "timings": [709.422, 5601.59, 700.281, 1605.95, 1063.12, 1371.22, 560.609]
    },
    {
     "length": 1888,
     "align1": 0,
     "align2": 0,
     "timings": [695.125, 5697.97, 689.531, 1580.42, 1032.7, 1312.06, 538.312]
    },
    {
     "length": 1888,
     "align1": 59,
     "align2": 0,
     "timings": [746.234, 5697.98, 737.922, 1714.77, 1358.45, 1322.62, 836.406]
    },
    {
     "length": 1888,
     "align1": 0,
     "align2": 59,
     "timings": [820.594, 5697.58, 800.312, 1583.62, 1310.17, 1365.52, 864.844]
    },
    {
     "length": 1888,
     "align1": 59,
     "align2": 59,
     "timings": [726.062, 5697.98, 713.688, 1559.03, 996.516, 1361.27, 570.141]
    },
    {
     "length": 1920,
     "align1": 0,
     "align2": 0,
     "timings": [663.359, 5793.97, 656.094, 1450.38, 939.75, 1319.98, 543.828]
    },
    {
     "length": 1920,
     "align1": 60,
     "align2": 0,
     "timings": [752.359, 5793.17, 728.141, 1575.05, 1233.23, 1335.38, 849.734]
    },
    {
     "length": 1920,
     "align1": 0,
     "align2": 60,
     "timings": [834.078, 5793.17, 819.688, 1669.06, 1449.8, 1378.48, 924.125]
    },
    {
     "length": 1920,
     "align1": 60,
     "align2": 60,
     "timings": [735.969, 5793.58, 716.859, 1642.95, 1122.27, 1374.89, 581.75]
    },
    {
     "length": 1952,
     "align1": 0,
     "align2": 0,
     "timings": [720.672, 5889.97, 707.266, 1616.73, 1109.34, 1337.05, 554.016]
    },
    {
     "length": 1952,
     "align1": 61,
     "align2": 0,
     "timings": [768.016, 5890.05, 755.031, 1740.36, 1392.91, 1341.59, 861.984]
    },
    {
     "length": 1952,
     "align1": 0,
     "align2": 61,
     "timings": [866.594, 5889.58, 846.172, 1599.06, 1343.05, 1392.53, 914.422]
    },
    {
     "length": 1952,
     "align1": 61,
     "align2": 61,
     "timings": [775.203, 5889.59, 757.719, 1570.02, 1011.52, 1386.06, 610.547]
    },
    {
     "length": 1984,
     "align1": 0,
     "align2": 0,
     "timings": [687.797, 5985.58, 671.703, 1482.53, 960.328, 1348.5, 561.406]
    },
    {
     "length": 1984,
     "align1": 62,
     "align2": 0,
     "timings": [770.578, 5985.19, 746.109, 1617.97, 1268.91, 1363.16, 875.516]
    },
    {
     "length": 1984,
     "align1": 0,
     "align2": 62,
     "timings": [860.109, 5985.84, 837.328, 1698.58, 1458.98, 1407.27, 897.547]
    },
    {
     "length": 1984,
     "align1": 62,
     "align2": 62,
     "timings": [739.609, 5986.28, 726.891, 1683, 1116.5, 1399.86, 613.031]
    },
    {
     "length": 2016,
     "align1": 0,
     "align2": 0,
     "timings": [737.625, 6081.58, 729.328, 1647.55, 1129.17, 1363.94, 568.391]
    },
    {
     "length": 2016,
     "align1": 63,
     "align2": 0,
     "timings": [786.938, 6082.03, 774.062, 1774.28, 1427.14, 1366.14, 889.062]
    },
    {
     "length": 2016,
     "align1": 0,
     "align2": 63,
     "timings": [851.625, 6081.58, 834.656, 1627.39, 1373.86, 1417.42, 910.484]
    },
    {
     "length": 2016,
     "align1": 63,
     "align2": 63,
     "timings": [745.531, 7184.59, 750.781, 1601.55, 1079.95, 1418.48, 601.531]
    },
    {
     "length": 8192,
     "align1": 0,
     "align2": 0,
     "timings": [2617.83, 24611.3, 2551.62, 5061.19, 3624.98, 3858.86, 2126.98]
    }]
  }
 }
}
{
 "timing_type": "hp_timing",
 "functions": {
  "memcpy": {
   "bench-variant": "large",
   "ifuncs": ["__memcpy_niagara4", "__memcpy_niagara2", "__memcpy_niagara1", "__memcpy_ultra1", "__memcpy_c"],
   "results": [
    {
     "length": 65543,
     "align1": 0,
     "align2": 0,
     "timings": [59127.1, 50140.2, 47568.8, 72907.4, 29730.2]
    },
    {
     "length": 65551,
     "align1": 0,
     "align2": 3,
     "timings": [35074.1, 58193.6, 48056.7, 53652.4, 38544.1]
    },
    {
     "length": 65567,
     "align1": 3,
     "align2": 0,
     "timings": [33287.4, 56042.3, 45161.9, 54339.6, 37674.2]
    },
    {
     "length": 65599,
     "align1": 3,
     "align2": 5,
     "timings": [33360.3, 58022, 45390.5, 53861.4, 37517.5]
    },
    {
     "length": 131079,
     "align1": 0,
     "align2": 0,
     "timings": [90264.6, 99100, 93145.8, 99447.2, 70812.8]
    },
    {
     "length": 131087,
     "align1": 0,
     "align2": 3,
     "timings": [73837, 107689, 87828.9, 99008.3, 79760.9]
    },
    {
     "length": 131103,
     "align1": 3,
     "align2": 0,
     "timings": [72335.1, 108369, 87037.8, 99012, 80061.6]
    },
    {
     "length": 131135,
     "align1": 3,
     "align2": 5,
     "timings": [72164.8, 107436, 87604.3, 98978, 80012.7]
    },
    {
     "length": 262151,
     "align1": 0,
     "align2": 0,
     "timings": [179844, 197113, 184066, 192429, 146549]
    },
    {
     "length": 262159,
     "align1": 0,
     "align2": 3,
     "timings": [157043, 212988, 160545, 191674, 157602]
    },
    {
     "length": 262175,
     "align1": 3,
     "align2": 0,
     "timings": [165027, 199828, 159090, 191833, 158787]
    },
    {
     "length": 262207,
     "align1": 3,
     "align2": 5,
     "timings": [164956, 206744, 166331, 193132, 159041]
    },
    {
     "length": 524295,
     "align1": 0,
     "align2": 0,
     "timings": [533385, 574664, 562402, 551662, 493239]
    },
    {
     "length": 524303,
     "align1": 0,
     "align2": 3,
     "timings": [481687, 604455, 511358, 553130, 511505]
    },
    {
     "length": 524319,
     "align1": 3,
     "align2": 0,
     "timings": [490018, 568112, 492695, 550434, 514233]
    },
    {
     "length": 524351,
     "align1": 3,
     "align2": 5,
     "timings": [480925, 597437, 514106, 560834, 516341]
    },
    {
     "length": 1048583,
     "align1": 0,
     "align2": 0,
     "timings": [1.11891e+06, 1.21379e+06, 1.1737e+06, 1.23087e+06, 1.07554e+06]
    },
    {
     "length": 1048591,
     "align1": 0,
     "align2": 3,
     "timings": [1.04617e+06, 1.36087e+06, 1.25046e+06, 1.32489e+06, 1.13088e+06]
    },
    {
     "length": 1048607,
     "align1": 3,
     "align2": 0,
     "timings": [1.05295e+06, 1.21036e+06, 1.0852e+06, 1.20669e+06, 1.11625e+06]
    },
    {
     "length": 1048639,
     "align1": 3,
     "align2": 5,
     "timings": [1.0514e+06, 1.25004e+06, 1.06701e+06, 1.18965e+06, 1.116e+06]
    },
    {
     "length": 2097159,
     "align1": 0,
     "align2": 0,
     "timings": [2.69514e+06, 3.22031e+06, 3.1901e+06, 3.37276e+06, 2.35872e+06]
    },
    {
     "length": 2097167,
     "align1": 0,
     "align2": 3,
     "timings": [2.20282e+06, 2.80237e+06, 2.98769e+06, 3.20854e+06, 2.46728e+06]
    },
    {
     "length": 2097183,
     "align1": 3,
     "align2": 0,
     "timings": [2.17914e+06, 2.68061e+06, 3.18438e+06, 3.20131e+06, 2.427e+06]
    },
    {
     "length": 2097215,
     "align1": 3,
     "align2": 5,
     "timings": [2.13129e+06, 2.54599e+06, 2.28398e+06, 2.69756e+06, 2.31616e+06]
    },
    {
     "length": 4194311,
     "align1": 0,
     "align2": 0,
     "timings": [6.44985e+06, 6.84935e+06, 6.36142e+06, 6.6896e+06, 9.85727e+06]
    },
    {
     "length": 4194319,
     "align1": 0,
     "align2": 3,
     "timings": [9.1533e+06, 7.40558e+06, 7.21224e+06, 1.01661e+07, 9.91204e+06]
    },
    {
     "length": 4194335,
     "align1": 3,
     "align2": 0,
     "timings": [8.63271e+06, 6.38308e+06, 6.37415e+06, 6.67057e+06, 9.51175e+06]
    },
    {
     "length": 4194367,
     "align1": 3,
     "align2": 5,
     "timings": [8.59695e+06, 6.66938e+06, 6.48887e+06, 7.43697e+06, 9.84484e+06]
    },
    {
     "length": 8388615,
     "align1": 0,
     "align2": 0,
     "timings": [1.81105e+07, 1.96478e+07, 1.91947e+07, 1.86411e+07, 2.54114e+07]
    },
    {
     "length": 8388623,
     "align1": 0,
     "align2": 3,
     "timings": [2.33228e+07, 2.3391e+07, 2.14993e+07, 2.59313e+07, 2.83967e+07]
    },
    {
     "length": 8388639,
     "align1": 3,
     "align2": 0,
     "timings": [2.4374e+07, 2.49625e+07, 2.00963e+07, 1.8503e+07, 2.82517e+07]
    },
    {
     "length": 8388671,
     "align1": 3,
     "align2": 5,
     "timings": [2.33218e+07, 2.39182e+07, 2.1584e+07, 2.00245e+07, 2.83425e+07]
    },
    {
     "length": 16777223,
     "align1": 0,
     "align2": 0,
     "timings": [4.03404e+07, 4.96037e+07, 5.23379e+07, 5.04445e+07, 5.11504e+07]
    },
    {
     "length": 16777231,
     "align1": 0,
     "align2": 3,
     "timings": [4.69308e+07, 6.2349e+07, 4.98645e+07, 5.77437e+07, 5.71984e+07]
    },
    {
     "length": 16777247,
     "align1": 3,
     "align2": 0,
     "timings": [4.88141e+07, 6.08496e+07, 4.51228e+07, 4.58737e+07, 5.72227e+07]
    },
    {
     "length": 16777279,
     "align1": 3,
     "align2": 5,
     "timings": [4.6599e+07, 6.24816e+07, 4.97614e+07, 5.09817e+07, 5.72153e+07]
    },
    {
     "length": 33554439,
     "align1": 0,
     "align2": 0,
     "timings": [6.57336e+07, 8.45818e+07, 9.20476e+07, 8.58418e+07, 8.84407e+07]
    },
    {
     "length": 33554447,
     "align1": 0,
     "align2": 3,
     "timings": [7.87364e+07, 1.11608e+08, 8.69825e+07, 1.03096e+08, 1.01216e+08]
    },
    {
     "length": 33554463,
     "align1": 3,
     "align2": 0,
     "timings": [8.36701e+07, 1.08938e+08, 7.55594e+07, 8.45694e+07, 1.00481e+08]
    },
    {
     "length": 33554495,
     "align1": 3,
     "align2": 5,
     "timings": [7.87672e+07, 1.11732e+08, 8.68008e+07, 1.03159e+08, 1.01291e+08]
    }]
  }
 }
}
Adhemerval Zanella Netto - Oct. 5, 2017, 6:12 p.m.
On 05/10/2017 15:02, Adhemerval Zanella wrote:
> 
> 
> On 05/10/2017 13:49, David Miller wrote:
>> From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
>> Date: Thu,  5 Oct 2017 10:51:11 -0300
>>
>>> Both SPARC support multiarch platforms (sparcv9 and sparc64) have the
>>> a default assembly implemented memcpy.  Since it should not be any
>>> restriction about it them on the loader object and assuming they are
>>> faster than generic ones this patch uses them for rtld objects.
>>>
>>> Also, there is no indication neither on original patch [1] or in commit
>>> message why the generic one where used instead of the sparc optimized
>>> ones.
>>
>> The ultra1 memcpy is really an extremely non-ideal variant to use as
>> the default for anything.
>>
>> It's much slower on newer cpus, as the block loads and stores used in
>> the ultra1 version aren't optimized the same way they were in those
>> older chips.
>>
>> The C version is faster on newer cpus and definitely a better choice
>> as a default, especially because it doesn't use any cpu specific
>> instructions like the ultra1 variant does.
>>
>> In the Linux kernel we have an assembler version we use as the default
>> which doesn't use any special instructions.
> 
> Thanks for the explanation, although it does not explain why the ultra1
> is currently the default for sparc64 (sysdeps/sparc/sparc64/memcpy.S)
> and also the default selection for multiarch.  The C version is used
> solely for loader currently.
> 
> I tried to check which are the performance of C implementation against
> ultra1 one on a niagara5 and results are:
> 
>   - on bench-memcpy the C version is slight slower for sizes up to
>     32 (about 4% faster for sizes up to 16, 40% from 16 to 32 and
>     50% up to 32).  It is definitely faster for sizes higher than
>     64 (62% faster for sizes from 64 to 128 and 85% for sizes
>     higher than 128).
> 
>   - on bench-memcpy-random shows no performance difference, however
>     bench-memcpy-large shows the C implementation is indeed faster
>     for all inputs.
> 
> So I think that instead of using default memcpy for rtld, the best
> strategy would to use the C implementation instead as default and
> add ultra1 as another option for ifunc resolution.

One thing I forgot to ask is whether if you have any data points 
how slow the C implementation would be compared to current default
sparc64 memcpy.  Because one options would just remove it and use
the C as default without providing it as an option.
David Miller - Oct. 5, 2017, 6:26 p.m.
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Thu, 5 Oct 2017 15:02:02 -0300

> Thanks for the explanation, although it does not explain why the ultra1
> is currently the default for sparc64 (sysdeps/sparc/sparc64/memcpy.S)
> and also the default selection for multiarch.  The C version is used
> solely for loader currently.

I never got around to fixing up this situation on the glibc side,
that's why.

> I tried to check which are the performance of C implementation against
> ultra1 one on a niagara5 and results are:
> 
>   - on bench-memcpy the C version is slight slower for sizes up to
>     32 (about 4% faster for sizes up to 16, 40% from 16 to 32 and
>     50% up to 32).  It is definitely faster for sizes higher than
>     64 (62% faster for sizes from 64 to 128 and 85% for sizes
>     higher than 128).
> 
>   - on bench-memcpy-random shows no performance difference, however
>     bench-memcpy-large shows the C implementation is indeed faster
>     for all inputs.
> 
> So I think that instead of using default memcpy for rtld, the best
> strategy would to use the C implementation instead as default and
> add ultra1 as another option for ifunc resolution.

Yes, that's a good way to go.
David Miller - Oct. 5, 2017, 6:30 p.m.
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date: Thu, 5 Oct 2017 15:12:33 -0300

> One thing I forgot to ask is whether if you have any data points how
> slow the C implementation would be compared to current default
> sparc64 memcpy.  Because one options would just remove it and use
> the C as default without providing it as an option.

Well, on actual Ultra1/2/2e/2i chips, it is significantly faster
than the C implementation.

But in rtld the safest thing to do is use a simple memcpy that works
on every cpu, regardless of cpu caps.
Adhemerval Zanella Netto - Oct. 5, 2017, 6:45 p.m.
On 05/10/2017 15:30, David Miller wrote:
> From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> Date: Thu, 5 Oct 2017 15:12:33 -0300
> 
>> One thing I forgot to ask is whether if you have any data points how
>> slow the C implementation would be compared to current default
>> sparc64 memcpy.  Because one options would just remove it and use
>> the C as default without providing it as an option.
> 
> Well, on actual Ultra1/2/2e/2i chips, it is significantly faster
> than the C implementation.
> 
> But in rtld the safest thing to do is use a simple memcpy that works
> on every cpu, regardless of cpu caps.
> 

Right, I think we can live with it.  I withdrawn both patch 3 and 4
then.

Patch

diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S
new file mode 100644
index 0000000..8e524da
--- /dev/null
+++ b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.S
@@ -0,0 +1 @@ 
+#include <sysdeps/sparc/sparc32/sparcv9/memcpy.S>
diff --git a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c b/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c
deleted file mode 100644
index 304ad4e..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/multiarch/rtld-memcpy.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sparc64/multiarch/rtld-memcpy.c>
diff --git a/sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c b/sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c
deleted file mode 100644
index 6f8386b..0000000
--- a/sysdeps/sparc/sparc32/sparcv9/rtld-memcpy.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sparc64/rtld-memcpy.c>
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S b/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S
new file mode 100644
index 0000000..dc7e095
--- /dev/null
+++ b/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.S
@@ -0,0 +1 @@ 
+#include <sysdeps/sparc/sparc64/memcpy.S>
diff --git a/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c b/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c
deleted file mode 100644
index 2452575..0000000
--- a/sysdeps/sparc/sparc64/multiarch/rtld-memcpy.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include "../rtld-memcpy.c"
diff --git a/sysdeps/sparc/sparc64/rtld-memcpy.c b/sysdeps/sparc/sparc64/rtld-memcpy.c
deleted file mode 100644
index 52f8302..0000000
--- a/sysdeps/sparc/sparc64/rtld-memcpy.c
+++ /dev/null
@@ -1,3 +0,0 @@ 
-#define NO_MEMPCPY_STPCPY_REDIRECT
-#include <string/memcpy.c>
-#include <string/mempcpy.c>