Message ID | 20231116102950.2615051-1-bmahi496@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | powerpc : Add optimized memchr for POWER10 | expand |
Attached benchmark results file. Previously I have sent the memchr patch and benchmark results file as a series of patches.Please ignore those series of patches. On 16/11/23 3:59 pm, bmahi496@linux.ibm.com wrote: > From: MAHESH BODAPATI <bmahi496@linux.ibm.com> > > Optimized memchr for POWER10 based on existing rawmemchr and strlen. > movement of code,dead code elimination and loop unrolling helped in > getting better performance. > --- > sysdeps/powerpc/powerpc64/le/power10/memchr.S | 315 ++++++++++++++++++ > sysdeps/powerpc/powerpc64/multiarch/Makefile | 9 +- > .../powerpc64/multiarch/ifunc-impl-list.c | 6 + > .../powerpc64/multiarch/memchr-power10.S | 28 ++ > sysdeps/powerpc/powerpc64/multiarch/memchr.c | 20 +- > 5 files changed, 368 insertions(+), 10 deletions(-) > create mode 100644 sysdeps/powerpc/powerpc64/le/power10/memchr.S > create mode 100644 sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S > > diff --git a/sysdeps/powerpc/powerpc64/le/power10/memchr.S b/sysdeps/powerpc/powerpc64/le/power10/memchr.S > new file mode 100644 > index 0000000000..faf293f344 > --- /dev/null > +++ b/sysdeps/powerpc/powerpc64/le/power10/memchr.S > @@ -0,0 +1,315 @@ > +/* Optimized memchr implementation for POWER10 LE. > + Copyright (C) 2021-2023 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <https://www.gnu.org/licenses/>. */ > + > +#include <sysdep.h> > + > +# ifndef MEMCHR > +# define MEMCHR __memchr > +# endif > +# define M_VREG_ZERO v20 > +# define M_OFF_START_LOOP 256 > +# define MEMCHR_SUBTRACT_VECTORS \ > + vsububm v4,v4,v18; \ > + vsububm v5,v5,v18; \ > + vsububm v6,v6,v18; \ > + vsububm v7,v7,v18; > +# define M_TAIL(vreg,increment) \ > + vctzlsbb r4,vreg; \ > + cmpld r5,r4; \ > + ble L(null); \ > + addi r4,r4,increment; \ > + add r3,r6,r4; \ > + blr > + > +/* TODO: Replace macros by the actual instructions when minimum binutils becomes > + >= 2.35. This is used to keep compatibility with older versions. */ > +#define M_VEXTRACTBM(rt,vrb) \ > + .long(((4)<<(32-6)) \ > + | ((rt)<<(32-11)) \ > + | ((8)<<(32-16)) \ > + | ((vrb)<<(32-21)) \ > + | 1602) > + > +#define M_LXVP(xtp,dq,ra) \ > + .long(((6)<<(32-6)) \ > + | ((((xtp)-32)>>1)<<(32-10)) \ > + | ((1)<<(32-11)) \ > + | ((ra)<<(32-16)) \ > + | dq) > + > +#define CHECK16B(vreg,offset,addr,label) \ > + lxv vreg+32,offset(addr); \ > + vcmpequb. vreg,vreg,v18; \ > + bne cr6,L(label); \ > + cmpldi r5,16; \ > + ble L(null); \ > + addi r5,r5,-16; > + > +/* Load 4 quadwords, merge into one VR for speed and check for NULLs. r6 has # > + of bytes already checked. */ > +#define CHECK64B(offset,addr,label) \ > + M_LXVP(v4+32,offset,addr); \ > + M_LXVP(v6+32,offset+32,addr); \ > + MEMCHR_SUBTRACT_VECTORS; \ > + vminub v14,v4,v5; \ > + vminub v15,v6,v7; \ > + vminub v16,v14,v15; \ > + vcmpequb. v0,v16,M_VREG_ZERO; \ > + beq cr6,$+12; \ > + li r7,offset; \ > + b L(label); \ > + cmpldi r5,64; \ > + ble L(null); \ > + addi r5,r5,-64 > + > +/* Implements the function > + void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5]). */ > + > + .machine power9 > + > +ENTRY_TOCLESS (MEMCHR) > + CALL_MCOUNT 3 > + > + cmpldi r5,0 > + beq L(null) > + mr r0,r5 > + xori r6,r4,0xff > + > + mtvsrd v18+32,r4 /* matching char in v18 */ > + mtvsrd v19+32,r6 /* non matching char in v19 */ > + > + vspltb v18,v18,7 /* replicate */ > + vspltb v19,v19,7 /* replicate */ > + vspltisb M_VREG_ZERO,0 > + > + /* Next 16B-aligned address. Prepare address for L(aligned). */ > + addi r6,r3,16 > + clrrdi r6,r6,4 > + > + /* Align data and fill bytes not loaded with non matching char. */ > + lvx v0,0,r3 > + lvsr v1,0,r3 > + vperm v0,v19,v0,v1 > + > + vcmpequb. v6,v0,v18 > + bne cr6,L(found) > + sub r4,r6,r3 > + cmpld r5,r4 > + ble L(null) > + sub r5,r5,r4 > + > + /* Test up to OFF_START_LOOP-16 bytes in 16B chunks. The main loop is > + optimized for longer strings, so checking the first bytes in 16B > + chunks benefits a lot small strings. */ > + .p2align 5 > +L(aligned): > + cmpldi r5,0 > + beq L(null) > + > + CHECK16B(v0,0,r6,tail1) > + CHECK16B(v1,16,r6,tail2) > + CHECK16B(v2,32,r6,tail3) > + CHECK16B(v3,48,r6,tail4) > + CHECK16B(v4,64,r6,tail5) > + CHECK16B(v5,80,r6,tail6) > + CHECK16B(v6,96,r6,tail7) > + CHECK16B(v7,112,r6,tail8) > + CHECK16B(v8,128,r6,tail9) > + CHECK16B(v9,144,r6,tail10) > + CHECK16B(v10,160,r6,tail11) > + CHECK16B(v0,176,r6,tail12) > + CHECK16B(v1,192,r6,tail13) > + CHECK16B(v2,208,r6,tail14) > + CHECK16B(v3,224,r6,tail15) > + > + cmpdi cr5,r4,0 /* Check if c == 0. This will be useful to > + choose how we will perform the main loop. */ > + > + /* Prepare address for the loop. */ > + addi r4,r3,M_OFF_START_LOOP > + clrrdi r4,r4,6 > + sub r6,r4,r3 > + sub r5,r0,r6 > + addi r6,r4,128 > + > + /* If c == 0, use the loop without the vsububm. */ > + beq cr5,L(loop) > + > + /* This is very similar to the block after L(loop), the difference is > + that here MEMCHR_SUBTRACT_VECTORS is not empty, and we subtract > + each byte loaded by the char we are looking for, this way we can keep > + using vminub to merge the results and checking for nulls. */ > + .p2align 5 > +L(memchr_loop): > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + b L(memchr_loop) > + /* Switch to a more aggressive approach checking 64B each time. Use 2 > + pointers 128B apart and unroll the loop once to make the pointer > + updates and usages separated enough to avoid stalls waiting for > + address calculation. */ > + .p2align 5 > +L(loop): > +#undef MEMCHR_SUBTRACT_VECTORS > +#define MEMCHR_SUBTRACT_VECTORS /* nothing */ > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + b L(loop) > + > + .p2align 5 > +L(pre_tail_64b): > + mr r6,r4 > +L(tail_64b): > + /* OK, we found a null byte. Let's look for it in the current 64-byte > + block and mark it in its corresponding VR. lxvp vx,0(ry) puts the > + low 16B bytes into vx+1, and the high into vx, so the order here is > + v5, v4, v7, v6. */ > + vcmpequb v1,v5,M_VREG_ZERO > + vcmpequb v2,v4,M_VREG_ZERO > + vcmpequb v3,v7,M_VREG_ZERO > + vcmpequb v4,v6,M_VREG_ZERO > + > + /* Take into account the other 64B blocks we had already checked. */ > + add r6,r6,r7 > + /* Extract first bit of each byte. */ > + M_VEXTRACTBM(r8,v1) > + M_VEXTRACTBM(r9,v2) > + M_VEXTRACTBM(r10,v3) > + M_VEXTRACTBM(r11,v4) > + > + /* Shift each value into their corresponding position. */ > + sldi r9,r9,16 > + sldi r10,r10,32 > + sldi r11,r11,48 > + > + /* Merge the results. */ > + or r8,r8,r9 > + or r9,r10,r11 > + or r11,r9,r8 > + > + cnttzd r0,r11 /* Count trailing zeros before the match. */ > + cmpld r5,r0 > + ble L(null) > + add r3,r6,r0 /* Compute final address. */ > + blr > + > + .p2align 5 > +L(tail1): > + M_TAIL(v0,0) > + > + .p2align 5 > +L(tail2): > + M_TAIL(v1,16) > + > + .p2align 5 > +L(tail3): > + M_TAIL(v2,32) > + > + .p2align 5 > +L(tail4): > + M_TAIL(v3,48) > + > + .p2align 5 > +L(tail5): > + M_TAIL(v4,64) > + > + .p2align 5 > +L(tail6): > + M_TAIL(v5,80) > + > + .p2align 5 > +L(tail7): > + M_TAIL(v6,96) > + > + .p2align 5 > +L(tail8): > + M_TAIL(v7,112) > + > + .p2align 5 > +L(tail9): > + M_TAIL(v8,128) > + > + .p2align 5 > +L(tail10): > + M_TAIL(v9,144) > + > + .p2align 5 > +L(tail11): > + M_TAIL(v10,160) > + > + .p2align 5 > +L(tail12): > + M_TAIL(v0,176) > + > + .p2align 5 > +L(tail13): > + M_TAIL(v1,192) > + > + .p2align 5 > +L(tail14): > + M_TAIL(v2,208) > + > + .p2align 5 > +L(tail15): > + M_TAIL(v3,224) > + > + .p2align 5 > +L(found): > + vctzlsbb r7,v6 > + cmpld r5,r7 > + ble L(null) > + add r3,r3,r7 > + blr > + > + .p2align 5 > +L(null): > + li r3,0 > + blr > + > +END (MEMCHR) > + > +weak_alias (__memchr, memchr) > +libc_hidden_builtin_def (memchr) > diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile > index 27d8495503..eb3d72a11c 100644 > --- a/sysdeps/powerpc/powerpc64/multiarch/Makefile > +++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile > @@ -31,10 +31,11 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ > strncase-power8 > > ifneq (,$(filter %le,$(config-machine))) > -sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \ > - rawmemchr-power9 rawmemchr-power10 \ > - strcmp-power9 strncmp-power9 strcpy-power9 stpcpy-power9 \ > - strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 > +sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \ > + memmove-power10 memset-power10 rawmemchr-power9 \ > + rawmemchr-power10 strcmp-power9 strncmp-power9 \ > + strcpy-power9 stpcpy-power9 strlen-power9 strncpy-power9 \ > + stpncpy-power9 strlen-power10 > endif > CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops > CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops > diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c > index fc26dd0e17..b353ca4c3a 100644 > --- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c > +++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c > @@ -226,6 +226,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > > /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */ > IFUNC_IMPL (i, name, memchr, > +#ifdef __LITTLE_ENDIAN__ > + IFUNC_IMPL_ADD (array, i, memchr, > + hwcap2 & PPC_FEATURE2_ARCH_3_1 > + && hwcap & PPC_FEATURE_HAS_VSX, > + __memchr_power10) > +#endif > IFUNC_IMPL_ADD (array, i, memchr, > hwcap2 & PPC_FEATURE2_ARCH_2_07 > && hwcap & PPC_FEATURE_HAS_ALTIVEC, > diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S > new file mode 100644 > index 0000000000..b9ed792676 > --- /dev/null > +++ b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S > @@ -0,0 +1,28 @@ > +/* Optimized memchr implementation for POWER10/PPC64. > + Copyright (C) 2016-2023 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <https://www.gnu.org/licenses/>. */ > + > +#if defined __LITTLE_ENDIAN__ && IS_IN (libc) > +#define MEMCHR __memchr_power10 > + > +#undef libc_hidden_builtin_def > +#define libc_hidden_builtin_def(name) > +#undef weak_alias > +#define weak_alias(name,alias) > + > +#include <sysdeps/powerpc/powerpc64/le/power10/memchr.S> > +#endif > diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c > index a1a8f3eedd..dbb30fe51d 100644 > --- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c > +++ b/sysdeps/powerpc/powerpc64/multiarch/memchr.c > @@ -25,15 +25,23 @@ extern __typeof (__memchr) __memchr_ppc attribute_hidden; > extern __typeof (__memchr) __memchr_power7 attribute_hidden; > extern __typeof (__memchr) __memchr_power8 attribute_hidden; > > +# ifdef __LITTLE_ENDIAN__ > +extern __typeof (__memchr) __memchr_power10 attribute_hidden; > +# endif > /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle > ifunc symbol properly. */ > libc_ifunc (__memchr, > - (hwcap2 & PPC_FEATURE2_ARCH_2_07 > - && hwcap & PPC_FEATURE_HAS_ALTIVEC) > - ? __memchr_power8 : > - (hwcap & PPC_FEATURE_ARCH_2_06) > - ? __memchr_power7 > - : __memchr_ppc); > +# ifdef __LITTLE_ENDIAN__ > + (hwcap2 & PPC_FEATURE2_ARCH_3_1 > + && hwcap & PPC_FEATURE_HAS_VSX) > + ? __memchr_power10 : > +# endif > + (hwcap2 & PPC_FEATURE2_ARCH_2_07 > + && hwcap & PPC_FEATURE_HAS_ALTIVEC) > + ? __memchr_power8 : > + (hwcap & PPC_FEATURE_ARCH_2_06) > + ? __memchr_power7 > + : __memchr_ppc); > > weak_alias (__memchr, memchr) > libc_hidden_builtin_def (memchr) Function: memchr Variant: __memchr_power10 __memchr_power8 ======================================================================================================================== align=0, pos=32, len=2048, seek_char=23, invert_pos=0: 1.47 ( 42.59%) 2.57 align=1, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.69%) 3.83 align=0, pos=32, len=2048, seek_char=0, invert_pos=0: 1.47 ( 40.18%) 2.46 align=1, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.66%) 3.83 align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.39%) 2.98 align=0, pos=64, len=2048, seek_char=23, invert_pos=0: 1.93 ( 34.41%) 2.94 align=2, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.67%) 3.83 align=0, pos=64, len=2048, seek_char=0, invert_pos=0: 1.93 ( 37.61%) 3.09 align=2, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.63%) 3.82 align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.23%) 2.97 align=0, pos=128, len=2048, seek_char=23, invert_pos=0: 2.95 ( 17.04%) 3.55 align=3, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.66%) 3.83 align=0, pos=128, len=2048, seek_char=0, invert_pos=0: 2.95 ( 27.55%) 4.07 align=3, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.62%) 3.82 align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.21%) 2.97 align=0, pos=256, len=2048, seek_char=23, invert_pos=0: 5.81 ( -8.78%) 5.34 align=4, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 50.39%) 3.88 align=0, pos=256, len=2048, seek_char=0, invert_pos=0: 5.80 ( -4.27%) 5.57 align=4, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.68%) 3.83 align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.31%) 2.98 align=0, pos=512, len=2048, seek_char=23, invert_pos=0: 7.76 (-10.27%) 7.04 align=5, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.65%) 3.83 align=0, pos=512, len=2048, seek_char=0, invert_pos=0: 7.76 (-10.36%) 7.03 align=5, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.63%) 3.83 align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.27%) 2.98 align=0, pos=1024, len=2048, seek_char=23, invert_pos=0: 11.50 ( -4.86%) 10.97 align=6, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.62%) 3.82 align=0, pos=1024, len=2048, seek_char=0, invert_pos=0: 11.50 ( -4.80%) 10.98 align=6, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.66%) 3.83 align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.25%) 2.98 align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.15%) 17.05 align=7, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.65%) 3.83 align=0, pos=2048, len=2048, seek_char=0, invert_pos=0: 18.17 ( -7.68%) 16.88 align=7, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.65%) 3.83 align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.17%) 2.97 align=1, pos=32, len=192, seek_char=23, invert_pos=0: 1.48 ( 40.16%) 2.47 align=1, pos=32, len=192, seek_char=0, invert_pos=0: 1.48 ( 40.14%) 2.47 align=1, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 40.06%) 2.47 align=1, pos=32, len=256, seek_char=0, invert_pos=0: 1.48 ( 40.17%) 2.47 align=1, pos=32, len=512, seek_char=23, invert_pos=0: 1.48 ( 40.21%) 2.47 align=1, pos=32, len=512, seek_char=0, invert_pos=0: 1.48 ( 40.12%) 2.47 align=65521, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 50.27%) 2.98 align=2, pos=64, len=192, seek_char=23, invert_pos=0: 1.93 ( 49.64%) 3.83 align=2, pos=64, len=192, seek_char=0, invert_pos=0: 1.93 ( 49.70%) 3.83 align=2, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.66%) 3.83 align=2, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.67%) 3.83 align=2, pos=64, len=512, seek_char=23, invert_pos=0: 1.93 ( 49.63%) 3.83 align=2, pos=64, len=512, seek_char=0, invert_pos=0: 1.93 ( 49.63%) 3.83 align=65521, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 35.23%) 2.97 align=3, pos=96, len=192, seek_char=23, invert_pos=0: 2.44 ( 36.31%) 3.83 align=3, pos=96, len=192, seek_char=0, invert_pos=0: 2.44 ( 36.31%) 3.82 align=3, pos=96, len=256, seek_char=23, invert_pos=0: 2.44 ( 36.35%) 3.83 align=3, pos=96, len=256, seek_char=0, invert_pos=0: 2.44 ( 36.33%) 3.83 align=3, pos=96, len=512, seek_char=23, invert_pos=0: 2.44 ( 36.35%) 3.83 align=3, pos=96, len=512, seek_char=0, invert_pos=0: 2.43 ( 36.32%) 3.82 align=65521, pos=96, len=256, seek_char=23, invert_pos=0: 2.44 ( 31.33%) 3.55 align=4, pos=128, len=192, seek_char=23, invert_pos=0: 2.95 ( 33.41%) 4.43 align=4, pos=128, len=192, seek_char=0, invert_pos=0: 2.95 ( 33.42%) 4.43 align=4, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 33.42%) 4.43 align=4, pos=128, len=256, seek_char=0, invert_pos=0: 2.95 ( 33.40%) 4.43 align=4, pos=128, len=512, seek_char=23, invert_pos=0: 2.95 ( 33.43%) 4.43 align=4, pos=128, len=512, seek_char=0, invert_pos=0: 2.95 ( 33.46%) 4.43 align=65521, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 16.84%) 3.54 align=5, pos=160, len=192, seek_char=23, invert_pos=0: 3.46 ( 21.81%) 4.43 align=5, pos=160, len=192, seek_char=0, invert_pos=0: 3.46 ( 21.83%) 4.43 align=5, pos=160, len=256, seek_char=23, invert_pos=0: 3.46 ( 21.81%) 4.43 align=5, pos=160, len=256, seek_char=0, invert_pos=0: 3.46 ( 21.77%) 4.42 align=5, pos=160, len=512, seek_char=23, invert_pos=0: 3.46 ( 21.89%) 4.43 align=5, pos=160, len=512, seek_char=0, invert_pos=0: 3.46 ( 21.84%) 4.43 align=65521, pos=160, len=256, seek_char=23, invert_pos=0: 6.83 (-30.73%) 5.22 align=6, pos=192, len=192, seek_char=23, invert_pos=0: 3.97 ( 10.39%) 4.44 align=6, pos=192, len=192, seek_char=0, invert_pos=0: 3.97 ( 10.39%) 4.43 align=6, pos=192, len=256, seek_char=23, invert_pos=0: 3.97 ( 21.26%) 5.05 align=6, pos=192, len=256, seek_char=0, invert_pos=0: 3.97 ( 21.38%) 5.05 align=6, pos=192, len=512, seek_char=23, invert_pos=0: 3.97 ( 21.22%) 5.04 align=6, pos=192, len=512, seek_char=0, invert_pos=0: 3.97 ( 21.22%) 5.04 align=65521, pos=192, len=256, seek_char=23, invert_pos=0: 3.97 ( 3.49%) 4.12 align=7, pos=224, len=192, seek_char=23, invert_pos=0: 3.97 ( 10.37%) 4.43 align=7, pos=224, len=192, seek_char=0, invert_pos=0: 3.97 ( 10.20%) 4.43 align=7, pos=224, len=256, seek_char=23, invert_pos=0: 4.49 ( 10.96%) 5.04 align=7, pos=224, len=256, seek_char=0, invert_pos=0: 4.49 ( 10.88%) 5.03 align=7, pos=224, len=512, seek_char=23, invert_pos=0: 4.49 ( 10.89%) 5.03 align=7, pos=224, len=512, seek_char=0, invert_pos=0: 4.49 ( 10.87%) 5.03 align=65521, pos=224, len=256, seek_char=23, invert_pos=0: 4.48 ( 1.05%) 4.53 align=0, pos=1, len=2, seek_char=23, invert_pos=0: 0.91 ( 39.10%) 1.50 align=0, pos=1, len=2, seek_char=0, invert_pos=0: 0.91 ( 38.78%) 1.49 align=1, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 30.50%) 1.49 align=1, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 33.34%) 1.55 align=0, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.34%) 1.03 align=0, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 (-13.29%) 1.03 align=1, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.41%) 1.03 align=1, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 ( 40.45%) 1.95 align=32768, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 28.84%) 1.45 align=32768, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 33.32%) 1.55 align=32769, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 33.33%) 1.55 align=32769, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 33.35%) 1.55 align=32768, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.33%) 1.03 align=32768, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 (-13.40%) 1.03 align=32769, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.39%) 1.03 align=32769, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 ( 40.42%) 1.95 align=65521, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 ( 40.39%) 1.95 align=65521, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 ( 40.30%) 1.95 align=65521, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 53.14%) 2.21 align=65521, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 30.57%) 1.49 align=0, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 28.84%) 1.45 align=0, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.31%) 1.55 align=2, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 33.29%) 1.55 align=2, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55 align=0, pos=2, len=1, seek_char=23, invert_pos=0: 0.91 ( 38.90%) 1.50 align=0, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 24.96%) 1.55 align=2, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 25.03%) 1.55 align=2, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55 align=32768, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 33.30%) 1.55 align=32768, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.38%) 1.55 align=32770, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 33.33%) 1.55 align=32770, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.37%) 1.55 align=32768, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 24.96%) 1.55 align=32768, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 25.01%) 1.55 align=32770, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 25.04%) 1.55 align=32770, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 24.96%) 1.55 align=65521, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 25.00%) 1.55 align=65521, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 25.05%) 1.55 align=65521, pos=2, len=3, seek_char=23, invert_pos=0: 1.04 ( 33.27%) 1.55 align=65521, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55 align=0, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55 align=0, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55 align=3, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.29%) 1.55 align=3, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55 align=0, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 24.98%) 1.55 align=0, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 24.96%) 1.55 align=3, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 24.95%) 1.55 align=3, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.03%) 1.55 align=32768, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55 align=32768, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55 align=32771, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55 align=32771, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.31%) 1.55 align=32768, pos=3, len=2, seek_char=23, invert_pos=0: 1.43 ( 7.92%) 1.55 align=32768, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55 align=32771, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 25.03%) 1.55 align=32771, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.01%) 1.55 align=65521, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 25.01%) 1.55 align=65521, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.01%) 1.55 align=65521, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.35%) 1.55 align=65521, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.30%) 1.55 align=0, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55 align=0, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55 align=4, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 38.09%) 1.67 align=4, pos=4, len=5, seek_char=0, invert_pos=0: 0.91 ( 45.26%) 1.66 align=0, pos=4, len=3, seek_char=23, invert_pos=0: 1.43 ( 4.54%) 1.50 align=0, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55 align=4, pos=4, len=3, seek_char=23, invert_pos=0: 1.16 ( 24.98%) 1.55 align=4, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 25.05%) 1.55 align=32768, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 33.35%) 1.55 align=32768, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55 align=32772, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 37.80%) 1.66 align=32772, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64 align=32768, pos=4, len=3, seek_char=23, invert_pos=0: 1.43 ( 4.47%) 1.50 align=32768, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55 align=32772, pos=4, len=3, seek_char=23, invert_pos=0: 1.16 ( 25.02%) 1.55 align=32772, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 25.08%) 1.55 align=65521, pos=4, len=3, seek_char=23, invert_pos=0: 1.16 ( 25.01%) 1.55 align=65521, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55 align=65521, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55 align=65521, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 33.31%) 1.55 align=0, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 33.32%) 1.55 align=0, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 33.39%) 1.55 align=5, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 37.80%) 1.66 align=5, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 36.97%) 1.64 align=0, pos=5, len=4, seek_char=23, invert_pos=0: 1.43 ( 4.39%) 1.49 align=0, pos=5, len=4, seek_char=0, invert_pos=0: 1.43 ( 7.92%) 1.55 align=5, pos=5, len=4, seek_char=23, invert_pos=0: 1.43 ( 15.84%) 1.70 align=5, pos=5, len=4, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70 align=32768, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 28.94%) 1.46 align=32768, pos=5, len=6, seek_char=0, invert_pos=0: 1.23 ( 17.46%) 1.49 align=32773, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 38.08%) 1.67 align=32773, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 36.97%) 1.64 align=32768, pos=5, len=4, seek_char=23, invert_pos=0: 1.16 ( 22.15%) 1.49 align=32768, pos=5, len=4, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55 align=32773, pos=5, len=4, seek_char=23, invert_pos=0: 1.16 ( 31.50%) 1.70 align=32773, pos=5, len=4, seek_char=0, invert_pos=0: 1.16 ( 31.43%) 1.70 align=65521, pos=5, len=4, seek_char=23, invert_pos=0: 1.16 ( 22.23%) 1.50 align=65521, pos=5, len=4, seek_char=0, invert_pos=0: 1.16 ( 24.97%) 1.55 align=65521, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 33.30%) 1.55 align=65521, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 33.35%) 1.55 align=0, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55 align=0, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 33.36%) 1.55 align=6, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 37.78%) 1.66 align=6, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 36.96%) 1.64 align=0, pos=6, len=5, seek_char=23, invert_pos=0: 1.43 ( 4.42%) 1.49 align=0, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55 align=6, pos=6, len=5, seek_char=23, invert_pos=0: 1.16 ( 31.40%) 1.70 align=6, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 31.44%) 1.70 align=32768, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 28.96%) 1.46 align=32768, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55 align=32774, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 36.90%) 1.64 align=32774, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 36.96%) 1.64 align=32768, pos=6, len=5, seek_char=23, invert_pos=0: 1.43 ( 4.43%) 1.49 align=32768, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55 align=32774, pos=6, len=5, seek_char=23, invert_pos=0: 1.16 ( 31.46%) 1.70 align=32774, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 31.46%) 1.70 align=65521, pos=6, len=5, seek_char=23, invert_pos=0: 1.16 ( 22.26%) 1.50 align=65521, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 24.98%) 1.55 align=65521, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55 align=65521, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55 align=0, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 33.28%) 1.55 align=0, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 33.28%) 1.55 align=7, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 37.81%) 1.66 align=7, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64 align=0, pos=7, len=6, seek_char=23, invert_pos=0: 1.43 ( 4.49%) 1.50 align=0, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 25.04%) 1.55 align=7, pos=7, len=6, seek_char=23, invert_pos=0: 1.16 ( 31.45%) 1.70 align=7, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 31.46%) 1.70 align=32768, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 28.90%) 1.45 align=32768, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 33.36%) 1.55 align=32775, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 37.75%) 1.66 align=32775, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 38.06%) 1.67 align=32768, pos=7, len=6, seek_char=23, invert_pos=0: 1.43 ( 4.34%) 1.49 align=32768, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55 align=32775, pos=7, len=6, seek_char=23, invert_pos=0: 1.16 ( 31.46%) 1.70 align=32775, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 31.42%) 1.70 align=65521, pos=7, len=6, seek_char=23, invert_pos=0: 1.16 ( 22.20%) 1.50 align=65521, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55 align=65521, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 36.93%) 1.64 align=65521, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 36.86%) 1.64 align=0, pos=8, len=9, seek_char=23, invert_pos=0: 1.03 ( 36.93%) 1.64 align=0, pos=8, len=9, seek_char=0, invert_pos=0: 1.03 ( 38.07%) 1.67 align=8, pos=8, len=9, seek_char=23, invert_pos=0: 1.28 ( 22.06%) 1.64 align=8, pos=8, len=9, seek_char=0, invert_pos=0: 1.30 ( 20.60%) 1.64 align=0, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 ( 4.32%) 1.49 align=0, pos=8, len=7, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55 align=8, pos=8, len=7, seek_char=23, invert_pos=0: 1.16 ( 24.99%) 1.55 align=8, pos=8, len=7, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55 align=32768, pos=8, len=9, seek_char=23, invert_pos=0: 1.03 ( 36.91%) 1.64 align=32768, pos=8, len=9, seek_char=0, invert_pos=0: 1.03 ( 38.11%) 1.67 align=32776, pos=8, len=9, seek_char=23, invert_pos=0: 1.30 ( 21.94%) 1.67 align=32776, pos=8, len=9, seek_char=0, invert_pos=0: 1.30 ( 22.03%) 1.67 align=32768, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 ( 4.50%) 1.50 align=32768, pos=8, len=7, seek_char=0, invert_pos=0: 1.43 ( 7.89%) 1.55 align=32776, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 ( 7.94%) 1.55 align=32776, pos=8, len=7, seek_char=0, invert_pos=0: 1.43 ( 7.88%) 1.55 align=65521, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 (-29.96%) 1.10 align=65521, pos=8, len=7, seek_char=0, invert_pos=0: 1.43 ( -9.59%) 1.30 align=65521, pos=8, len=9, seek_char=23, invert_pos=0: 1.03 ( 36.90%) 1.64 align=65521, pos=8, len=9, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64 align=0, pos=9, len=10, seek_char=23, invert_pos=0: 1.03 ( 38.08%) 1.67 align=0, pos=9, len=10, seek_char=0, invert_pos=0: 1.03 ( 39.15%) 1.70 align=9, pos=9, len=10, seek_char=23, invert_pos=0: 1.30 ( 20.44%) 1.64 align=9, pos=9, len=10, seek_char=0, invert_pos=0: 1.30 ( 21.67%) 1.66 align=0, pos=9, len=8, seek_char=23, invert_pos=0: 3.44 ( 2.58%) 3.53 align=0, pos=9, len=8, seek_char=0, invert_pos=0: 3.60 ( -4.96%) 3.43 align=9, pos=9, len=8, seek_char=23, invert_pos=0: 3.98 ( 9.48%) 4.39 align=9, pos=9, len=8, seek_char=0, invert_pos=0: 1.22 ( 45.64%) 2.24 align=32768, pos=9, len=10, seek_char=23, invert_pos=0: 1.80 ( -9.63%) 1.64 align=32768, pos=9, len=10, seek_char=0, invert_pos=0: 0.91 ( 45.22%) 1.66 align=32777, pos=9, len=10, seek_char=23, invert_pos=0: 1.30 ( 20.49%) 1.64 align=32777, pos=9, len=10, seek_char=0, invert_pos=0: 1.46 ( 10.78%) 1.64 align=32768, pos=9, len=8, seek_char=23, invert_pos=0: 0.91 ( 16.49%) 1.09 align=32768, pos=9, len=8, seek_char=0, invert_pos=0: 1.16 ( -4.55%) 1.11 align=32777, pos=9, len=8, seek_char=23, invert_pos=0: 1.42 ( 16.55%) 1.70 align=32777, pos=9, len=8, seek_char=0, invert_pos=0: 1.42 ( 16.53%) 1.70 align=65521, pos=9, len=8, seek_char=23, invert_pos=0: 1.16 ( 31.40%) 1.70 align=65521, pos=9, len=8, seek_char=0, invert_pos=0: 1.16 ( 31.51%) 1.70 align=65521, pos=9, len=10, seek_char=23, invert_pos=0: 0.91 ( 46.40%) 1.70 align=65521, pos=9, len=10, seek_char=0, invert_pos=0: 0.91 ( 45.46%) 1.67 align=0, pos=10, len=11, seek_char=23, invert_pos=0: 0.91 ( 44.49%) 1.64 align=0, pos=10, len=11, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64 align=10, pos=10, len=11, seek_char=23, invert_pos=0: 1.30 ( 21.95%) 1.67 align=10, pos=10, len=11, seek_char=0, invert_pos=0: 1.30 ( 21.99%) 1.67 align=0, pos=10, len=9, seek_char=23, invert_pos=0: 1.68 ( 0.68%) 1.70 align=0, pos=10, len=9, seek_char=0, invert_pos=0: 1.62 ( 4.40%) 1.70 align=10, pos=10, len=9, seek_char=23, invert_pos=0: 1.42 ( 16.56%) 1.70 align=10, pos=10, len=9, seek_char=0, invert_pos=0: 1.42 ( 16.57%) 1.70 align=32768, pos=10, len=11, seek_char=23, invert_pos=0: 1.03 ( 38.10%) 1.67 align=32768, pos=10, len=11, seek_char=0, invert_pos=0: 1.03 ( 39.15%) 1.70 align=32778, pos=10, len=11, seek_char=23, invert_pos=0: 1.30 ( 21.98%) 1.67 align=32778, pos=10, len=11, seek_char=0, invert_pos=0: 1.30 ( 22.01%) 1.67 align=32768, pos=10, len=9, seek_char=23, invert_pos=0: 1.85 ( -2.22%) 1.81 align=32768, pos=10, len=9, seek_char=0, invert_pos=0: 1.16 ( 31.47%) 1.70 align=32778, pos=10, len=9, seek_char=23, invert_pos=0: 1.42 ( 16.41%) 1.70 align=32778, pos=10, len=9, seek_char=0, invert_pos=0: 1.42 ( 28.00%) 1.97 align=65521, pos=10, len=9, seek_char=23, invert_pos=0: 1.16 ( 31.36%) 1.70 align=65521, pos=10, len=9, seek_char=0, invert_pos=0: 1.16 ( 31.44%) 1.70 align=65521, pos=10, len=11, seek_char=23, invert_pos=0: 1.03 ( 36.95%) 1.64 align=65521, pos=10, len=11, seek_char=0, invert_pos=0: 1.03 ( 36.85%) 1.64 align=0, pos=11, len=12, seek_char=23, invert_pos=0: 1.03 ( 36.92%) 1.64 align=0, pos=11, len=12, seek_char=0, invert_pos=0: 1.03 ( 37.78%) 1.66 align=11, pos=11, len=12, seek_char=23, invert_pos=0: 1.30 ( 20.49%) 1.64 align=11, pos=11, len=12, seek_char=0, invert_pos=0: 1.30 ( 20.54%) 1.64 align=0, pos=11, len=10, seek_char=23, invert_pos=0: 1.68 ( 0.73%) 1.70 align=0, pos=11, len=10, seek_char=0, invert_pos=0: 1.68 ( 0.72%) 1.70 align=11, pos=11, len=10, seek_char=23, invert_pos=0: 1.42 ( 16.43%) 1.70 align=11, pos=11, len=10, seek_char=0, invert_pos=0: 1.42 ( 16.56%) 1.70 align=32768, pos=11, len=12, seek_char=23, invert_pos=0: 1.03 ( 38.06%) 1.67 align=32768, pos=11, len=12, seek_char=0, invert_pos=0: 1.03 ( 36.89%) 1.64 align=32779, pos=11, len=12, seek_char=23, invert_pos=0: 1.30 ( 23.29%) 1.70 align=32779, pos=11, len=12, seek_char=0, invert_pos=0: 1.30 ( 21.95%) 1.67 align=32768, pos=11, len=10, seek_char=23, invert_pos=0: 1.68 ( 0.73%) 1.70 align=32768, pos=11, len=10, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70 align=32779, pos=11, len=10, seek_char=23, invert_pos=0: 1.69 ( 0.64%) 1.70 align=32779, pos=11, len=10, seek_char=0, invert_pos=0: 1.68 ( 0.68%) 1.70 align=65521, pos=11, len=10, seek_char=23, invert_pos=0: 1.43 ( 15.79%) 1.70 align=65521, pos=11, len=10, seek_char=0, invert_pos=0: 1.43 ( 15.77%) 1.70 align=65521, pos=11, len=12, seek_char=23, invert_pos=0: 1.03 ( 36.94%) 1.64 align=65521, pos=11, len=12, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64 align=0, pos=12, len=13, seek_char=23, invert_pos=0: 1.03 ( 36.91%) 1.64 align=0, pos=12, len=13, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64 align=12, pos=12, len=13, seek_char=23, invert_pos=0: 1.30 ( 31.08%) 1.89 align=12, pos=12, len=13, seek_char=0, invert_pos=0: 1.30 ( 31.04%) 1.89 align=0, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.82%) 1.70 align=0, pos=12, len=11, seek_char=0, invert_pos=0: 1.43 ( 15.74%) 1.70 align=12, pos=12, len=11, seek_char=23, invert_pos=0: 1.42 ( 16.52%) 1.70 align=12, pos=12, len=11, seek_char=0, invert_pos=0: 1.42 ( 16.49%) 1.70 align=32768, pos=12, len=13, seek_char=23, invert_pos=0: 1.03 ( 38.06%) 1.67 align=32768, pos=12, len=13, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64 align=32780, pos=12, len=13, seek_char=23, invert_pos=0: 1.30 ( 40.52%) 2.19 align=32780, pos=12, len=13, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89 align=32768, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.82%) 1.70 align=32768, pos=12, len=11, seek_char=0, invert_pos=0: 1.68 ( 0.69%) 1.70 align=32780, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.72%) 1.70 align=32780, pos=12, len=11, seek_char=0, invert_pos=0: 1.42 ( 16.60%) 1.70 align=65521, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.76%) 1.70 align=65521, pos=12, len=11, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70 align=65521, pos=12, len=13, seek_char=23, invert_pos=0: 1.03 ( 37.77%) 1.66 align=65521, pos=12, len=13, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64 align=0, pos=13, len=14, seek_char=23, invert_pos=0: 1.03 ( 36.94%) 1.64 align=0, pos=13, len=14, seek_char=0, invert_pos=0: 1.03 ( 36.95%) 1.64 align=13, pos=13, len=14, seek_char=23, invert_pos=0: 1.30 ( 30.96%) 1.89 align=13, pos=13, len=14, seek_char=0, invert_pos=0: 1.30 ( 31.00%) 1.89 align=0, pos=13, len=12, seek_char=23, invert_pos=0: 1.68 ( 0.76%) 1.70 align=0, pos=13, len=12, seek_char=0, invert_pos=0: 1.43 ( 15.83%) 1.70 align=13, pos=13, len=12, seek_char=23, invert_pos=0: 1.68 ( 13.63%) 1.95 align=13, pos=13, len=12, seek_char=0, invert_pos=0: 1.68 ( 13.55%) 1.95 align=32768, pos=13, len=14, seek_char=23, invert_pos=0: 1.04 ( 36.85%) 1.64 align=32768, pos=13, len=14, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64 align=32781, pos=13, len=14, seek_char=23, invert_pos=0: 1.30 ( 31.00%) 1.89 align=32781, pos=13, len=14, seek_char=0, invert_pos=0: 1.30 ( 31.05%) 1.89 align=32768, pos=13, len=12, seek_char=23, invert_pos=0: 1.69 ( 0.71%) 1.70 align=32768, pos=13, len=12, seek_char=0, invert_pos=0: 1.43 ( 15.86%) 1.70 align=32781, pos=13, len=12, seek_char=23, invert_pos=0: 1.68 ( 13.65%) 1.95 align=32781, pos=13, len=12, seek_char=0, invert_pos=0: 1.68 ( 13.69%) 1.95 align=65521, pos=13, len=12, seek_char=23, invert_pos=0: 1.43 ( 15.88%) 1.70 align=65521, pos=13, len=12, seek_char=0, invert_pos=0: 1.43 ( 15.82%) 1.70 align=65521, pos=13, len=14, seek_char=23, invert_pos=0: 1.03 ( 37.83%) 1.66 align=65521, pos=13, len=14, seek_char=0, invert_pos=0: 1.03 ( 38.14%) 1.67 align=0, pos=14, len=15, seek_char=23, invert_pos=0: 1.03 ( 39.18%) 1.70 align=0, pos=14, len=15, seek_char=0, invert_pos=0: 1.03 ( 37.78%) 1.66 align=14, pos=14, len=15, seek_char=23, invert_pos=0: 1.30 ( 31.47%) 1.90 align=14, pos=14, len=15, seek_char=0, invert_pos=0: 1.30 ( 31.09%) 1.89 align=0, pos=14, len=13, seek_char=23, invert_pos=0: 2.30 (-17.05%) 1.96 align=0, pos=14, len=13, seek_char=0, invert_pos=0: 1.16 ( 31.51%) 1.70 align=14, pos=14, len=13, seek_char=23, invert_pos=0: 1.68 ( 13.69%) 1.95 align=14, pos=14, len=13, seek_char=0, invert_pos=0: 1.68 ( 13.64%) 1.95 align=32768, pos=14, len=15, seek_char=23, invert_pos=0: 1.03 ( 36.95%) 1.64 align=32768, pos=14, len=15, seek_char=0, invert_pos=0: 1.03 ( 36.94%) 1.64 align=32782, pos=14, len=15, seek_char=23, invert_pos=0: 1.30 ( 30.99%) 1.89 align=32782, pos=14, len=15, seek_char=0, invert_pos=0: 1.30 ( 30.99%) 1.89 align=32768, pos=14, len=13, seek_char=23, invert_pos=0: 1.68 ( 0.76%) 1.70 align=32768, pos=14, len=13, seek_char=0, invert_pos=0: 1.43 ( 15.78%) 1.70 align=32782, pos=14, len=13, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95 align=32782, pos=14, len=13, seek_char=0, invert_pos=0: 1.68 ( 13.62%) 1.95 align=65521, pos=14, len=13, seek_char=23, invert_pos=0: 1.43 ( 15.87%) 1.70 align=65521, pos=14, len=13, seek_char=0, invert_pos=0: 1.43 ( 15.80%) 1.70 align=65521, pos=14, len=15, seek_char=23, invert_pos=0: 1.03 ( 38.19%) 1.67 align=65521, pos=14, len=15, seek_char=0, invert_pos=0: 1.03 ( 38.14%) 1.67 align=0, pos=15, len=16, seek_char=23, invert_pos=0: 1.03 ( 37.99%) 1.67 align=0, pos=15, len=16, seek_char=0, invert_pos=0: 1.03 ( 38.17%) 1.67 align=15, pos=15, len=16, seek_char=23, invert_pos=0: 1.30 ( 31.42%) 1.90 align=15, pos=15, len=16, seek_char=0, invert_pos=0: 1.30 ( 31.02%) 1.89 align=0, pos=15, len=14, seek_char=23, invert_pos=0: 1.69 ( 0.69%) 1.70 align=0, pos=15, len=14, seek_char=0, invert_pos=0: 1.43 ( 15.82%) 1.70 align=15, pos=15, len=14, seek_char=23, invert_pos=0: 1.68 ( 13.64%) 1.95 align=15, pos=15, len=14, seek_char=0, invert_pos=0: 1.68 ( 13.59%) 1.95 align=32768, pos=15, len=16, seek_char=23, invert_pos=0: 1.04 ( 37.80%) 1.66 align=32768, pos=15, len=16, seek_char=0, invert_pos=0: 1.03 ( 38.12%) 1.67 align=32783, pos=15, len=16, seek_char=23, invert_pos=0: 1.30 ( 31.44%) 1.90 align=32783, pos=15, len=16, seek_char=0, invert_pos=0: 1.30 ( 31.06%) 1.89 align=32768, pos=15, len=14, seek_char=23, invert_pos=0: 1.68 ( 0.81%) 1.70 align=32768, pos=15, len=14, seek_char=0, invert_pos=0: 1.43 ( 15.83%) 1.70 align=32783, pos=15, len=14, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95 align=32783, pos=15, len=14, seek_char=0, invert_pos=0: 1.68 ( 13.71%) 1.95 align=65521, pos=15, len=14, seek_char=23, invert_pos=0: 1.43 ( 15.83%) 1.70 align=65521, pos=15, len=14, seek_char=0, invert_pos=0: 1.43 ( 31.07%) 2.07 align=65521, pos=15, len=16, seek_char=23, invert_pos=0: 1.30 ( 31.04%) 1.89 align=65521, pos=15, len=16, seek_char=0, invert_pos=0: 1.30 ( 31.05%) 1.89 align=0, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 30.99%) 1.89 align=0, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.48%) 1.90 align=16, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 31.02%) 1.89 align=16, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.07%) 1.89 align=0, pos=16, len=15, seek_char=23, invert_pos=0: 1.68 ( 0.70%) 1.70 align=0, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.76%) 1.69 align=16, pos=16, len=15, seek_char=23, invert_pos=0: 1.43 ( 15.82%) 1.70 align=16, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.78%) 1.70 align=32768, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 31.44%) 1.90 align=32768, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.04%) 1.89 align=32784, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 31.00%) 1.89 align=32784, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.01%) 1.89 align=32768, pos=16, len=15, seek_char=23, invert_pos=0: 1.43 ( 15.83%) 1.70 align=32768, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.86%) 1.70 align=32784, pos=16, len=15, seek_char=23, invert_pos=0: 1.43 ( 15.77%) 1.70 align=32784, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70 align=65521, pos=16, len=15, seek_char=23, invert_pos=0: 1.42 (-10.93%) 1.28 align=65521, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( -5.51%) 1.35 align=65521, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 32.30%) 1.92 align=65521, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93 align=0, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 32.57%) 1.93 align=0, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93 align=17, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93 align=17, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93 align=0, pos=17, len=16, seek_char=23, invert_pos=0: 1.43 ( 14.46%) 1.67 align=0, pos=17, len=16, seek_char=0, invert_pos=0: 1.43 ( 0.01%) 1.43 align=17, pos=17, len=16, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95 align=17, pos=17, len=16, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95 align=32768, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 31.02%) 1.89 align=32768, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 31.01%) 1.89 align=32785, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 40.75%) 2.20 align=32785, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 30.98%) 1.89 align=32768, pos=17, len=16, seek_char=23, invert_pos=0: 1.43 ( 0.00%) 1.43 align=32768, pos=17, len=16, seek_char=0, invert_pos=0: 1.43 ( 0.02%) 1.43 align=32785, pos=17, len=16, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95 align=32785, pos=17, len=16, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95 align=65521, pos=17, len=16, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95 align=65521, pos=17, len=16, seek_char=0, invert_pos=0: 1.68 ( 13.67%) 1.95 align=65521, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 31.01%) 1.89 align=65521, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 31.02%) 1.89 align=0, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.06%) 1.89 align=0, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 32.45%) 1.93 align=18, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.07%) 1.89 align=18, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89 align=0, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.65%) 1.95 align=0, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95 align=18, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.63%) 1.95 align=18, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.67%) 1.95 align=32768, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.46%) 1.90 align=32768, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89 align=32786, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.06%) 1.89 align=32786, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.02%) 1.89 align=32768, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.78%) 1.95 align=32768, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.67%) 1.95 align=32786, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.74%) 1.95 align=32786, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.62%) 1.95 align=65521, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.63%) 1.95 align=65521, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.61%) 1.95 align=65521, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.10%) 1.89 align=65521, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.00%) 1.89 align=0, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.42%) 1.90 align=0, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.05%) 1.89 align=19, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.02%) 1.89 align=19, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.01%) 1.89 align=0, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.62%) 1.95 align=0, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95 align=19, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.60%) 1.95 align=19, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.61%) 1.95 align=32768, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.06%) 1.89 align=32768, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.06%) 1.89 align=32787, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.05%) 1.89 align=32787, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.46%) 1.90 align=32768, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.67%) 1.95 align=32768, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95 align=32787, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.64%) 1.95 align=32787, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95 align=65521, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.59%) 1.95 align=65521, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.70%) 1.95 align=65521, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.05%) 1.89 align=65521, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89 align=0, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 31.42%) 1.90 align=0, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 30.98%) 1.89 align=20, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 39.89%) 2.17 align=20, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 38.76%) 2.13 align=0, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.72%) 1.95 align=0, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.72%) 1.95 align=20, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.71%) 1.95 align=20, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.73%) 1.95 align=32768, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93 align=32768, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 32.59%) 1.93 align=32788, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 39.87%) 2.17 align=32788, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 38.76%) 2.13 align=32768, pos=20, len=19, seek_char=23, invert_pos=0: 1.67 ( 14.31%) 1.95 align=32768, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.60%) 1.95 align=32788, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.69%) 1.95 align=32788, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.62%) 1.95 align=65521, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.71%) 1.95 align=65521, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.71%) 1.95 align=65521, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 32.60%) 1.93 align=65521, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93 align=0, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93 align=0, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93 align=21, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 38.49%) 2.12 align=21, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 38.44%) 2.12 align=0, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 13.75%) 1.95 align=0, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 13.58%) 1.95 align=21, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 22.76%) 2.18 align=21, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 22.74%) 2.18 align=32768, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93 align=32768, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93 align=32789, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 38.49%) 2.12 align=32789, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 39.87%) 2.17 align=32768, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 13.77%) 1.95 align=32768, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95 align=32789, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 22.76%) 2.18 align=32789, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 22.78%) 2.18 align=65521, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 13.70%) 1.95 align=65521, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 13.70%) 1.95 align=65521, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93 align=65521, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93 align=0, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 32.56%) 1.93 align=0, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93 align=22, pos=22, len=23, seek_char=23, invert_pos=0: 1.36 ( 35.96%) 2.12 align=22, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 43.38%) 2.30 align=0, pos=22, len=21, seek_char=23, invert_pos=0: 1.68 ( 13.59%) 1.95 align=0, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 24.16%) 1.95 align=22, pos=22, len=21, seek_char=23, invert_pos=0: 1.48 ( 32.12%) 2.18 align=22, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 32.13%) 2.18 align=32768, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93 align=32768, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93 align=32790, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 38.39%) 2.11 align=32790, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 38.53%) 2.12 align=32768, pos=22, len=21, seek_char=23, invert_pos=0: 1.68 ( 13.70%) 1.95 align=32768, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 24.20%) 1.95 align=32790, pos=22, len=21, seek_char=23, invert_pos=0: 1.48 ( 32.19%) 2.18 align=32790, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 32.14%) 2.18 align=65521, pos=22, len=21, seek_char=23, invert_pos=0: 1.48 ( 24.14%) 1.95 align=65521, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 24.15%) 1.95 align=65521, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93 align=65521, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 32.60%) 1.93 align=0, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93 align=0, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93 align=23, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 38.42%) 2.12 align=23, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 38.43%) 2.12 align=0, pos=23, len=22, seek_char=23, invert_pos=0: 1.68 ( 13.64%) 1.95 align=0, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 24.15%) 1.95 align=23, pos=23, len=22, seek_char=23, invert_pos=0: 1.48 ( 32.12%) 2.18 align=23, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 32.12%) 2.18 align=32768, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93 align=32768, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93 align=32791, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 38.78%) 2.13 align=32791, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 38.51%) 2.12 align=32768, pos=23, len=22, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95 align=32768, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 24.12%) 1.95 align=32791, pos=23, len=22, seek_char=23, invert_pos=0: 1.48 ( 32.18%) 2.18 align=32791, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 32.12%) 2.18 align=65521, pos=23, len=22, seek_char=23, invert_pos=0: 1.48 ( 24.09%) 1.95 align=65521, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 24.10%) 1.95 align=65521, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 39.72%) 2.16 align=65521, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 38.44%) 2.12 align=0, pos=24, len=25, seek_char=23, invert_pos=0: 1.30 ( 38.43%) 2.12 align=0, pos=24, len=25, seek_char=0, invert_pos=0: 1.30 ( 38.46%) 2.12 align=24, pos=24, len=25, seek_char=23, invert_pos=0: 1.47 ( 30.35%) 2.12 align=24, pos=24, len=25, seek_char=0, invert_pos=0: 1.48 ( 30.15%) 2.12 align=0, pos=24, len=23, seek_char=23, invert_pos=0: 1.92 ( 1.88%) 1.95 align=0, pos=24, len=23, seek_char=0, invert_pos=0: 1.48 ( 24.10%) 1.95 align=24, pos=24, len=23, seek_char=23, invert_pos=0: 1.48 ( 24.13%) 1.95 align=24, pos=24, len=23, seek_char=0, invert_pos=0: 1.48 ( 24.12%) 1.95 align=32768, pos=24, len=25, seek_char=23, invert_pos=0: 1.30 ( 38.75%) 2.13 align=32768, pos=24, len=25, seek_char=0, invert_pos=0: 1.30 ( 38.47%) 2.12 align=32792, pos=24, len=25, seek_char=23, invert_pos=0: 1.48 ( 30.18%) 2.12 align=32792, pos=24, len=25, seek_char=0, invert_pos=0: 1.48 ( 30.17%) 2.12 align=32768, pos=24, len=23, seek_char=23, invert_pos=0: 1.92 ( 1.74%) 1.95 align=32768, pos=24, len=23, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95 align=32792, pos=24, len=23, seek_char=23, invert_pos=0: 1.68 ( 13.65%) 1.95 align=32792, pos=24, len=23, seek_char=0, invert_pos=0: 1.68 ( 13.60%) 1.95 align=65521, pos=24, len=23, seek_char=23, invert_pos=0: 1.68 ( -0.77%) 1.67 align=65521, pos=24, len=23, seek_char=0, invert_pos=0: 1.68 ( -0.88%) 1.67 align=65521, pos=24, len=25, seek_char=23, invert_pos=0: 1.30 ( 39.81%) 2.16 align=65521, pos=24, len=25, seek_char=0, invert_pos=0: 1.30 ( 38.44%) 2.12 align=0, pos=25, len=26, seek_char=23, invert_pos=0: 1.30 ( 38.48%) 2.12 align=0, pos=25, len=26, seek_char=0, invert_pos=0: 1.30 ( 39.80%) 2.16 align=25, pos=25, len=26, seek_char=23, invert_pos=0: 1.48 ( 30.07%) 2.11 align=25, pos=25, len=26, seek_char=0, invert_pos=0: 1.48 ( 30.15%) 2.12 align=0, pos=25, len=24, seek_char=23, invert_pos=0: 1.68 (-10.34%) 1.53 align=0, pos=25, len=24, seek_char=0, invert_pos=0: 1.68 (-10.29%) 1.53 align=25, pos=25, len=24, seek_char=23, invert_pos=0: 1.43 ( 34.64%) 2.18 align=25, pos=25, len=24, seek_char=0, invert_pos=0: 1.55 ( 28.81%) 2.18 align=32768, pos=25, len=26, seek_char=23, invert_pos=0: 1.30 ( 39.84%) 2.17 align=32768, pos=25, len=26, seek_char=0, invert_pos=0: 1.30 ( 38.74%) 2.13 align=32793, pos=25, len=26, seek_char=23, invert_pos=0: 1.48 ( 30.05%) 2.12 align=32793, pos=25, len=26, seek_char=0, invert_pos=0: 1.48 ( 30.44%) 2.13 align=32768, pos=25, len=24, seek_char=23, invert_pos=0: 1.95 (-16.97%) 1.67 align=32768, pos=25, len=24, seek_char=0, invert_pos=0: 1.95 (-17.01%) 1.67 align=32793, pos=25, len=24, seek_char=23, invert_pos=0: 1.55 ( 28.82%) 2.18 align=32793, pos=25, len=24, seek_char=0, invert_pos=0: 1.55 ( 28.85%) 2.18 align=65521, pos=25, len=24, seek_char=23, invert_pos=0: 1.95 ( 10.38%) 2.18 align=65521, pos=25, len=24, seek_char=0, invert_pos=0: 1.95 ( 10.40%) 2.18 align=65521, pos=25, len=26, seek_char=23, invert_pos=0: 1.30 ( 39.83%) 2.16 align=65521, pos=25, len=26, seek_char=0, invert_pos=0: 1.30 ( 38.48%) 2.12 align=0, pos=26, len=27, seek_char=23, invert_pos=0: 1.30 ( 39.84%) 2.16 align=0, pos=26, len=27, seek_char=0, invert_pos=0: 1.30 ( 38.48%) 2.12 align=26, pos=26, len=27, seek_char=23, invert_pos=0: 1.48 ( 31.64%) 2.16 align=26, pos=26, len=27, seek_char=0, invert_pos=0: 1.48 ( 30.15%) 2.12 align=0, pos=26, len=25, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18 align=0, pos=26, len=25, seek_char=0, invert_pos=0: 1.95 ( 10.39%) 2.18 align=26, pos=26, len=25, seek_char=23, invert_pos=0: 1.55 ( 28.81%) 2.18 align=26, pos=26, len=25, seek_char=0, invert_pos=0: 1.55 ( 28.85%) 2.18 align=32768, pos=26, len=27, seek_char=23, invert_pos=0: 1.30 ( 38.52%) 2.12 align=32768, pos=26, len=27, seek_char=0, invert_pos=0: 1.30 ( 38.79%) 2.13 align=32794, pos=26, len=27, seek_char=23, invert_pos=0: 1.48 ( 30.05%) 2.12 align=32794, pos=26, len=27, seek_char=0, invert_pos=0: 1.48 ( 30.22%) 2.12 align=32768, pos=26, len=25, seek_char=23, invert_pos=0: 1.95 ( 10.41%) 2.18 align=32768, pos=26, len=25, seek_char=0, invert_pos=0: 1.68 ( 22.75%) 2.18 align=32794, pos=26, len=25, seek_char=23, invert_pos=0: 1.55 ( 28.80%) 2.18 align=32794, pos=26, len=25, seek_char=0, invert_pos=0: 1.63 ( 25.30%) 2.18 align=65521, pos=26, len=25, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18 align=65521, pos=26, len=25, seek_char=0, invert_pos=0: 1.68 ( 22.70%) 2.18 align=65521, pos=26, len=27, seek_char=23, invert_pos=0: 1.30 ( 38.47%) 2.12 align=65521, pos=26, len=27, seek_char=0, invert_pos=0: 1.30 ( 38.76%) 2.13 align=0, pos=27, len=28, seek_char=23, invert_pos=0: 1.30 ( 38.54%) 2.12 align=0, pos=27, len=28, seek_char=0, invert_pos=0: 1.30 ( 38.50%) 2.12 align=27, pos=27, len=28, seek_char=23, invert_pos=0: 1.48 ( 31.64%) 2.16 align=27, pos=27, len=28, seek_char=0, invert_pos=0: 1.48 ( 30.11%) 2.12 align=0, pos=27, len=26, seek_char=23, invert_pos=0: 1.95 ( 10.44%) 2.18 align=0, pos=27, len=26, seek_char=0, invert_pos=0: 1.68 ( 22.67%) 2.18 align=27, pos=27, len=26, seek_char=23, invert_pos=0: 1.55 ( 28.84%) 2.18 align=27, pos=27, len=26, seek_char=0, invert_pos=0: 1.55 ( 28.81%) 2.18 align=32768, pos=27, len=28, seek_char=23, invert_pos=0: 1.55 ( 26.73%) 2.12 align=32768, pos=27, len=28, seek_char=0, invert_pos=0: 1.55 ( 26.73%) 2.12 align=32795, pos=27, len=28, seek_char=23, invert_pos=0: 1.48 ( 30.16%) 2.12 align=32795, pos=27, len=28, seek_char=0, invert_pos=0: 1.48 ( 31.67%) 2.16 align=32768, pos=27, len=26, seek_char=23, invert_pos=0: 1.95 ( 10.48%) 2.18 align=32768, pos=27, len=26, seek_char=0, invert_pos=0: 1.68 ( 22.73%) 2.18 align=32795, pos=27, len=26, seek_char=23, invert_pos=0: 1.81 ( 17.05%) 2.18 align=32795, pos=27, len=26, seek_char=0, invert_pos=0: 1.55 ( 28.88%) 2.18 align=65521, pos=27, len=26, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18 align=65521, pos=27, len=26, seek_char=0, invert_pos=0: 1.95 ( 10.38%) 2.18 align=65521, pos=27, len=28, seek_char=23, invert_pos=0: 1.55 ( 26.81%) 2.12 align=65521, pos=27, len=28, seek_char=0, invert_pos=0: 1.55 ( 26.82%) 2.12 align=0, pos=28, len=29, seek_char=23, invert_pos=0: 1.55 ( 26.66%) 2.12 align=0, pos=28, len=29, seek_char=0, invert_pos=0: 1.55 ( 26.80%) 2.12 align=28, pos=28, len=29, seek_char=23, invert_pos=0: 1.48 ( 36.36%) 2.32 align=28, pos=28, len=29, seek_char=0, invert_pos=0: 1.48 ( 36.71%) 2.34 align=0, pos=28, len=27, seek_char=23, invert_pos=0: 1.95 ( 10.38%) 2.18 align=0, pos=28, len=27, seek_char=0, invert_pos=0: 1.95 ( 10.44%) 2.18 align=28, pos=28, len=27, seek_char=23, invert_pos=0: 1.81 ( 17.03%) 2.18 align=28, pos=28, len=27, seek_char=0, invert_pos=0: 1.55 ( 28.85%) 2.18 align=32768, pos=28, len=29, seek_char=23, invert_pos=0: 1.55 ( 26.82%) 2.12 align=32768, pos=28, len=29, seek_char=0, invert_pos=0: 1.55 ( 28.49%) 2.17 align=32796, pos=28, len=29, seek_char=23, invert_pos=0: 1.48 ( 36.25%) 2.32 align=32796, pos=28, len=29, seek_char=0, invert_pos=0: 1.48 ( 36.28%) 2.32 align=32768, pos=28, len=27, seek_char=23, invert_pos=0: 1.95 ( 10.37%) 2.18 align=32768, pos=28, len=27, seek_char=0, invert_pos=0: 1.68 ( 22.75%) 2.18 align=32796, pos=28, len=27, seek_char=23, invert_pos=0: 1.81 ( 17.02%) 2.18 align=32796, pos=28, len=27, seek_char=0, invert_pos=0: 1.55 ( 28.87%) 2.18 align=65521, pos=28, len=27, seek_char=23, invert_pos=0: 1.95 ( 10.44%) 2.18 align=65521, pos=28, len=27, seek_char=0, invert_pos=0: 1.68 ( 22.78%) 2.18 align=65521, pos=28, len=29, seek_char=23, invert_pos=0: 1.55 ( 26.81%) 2.12 align=65521, pos=28, len=29, seek_char=0, invert_pos=0: 1.55 ( 26.76%) 2.12 align=0, pos=29, len=30, seek_char=23, invert_pos=0: 1.30 ( 38.50%) 2.12 align=0, pos=29, len=30, seek_char=0, invert_pos=0: 1.30 ( 38.43%) 2.12 align=29, pos=29, len=30, seek_char=23, invert_pos=0: 1.48 ( 36.26%) 2.32 align=29, pos=29, len=30, seek_char=0, invert_pos=0: 1.48 ( 36.28%) 2.32 align=0, pos=29, len=28, seek_char=23, invert_pos=0: 1.95 ( 10.42%) 2.18 align=0, pos=29, len=28, seek_char=0, invert_pos=0: 1.68 ( 22.77%) 2.18 align=29, pos=29, len=28, seek_char=23, invert_pos=0: 1.81 ( 24.20%) 2.39 align=29, pos=29, len=28, seek_char=0, invert_pos=0: 1.55 ( 34.98%) 2.38 align=32768, pos=29, len=30, seek_char=23, invert_pos=0: 1.55 ( 28.48%) 2.17 align=32768, pos=29, len=30, seek_char=0, invert_pos=0: 1.55 ( 26.80%) 2.12 align=32797, pos=29, len=30, seek_char=23, invert_pos=0: 1.48 ( 36.83%) 2.34 align=32797, pos=29, len=30, seek_char=0, invert_pos=0: 1.48 ( 36.26%) 2.32 align=32768, pos=29, len=28, seek_char=23, invert_pos=0: 1.95 ( 10.44%) 2.18 align=32768, pos=29, len=28, seek_char=0, invert_pos=0: 1.68 ( 22.75%) 2.18 align=32797, pos=29, len=28, seek_char=23, invert_pos=0: 1.81 ( 24.16%) 2.39 align=32797, pos=29, len=28, seek_char=0, invert_pos=0: 1.55 ( 35.00%) 2.39 align=65521, pos=29, len=28, seek_char=23, invert_pos=0: 1.95 ( 10.47%) 2.18 align=65521, pos=29, len=28, seek_char=0, invert_pos=0: 1.95 ( 10.39%) 2.18 align=65521, pos=29, len=30, seek_char=23, invert_pos=0: 1.55 ( 26.78%) 2.12 align=65521, pos=29, len=30, seek_char=0, invert_pos=0: 1.30 ( 38.53%) 2.12 align=0, pos=30, len=31, seek_char=23, invert_pos=0: 1.55 ( 26.75%) 2.12 align=0, pos=30, len=31, seek_char=0, invert_pos=0: 1.55 ( 28.43%) 2.17 align=30, pos=30, len=31, seek_char=23, invert_pos=0: 1.48 ( 36.26%) 2.32 align=30, pos=30, len=31, seek_char=0, invert_pos=0: 1.48 ( 36.32%) 2.32 align=0, pos=30, len=29, seek_char=23, invert_pos=0: 1.95 ( 10.42%) 2.18 align=0, pos=30, len=29, seek_char=0, invert_pos=0: 1.68 ( 22.69%) 2.18 align=30, pos=30, len=29, seek_char=23, invert_pos=0: 1.81 ( 24.25%) 2.39 align=30, pos=30, len=29, seek_char=0, invert_pos=0: 1.55 ( 35.08%) 2.39 align=32768, pos=30, len=31, seek_char=23, invert_pos=0: 1.55 ( 26.69%) 2.12 align=32768, pos=30, len=31, seek_char=0, invert_pos=0: 1.55 ( 26.75%) 2.12 align=32798, pos=30, len=31, seek_char=23, invert_pos=0: 1.48 ( 36.31%) 2.32 align=32798, pos=30, len=31, seek_char=0, invert_pos=0: 1.48 ( 36.32%) 2.32 align=32768, pos=30, len=29, seek_char=23, invert_pos=0: 1.95 ( 10.37%) 2.18 align=32768, pos=30, len=29, seek_char=0, invert_pos=0: 1.68 ( 22.73%) 2.18 align=32798, pos=30, len=29, seek_char=23, invert_pos=0: 1.81 ( 24.24%) 2.39 align=32798, pos=30, len=29, seek_char=0, invert_pos=0: 1.55 ( 35.00%) 2.39 align=65521, pos=30, len=29, seek_char=23, invert_pos=0: 1.95 ( 10.39%) 2.18 align=65521, pos=30, len=29, seek_char=0, invert_pos=0: 1.68 ( 22.72%) 2.18 align=65521, pos=30, len=31, seek_char=23, invert_pos=0: 1.55 ( 28.34%) 2.16 align=65521, pos=30, len=31, seek_char=0, invert_pos=0: 1.55 ( 28.35%) 2.16 align=0, pos=31, len=32, seek_char=23, invert_pos=0: 1.55 ( 26.81%) 2.12 align=0, pos=31, len=32, seek_char=0, invert_pos=0: 1.55 ( 26.75%) 2.12 align=31, pos=31, len=32, seek_char=23, invert_pos=0: 1.48 ( 36.27%) 2.32 align=31, pos=31, len=32, seek_char=0, invert_pos=0: 1.48 ( 36.29%) 2.32 align=0, pos=31, len=30, seek_char=23, invert_pos=0: 1.95 ( 10.41%) 2.18 align=0, pos=31, len=30, seek_char=0, invert_pos=0: 1.68 ( 22.78%) 2.18 align=31, pos=31, len=30, seek_char=23, invert_pos=0: 1.55 ( 35.05%) 2.39 align=31, pos=31, len=30, seek_char=0, invert_pos=0: 1.55 ( 35.03%) 2.39 align=32768, pos=31, len=32, seek_char=23, invert_pos=0: 1.55 ( 26.78%) 2.12 align=32768, pos=31, len=32, seek_char=0, invert_pos=0: 1.55 ( 26.80%) 2.12 align=32799, pos=31, len=32, seek_char=23, invert_pos=0: 1.48 ( 36.24%) 2.32 align=32799, pos=31, len=32, seek_char=0, invert_pos=0: 1.48 ( 36.37%) 2.32 align=32768, pos=31, len=30, seek_char=23, invert_pos=0: 1.95 ( 10.47%) 2.18 align=32768, pos=31, len=30, seek_char=0, invert_pos=0: 1.68 ( 22.69%) 2.18 align=32799, pos=31, len=30, seek_char=23, invert_pos=0: 1.81 ( 24.25%) 2.39 align=32799, pos=31, len=30, seek_char=0, invert_pos=0: 1.55 ( 35.04%) 2.39 align=65521, pos=31, len=30, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18 align=65521, pos=31, len=30, seek_char=0, invert_pos=0: 1.95 ( 10.43%) 2.18 align=65521, pos=31, len=32, seek_char=23, invert_pos=0: 1.48 ( 37.27%) 2.36 align=65521, pos=31, len=32, seek_char=0, invert_pos=0: 1.49 ( 36.67%) 2.36 align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.59%) 1.43 align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.58%) 1.43 align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.54%) 1.43 align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.50%) 1.43 align=0, pos=48, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.55%) 1.43 align=0, pos=16, len=48, seek_char=23, invert_pos=0: 1.81 ( 3.14%) 1.87 align=0, pos=80, len=16, seek_char=23, invert_pos=0: 1.43 (-11.95%) 1.28 align=0, pos=16, len=80, seek_char=23, invert_pos=0: 1.30 ( 47.16%) 2.46 align=0, pos=112, len=16, seek_char=23, invert_pos=0: 1.43 ( -0.00%) 1.43 align=0, pos=16, len=112, seek_char=23, invert_pos=0: 1.55 ( 37.06%) 2.46 align=0, pos=144, len=16, seek_char=23, invert_pos=0: 1.43 ( 0.02%) 1.43 align=0, pos=16, len=144, seek_char=23, invert_pos=0: 1.55 ( 37.09%) 2.46 align=0, pos=176, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.16%) 1.68 align=0, pos=16, len=176, seek_char=23, invert_pos=0: 1.55 ( 37.06%) 2.46 align=0, pos=208, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.23%) 1.68 align=0, pos=16, len=208, seek_char=23, invert_pos=0: 1.55 ( 37.08%) 2.46 align=0, pos=240, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.20%) 1.68 align=0, pos=16, len=240, seek_char=23, invert_pos=0: 1.55 ( 37.04%) 2.46 align=0, pos=272, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.16%) 1.68 align=0, pos=16, len=272, seek_char=23, invert_pos=0: 1.55 ( 37.00%) 2.46 align=0, pos=304, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.23%) 1.68 align=0, pos=16, len=304, seek_char=23, invert_pos=0: 1.55 ( 37.08%) 2.47 align=0, pos=336, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.20%) 1.68 align=0, pos=16, len=336, seek_char=23, invert_pos=0: 1.55 ( 37.09%) 2.46 align=0, pos=368, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.18%) 1.68 align=0, pos=16, len=368, seek_char=23, invert_pos=0: 1.55 ( 37.07%) 2.46 align=0, pos=400, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.19%) 1.68 align=0, pos=16, len=400, seek_char=23, invert_pos=0: 1.30 ( 47.05%) 2.46 align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 29.29%) 1.84 align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.90%) 1.81 align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 29.32%) 1.84 align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.94%) 1.81 align=0, pos=64, len=32, seek_char=23, invert_pos=0: 1.30 ( 29.38%) 1.84 align=0, pos=32, len=64, seek_char=23, invert_pos=0: 1.48 ( 28.84%) 2.08 align=0, pos=96, len=32, seek_char=23, invert_pos=0: 1.55 ( 14.12%) 1.81 align=0, pos=32, len=96, seek_char=23, invert_pos=0: 1.48 ( 40.07%) 2.47 align=0, pos=128, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.86%) 1.84 align=0, pos=32, len=128, seek_char=23, invert_pos=0: 1.48 ( 40.03%) 2.46 align=0, pos=160, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.83%) 1.84 align=0, pos=32, len=160, seek_char=23, invert_pos=0: 1.48 ( 39.96%) 2.46 align=0, pos=192, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.86%) 1.84 align=0, pos=32, len=192, seek_char=23, invert_pos=0: 1.48 ( 39.99%) 2.46 align=0, pos=224, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.79%) 1.84 align=0, pos=32, len=224, seek_char=23, invert_pos=0: 1.48 ( 39.97%) 2.46 align=0, pos=256, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.83%) 1.84 align=0, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 40.01%) 2.46 align=0, pos=288, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.81%) 1.84 align=0, pos=32, len=288, seek_char=23, invert_pos=0: 1.48 ( 39.92%) 2.46 align=0, pos=320, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.92%) 1.84 align=0, pos=32, len=320, seek_char=23, invert_pos=0: 1.48 ( 40.00%) 2.46 align=0, pos=352, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.83%) 1.84 align=0, pos=32, len=352, seek_char=23, invert_pos=0: 1.48 ( 39.91%) 2.46 align=0, pos=384, len=32, seek_char=23, invert_pos=0: 1.55 ( 14.21%) 1.81 align=0, pos=32, len=384, seek_char=23, invert_pos=0: 1.48 ( 39.96%) 2.46 align=0, pos=416, len=32, seek_char=23, invert_pos=0: 1.55 ( 14.15%) 1.81 align=0, pos=32, len=416, seek_char=23, invert_pos=0: 1.48 ( 39.98%) 2.46 align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 16.52%) 2.00 align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.56%) 1.98 align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.63%) 1.98 align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.64%) 1.98 align=0, pos=96, len=64, seek_char=23, invert_pos=0: 1.67 ( 16.53%) 2.00 align=0, pos=64, len=96, seek_char=23, invert_pos=0: 1.93 ( 21.57%) 2.46 align=0, pos=32, len=64, seek_char=23, invert_pos=0: 1.48 ( 30.31%) 2.12 align=0, pos=64, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.89%) 1.84 align=0, pos=128, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.57%) 1.98 align=0, pos=64, len=128, seek_char=23, invert_pos=0: 1.93 ( 35.15%) 2.97 align=0, pos=160, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.65%) 1.98 align=0, pos=64, len=160, seek_char=23, invert_pos=0: 1.93 ( 35.19%) 2.97 align=0, pos=192, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.23%) 2.20 align=0, pos=64, len=192, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97 align=0, pos=224, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.20%) 2.20 align=0, pos=64, len=224, seek_char=23, invert_pos=0: 1.93 ( 35.20%) 2.97 align=0, pos=256, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.24%) 2.20 align=0, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97 align=0, pos=288, len=64, seek_char=23, invert_pos=0: 1.83 ( 16.59%) 2.20 align=0, pos=64, len=288, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97 align=0, pos=320, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.20%) 2.20 align=0, pos=64, len=320, seek_char=23, invert_pos=0: 1.93 ( 35.14%) 2.97 align=0, pos=352, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.23%) 2.20 align=0, pos=64, len=352, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97 align=0, pos=384, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.21%) 2.20 align=0, pos=64, len=384, seek_char=23, invert_pos=0: 1.93 ( 35.19%) 2.97 align=0, pos=416, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.19%) 2.20 align=0, pos=64, len=416, seek_char=23, invert_pos=0: 1.93 ( 35.18%) 2.97 align=0, pos=448, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.18%) 2.20 align=0, pos=64, len=448, seek_char=23, invert_pos=0: 1.93 ( 35.18%) 2.97 align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 0.81%) 2.71 align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.07%) 2.96 align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.09%) 2.96 align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.05%) 2.96 align=0, pos=160, len=128, seek_char=23, invert_pos=0: 2.79 ( 5.72%) 2.96 align=0, pos=128, len=160, seek_char=23, invert_pos=0: 2.95 ( -0.44%) 2.94 align=0, pos=96, len=128, seek_char=23, invert_pos=0: 2.44 ( 17.11%) 2.94 align=0, pos=128, len=96, seek_char=23, invert_pos=0: 2.18 ( 11.58%) 2.47 align=0, pos=192, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10 align=0, pos=128, len=192, seek_char=23, invert_pos=0: 2.95 ( 26.61%) 4.02 align=0, pos=64, len=128, seek_char=23, invert_pos=0: 1.93 ( 34.42%) 2.94 align=0, pos=128, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.62%) 1.98 align=0, pos=224, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10 align=0, pos=128, len=224, seek_char=23, invert_pos=0: 2.95 ( 25.70%) 3.97 align=0, pos=32, len=128, seek_char=23, invert_pos=0: 1.48 ( 40.01%) 2.46 align=0, pos=128, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.84%) 1.81 align=0, pos=256, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.16%) 3.10 align=0, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 19.11%) 3.64 align=0, pos=288, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.16%) 3.10 align=0, pos=128, len=288, seek_char=23, invert_pos=0: 2.95 ( 19.07%) 3.64 align=0, pos=320, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.19%) 3.10 align=0, pos=128, len=320, seek_char=23, invert_pos=0: 2.95 ( 19.13%) 3.65 align=0, pos=352, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10 align=0, pos=128, len=352, seek_char=23, invert_pos=0: 2.95 ( 19.11%) 3.64 align=0, pos=384, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.16%) 3.10 align=0, pos=128, len=384, seek_char=23, invert_pos=0: 2.95 ( 19.14%) 3.65 align=0, pos=416, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.18%) 3.10 align=0, pos=128, len=416, seek_char=23, invert_pos=0: 2.95 ( 19.08%) 3.64 align=0, pos=448, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.15%) 3.10 align=0, pos=128, len=448, seek_char=23, invert_pos=0: 2.95 ( 19.04%) 3.64 align=0, pos=480, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10 align=0, pos=128, len=480, seek_char=23, invert_pos=0: 2.95 ( 19.11%) 3.64 align=0, pos=512, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.18%) 3.10 align=0, pos=128, len=512, seek_char=23, invert_pos=0: 2.95 ( 19.08%) 3.64 align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 1.06%) 4.79 align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.91%) 4.93 align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.85%) 4.93 align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.99%) 4.94 align=0, pos=288, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.96%) 4.94 align=0, pos=256, len=288, seek_char=23, invert_pos=0: 5.81 (-27.17%) 4.57 align=0, pos=224, len=256, seek_char=23, invert_pos=0: 4.49 ( -7.31%) 4.18 align=0, pos=256, len=224, seek_char=23, invert_pos=0: 4.23 (-23.95%) 3.41 align=0, pos=320, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.82%) 4.93 align=0, pos=256, len=320, seek_char=23, invert_pos=0: 5.80 (-20.46%) 4.82 align=0, pos=192, len=256, seek_char=23, invert_pos=0: 3.97 ( 10.12%) 4.42 align=0, pos=256, len=192, seek_char=23, invert_pos=0: 3.72 ( 10.13%) 4.14 align=0, pos=352, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.90%) 4.93 align=0, pos=256, len=352, seek_char=23, invert_pos=0: 5.80 (-20.56%) 4.81 align=0, pos=160, len=256, seek_char=23, invert_pos=0: 3.46 ( -0.90%) 3.43 align=0, pos=256, len=160, seek_char=23, invert_pos=0: 3.20 ( -8.80%) 2.95 align=0, pos=384, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.42%) 4.37 align=0, pos=256, len=384, seek_char=23, invert_pos=0: 5.81 (-20.57%) 4.82 align=0, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 17.10%) 3.56 align=0, pos=256, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.22%) 3.10 align=0, pos=416, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.47%) 4.37 align=0, pos=256, len=416, seek_char=23, invert_pos=0: 5.80 (-14.73%) 5.06 align=0, pos=96, len=256, seek_char=23, invert_pos=0: 2.44 ( 17.03%) 2.94 align=0, pos=256, len=96, seek_char=23, invert_pos=0: 2.18 ( 11.74%) 2.47 align=0, pos=448, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.45%) 4.37 align=0, pos=256, len=448, seek_char=23, invert_pos=0: 5.80 (-20.57%) 4.81 align=0, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 34.44%) 2.94 align=0, pos=256, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.62%) 1.98 align=0, pos=480, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.44%) 4.37 align=0, pos=256, len=480, seek_char=23, invert_pos=0: 5.81 (-14.50%) 5.07 align=0, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 40.05%) 2.47 align=0, pos=256, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.92%) 1.81 align=0, pos=512, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.47%) 4.37 align=0, pos=256, len=512, seek_char=23, invert_pos=0: 5.80 (-20.38%) 4.82 align=0, pos=544, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.46%) 4.37 align=0, pos=256, len=544, seek_char=23, invert_pos=0: 5.80 (-14.15%) 5.08 align=0, pos=576, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.44%) 4.37 align=0, pos=256, len=576, seek_char=23, invert_pos=0: 5.80 (-20.59%) 4.81 align=0, pos=608, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.45%) 4.37 align=0, pos=256, len=608, seek_char=23, invert_pos=0: 5.93 (-17.33%) 5.05 align=0, pos=640, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.45%) 4.37 align=0, pos=256, len=640, seek_char=23, invert_pos=0: 5.80 (-20.53%) 4.82 align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.44%) 6.86 align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.45%) 6.86 align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.77 ( 1.79%) 6.89 align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.93%) 6.89 align=0, pos=544, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.92%) 6.89 align=0, pos=512, len=544, seek_char=23, invert_pos=0: 7.77 (-14.07%) 6.81 align=0, pos=480, len=512, seek_char=23, invert_pos=0: 7.25 (-17.75%) 6.16 align=0, pos=512, len=480, seek_char=23, invert_pos=0: 7.23 (-14.30%) 6.33 align=0, pos=576, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.90%) 6.89 align=0, pos=512, len=576, seek_char=23, invert_pos=0: 7.76 (-19.10%) 6.52 align=0, pos=448, len=512, seek_char=23, invert_pos=0: 7.36 (-14.57%) 6.43 align=0, pos=512, len=448, seek_char=23, invert_pos=0: 6.13 ( 2.88%) 6.31 align=0, pos=608, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.90%) 6.89 align=0, pos=512, len=608, seek_char=23, invert_pos=0: 7.77 (-18.82%) 6.54 align=0, pos=416, len=512, seek_char=23, invert_pos=0: 6.79 ( -3.25%) 6.58 align=0, pos=512, len=416, seek_char=23, invert_pos=0: 6.77 (-19.54%) 5.66 align=0, pos=640, len=512, seek_char=23, invert_pos=0: 6.62 ( 1.53%) 6.72 align=0, pos=512, len=640, seek_char=23, invert_pos=0: 7.76 (-18.82%) 6.53 align=0, pos=384, len=512, seek_char=23, invert_pos=0: 6.79 ( -5.44%) 6.44 align=0, pos=512, len=384, seek_char=23, invert_pos=0: 5.70 ( 11.27%) 6.43 align=0, pos=672, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.98%) 6.90 align=0, pos=512, len=672, seek_char=23, invert_pos=0: 7.77 (-19.32%) 6.51 align=0, pos=352, len=512, seek_char=23, invert_pos=0: 6.29 ( -7.16%) 5.87 align=0, pos=512, len=352, seek_char=23, invert_pos=0: 6.39 (-31.82%) 4.85 align=0, pos=704, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.51%) 6.86 align=0, pos=512, len=704, seek_char=23, invert_pos=0: 7.73 (-16.65%) 6.63 align=0, pos=320, len=512, seek_char=23, invert_pos=0: 6.29 ( -7.27%) 5.86 align=0, pos=512, len=320, seek_char=23, invert_pos=0: 5.27 ( 1.88%) 5.38 align=0, pos=736, len=512, seek_char=23, invert_pos=0: 6.60 ( 4.26%) 6.89 align=0, pos=512, len=736, seek_char=23, invert_pos=0: 7.76 (-16.98%) 6.64 align=0, pos=288, len=512, seek_char=23, invert_pos=0: 5.80 (-14.13%) 5.09 align=0, pos=512, len=288, seek_char=23, invert_pos=0: 5.79 (-48.42%) 3.90 align=0, pos=768, len=512, seek_char=23, invert_pos=0: 6.59 ( 3.58%) 6.84 align=0, pos=512, len=768, seek_char=23, invert_pos=0: 7.77 (-18.94%) 6.54 align=0, pos=256, len=512, seek_char=23, invert_pos=0: 5.81 (-14.67%) 5.06 align=0, pos=512, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.43%) 4.37 align=0, pos=800, len=512, seek_char=23, invert_pos=0: 6.59 ( 3.78%) 6.85 align=0, pos=512, len=800, seek_char=23, invert_pos=0: 7.77 (-18.93%) 6.53 align=0, pos=224, len=512, seek_char=23, invert_pos=0: 4.49 ( -1.45%) 4.42 align=0, pos=512, len=224, seek_char=23, invert_pos=0: 4.23 (-21.06%) 3.49 align=0, pos=832, len=512, seek_char=23, invert_pos=0: 6.59 ( 3.73%) 6.85 align=0, pos=512, len=832, seek_char=23, invert_pos=0: 7.77 (-19.30%) 6.51 align=0, pos=192, len=512, seek_char=23, invert_pos=0: 3.97 ( 10.18%) 4.42 align=0, pos=512, len=192, seek_char=23, invert_pos=0: 3.72 ( 3.67%) 3.86 align=0, pos=864, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.90%) 6.89 align=0, pos=512, len=864, seek_char=23, invert_pos=0: 7.76 (-18.92%) 6.53 align=0, pos=160, len=512, seek_char=23, invert_pos=0: 3.46 ( 2.72%) 3.56 align=0, pos=512, len=160, seek_char=23, invert_pos=0: 3.20 ( -9.03%) 2.94 align=0, pos=896, len=512, seek_char=23, invert_pos=0: 6.62 ( 1.40%) 6.71 align=0, pos=512, len=896, seek_char=23, invert_pos=0: 7.77 (-18.84%) 6.54 align=0, pos=128, len=512, seek_char=23, invert_pos=0: 2.95 ( 17.19%) 3.56 align=0, pos=512, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.05%) 2.96 align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.42 ( -6.46%) 9.78 align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.43 ( 1.24%) 10.56 align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.43 ( -6.62%) 9.78 align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.43 ( 1.30%) 10.57 align=0, pos=1056, len=1024, seek_char=23, invert_pos=0: 10.45 ( -6.73%) 9.79 align=0, pos=1024, len=1056, seek_char=23, invert_pos=0: 11.51 (-10.21%) 10.44 align=0, pos=992, len=1024, seek_char=23, invert_pos=0: 11.05 ( -9.43%) 10.10 align=0, pos=1024, len=992, seek_char=23, invert_pos=0: 11.01 ( -8.27%) 10.17 align=0, pos=1088, len=1024, seek_char=23, invert_pos=0: 10.42 ( -0.46%) 10.37 align=0, pos=1024, len=1088, seek_char=23, invert_pos=0: 11.50 ( -9.66%) 10.49 align=0, pos=960, len=1024, seek_char=23, invert_pos=0: 11.03 ( -6.84%) 10.33 align=0, pos=1024, len=960, seek_char=23, invert_pos=0: 9.97 ( 0.61%) 10.03 align=0, pos=1120, len=1024, seek_char=23, invert_pos=0: 10.42 ( -0.44%) 10.37 align=0, pos=1024, len=1120, seek_char=23, invert_pos=0: 11.50 ( -6.25%) 10.83 align=0, pos=928, len=1024, seek_char=23, invert_pos=0: 10.57 ( -6.46%) 9.92 align=0, pos=1024, len=928, seek_char=23, invert_pos=0: 10.54 (-10.13%) 9.57 align=0, pos=1152, len=1024, seek_char=23, invert_pos=0: 10.42 ( -6.55%) 9.78 align=0, pos=1024, len=1152, seek_char=23, invert_pos=0: 11.50 (-12.53%) 10.22 align=0, pos=896, len=1024, seek_char=23, invert_pos=0: 10.56 ( -6.39%) 9.93 align=0, pos=1024, len=896, seek_char=23, invert_pos=0: 9.48 ( 2.04%) 9.68 align=0, pos=1184, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.50%) 10.57 align=0, pos=1024, len=1184, seek_char=23, invert_pos=0: 11.50 ( -9.66%) 10.49 align=0, pos=864, len=1024, seek_char=23, invert_pos=0: 10.13 ( -6.12%) 9.54 align=0, pos=1024, len=864, seek_char=23, invert_pos=0: 10.10 ( -7.61%) 9.39 align=0, pos=1216, len=1024, seek_char=23, invert_pos=0: 10.41 ( 1.57%) 10.58 align=0, pos=1024, len=1216, seek_char=23, invert_pos=0: 11.50 ( -9.73%) 10.48 align=0, pos=832, len=1024, seek_char=23, invert_pos=0: 10.13 ( -6.10%) 9.54 align=0, pos=1024, len=832, seek_char=23, invert_pos=0: 9.01 ( -3.04%) 8.75 align=0, pos=1248, len=1024, seek_char=23, invert_pos=0: 10.41 ( -6.70%) 9.76 align=0, pos=1024, len=1248, seek_char=23, invert_pos=0: 11.51 ( -9.70%) 10.49 align=0, pos=800, len=1024, seek_char=23, invert_pos=0: 9.63 ( 22.00%) 12.34 align=0, pos=1024, len=800, seek_char=23, invert_pos=0: 9.61 ( -7.98%) 8.90 align=0, pos=1280, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.47%) 10.57 align=0, pos=1024, len=1280, seek_char=23, invert_pos=0: 11.50 ( -6.28%) 10.82 align=0, pos=768, len=1024, seek_char=23, invert_pos=0: 9.80 ( 22.53%) 12.66 align=0, pos=1024, len=768, seek_char=23, invert_pos=0: 8.52 ( 4.58%) 8.92 align=0, pos=1312, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.49%) 10.57 align=0, pos=1024, len=1312, seek_char=23, invert_pos=0: 11.50 ( -9.64%) 10.49 align=0, pos=736, len=1024, seek_char=23, invert_pos=0: 9.16 (-16.99%) 7.83 align=0, pos=1024, len=736, seek_char=23, invert_pos=0: 9.28 (-21.76%) 7.62 align=0, pos=1344, len=1024, seek_char=23, invert_pos=0: 10.41 ( -6.42%) 9.79 align=0, pos=1024, len=1344, seek_char=23, invert_pos=0: 11.51 ( -9.67%) 10.49 align=0, pos=704, len=1024, seek_char=23, invert_pos=0: 9.15 ( -4.59%) 8.75 align=0, pos=1024, len=704, seek_char=23, invert_pos=0: 8.06 ( 0.92%) 8.14 align=0, pos=1376, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.53%) 10.58 align=0, pos=1024, len=1376, seek_char=23, invert_pos=0: 11.50 ( -9.65%) 10.49 align=0, pos=672, len=1024, seek_char=23, invert_pos=0: 8.70 ( -6.79%) 8.15 align=0, pos=1024, len=672, seek_char=23, invert_pos=0: 8.68 (-20.37%) 7.21 align=0, pos=1408, len=1024, seek_char=23, invert_pos=0: 10.42 ( -0.30%) 10.38 align=0, pos=1024, len=1408, seek_char=23, invert_pos=0: 11.51 ( -6.38%) 10.82 align=0, pos=640, len=1024, seek_char=23, invert_pos=0: 8.71 ( -6.84%) 8.15 align=0, pos=1024, len=640, seek_char=23, invert_pos=0: 7.61 ( 0.90%) 7.68 align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.93 ( -5.51%) 16.99 align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.92 ( -6.09%) 16.89 align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 18.01 ( -5.80%) 17.02 align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.49%) 16.99 align=0, pos=2080, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.50%) 16.99 align=0, pos=2048, len=2080, seek_char=23, invert_pos=0: 19.08 ( -9.51%) 17.42 align=0, pos=2016, len=2048, seek_char=23, invert_pos=0: 18.70 ( 13.66%) 21.66 align=0, pos=2048, len=2016, seek_char=23, invert_pos=0: 18.69 (-10.90%) 16.85 align=0, pos=2112, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.50%) 16.99 align=0, pos=2048, len=2112, seek_char=23, invert_pos=0: 19.07 ( -6.48%) 17.91 align=0, pos=1984, len=2048, seek_char=23, invert_pos=0: 18.71 ( 15.61%) 22.17 align=0, pos=2048, len=1984, seek_char=23, invert_pos=0: 17.47 ( -5.68%) 16.53 align=0, pos=2144, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.57%) 16.98 align=0, pos=2048, len=2144, seek_char=23, invert_pos=0: 19.08 ( -6.63%) 17.89 align=0, pos=1952, len=2048, seek_char=23, invert_pos=0: 18.14 ( 16.14%) 21.64 align=0, pos=2048, len=1952, seek_char=23, invert_pos=0: 18.05 (-10.24%) 16.37 align=0, pos=2176, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.51%) 16.99 align=0, pos=2048, len=2176, seek_char=23, invert_pos=0: 19.07 ( -5.77%) 18.03 align=0, pos=1920, len=2048, seek_char=23, invert_pos=0: 18.14 ( 15.45%) 21.46 align=0, pos=2048, len=1920, seek_char=23, invert_pos=0: 16.99 ( -5.31%) 16.13 align=0, pos=2208, len=2048, seek_char=23, invert_pos=0: 17.93 ( -5.50%) 17.00 align=0, pos=2048, len=2208, seek_char=23, invert_pos=0: 19.08 ( -6.60%) 17.90 align=0, pos=1888, len=2048, seek_char=23, invert_pos=0: 17.62 ( -7.15%) 16.44 align=0, pos=2048, len=1888, seek_char=23, invert_pos=0: 17.78 (-11.78%) 15.91 align=0, pos=2240, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.42%) 17.00 align=0, pos=2048, len=2240, seek_char=23, invert_pos=0: 19.08 ( -6.68%) 17.88 align=0, pos=1856, len=2048, seek_char=23, invert_pos=0: 17.62 ( -7.10%) 16.45 align=0, pos=2048, len=1856, seek_char=23, invert_pos=0: 16.53 ( -6.91%) 15.46 align=0, pos=2272, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.57%) 16.98 align=0, pos=2048, len=2272, seek_char=23, invert_pos=0: 19.08 ( -6.58%) 17.90 align=0, pos=1824, len=2048, seek_char=23, invert_pos=0: 17.23 ( -6.92%) 16.11 align=0, pos=2048, len=1824, seek_char=23, invert_pos=0: 17.27 (-11.89%) 15.44 align=0, pos=2304, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.44%) 17.00 align=0, pos=2048, len=2304, seek_char=23, invert_pos=0: 19.07 ( -6.55%) 17.90 align=0, pos=1792, len=2048, seek_char=23, invert_pos=0: 17.22 ( -7.80%) 15.97 align=0, pos=2048, len=1792, seek_char=23, invert_pos=0: 16.16 ( -6.47%) 15.18 align=0, pos=2336, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.68%) 16.96 align=0, pos=2048, len=2336, seek_char=23, invert_pos=0: 19.07 ( -6.52%) 17.90 align=0, pos=1760, len=2048, seek_char=23, invert_pos=0: 16.81 ( -8.40%) 15.51 align=0, pos=2048, len=1760, seek_char=23, invert_pos=0: 16.77 (-12.25%) 14.94 align=0, pos=2368, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.75%) 16.95 align=0, pos=2048, len=2368, seek_char=23, invert_pos=0: 19.07 ( -5.98%) 18.00 align=0, pos=1728, len=2048, seek_char=23, invert_pos=0: 16.79 ( -8.32%) 15.50 align=0, pos=2048, len=1728, seek_char=23, invert_pos=0: 15.63 ( -5.39%) 14.83 align=0, pos=2400, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.73%) 16.95 align=0, pos=2048, len=2400, seek_char=23, invert_pos=0: 19.06 ( -6.43%) 17.91 align=0, pos=1696, len=2048, seek_char=23, invert_pos=0: 16.35 ( -8.76%) 15.04 align=0, pos=2048, len=1696, seek_char=23, invert_pos=0: 16.24 (-11.59%) 14.55 align=0, pos=2432, len=2048, seek_char=23, invert_pos=0: 17.92 ( -6.01%) 16.90 align=0, pos=2048, len=2432, seek_char=23, invert_pos=0: 19.07 ( -6.43%) 17.92 align=0, pos=1664, len=2048, seek_char=23, invert_pos=0: 16.17 ( -7.71%) 15.01 align=0, pos=2048, len=1664, seek_char=23, invert_pos=0: 15.28 ( -5.18%) 14.53 align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 33.09 ( 9.41%) 36.53 align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 32.95 ( 9.75%) 36.51 align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 32.93 ( 9.83%) 36.52 align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.72%) 36.49 align=0, pos=4128, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.14%) 36.66 align=0, pos=4096, len=4128, seek_char=23, invert_pos=0: 34.66 ( 5.23%) 36.57 align=0, pos=4064, len=4096, seek_char=23, invert_pos=0: 34.76 ( 6.82%) 37.31 align=0, pos=4096, len=4064, seek_char=23, invert_pos=0: 34.77 ( 3.61%) 36.07 align=0, pos=4160, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.36%) 36.75 align=0, pos=4096, len=4160, seek_char=23, invert_pos=0: 34.63 ( 8.36%) 37.79 align=0, pos=4032, len=4096, seek_char=23, invert_pos=0: 34.86 ( 6.59%) 37.31 align=0, pos=4096, len=4032, seek_char=23, invert_pos=0: 32.52 ( 10.32%) 36.26 align=0, pos=4192, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.34%) 36.73 align=0, pos=4096, len=4192, seek_char=23, invert_pos=0: 34.84 ( 7.20%) 37.54 align=0, pos=4000, len=4096, seek_char=23, invert_pos=0: 34.23 ( 7.68%) 37.07 align=0, pos=4096, len=4000, seek_char=23, invert_pos=0: 33.52 ( 5.25%) 35.38 align=0, pos=4224, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.10%) 36.64 align=0, pos=4096, len=4224, seek_char=23, invert_pos=0: 34.74 ( 7.66%) 37.62 align=0, pos=3968, len=4096, seek_char=23, invert_pos=0: 34.17 ( 7.88%) 37.09 align=0, pos=4096, len=3968, seek_char=23, invert_pos=0: 32.27 ( 9.69%) 35.73 align=0, pos=4256, len=4096, seek_char=23, invert_pos=0: 32.93 ( 10.55%) 36.81 align=0, pos=4096, len=4256, seek_char=23, invert_pos=0: 34.72 ( 7.68%) 37.61 align=0, pos=3936, len=4096, seek_char=23, invert_pos=0: 36.41 ( 0.93%) 36.76 align=0, pos=4096, len=3936, seek_char=23, invert_pos=0: 36.49 ( -5.41%) 34.62 align=0, pos=4288, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.32%) 36.72 align=0, pos=4096, len=4288, seek_char=23, invert_pos=0: 34.69 ( 8.36%) 37.86 align=0, pos=3904, len=4096, seek_char=23, invert_pos=0: 36.43 ( 1.33%) 36.92 align=0, pos=4096, len=3904, seek_char=23, invert_pos=0: 34.89 ( 0.26%) 34.98 align=0, pos=4320, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.65%) 36.45 align=0, pos=4096, len=4320, seek_char=23, invert_pos=0: 34.71 ( 8.83%) 38.07 align=0, pos=3872, len=4096, seek_char=23, invert_pos=0: 34.23 ( 6.08%) 36.45 align=0, pos=4096, len=3872, seek_char=23, invert_pos=0: 34.42 ( -1.12%) 34.04 align=0, pos=4352, len=4096, seek_char=23, invert_pos=0: 32.93 ( 9.51%) 36.39 align=0, pos=4096, len=4352, seek_char=23, invert_pos=0: 34.69 ( 9.68%) 38.40 align=0, pos=3840, len=4096, seek_char=23, invert_pos=0: 34.30 ( 5.95%) 36.47 align=0, pos=4096, len=3840, seek_char=23, invert_pos=0: 32.94 ( 4.59%) 34.52 align=0, pos=4384, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.67%) 36.47 align=0, pos=4096, len=4384, seek_char=23, invert_pos=0: 34.68 ( 9.63%) 38.38 align=0, pos=3808, len=4096, seek_char=23, invert_pos=0: 36.70 ( -2.66%) 35.75 align=0, pos=4096, len=3808, seek_char=23, invert_pos=0: 36.20 ( -6.42%) 34.01 align=0, pos=4416, len=4096, seek_char=23, invert_pos=0: 32.97 ( 9.29%) 36.35 align=0, pos=4096, len=4416, seek_char=23, invert_pos=0: 34.71 ( 9.92%) 38.53 align=0, pos=3776, len=4096, seek_char=23, invert_pos=0: 36.67 ( -1.47%) 36.14 align=0, pos=4096, len=3776, seek_char=23, invert_pos=0: 34.80 ( -2.46%) 33.97 align=0, pos=4448, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.68%) 36.47 align=0, pos=4096, len=4448, seek_char=23, invert_pos=0: 34.71 ( 9.93%) 38.53 align=0, pos=3744, len=4096, seek_char=23, invert_pos=0: 36.13 ( -1.24%) 35.69 align=0, pos=4096, len=3744, seek_char=23, invert_pos=0: 35.29 ( -5.31%) 33.51 align=0, pos=4480, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.54%) 36.41 align=0, pos=4096, len=4480, seek_char=23, invert_pos=0: 34.71 ( 10.35%) 38.71 align=0, pos=3712, len=4096, seek_char=23, invert_pos=0: 36.23 ( -1.39%) 35.74 align=0, pos=4096, len=3712, seek_char=23, invert_pos=0: 34.50 ( -3.04%) 33.48 align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 66.82 ( 0.37%) 67.07 align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 66.85 ( 0.23%) 67.00 align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 66.81 ( 0.48%) 67.14 align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 67.25 ( -0.41%) 66.97 align=0, pos=8224, len=8192, seek_char=23, invert_pos=0: 66.80 ( 0.32%) 67.01 align=0, pos=8192, len=8224, seek_char=23, invert_pos=0: 67.47 ( -0.13%) 67.38 align=0, pos=8160, len=8192, seek_char=23, invert_pos=0: 67.24 ( 0.87%) 67.83 align=0, pos=8192, len=8160, seek_char=23, invert_pos=0: 66.90 ( -0.57%) 66.52 align=0, pos=8256, len=8192, seek_char=23, invert_pos=0: 66.82 ( 1.37%) 67.75 align=0, pos=8192, len=8256, seek_char=23, invert_pos=0: 67.51 ( 1.17%) 68.31 align=0, pos=8128, len=8192, seek_char=23, invert_pos=0: 67.39 ( 1.13%) 68.16 align=0, pos=8192, len=8128, seek_char=23, invert_pos=0: 66.11 ( 1.53%) 67.14 align=0, pos=8288, len=8192, seek_char=23, invert_pos=0: 66.91 ( 1.00%) 67.59 align=0, pos=8192, len=8288, seek_char=23, invert_pos=0: 68.28 ( 0.17%) 68.40 align=0, pos=8096, len=8192, seek_char=23, invert_pos=0: 67.51 ( 0.30%) 67.71 align=0, pos=8192, len=8096, seek_char=23, invert_pos=0: 67.57 ( -2.01%) 66.24 align=0, pos=8320, len=8192, seek_char=23, invert_pos=0: 67.09 ( 0.74%) 67.59 align=0, pos=8192, len=8320, seek_char=23, invert_pos=0: 68.77 ( -0.41%) 68.49 align=0, pos=8064, len=8192, seek_char=23, invert_pos=0: 67.57 ( 0.39%) 67.84 align=0, pos=8192, len=8064, seek_char=23, invert_pos=0: 66.10 ( 0.70%) 66.57 align=0, pos=8352, len=8192, seek_char=23, invert_pos=0: 67.05 ( 1.23%) 67.89 align=0, pos=8192, len=8352, seek_char=23, invert_pos=0: 68.54 ( -0.23%) 68.38 align=0, pos=8032, len=8192, seek_char=23, invert_pos=0: 67.30 ( 0.37%) 67.55 align=0, pos=8192, len=8032, seek_char=23, invert_pos=0: 66.62 ( -1.49%) 65.65 align=0, pos=8384, len=8192, seek_char=23, invert_pos=0: 66.95 ( 0.11%) 67.02 align=0, pos=8192, len=8384, seek_char=23, invert_pos=0: 68.77 ( -0.21%) 68.63 align=0, pos=8000, len=8192, seek_char=23, invert_pos=0: 67.41 ( 0.04%) 67.43 align=0, pos=8192, len=8000, seek_char=23, invert_pos=0: 65.51 ( 0.06%) 65.56 align=0, pos=8416, len=8192, seek_char=23, invert_pos=0: 66.92 ( 0.21%) 67.06 align=0, pos=8192, len=8416, seek_char=23, invert_pos=0: 68.94 ( -0.11%) 68.86 align=0, pos=7968, len=8192, seek_char=23, invert_pos=0: 66.92 ( 0.28%) 67.11 align=0, pos=8192, len=7968, seek_char=23, invert_pos=0: 66.27 ( -1.79%) 65.10 align=0, pos=8448, len=8192, seek_char=23, invert_pos=0: 66.87 ( 0.21%) 67.01 align=0, pos=8192, len=8448, seek_char=23, invert_pos=0: 68.90 ( 0.46%) 69.22 align=0, pos=7936, len=8192, seek_char=23, invert_pos=0: 66.95 ( 0.28%) 67.14 align=0, pos=8192, len=7936, seek_char=23, invert_pos=0: 65.09 ( 0.07%) 65.14 align=0, pos=8480, len=8192, seek_char=23, invert_pos=0: 66.86 ( 0.34%) 67.09 align=0, pos=8192, len=8480, seek_char=23, invert_pos=0: 68.91 ( 0.87%) 69.51 align=0, pos=7904, len=8192, seek_char=23, invert_pos=0: 66.29 ( 1.10%) 67.03 align=0, pos=8192, len=7904, seek_char=23, invert_pos=0: 65.09 ( -1.07%) 64.40 align=0, pos=8512, len=8192, seek_char=23, invert_pos=0: 66.87 ( 0.87%) 67.46 align=0, pos=8192, len=8512, seek_char=23, invert_pos=0: 68.99 ( 0.84%) 69.58 align=0, pos=7872, len=8192, seek_char=23, invert_pos=0: 66.34 ( 1.17%) 67.12 align=0, pos=8192, len=7872, seek_char=23, invert_pos=0: 64.72 ( 0.54%) 65.07 align=0, pos=8544, len=8192, seek_char=23, invert_pos=0: 66.86 ( 1.63%) 67.97 align=0, pos=8192, len=8544, seek_char=23, invert_pos=0: 68.68 ( 1.77%) 69.91 align=0, pos=7840, len=8192, seek_char=23, invert_pos=0: 65.99 ( 1.59%) 67.05 align=0, pos=8192, len=7840, seek_char=23, invert_pos=0: 65.62 ( -1.99%) 64.34 align=0, pos=8576, len=8192, seek_char=23, invert_pos=0: 66.96 ( 1.51%) 67.98 align=0, pos=8192, len=8576, seek_char=23, invert_pos=0: 68.73 ( 1.74%) 69.94 align=0, pos=7808, len=8192, seek_char=23, invert_pos=0: 65.98 ( 1.51%) 66.99 align=0, pos=8192, len=7808, seek_char=23, invert_pos=0: 65.09 ( -0.53%) 64.75
On 11/16/23 4:29 AM, bmahi496@linux.ibm.com wrote: > From: MAHESH BODAPATI<bmahi496@linux.ibm.com> > > Optimized memchr for POWER10 based on existing rawmemchr and strlen. > movement of code,dead code elimination and loop unrolling helped in Do you mean reordering the instructions in the assembly file? > getting better performance. > --- > sysdeps/powerpc/powerpc64/le/power10/memchr.S | 315 ++++++++++++++++++ > sysdeps/powerpc/powerpc64/multiarch/Makefile | 9 +- > .../powerpc64/multiarch/ifunc-impl-list.c | 6 + > .../powerpc64/multiarch/memchr-power10.S | 28 ++ > sysdeps/powerpc/powerpc64/multiarch/memchr.c | 20 +- > 5 files changed, 368 insertions(+), 10 deletions(-) > create mode 100644 sysdeps/powerpc/powerpc64/le/power10/memchr.S > create mode 100644 sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S LGTM. Please rebase sysdeps/powerpc/powerpc64/multiarch/Makefile and send updated patch. > > diff --git a/sysdeps/powerpc/powerpc64/le/power10/memchr.S b/sysdeps/powerpc/powerpc64/le/power10/memchr.S > new file mode 100644 > index 0000000000..faf293f344 > --- /dev/null > +++ b/sysdeps/powerpc/powerpc64/le/power10/memchr.S > @@ -0,0 +1,315 @@ > +/* Optimized memchr implementation for POWER10 LE. > + Copyright (C) 2021-2023 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > +<https://www.gnu.org/licenses/>. */ > + > +#include <sysdep.h> > + > +# ifndef MEMCHR > +# define MEMCHR __memchr > +# endif > +# define M_VREG_ZERO v20 > +# define M_OFF_START_LOOP 256 > +# define MEMCHR_SUBTRACT_VECTORS \ > + vsububm v4,v4,v18; \ > + vsububm v5,v5,v18; \ > + vsububm v6,v6,v18; \ > + vsububm v7,v7,v18; > +# define M_TAIL(vreg,increment) \ > + vctzlsbb r4,vreg; \ > + cmpld r5,r4; \ > + ble L(null); \ > + addi r4,r4,increment; \ > + add r3,r6,r4; \ > + blr > + > +/* TODO: Replace macros by the actual instructions when minimum binutils becomes > + >= 2.35. This is used to keep compatibility with older versions. */ > +#define M_VEXTRACTBM(rt,vrb) \ > + .long(((4)<<(32-6)) \ > + | ((rt)<<(32-11)) \ > + | ((8)<<(32-16)) \ > + | ((vrb)<<(32-21)) \ > + | 1602) > + > +#define M_LXVP(xtp,dq,ra) \ > + .long(((6)<<(32-6)) \ > + | ((((xtp)-32)>>1)<<(32-10)) \ > + | ((1)<<(32-11)) \ > + | ((ra)<<(32-16)) \ > + | dq) > + > +#define CHECK16B(vreg,offset,addr,label) \ > + lxv vreg+32,offset(addr); \ > + vcmpequb. vreg,vreg,v18; \ > + bne cr6,L(label); \ > + cmpldi r5,16; \ > + ble L(null); \ > + addi r5,r5,-16; > + > +/* Load 4 quadwords, merge into one VR for speed and check for NULLs. r6 has # > + of bytes already checked. */ > +#define CHECK64B(offset,addr,label) \ > + M_LXVP(v4+32,offset,addr); \ > + M_LXVP(v6+32,offset+32,addr); \ > + MEMCHR_SUBTRACT_VECTORS; \ > + vminub v14,v4,v5; \ > + vminub v15,v6,v7; \ > + vminub v16,v14,v15; \ > + vcmpequb. v0,v16,M_VREG_ZERO; \ > + beq cr6,$+12; \ > + li r7,offset; \ > + b L(label); \ > + cmpldi r5,64; \ > + ble L(null); \ > + addi r5,r5,-64 > + > +/* Implements the function > + void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5]). */ > + > + .machine power9 > + > +ENTRY_TOCLESS (MEMCHR) > + CALL_MCOUNT 3 > + > + cmpldi r5,0 > + beq L(null) > + mr r0,r5 > + xori r6,r4,0xff > + > + mtvsrd v18+32,r4 /* matching char in v18 */ > + mtvsrd v19+32,r6 /* non matching char in v19 */ > + > + vspltb v18,v18,7 /* replicate */ > + vspltb v19,v19,7 /* replicate */ > + vspltisb M_VREG_ZERO,0 > + > + /* Next 16B-aligned address. Prepare address for L(aligned). */ > + addi r6,r3,16 > + clrrdi r6,r6,4 > + > + /* Align data and fill bytes not loaded with non matching char. */ > + lvx v0,0,r3 > + lvsr v1,0,r3 > + vperm v0,v19,v0,v1 > + > + vcmpequb. v6,v0,v18 > + bne cr6,L(found) > + sub r4,r6,r3 > + cmpld r5,r4 > + ble L(null) > + sub r5,r5,r4 > + > + /* Test up to OFF_START_LOOP-16 bytes in 16B chunks. The main loop is > + optimized for longer strings, so checking the first bytes in 16B > + chunks benefits a lot small strings. */ > + .p2align 5 > +L(aligned): > + cmpldi r5,0 > + beq L(null) > + > + CHECK16B(v0,0,r6,tail1) > + CHECK16B(v1,16,r6,tail2) > + CHECK16B(v2,32,r6,tail3) > + CHECK16B(v3,48,r6,tail4) > + CHECK16B(v4,64,r6,tail5) > + CHECK16B(v5,80,r6,tail6) > + CHECK16B(v6,96,r6,tail7) > + CHECK16B(v7,112,r6,tail8) > + CHECK16B(v8,128,r6,tail9) > + CHECK16B(v9,144,r6,tail10) > + CHECK16B(v10,160,r6,tail11) > + CHECK16B(v0,176,r6,tail12) > + CHECK16B(v1,192,r6,tail13) > + CHECK16B(v2,208,r6,tail14) > + CHECK16B(v3,224,r6,tail15) > + > + cmpdi cr5,r4,0 /* Check if c == 0. This will be useful to > + choose how we will perform the main loop. */ > + > + /* Prepare address for the loop. */ > + addi r4,r3,M_OFF_START_LOOP > + clrrdi r4,r4,6 > + sub r6,r4,r3 > + sub r5,r0,r6 > + addi r6,r4,128 > + > + /* If c == 0, use the loop without the vsububm. */ > + beq cr5,L(loop) > + > + /* This is very similar to the block after L(loop), the difference is > + that here MEMCHR_SUBTRACT_VECTORS is not empty, and we subtract > + each byte loaded by the char we are looking for, this way we can keep > + using vminub to merge the results and checking for nulls. */ > + .p2align 5 > +L(memchr_loop): > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + b L(memchr_loop) > + /* Switch to a more aggressive approach checking 64B each time. Use 2 > + pointers 128B apart and unroll the loop once to make the pointer > + updates and usages separated enough to avoid stalls waiting for > + address calculation. */ > + .p2align 5 > +L(loop): > +#undef MEMCHR_SUBTRACT_VECTORS > +#define MEMCHR_SUBTRACT_VECTORS /* nothing */ > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + CHECK64B(0,r4,pre_tail_64b) > + CHECK64B(64,r4,pre_tail_64b) > + addi r4,r4,256 > + > + CHECK64B(0,r6,tail_64b) > + CHECK64B(64,r6,tail_64b) > + addi r6,r6,256 > + > + b L(loop) > + > + .p2align 5 > +L(pre_tail_64b): > + mr r6,r4 > +L(tail_64b): > + /* OK, we found a null byte. Let's look for it in the current 64-byte > + block and mark it in its corresponding VR. lxvp vx,0(ry) puts the > + low 16B bytes into vx+1, and the high into vx, so the order here is > + v5, v4, v7, v6. */ > + vcmpequb v1,v5,M_VREG_ZERO > + vcmpequb v2,v4,M_VREG_ZERO > + vcmpequb v3,v7,M_VREG_ZERO > + vcmpequb v4,v6,M_VREG_ZERO > + > + /* Take into account the other 64B blocks we had already checked. */ > + add r6,r6,r7 > + /* Extract first bit of each byte. */ > + M_VEXTRACTBM(r8,v1) > + M_VEXTRACTBM(r9,v2) > + M_VEXTRACTBM(r10,v3) > + M_VEXTRACTBM(r11,v4) > + > + /* Shift each value into their corresponding position. */ > + sldi r9,r9,16 > + sldi r10,r10,32 > + sldi r11,r11,48 > + > + /* Merge the results. */ > + or r8,r8,r9 > + or r9,r10,r11 > + or r11,r9,r8 > + > + cnttzd r0,r11 /* Count trailing zeros before the match. */ > + cmpld r5,r0 > + ble L(null) > + add r3,r6,r0 /* Compute final address. */ > + blr > + > + .p2align 5 > +L(tail1): > + M_TAIL(v0,0) > + > + .p2align 5 > +L(tail2): > + M_TAIL(v1,16) > + > + .p2align 5 > +L(tail3): > + M_TAIL(v2,32) > + > + .p2align 5 > +L(tail4): > + M_TAIL(v3,48) > + > + .p2align 5 > +L(tail5): > + M_TAIL(v4,64) > + > + .p2align 5 > +L(tail6): > + M_TAIL(v5,80) > + > + .p2align 5 > +L(tail7): > + M_TAIL(v6,96) > + > + .p2align 5 > +L(tail8): > + M_TAIL(v7,112) > + > + .p2align 5 > +L(tail9): > + M_TAIL(v8,128) > + > + .p2align 5 > +L(tail10): > + M_TAIL(v9,144) > + > + .p2align 5 > +L(tail11): > + M_TAIL(v10,160) > + > + .p2align 5 > +L(tail12): > + M_TAIL(v0,176) > + > + .p2align 5 > +L(tail13): > + M_TAIL(v1,192) > + > + .p2align 5 > +L(tail14): > + M_TAIL(v2,208) > + > + .p2align 5 > +L(tail15): > + M_TAIL(v3,224) > + > + .p2align 5 > +L(found): > + vctzlsbb r7,v6 > + cmpld r5,r7 > + ble L(null) > + add r3,r3,r7 > + blr > + > + .p2align 5 > +L(null): > + li r3,0 > + blr > + > +END (MEMCHR) > + > +weak_alias (__memchr, memchr) > +libc_hidden_builtin_def (memchr) > diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile > index 27d8495503..eb3d72a11c 100644 > --- a/sysdeps/powerpc/powerpc64/multiarch/Makefile > +++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile > @@ -31,10 +31,11 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ > strncase-power8 > > ifneq (,$(filter %le,$(config-machine))) > -sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \ > - rawmemchr-power9 rawmemchr-power10 \ > - strcmp-power9 strncmp-power9 strcpy-power9 stpcpy-power9 \ > - strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 > +sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \ > + memmove-power10 memset-power10 rawmemchr-power9 \ > + rawmemchr-power10 strcmp-power9 strncmp-power9 \ > + strcpy-power9 stpcpy-power9 strlen-power9 strncpy-power9 \ > + stpncpy-power9 strlen-power10 > endif > CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops > CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops > diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c > index fc26dd0e17..b353ca4c3a 100644 > --- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c > +++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c > @@ -226,6 +226,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, > > /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */ > IFUNC_IMPL (i, name, memchr, > +#ifdef __LITTLE_ENDIAN__ > + IFUNC_IMPL_ADD (array, i, memchr, > + hwcap2 & PPC_FEATURE2_ARCH_3_1 > + && hwcap & PPC_FEATURE_HAS_VSX, > + __memchr_power10) > +#endif > IFUNC_IMPL_ADD (array, i, memchr, > hwcap2 & PPC_FEATURE2_ARCH_2_07 > && hwcap & PPC_FEATURE_HAS_ALTIVEC, > diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S > new file mode 100644 > index 0000000000..b9ed792676 > --- /dev/null > +++ b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S > @@ -0,0 +1,28 @@ > +/* Optimized memchr implementation for POWER10/PPC64. > + Copyright (C) 2016-2023 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > +<https://www.gnu.org/licenses/>. */ > + > +#if defined __LITTLE_ENDIAN__ && IS_IN (libc) > +#define MEMCHR __memchr_power10 > + > +#undef libc_hidden_builtin_def > +#define libc_hidden_builtin_def(name) > +#undef weak_alias > +#define weak_alias(name,alias) > + > +#include <sysdeps/powerpc/powerpc64/le/power10/memchr.S> > +#endif > diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c > index a1a8f3eedd..dbb30fe51d 100644 > --- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c > +++ b/sysdeps/powerpc/powerpc64/multiarch/memchr.c > @@ -25,15 +25,23 @@ extern __typeof (__memchr) __memchr_ppc attribute_hidden; > extern __typeof (__memchr) __memchr_power7 attribute_hidden; > extern __typeof (__memchr) __memchr_power8 attribute_hidden; > > +# ifdef __LITTLE_ENDIAN__ > +extern __typeof (__memchr) __memchr_power10 attribute_hidden; > +# endif > /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle > ifunc symbol properly. */ > libc_ifunc (__memchr, > - (hwcap2 & PPC_FEATURE2_ARCH_2_07 > - && hwcap & PPC_FEATURE_HAS_ALTIVEC) > - ? __memchr_power8 : > - (hwcap & PPC_FEATURE_ARCH_2_06) > - ? __memchr_power7 > - : __memchr_ppc); > +# ifdef __LITTLE_ENDIAN__ > + (hwcap2 & PPC_FEATURE2_ARCH_3_1 > + && hwcap & PPC_FEATURE_HAS_VSX) > + ? __memchr_power10 : > +# endif > + (hwcap2 & PPC_FEATURE2_ARCH_2_07 > + && hwcap & PPC_FEATURE_HAS_ALTIVEC) > + ? __memchr_power8 : > + (hwcap & PPC_FEATURE_ARCH_2_06) > + ? __memchr_power7 > + : __memchr_ppc); > > weak_alias (__memchr, memchr) > libc_hidden_builtin_def (memchr)
diff --git a/sysdeps/powerpc/powerpc64/le/power10/memchr.S b/sysdeps/powerpc/powerpc64/le/power10/memchr.S new file mode 100644 index 0000000000..faf293f344 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/le/power10/memchr.S @@ -0,0 +1,315 @@ +/* Optimized memchr implementation for POWER10 LE. + Copyright (C) 2021-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +# ifndef MEMCHR +# define MEMCHR __memchr +# endif +# define M_VREG_ZERO v20 +# define M_OFF_START_LOOP 256 +# define MEMCHR_SUBTRACT_VECTORS \ + vsububm v4,v4,v18; \ + vsububm v5,v5,v18; \ + vsububm v6,v6,v18; \ + vsububm v7,v7,v18; +# define M_TAIL(vreg,increment) \ + vctzlsbb r4,vreg; \ + cmpld r5,r4; \ + ble L(null); \ + addi r4,r4,increment; \ + add r3,r6,r4; \ + blr + +/* TODO: Replace macros by the actual instructions when minimum binutils becomes + >= 2.35. This is used to keep compatibility with older versions. */ +#define M_VEXTRACTBM(rt,vrb) \ + .long(((4)<<(32-6)) \ + | ((rt)<<(32-11)) \ + | ((8)<<(32-16)) \ + | ((vrb)<<(32-21)) \ + | 1602) + +#define M_LXVP(xtp,dq,ra) \ + .long(((6)<<(32-6)) \ + | ((((xtp)-32)>>1)<<(32-10)) \ + | ((1)<<(32-11)) \ + | ((ra)<<(32-16)) \ + | dq) + +#define CHECK16B(vreg,offset,addr,label) \ + lxv vreg+32,offset(addr); \ + vcmpequb. vreg,vreg,v18; \ + bne cr6,L(label); \ + cmpldi r5,16; \ + ble L(null); \ + addi r5,r5,-16; + +/* Load 4 quadwords, merge into one VR for speed and check for NULLs. r6 has # + of bytes already checked. */ +#define CHECK64B(offset,addr,label) \ + M_LXVP(v4+32,offset,addr); \ + M_LXVP(v6+32,offset+32,addr); \ + MEMCHR_SUBTRACT_VECTORS; \ + vminub v14,v4,v5; \ + vminub v15,v6,v7; \ + vminub v16,v14,v15; \ + vcmpequb. v0,v16,M_VREG_ZERO; \ + beq cr6,$+12; \ + li r7,offset; \ + b L(label); \ + cmpldi r5,64; \ + ble L(null); \ + addi r5,r5,-64 + +/* Implements the function + void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5]). */ + + .machine power9 + +ENTRY_TOCLESS (MEMCHR) + CALL_MCOUNT 3 + + cmpldi r5,0 + beq L(null) + mr r0,r5 + xori r6,r4,0xff + + mtvsrd v18+32,r4 /* matching char in v18 */ + mtvsrd v19+32,r6 /* non matching char in v19 */ + + vspltb v18,v18,7 /* replicate */ + vspltb v19,v19,7 /* replicate */ + vspltisb M_VREG_ZERO,0 + + /* Next 16B-aligned address. Prepare address for L(aligned). */ + addi r6,r3,16 + clrrdi r6,r6,4 + + /* Align data and fill bytes not loaded with non matching char. */ + lvx v0,0,r3 + lvsr v1,0,r3 + vperm v0,v19,v0,v1 + + vcmpequb. v6,v0,v18 + bne cr6,L(found) + sub r4,r6,r3 + cmpld r5,r4 + ble L(null) + sub r5,r5,r4 + + /* Test up to OFF_START_LOOP-16 bytes in 16B chunks. The main loop is + optimized for longer strings, so checking the first bytes in 16B + chunks benefits a lot small strings. */ + .p2align 5 +L(aligned): + cmpldi r5,0 + beq L(null) + + CHECK16B(v0,0,r6,tail1) + CHECK16B(v1,16,r6,tail2) + CHECK16B(v2,32,r6,tail3) + CHECK16B(v3,48,r6,tail4) + CHECK16B(v4,64,r6,tail5) + CHECK16B(v5,80,r6,tail6) + CHECK16B(v6,96,r6,tail7) + CHECK16B(v7,112,r6,tail8) + CHECK16B(v8,128,r6,tail9) + CHECK16B(v9,144,r6,tail10) + CHECK16B(v10,160,r6,tail11) + CHECK16B(v0,176,r6,tail12) + CHECK16B(v1,192,r6,tail13) + CHECK16B(v2,208,r6,tail14) + CHECK16B(v3,224,r6,tail15) + + cmpdi cr5,r4,0 /* Check if c == 0. This will be useful to + choose how we will perform the main loop. */ + + /* Prepare address for the loop. */ + addi r4,r3,M_OFF_START_LOOP + clrrdi r4,r4,6 + sub r6,r4,r3 + sub r5,r0,r6 + addi r6,r4,128 + + /* If c == 0, use the loop without the vsububm. */ + beq cr5,L(loop) + + /* This is very similar to the block after L(loop), the difference is + that here MEMCHR_SUBTRACT_VECTORS is not empty, and we subtract + each byte loaded by the char we are looking for, this way we can keep + using vminub to merge the results and checking for nulls. */ + .p2align 5 +L(memchr_loop): + CHECK64B(0,r4,pre_tail_64b) + CHECK64B(64,r4,pre_tail_64b) + addi r4,r4,256 + + CHECK64B(0,r6,tail_64b) + CHECK64B(64,r6,tail_64b) + addi r6,r6,256 + + CHECK64B(0,r4,pre_tail_64b) + CHECK64B(64,r4,pre_tail_64b) + addi r4,r4,256 + + CHECK64B(0,r6,tail_64b) + CHECK64B(64,r6,tail_64b) + addi r6,r6,256 + + b L(memchr_loop) + /* Switch to a more aggressive approach checking 64B each time. Use 2 + pointers 128B apart and unroll the loop once to make the pointer + updates and usages separated enough to avoid stalls waiting for + address calculation. */ + .p2align 5 +L(loop): +#undef MEMCHR_SUBTRACT_VECTORS +#define MEMCHR_SUBTRACT_VECTORS /* nothing */ + CHECK64B(0,r4,pre_tail_64b) + CHECK64B(64,r4,pre_tail_64b) + addi r4,r4,256 + + CHECK64B(0,r6,tail_64b) + CHECK64B(64,r6,tail_64b) + addi r6,r6,256 + + CHECK64B(0,r4,pre_tail_64b) + CHECK64B(64,r4,pre_tail_64b) + addi r4,r4,256 + + CHECK64B(0,r6,tail_64b) + CHECK64B(64,r6,tail_64b) + addi r6,r6,256 + + b L(loop) + + .p2align 5 +L(pre_tail_64b): + mr r6,r4 +L(tail_64b): + /* OK, we found a null byte. Let's look for it in the current 64-byte + block and mark it in its corresponding VR. lxvp vx,0(ry) puts the + low 16B bytes into vx+1, and the high into vx, so the order here is + v5, v4, v7, v6. */ + vcmpequb v1,v5,M_VREG_ZERO + vcmpequb v2,v4,M_VREG_ZERO + vcmpequb v3,v7,M_VREG_ZERO + vcmpequb v4,v6,M_VREG_ZERO + + /* Take into account the other 64B blocks we had already checked. */ + add r6,r6,r7 + /* Extract first bit of each byte. */ + M_VEXTRACTBM(r8,v1) + M_VEXTRACTBM(r9,v2) + M_VEXTRACTBM(r10,v3) + M_VEXTRACTBM(r11,v4) + + /* Shift each value into their corresponding position. */ + sldi r9,r9,16 + sldi r10,r10,32 + sldi r11,r11,48 + + /* Merge the results. */ + or r8,r8,r9 + or r9,r10,r11 + or r11,r9,r8 + + cnttzd r0,r11 /* Count trailing zeros before the match. */ + cmpld r5,r0 + ble L(null) + add r3,r6,r0 /* Compute final address. */ + blr + + .p2align 5 +L(tail1): + M_TAIL(v0,0) + + .p2align 5 +L(tail2): + M_TAIL(v1,16) + + .p2align 5 +L(tail3): + M_TAIL(v2,32) + + .p2align 5 +L(tail4): + M_TAIL(v3,48) + + .p2align 5 +L(tail5): + M_TAIL(v4,64) + + .p2align 5 +L(tail6): + M_TAIL(v5,80) + + .p2align 5 +L(tail7): + M_TAIL(v6,96) + + .p2align 5 +L(tail8): + M_TAIL(v7,112) + + .p2align 5 +L(tail9): + M_TAIL(v8,128) + + .p2align 5 +L(tail10): + M_TAIL(v9,144) + + .p2align 5 +L(tail11): + M_TAIL(v10,160) + + .p2align 5 +L(tail12): + M_TAIL(v0,176) + + .p2align 5 +L(tail13): + M_TAIL(v1,192) + + .p2align 5 +L(tail14): + M_TAIL(v2,208) + + .p2align 5 +L(tail15): + M_TAIL(v3,224) + + .p2align 5 +L(found): + vctzlsbb r7,v6 + cmpld r5,r7 + ble L(null) + add r3,r3,r7 + blr + + .p2align 5 +L(null): + li r3,0 + blr + +END (MEMCHR) + +weak_alias (__memchr, memchr) +libc_hidden_builtin_def (memchr) diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile index 27d8495503..eb3d72a11c 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/Makefile +++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile @@ -31,10 +31,11 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \ strncase-power8 ifneq (,$(filter %le,$(config-machine))) -sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \ - rawmemchr-power9 rawmemchr-power10 \ - strcmp-power9 strncmp-power9 strcpy-power9 stpcpy-power9 \ - strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10 +sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \ + memmove-power10 memset-power10 rawmemchr-power9 \ + rawmemchr-power10 strcmp-power9 strncmp-power9 \ + strcpy-power9 stpcpy-power9 strlen-power9 strncpy-power9 \ + stpncpy-power9 strlen-power10 endif CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c index fc26dd0e17..b353ca4c3a 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c +++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c @@ -226,6 +226,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array, /* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */ IFUNC_IMPL (i, name, memchr, +#ifdef __LITTLE_ENDIAN__ + IFUNC_IMPL_ADD (array, i, memchr, + hwcap2 & PPC_FEATURE2_ARCH_3_1 + && hwcap & PPC_FEATURE_HAS_VSX, + __memchr_power10) +#endif IFUNC_IMPL_ADD (array, i, memchr, hwcap2 & PPC_FEATURE2_ARCH_2_07 && hwcap & PPC_FEATURE_HAS_ALTIVEC, diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S new file mode 100644 index 0000000000..b9ed792676 --- /dev/null +++ b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S @@ -0,0 +1,28 @@ +/* Optimized memchr implementation for POWER10/PPC64. + Copyright (C) 2016-2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#if defined __LITTLE_ENDIAN__ && IS_IN (libc) +#define MEMCHR __memchr_power10 + +#undef libc_hidden_builtin_def +#define libc_hidden_builtin_def(name) +#undef weak_alias +#define weak_alias(name,alias) + +#include <sysdeps/powerpc/powerpc64/le/power10/memchr.S> +#endif diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c index a1a8f3eedd..dbb30fe51d 100644 --- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c +++ b/sysdeps/powerpc/powerpc64/multiarch/memchr.c @@ -25,15 +25,23 @@ extern __typeof (__memchr) __memchr_ppc attribute_hidden; extern __typeof (__memchr) __memchr_power7 attribute_hidden; extern __typeof (__memchr) __memchr_power8 attribute_hidden; +# ifdef __LITTLE_ENDIAN__ +extern __typeof (__memchr) __memchr_power10 attribute_hidden; +# endif /* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle ifunc symbol properly. */ libc_ifunc (__memchr, - (hwcap2 & PPC_FEATURE2_ARCH_2_07 - && hwcap & PPC_FEATURE_HAS_ALTIVEC) - ? __memchr_power8 : - (hwcap & PPC_FEATURE_ARCH_2_06) - ? __memchr_power7 - : __memchr_ppc); +# ifdef __LITTLE_ENDIAN__ + (hwcap2 & PPC_FEATURE2_ARCH_3_1 + && hwcap & PPC_FEATURE_HAS_VSX) + ? __memchr_power10 : +# endif + (hwcap2 & PPC_FEATURE2_ARCH_2_07 + && hwcap & PPC_FEATURE_HAS_ALTIVEC) + ? __memchr_power8 : + (hwcap & PPC_FEATURE_ARCH_2_06) + ? __memchr_power7 + : __memchr_ppc); weak_alias (__memchr, memchr) libc_hidden_builtin_def (memchr)
From: MAHESH BODAPATI <bmahi496@linux.ibm.com> Optimized memchr for POWER10 based on existing rawmemchr and strlen. movement of code,dead code elimination and loop unrolling helped in getting better performance. --- sysdeps/powerpc/powerpc64/le/power10/memchr.S | 315 ++++++++++++++++++ sysdeps/powerpc/powerpc64/multiarch/Makefile | 9 +- .../powerpc64/multiarch/ifunc-impl-list.c | 6 + .../powerpc64/multiarch/memchr-power10.S | 28 ++ sysdeps/powerpc/powerpc64/multiarch/memchr.c | 20 +- 5 files changed, 368 insertions(+), 10 deletions(-) create mode 100644 sysdeps/powerpc/powerpc64/le/power10/memchr.S create mode 100644 sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S