diff mbox series

powerpc : Add optimized memchr for POWER10

Message ID 20231116102950.2615051-1-bmahi496@linux.ibm.com
State New
Headers show
Series powerpc : Add optimized memchr for POWER10 | expand

Commit Message

MAHESH BODAPATI Nov. 16, 2023, 10:29 a.m. UTC
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

Comments

MAHESH BODAPATI Nov. 16, 2023, 10:35 a.m. UTC | #1
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
Rajalakshmi Srinivasaraghavan Dec. 11, 2023, 7:49 p.m. UTC | #2
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 mbox series

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)