public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10
@ 2024-06-16 11:49 bmahi496
  2024-06-18 16:04 ` Paul E Murphy
  2024-06-20 21:40 ` Paul E Murphy
  0 siblings, 2 replies; 5+ messages in thread
From: bmahi496 @ 2024-06-16 11:49 UTC (permalink / raw)
  To: libc-alpha; +Cc: bergner, MAHESH BODAPATI

From: MAHESH BODAPATI <bmahi496@linux.ibm.com>

Improvements compared to POWER9 version:

Use simple comparisons for the first ~512 bytes
  The main loop is good for long strings, but comparing 16B each time is better
  for shorter strings. After aligning the address to 16 bytes, we unroll
  the loop four times, checking 128 bytes each time. There may be some overlap
  with the main loop for unaligned strings, but it is better for shorter strings.

Use new P10 instructions
  lxvp is used to load 32B with a single instruction, reducing contention in
  the load queue.

The degradations for smaller strings are not consistent and the overall
performance numbers are good.
---
 sysdeps/powerpc/powerpc64/le/power10/stpcpy.S |  24 ++
 sysdeps/powerpc/powerpc64/le/power10/strcpy.S | 394 ++++++++++++++++++
 sysdeps/powerpc/powerpc64/multiarch/Makefile  |   3 +-
 .../powerpc64/multiarch/ifunc-impl-list.c     |   6 +
 .../powerpc64/multiarch/stpcpy-power10.S      |  24 ++
 sysdeps/powerpc/powerpc64/multiarch/stpcpy.c  |  10 +-
 .../powerpc64/multiarch/strcpy-power10.S      |  26 ++
 sysdeps/powerpc/powerpc64/multiarch/strcpy.c  |   8 +-
 8 files changed, 489 insertions(+), 6 deletions(-)
 create mode 100644 sysdeps/powerpc/powerpc64/le/power10/stpcpy.S
 create mode 100644 sysdeps/powerpc/powerpc64/le/power10/strcpy.S
 create mode 100644 sysdeps/powerpc/powerpc64/multiarch/stpcpy-power10.S
 create mode 100644 sysdeps/powerpc/powerpc64/multiarch/strcpy-power10.S

diff --git a/sysdeps/powerpc/powerpc64/le/power10/stpcpy.S b/sysdeps/powerpc/powerpc64/le/power10/stpcpy.S
new file mode 100644
index 0000000000..711a1ad512
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/le/power10/stpcpy.S
@@ -0,0 +1,24 @@
+/* Optimized stpcpy implementation for PowerPC64/POWER10.
+   Copyright (C) 2024 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/>.  */
+
+#define USE_AS_STPCPY
+#include <sysdeps/powerpc/powerpc64/le/power10/strcpy.S>
+
+weak_alias (__stpcpy, stpcpy)
+libc_hidden_def (__stpcpy)
+libc_hidden_builtin_def (stpcpy)
diff --git a/sysdeps/powerpc/powerpc64/le/power10/strcpy.S b/sysdeps/powerpc/powerpc64/le/power10/strcpy.S
new file mode 100644
index 0000000000..de52c92e78
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/le/power10/strcpy.S
@@ -0,0 +1,394 @@
+/* Optimized strcpy implementation for PowerPC64/POWER10.
+   Copyright (C) 2024 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>
+
+#ifdef USE_AS_STPCPY
+# ifndef STPCPY
+#   define FUNC_NAME __stpcpy
+# else
+#   define FUNC_NAME STPCPY
+# endif
+#else
+# ifndef STRCPY
+#  define FUNC_NAME strcpy
+# else
+#  define FUNC_NAME STRCPY
+# endif
+#endif  /* !USE_AS_STPCPY  */
+
+/* Implements the function
+
+   char * [r3] strcpy (char *dest [r3], const char *src [r4])
+
+   or
+
+   char * [r3] stpcpy (char *dest [r3], const char *src [r4])
+
+   if USE_AS_STPCPY is defined.
+
+   The implementation can load bytes past a NULL terminator, but only
+   up to the next 16B/64B boundary, so it never crosses a page.  */
+
+
+#define LXVP(xtp,dq,ra)	    \
+	.long(((6)<<(32-6))		\
+	      | ((((xtp)-32)>>1)<<(32-10)) \
+	      | ((1)<<(32-11))	     \
+	      | ((ra)<<(32-16))	    \
+	      | dq)
+
+/* Load 4 quadwords, merge into one VR for speed and check for NULLs
+   and branch to label if NULL is found.  */
+#define CHECK_64B(offset,addr,label)	  \
+	LXVP(v4+32,offset,addr);	    \
+	LXVP(v6+32,offset+32,addr);	 \
+	vminub    v14,v4,v5;		\
+	vminub    v15,v6,v7;		\
+	vminub    v16,v14,v15;	      \
+	vcmpequb. v0,v16,v18;	       \
+	beq     cr6,$+12;		   \
+	li      r7,offset;		  \
+	b       L(label);		   \
+	stxv    32+v5,(offset+0)(r11);      \
+	stxv    32+v4,(offset+16)(r11);     \
+	stxv    32+v7,(offset+32)(r11);     \
+	stxv    32+v6,(offset+48)(r11)
+
+/* Load quadword at addr+offset to vreg, check for NULL bytes,
+   and branch to label if any are found.  */
+#define CHECK_16B(vreg,offset,addr,label) \
+	lxv	vreg+32,offset(addr);	\
+	vcmpequb. v15,vreg,v18;	\
+	bne	cr6,L(label);
+
+/* Store vreg2 with length if NULL is found.  */
+#define STORE_WITH_LEN(vreg1,vreg2,reg)    \
+	vctzlsbb r8,vreg1;		 \
+	addi    r9,r8,1;		   \
+	sldi    r9,r9,56;		  \
+	stxvl   32+vreg2,reg,r9;
+
+
+	/* TODO: change this to .machine power10 when the minimum required
+	   binutils allows it.  */
+	.machine power9
+ENTRY_TOCLESS (FUNC_NAME, 4)
+	CALL_MCOUNT 2
+
+	vspltisb v18,0		/* Zeroes in v18  */
+	vspltisb v19,-1	 /* 0xFF bytes in v19  */
+
+	/* Next 16B-aligned address. Prepare address for L(loop).  */
+	addi	r5,r4,16
+	clrrdi	r5,r5,4
+	subf	r8,r4,r5
+	add	r11,r3,r8
+
+	/* Align data and fill bytes not loaded with non matching char.  */
+	lvx	v0,0,r4
+	lvsr	v1,0,r4
+	vperm	v0,v19,v0,v1
+
+	vcmpequb. v6,v0,v18	/* 0xff if byte is NULL, 0x00 otherwise.  */
+	beq	cr6,L(no_null)
+
+	/* There's a NULL byte.  */
+	STORE_WITH_LEN(v6,v0,r3)
+
+#ifdef USE_AS_STPCPY
+	/* stpcpy returns the dest address plus the size not counting the
+	   final '\0'.  */
+	add	r3,r3,r8
+#endif
+	blr
+
+L(no_null):
+	sldi	r10,r8,56	/* stxvl wants size in top 8 bits.  */
+	stxvl	32+v0,r3,r10	/* Partial store.  */
+
+/* The main loop is optimized for longer strings(> 512 bytes),
+   so checking the first bytes in 16B chunks benefits shorter
+   strings a lot.  */
+	.p2align 4
+L(aligned):
+	CHECK_16B(v0,0,r5,tail1)
+	CHECK_16B(v1,16,r5,tail2)
+	CHECK_16B(v2,32,r5,tail3)
+	CHECK_16B(v3,48,r5,tail4)
+	CHECK_16B(v4,64,r5,tail5)
+	CHECK_16B(v5,80,r5,tail6)
+	CHECK_16B(v6,96,r5,tail7)
+	CHECK_16B(v7,112,r5,tail8)
+
+	stxv	32+v0,0(r11)
+	stxv	32+v1,16(r11)
+	stxv	32+v2,32(r11)
+	stxv	32+v3,48(r11)
+	stxv	32+v4,64(r11)
+	stxv	32+v5,80(r11)
+	stxv	32+v6,96(r11)
+	stxv	32+v7,112(r11)
+
+	addi	r11,r11,128
+
+	CHECK_16B(v0,128,r5,tail1)
+	CHECK_16B(v1,128+16,r5,tail2)
+	CHECK_16B(v2,128+32,r5,tail3)
+	CHECK_16B(v3,128+48,r5,tail4)
+	CHECK_16B(v4,128+64,r5,tail5)
+	CHECK_16B(v5,128+80,r5,tail6)
+	CHECK_16B(v6,128+96,r5,tail7)
+	CHECK_16B(v7,128+112,r5,tail8)
+
+	stxv    32+v0,0(r11)
+	stxv    32+v1,16(r11)
+	stxv    32+v2,32(r11)
+	stxv    32+v3,48(r11)
+	stxv    32+v4,64(r11)
+	stxv    32+v5,80(r11)
+	stxv    32+v6,96(r11)
+	stxv    32+v7,112(r11)
+
+	addi    r11,r11,128
+
+	CHECK_16B(v0,256,r5,tail1)
+	CHECK_16B(v1,256+16,r5,tail2)
+	CHECK_16B(v2,256+32,r5,tail3)
+	CHECK_16B(v3,256+48,r5,tail4)
+	CHECK_16B(v4,256+64,r5,tail5)
+	CHECK_16B(v5,256+80,r5,tail6)
+	CHECK_16B(v6,256+96,r5,tail7)
+	CHECK_16B(v7,256+112,r5,tail8)
+
+	stxv    32+v0,0(r11)
+	stxv    32+v1,16(r11)
+	stxv    32+v2,32(r11)
+	stxv    32+v3,48(r11)
+	stxv    32+v4,64(r11)
+	stxv    32+v5,80(r11)
+	stxv    32+v6,96(r11)
+	stxv    32+v7,112(r11)
+
+	addi    r11,r11,128
+
+	CHECK_16B(v0,384,r5,tail1)
+	CHECK_16B(v1,384+16,r5,tail2)
+	CHECK_16B(v2,384+32,r5,tail3)
+	CHECK_16B(v3,384+48,r5,tail4)
+	CHECK_16B(v4,384+64,r5,tail5)
+	CHECK_16B(v5,384+80,r5,tail6)
+	CHECK_16B(v6,384+96,r5,tail7)
+	CHECK_16B(v7,384+112,r5,tail8)
+
+	stxv    32+v0,0(r11)
+	stxv    32+v1,16(r11)
+	stxv    32+v2,32(r11)
+	stxv    32+v3,48(r11)
+	stxv    32+v4,64(r11)
+	stxv    32+v5,80(r11)
+	stxv    32+v6,96(r11)
+	stxv    32+v7,112(r11)
+
+	/* Prepare address for the loop.  */
+	addi    r5,r4,512
+	clrrdi  r5,r5,6
+	subf    r7,r4,r5
+	add     r11,r3,r7
+
+/* Switch to a more aggressive approach checking 64B each time.  */
+	.p2align 5
+L(strcpy_loop):
+	CHECK_64B(0,r5,tail_64b)
+	CHECK_64B(64,r5,tail_64b)
+	CHECK_64B(128,r5,tail_64b)
+	CHECK_64B(192,r5,tail_64b)
+
+	CHECK_64B(256,r5,tail_64b)
+	CHECK_64B(256+64,r5,tail_64b)
+	CHECK_64B(256+128,r5,tail_64b)
+	CHECK_64B(256+192,r5,tail_64b)
+	addi    r5,r5,512
+	addi    r11,r11,512
+
+	b	L(strcpy_loop)
+
+	.p2align 5
+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.  */
+	add	r11,r11,r7
+	vcmpequb. v8,v5,v18
+	beq	cr6,L(no_null_16B)
+	/* There's a NULL byte.  */
+	STORE_WITH_LEN(v8,v5,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+L(no_null_16B):
+	stxv    32+v5,0(r11)
+	vcmpequb. v8,v4,v18
+	beq     cr6,L(no_null_32B)
+	/* There's a NULL byte.  */
+	addi    r11,r11,16
+	STORE_WITH_LEN(v8,v4,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+L(no_null_32B):
+	stxv    32+v4,16(r11)
+	vcmpequb. v8,v7,v18
+	beq     cr6,L(no_null_48B)
+	/* There's a NULL byte.  */
+	addi    r11,r11,32
+	STORE_WITH_LEN(v8,v7,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+L(no_null_48B):
+	stxv    32+v7,32(r11)
+	vcmpequb. v8,v6,v18;
+	/* There's a NULL byte.  */
+	addi    r11,r11,48
+	STORE_WITH_LEN(v8,v6,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail1):
+	/* There's a NULL byte.  */
+	STORE_WITH_LEN(v15,v0,r11)
+#ifdef USE_AS_STPCPY
+	/* stpcpy returns the dest address plus the size not counting the
+	   final '\0'.  */
+	add	r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail2):
+	stxv	32+v0,0(r11)
+	/* There's a NULL byte.  */
+	addi    r11,r11,16
+	STORE_WITH_LEN(v15,v1,r11)
+#ifdef USE_AS_STPCPY
+	add	r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail3):
+	stxv	32+v0,0(r11)
+	stxv	32+v1,16(r11)
+	/* There's a NULL byte.  */
+	addi    r11,r11,32
+	STORE_WITH_LEN(v15,v2,r11)
+#ifdef USE_AS_STPCPY
+	add	r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail4):
+	stxv	32+v0,0(r11)
+	stxv	32+v1,16(r11)
+	stxv	32+v2,32(r11)
+	/* There's a NULL byte.  */
+	addi    r11,r11,48
+	STORE_WITH_LEN(v15,v3,r11)
+#ifdef USE_AS_STPCPY
+	add	r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail5):
+	stxv    32+v0,0(r11)
+	stxv    32+v1,16(r11)
+	stxv    32+v2,32(r11)
+	stxv    32+v3,48(r11)
+	/* There's a NULL byte.  */
+	addi    r11,r11,64
+	STORE_WITH_LEN(v15,v4,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail6):
+	stxv    32+v0,0(r11)
+	stxv    32+v1,16(r11)
+	stxv    32+v2,32(r11)
+	stxv    32+v3,48(r11)
+	stxv    32+v4,64(r11)
+	/* There's a NULL byte.  */
+	addi    r11,r11,80
+	STORE_WITH_LEN(v15,v5,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail7):
+	stxv    32+v0,0(r11)
+	stxv    32+v1,16(r11)
+	stxv    32+v2,32(r11)
+	stxv    32+v3,48(r11)
+	stxv    32+v4,64(r11)
+	stxv    32+v5,80(r11)
+	/* There's a NULL byte.  */
+	addi    r11,r11,96
+	STORE_WITH_LEN(v15,v6,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+	.p2align 4
+L(tail8):
+	stxv    32+v0,0(r11)
+	stxv    32+v1,16(r11)
+	stxv    32+v2,32(r11)
+	stxv    32+v3,48(r11)
+	stxv    32+v4,64(r11)
+	stxv    32+v5,80(r11)
+	stxv    32+v6,96(r11)
+	/* There's a NULL byte.  */
+	addi    r11,r11,112
+	STORE_WITH_LEN(v15,v7,r11)
+#ifdef USE_AS_STPCPY
+	add     r3,r11,r8
+#endif
+	blr
+
+END (FUNC_NAME)
+#ifndef USE_AS_STPCPY
+libc_hidden_builtin_def (strcpy)
+#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile
index b847c19049..1a71f8d239 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile
@@ -34,7 +34,8 @@ ifneq (,$(filter %le,$(config-machine)))
 sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \
 		   memmove-power10 memset-power10 rawmemchr-power9 \
 		   rawmemchr-power10 strcmp-power9 strcmp-power10 \
-		   strncmp-power9 strncmp-power10 strcpy-power9 stpcpy-power9 \
+		   strncmp-power9 strncmp-power10 strcpy-power9 \
+		   strcpy-power10 stpcpy-power9 stpcpy-power10 \
 		   strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10
 endif
 CFLAGS-strncase-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 2bb47d3527..5c515e2756 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
@@ -114,6 +114,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   /* Support sysdeps/powerpc/powerpc64/multiarch/strcpy.c.  */
   IFUNC_IMPL (i, name, strcpy,
 #ifdef __LITTLE_ENDIAN__
+	      IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_3_1
+			      && hwcap & PPC_FEATURE_HAS_VSX,
+			      __strcpy_power10)
 	      IFUNC_IMPL_ADD (array, i, strcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00
 			      && hwcap & PPC_FEATURE_HAS_VSX,
 			      __strcpy_power9)
@@ -130,6 +133,9 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
   /* Support sysdeps/powerpc/powerpc64/multiarch/stpcpy.c.  */
   IFUNC_IMPL (i, name, stpcpy,
 #ifdef __LITTLE_ENDIAN__
+	      IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_3_1
+			      && hwcap & PPC_FEATURE_HAS_VSX,
+			      __stpcpy_power10)
 	      IFUNC_IMPL_ADD (array, i, stpcpy, hwcap2 & PPC_FEATURE2_ARCH_3_00
 			      && hwcap & PPC_FEATURE_HAS_VSX,
 			      __stpcpy_power9)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power10.S b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power10.S
new file mode 100644
index 0000000000..fed5494ff4
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/multiarch/stpcpy-power10.S
@@ -0,0 +1,24 @@
+/* Optimized stpcpy implementation for POWER10/PPC64.
+   Copyright (C) 2024 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/>.  */
+
+#define STPCPY __stpcpy_power10
+
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(name)
+
+#include <sysdeps/powerpc/powerpc64/le/power10/stpcpy.S>
diff --git a/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c b/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c
index 33c4a1f241..668ced0653 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/stpcpy.c
@@ -28,13 +28,17 @@ extern __typeof (__stpcpy) __stpcpy_power7 attribute_hidden;
 extern __typeof (__stpcpy) __stpcpy_power8 attribute_hidden;
 # ifdef __LITTLE_ENDIAN__
 extern __typeof (__stpcpy) __stpcpy_power9 attribute_hidden;
+extern __typeof (__stpcpy) __stpcpy_power10 attribute_hidden;
 # endif
 
 libc_ifunc_hidden (__stpcpy, __stpcpy,
 # ifdef __LITTLE_ENDIAN__
-		   (hwcap2 & PPC_FEATURE2_ARCH_3_00
-		    && hwcap & PPC_FEATURE_HAS_VSX)
-		   ? __stpcpy_power9 :
+		(hwcap2 & PPC_FEATURE2_ARCH_3_1
+		 && hwcap & PPC_FEATURE_HAS_VSX)
+		? __stpcpy_power10
+		: (hwcap2 & PPC_FEATURE2_ARCH_3_00
+		   && hwcap & PPC_FEATURE_HAS_VSX)
+		  ? __stpcpy_power9 :
 # endif
 		     (hwcap2 & PPC_FEATURE2_ARCH_2_07
 		      && hwcap & PPC_FEATURE_HAS_ALTIVEC)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy-power10.S b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power10.S
new file mode 100644
index 0000000000..5d5997deb8
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/multiarch/strcpy-power10.S
@@ -0,0 +1,26 @@
+/* Optimized strcpy implementation for POWER10/PPC64.
+   Copyright (C) 2024 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 STRCPY __strcpy_power10
+
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(name)
+
+#include <sysdeps/powerpc/powerpc64/le/power10/strcpy.S>
+#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/strcpy.c b/sysdeps/powerpc/powerpc64/multiarch/strcpy.c
index 37189e6fd6..304b0fe588 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/strcpy.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/strcpy.c
@@ -27,14 +27,18 @@ extern __typeof (strcpy) __strcpy_power7 attribute_hidden;
 extern __typeof (strcpy) __strcpy_power8 attribute_hidden;
 # ifdef __LITTLE_ENDIAN__
 extern __typeof (strcpy) __strcpy_power9 attribute_hidden;
+extern __typeof (strcpy) __strcpy_power10 attribute_hidden;
 # endif
 #undef strcpy
 
 libc_ifunc_redirected (__redirect_strcpy, strcpy,
 # ifdef __LITTLE_ENDIAN__
-			(hwcap2 & PPC_FEATURE2_ARCH_3_00
+			(hwcap2 & PPC_FEATURE2_ARCH_3_1
 			 && hwcap & PPC_FEATURE_HAS_VSX)
-			? __strcpy_power9 :
+			? __strcpy_power10
+			: (hwcap2 & PPC_FEATURE2_ARCH_3_00
+			   && hwcap & PPC_FEATURE_HAS_VSX)
+			  ? __strcpy_power9 :
 # endif
 		       (hwcap2 & PPC_FEATURE2_ARCH_2_07
 			&& hwcap & PPC_FEATURE_HAS_ALTIVEC)
-- 
2.43.0


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10
  2024-06-16 11:49 [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10 bmahi496
@ 2024-06-18 16:04 ` Paul E Murphy
  2024-06-19  5:47   ` MAHESH BODAPATI
  2024-06-20 21:40 ` Paul E Murphy
  1 sibling, 1 reply; 5+ messages in thread
From: Paul E Murphy @ 2024-06-18 16:04 UTC (permalink / raw)
  To: bmahi496, libc-alpha; +Cc: bergner



On 6/16/24 6:49 AM, bmahi496@linux.ibm.com wrote:
> From: MAHESH BODAPATI <bmahi496@linux.ibm.com>
> 
> Improvements compared to POWER9 version:
> 
> Use simple comparisons for the first ~512 bytes
>    The main loop is good for long strings, but comparing 16B each time is better
>    for shorter strings. After aligning the address to 16 bytes, we unroll
>    the loop four times, checking 128 bytes each time. There may be some overlap
>    with the main loop for unaligned strings, but it is better for shorter strings.
> 
> Use new P10 instructions
>    lxvp is used to load 32B with a single instruction, reducing contention in
>    the load queue.
> 
> The degradations for smaller strings are not consistent and the overall
> performance numbers are good.

It is very helpful to include some or all of the benchmark results which 
change in the commit message.  It helps the reviewers to more quickly 
understand the tradeoffs of a new implementation.  Can you share some of 
the benchmark results for the V1 patch?

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10
  2024-06-18 16:04 ` Paul E Murphy
@ 2024-06-19  5:47   ` MAHESH BODAPATI
  0 siblings, 0 replies; 5+ messages in thread
From: MAHESH BODAPATI @ 2024-06-19  5:47 UTC (permalink / raw)
  To: Paul E Murphy, libc-alpha; +Cc: bergner

[-- Attachment #1: Type: text/plain, Size: 1183 bytes --]


On 18/06/24 9:34 pm, Paul E Murphy wrote:
>
>
> On 6/16/24 6:49 AM, bmahi496@linux.ibm.com wrote:
>> From: MAHESH BODAPATI <bmahi496@linux.ibm.com>
>>
>> Improvements compared to POWER9 version:
>>
>> Use simple comparisons for the first ~512 bytes
>>    The main loop is good for long strings, but comparing 16B each 
>> time is better
>>    for shorter strings. After aligning the address to 16 bytes, we 
>> unroll
>>    the loop four times, checking 128 bytes each time. There may be 
>> some overlap
>>    with the main loop for unaligned strings, but it is better for 
>> shorter strings.
>>
>> Use new P10 instructions
>>    lxvp is used to load 32B with a single instruction, reducing 
>> contention in
>>    the load queue.
>>
>> The degradations for smaller strings are not consistent and the overall
>> performance numbers are good.
>
> It is very helpful to include some or all of the benchmark results 
> which change in the commit message.  It helps the reviewers to more 
> quickly understand the tradeoffs of a new implementation. Can you 
> share some of the benchmark results for the V1 patch?


Please go through the attached benchmark results file.

[-- Attachment #2: strcpy_results.txt --]
[-- Type: text/plain, Size: 133437 bytes --]

Function: strcpy
Variant: 
                                    __strcpy_power10	__strcpy_power9
========================================================================================================================
align1=0, align2=0, len=0, max_char=127:         1.21 (  3.91%)	        1.26	
align1=0, align2=0, len=0, max_char=255:         1.21 (  4.20%)	        1.26	
align1=0, align2=0, len=0, max_char=127:         1.21 (  4.35%)	        1.26	
align1=0, align2=0, len=0, max_char=255:         1.21 (  4.07%)	        1.26	
align1=0, align2=0, len=1, max_char=127:         1.21 (  4.09%)	        1.26	
align1=0, align2=0, len=1, max_char=255:         1.21 (  4.22%)	        1.26	
align1=0, align2=1, len=1, max_char=127:         1.20 (  9.73%)	        1.33	
align1=1, align2=0, len=1, max_char=255:         1.21 (  9.52%)	        1.33	
align1=0, align2=0, len=2, max_char=127:         1.21 (  9.60%)	        1.34	
align1=0, align2=0, len=2, max_char=255:         1.21 (  9.51%)	        1.33	
align1=0, align2=2, len=2, max_char=127:         1.21 (  9.61%)	        1.33	
align1=2, align2=0, len=2, max_char=255:         1.21 (  9.50%)	        1.33	
align1=0, align2=0, len=3, max_char=127:         1.21 (  9.40%)	        1.33	
align1=0, align2=0, len=3, max_char=255:         1.21 (  9.65%)	        1.33	
align1=0, align2=3, len=3, max_char=127:         1.21 (  9.48%)	        1.33	
align1=3, align2=0, len=3, max_char=255:         1.21 (  9.64%)	        1.33	
align1=0, align2=0, len=4, max_char=127:         1.21 (  9.38%)	        1.33	
align1=0, align2=0, len=4, max_char=255:         1.21 (  9.44%)	        1.33	
align1=0, align2=4, len=4, max_char=127:         1.21 (  9.57%)	        1.33	
align1=4, align2=0, len=4, max_char=255:         1.21 (  9.48%)	        1.33	
align1=0, align2=0, len=5, max_char=127:         1.21 (  9.45%)	        1.33	
align1=0, align2=0, len=5, max_char=255:         1.21 (  9.38%)	        1.33	
align1=0, align2=5, len=5, max_char=127:         1.21 (  9.45%)	        1.33	
align1=5, align2=0, len=5, max_char=255:         1.28 (  4.29%)	        1.33	
align1=0, align2=0, len=6, max_char=127:         1.21 (  9.62%)	        1.33	
align1=0, align2=0, len=6, max_char=255:         1.21 (  9.44%)	        1.33	
align1=0, align2=6, len=6, max_char=127:         1.21 (  9.54%)	        1.33	
align1=6, align2=0, len=6, max_char=255:         1.21 (  9.51%)	        1.33	
align1=0, align2=0, len=7, max_char=127:         1.21 (  9.49%)	        1.33	
align1=0, align2=0, len=7, max_char=255:         1.21 (  9.67%)	        1.34	
align1=0, align2=7, len=7, max_char=127:         1.21 (  9.47%)	        1.33	
align1=7, align2=0, len=7, max_char=255:         1.21 (  9.60%)	        1.33	
align1=0, align2=0, len=8, max_char=127:         1.21 (  9.39%)	        1.33	
align1=0, align2=0, len=8, max_char=255:         1.21 (  9.78%)	        1.34	
align1=0, align2=0, len=8, max_char=127:         1.21 (  9.51%)	        1.33	
align1=0, align2=0, len=8, max_char=255:         1.21 (  9.60%)	        1.34	
align1=0, align2=0, len=9, max_char=127:         1.21 (  9.53%)	        1.33	
align1=0, align2=0, len=9, max_char=255:         1.21 (  9.53%)	        1.33	
align1=0, align2=1, len=9, max_char=127:         1.21 (  9.54%)	        1.33	
align1=1, align2=0, len=9, max_char=255:         1.21 (  9.65%)	        1.33	
align1=0, align2=0, len=10, max_char=127:         1.21 (  9.55%)	        1.33	
align1=0, align2=0, len=10, max_char=255:         1.21 (  9.41%)	        1.33	
align1=0, align2=2, len=10, max_char=127:         1.21 ( 15.20%)	        1.42	
align1=2, align2=0, len=10, max_char=255:         1.21 (  9.60%)	        1.33	
align1=0, align2=0, len=11, max_char=127:         1.21 (  9.52%)	        1.33	
align1=0, align2=0, len=11, max_char=255:         1.21 (  9.48%)	        1.33	
align1=0, align2=3, len=11, max_char=127:         1.21 (  9.57%)	        1.33	
align1=3, align2=0, len=11, max_char=255:         1.21 (  9.58%)	        1.33	
align1=0, align2=0, len=12, max_char=127:         1.21 (  9.55%)	        1.33	
align1=0, align2=0, len=12, max_char=255:         1.21 (  9.48%)	        1.33	
align1=0, align2=4, len=12, max_char=127:         1.21 (  9.55%)	        1.33	
align1=4, align2=0, len=12, max_char=255:         1.39 ( 10.71%)	        1.55	
align1=0, align2=0, len=13, max_char=127:         1.21 (  9.51%)	        1.33	
align1=0, align2=0, len=13, max_char=255:         1.21 (  9.55%)	        1.33	
align1=0, align2=5, len=13, max_char=127:         1.21 (  9.52%)	        1.33	
align1=5, align2=0, len=13, max_char=255:         1.39 (  0.43%)	        1.40	
align1=0, align2=0, len=14, max_char=127:         1.21 (  9.64%)	        1.34	
align1=0, align2=0, len=14, max_char=255:         1.21 (  9.40%)	        1.33	
align1=0, align2=6, len=14, max_char=127:         1.21 (  9.55%)	        1.33	
align1=6, align2=0, len=14, max_char=255:         1.39 ( 16.57%)	        1.67	
align1=0, align2=0, len=15, max_char=127:         1.21 (  4.08%)	        1.26	
align1=0, align2=0, len=15, max_char=255:         1.21 (  9.54%)	        1.33	
align1=0, align2=7, len=15, max_char=127:         1.21 (  9.39%)	        1.33	
align1=7, align2=0, len=15, max_char=255:         1.55 ( 13.81%)	        1.79	
align1=0, align2=0, len=16, max_char=127:         1.39 ( 10.42%)	        1.55	
align1=7, align2=2, len=16, max_char=127:         1.55 ( -0.01%)	        1.55	
align1=0, align2=0, len=32, max_char=127:         1.56 ( -0.45%)	        1.55	
align1=6, align2=4, len=32, max_char=127:         1.55 (  7.39%)	        1.67	
align1=0, align2=0, len=64, max_char=127:         1.57 ( 12.80%)	        1.80	
align1=5, align2=6, len=64, max_char=127:         1.57 (  6.40%)	        1.68	
align1=0, align2=0, len=128, max_char=127:         1.98 ( 19.38%)	        2.46	
align1=4, align2=0, len=128, max_char=127:         1.99 ( 14.23%)	        2.32	
align1=0, align2=0, len=256, max_char=127:         3.10 (  3.70%)	        3.22	
align1=3, align2=2, len=256, max_char=127:         3.09 (  3.30%)	        3.20	
align1=0, align2=0, len=512, max_char=127:         5.26 ( 11.41%)	        5.94	
align1=2, align2=4, len=512, max_char=127:         5.32 ( 10.44%)	        5.94	
align1=0, align2=0, len=1024, max_char=127:         9.59 ( 13.92%)	       11.14	
align1=1, align2=6, len=1024, max_char=127:         9.72 ( 12.79%)	       11.14	
align1=1, align2=2, len=16, max_char=127:         1.39 (  9.88%)	        1.54	
align1=2, align2=1, len=16, max_char=255:         1.55 (  0.11%)	        1.55	
align1=1, align2=1, len=16, max_char=127:         1.55 ( -0.56%)	        1.54	
align1=1, align2=1, len=16, max_char=255:         1.55 ( -0.24%)	        1.54	
align1=2, align2=4, len=32, max_char=127:         1.55 (  0.25%)	        1.55	
align1=4, align2=2, len=32, max_char=255:         1.68 ( -1.94%)	        1.64	
align1=2, align2=2, len=32, max_char=127:         1.68 (  0.25%)	        1.68	
align1=2, align2=2, len=32, max_char=255:         1.55 (  0.16%)	        1.55	
align1=3, align2=6, len=64, max_char=127:         1.57 ( 13.16%)	        1.81	
align1=6, align2=3, len=64, max_char=255:         1.69 (  6.47%)	        1.80	
align1=3, align2=3, len=64, max_char=127:         1.69 (  6.28%)	        1.80	
align1=3, align2=3, len=64, max_char=255:         1.69 (  6.28%)	        1.80	
align1=4, align2=0, len=128, max_char=127:         1.99 ( 18.82%)	        2.45	
align1=0, align2=4, len=128, max_char=255:         1.99 (  4.20%)	        2.08	
align1=4, align2=4, len=128, max_char=127:         1.98 (  9.53%)	        2.19	
align1=4, align2=4, len=128, max_char=255:         1.98 ( 11.92%)	        2.24	
align1=5, align2=2, len=256, max_char=127:         3.09 (  3.36%)	        3.20	
align1=2, align2=5, len=256, max_char=255:         3.10 (  3.55%)	        3.21	
align1=5, align2=5, len=256, max_char=127:         3.18 (  1.76%)	        3.23	
align1=5, align2=5, len=256, max_char=255:         3.10 (  4.07%)	        3.23	
align1=6, align2=4, len=512, max_char=127:         5.34 ( 12.80%)	        6.12	
align1=4, align2=6, len=512, max_char=255:         5.32 (  9.99%)	        5.91	
align1=6, align2=6, len=512, max_char=127:         5.26 ( 10.68%)	        5.89	
align1=6, align2=6, len=512, max_char=255:         5.26 (  9.62%)	        5.82	
align1=7, align2=6, len=1024, max_char=127:         9.83 ( 12.52%)	       11.24	
align1=6, align2=7, len=1024, max_char=255:         9.72 ( 12.87%)	       11.16	
align1=7, align2=7, len=1024, max_char=127:         9.59 ( 13.53%)	       11.09	
align1=7, align2=7, len=1024, max_char=255:         9.59 ( 13.57%)	       11.09	
align1=0, align2=4, len=16, max_char=127:         1.55 (  0.27%)	        1.55	
align1=4, align2=0, len=16, max_char=255:         1.55 ( -0.02%)	        1.55	
align1=4, align2=4, len=16, max_char=127:         1.55 (  0.13%)	        1.55	
align1=2, align2=2, len=16, max_char=255:         1.55 ( -0.03%)	        1.55	
align1=2, align2=6, len=16, max_char=127:         1.55 ( -0.01%)	        1.55	
align1=6, align2=2, len=16, max_char=255:         1.55 (  0.74%)	        1.56	
align1=1, align2=7, len=16, max_char=127:         1.55 (  0.00%)	        1.55	
align1=7, align2=1, len=16, max_char=255:         1.54 (  0.03%)	        1.55	
align1=3, align2=4, len=16, max_char=127:         1.39 (  0.03%)	        1.39	
align1=4, align2=3, len=16, max_char=255:         1.39 ( -0.04%)	        1.39	
align1=5, align2=7, len=16, max_char=127:         1.39 (  0.27%)	        1.39	
align1=7, align2=5, len=16, max_char=127:         1.38 (  0.00%)	        1.38	
align1=0, align2=4, len=20, max_char=127:         1.39 (  0.41%)	        1.39	
align1=4, align2=0, len=20, max_char=255:         1.39 ( -0.36%)	        1.39	
align1=4, align2=4, len=20, max_char=127:         1.38 ( -0.04%)	        1.38	
align1=2, align2=2, len=20, max_char=255:         1.39 ( -0.01%)	        1.39	
align1=2, align2=6, len=20, max_char=127:         1.39 ( -0.16%)	        1.39	
align1=6, align2=2, len=20, max_char=255:         1.39 ( -0.11%)	        1.39	
align1=1, align2=7, len=20, max_char=127:         1.39 ( -0.36%)	        1.39	
align1=7, align2=1, len=20, max_char=255:         1.39 (  0.62%)	        1.39	
align1=3, align2=4, len=20, max_char=127:         1.38 (  0.48%)	        1.39	
align1=4, align2=3, len=20, max_char=255:         1.39 (  0.53%)	        1.39	
align1=5, align2=7, len=20, max_char=127:         1.39 (  0.45%)	        1.39	
align1=7, align2=5, len=20, max_char=127:         1.39 (  0.00%)	        1.39	
align1=0, align2=4, len=24, max_char=127:         1.39 (  0.30%)	        1.39	
align1=4, align2=0, len=24, max_char=255:         1.39 (  0.11%)	        1.39	
align1=4, align2=4, len=24, max_char=127:         1.39 (  0.14%)	        1.39	
align1=2, align2=2, len=24, max_char=255:         1.39 (  0.05%)	        1.39	
align1=2, align2=6, len=24, max_char=127:         1.39 ( -0.11%)	        1.39	
align1=6, align2=2, len=24, max_char=255:         1.39 (  0.29%)	        1.39	
align1=1, align2=7, len=24, max_char=127:         1.39 (  0.03%)	        1.39	
align1=7, align2=1, len=24, max_char=255:         1.39 (  0.44%)	        1.39	
align1=3, align2=4, len=24, max_char=127:         1.38 (  0.68%)	        1.39	
align1=4, align2=3, len=24, max_char=255:         1.38 (  0.51%)	        1.39	
align1=5, align2=7, len=24, max_char=127:         1.39 (  0.00%)	        1.39	
align1=7, align2=5, len=24, max_char=127:         1.39 (  0.17%)	        1.39	
align1=0, align2=4, len=28, max_char=127:         1.39 ( -0.17%)	        1.39	
align1=4, align2=0, len=28, max_char=255:         1.55 ( -0.20%)	        1.55	
align1=4, align2=4, len=28, max_char=127:         1.55 (  0.15%)	        1.55	
align1=2, align2=2, len=28, max_char=255:         1.39 ( -0.23%)	        1.39	
align1=2, align2=6, len=28, max_char=127:         1.55 (-11.27%)	        1.39	
align1=6, align2=2, len=28, max_char=255:         1.55 (  0.12%)	        1.55	
align1=1, align2=7, len=28, max_char=127:         1.39 (  0.38%)	        1.39	
align1=7, align2=1, len=28, max_char=255:         1.55 ( -0.18%)	        1.55	
align1=3, align2=4, len=28, max_char=127:         1.54 (-11.05%)	        1.39	
align1=4, align2=3, len=28, max_char=255:         1.55 (  0.31%)	        1.56	
align1=5, align2=7, len=28, max_char=127:         1.68 ( -8.22%)	        1.55	
align1=7, align2=5, len=28, max_char=127:         1.67 ( -8.20%)	        1.55	
align1=0, align2=4, len=32, max_char=127:         1.55 ( -0.09%)	        1.55	
align1=4, align2=0, len=32, max_char=255:         1.55 (  0.74%)	        1.56	
align1=4, align2=4, len=32, max_char=127:         1.55 (  0.47%)	        1.56	
align1=2, align2=2, len=32, max_char=255:         1.55 ( -0.29%)	        1.55	
align1=2, align2=6, len=32, max_char=127:         1.55 ( -0.02%)	        1.55	
align1=6, align2=2, len=32, max_char=255:         1.68 ( -8.03%)	        1.55	
align1=1, align2=7, len=32, max_char=127:         1.68 ( -8.28%)	        1.55	
align1=7, align2=1, len=32, max_char=255:         1.68 ( -7.71%)	        1.56	
align1=3, align2=4, len=32, max_char=127:         1.68 ( -7.73%)	        1.56	
align1=4, align2=3, len=32, max_char=255:         1.55 (  0.06%)	        1.55	
align1=5, align2=7, len=32, max_char=127:         1.67 ( -8.22%)	        1.55	
align1=7, align2=5, len=32, max_char=127:         1.54 (  0.22%)	        1.55	
align1=0, align2=4, len=36, max_char=127:         1.68 ( -8.28%)	        1.55	
align1=4, align2=0, len=36, max_char=255:         1.55 (  0.70%)	        1.56	
align1=4, align2=4, len=36, max_char=127:         1.67 ( -7.39%)	        1.56	
align1=2, align2=2, len=36, max_char=255:         1.55 (  0.24%)	        1.55	
align1=2, align2=6, len=36, max_char=127:         1.68 ( -7.85%)	        1.55	
align1=6, align2=2, len=36, max_char=255:         1.68 ( -7.54%)	        1.56	
align1=1, align2=7, len=36, max_char=127:         1.68 ( -8.40%)	        1.55	
align1=7, align2=1, len=36, max_char=255:         1.68 ( -8.28%)	        1.55	
align1=3, align2=4, len=36, max_char=127:         1.67 ( -7.43%)	        1.56	
align1=4, align2=3, len=36, max_char=255:         1.67 ( -7.94%)	        1.55	
align1=5, align2=7, len=36, max_char=127:         1.68 ( -8.15%)	        1.55	
align1=7, align2=5, len=36, max_char=127:         1.67 ( -8.09%)	        1.55	
align1=0, align2=4, len=40, max_char=127:         1.67 ( -7.48%)	        1.56	
align1=4, align2=0, len=40, max_char=255:         1.67 ( -8.06%)	        1.55	
align1=4, align2=4, len=40, max_char=127:         1.68 ( -8.03%)	        1.55	
align1=2, align2=2, len=40, max_char=255:         1.68 ( -7.91%)	        1.55	
align1=2, align2=6, len=40, max_char=127:         1.68 ( -7.87%)	        1.55	
align1=6, align2=2, len=40, max_char=255:         1.68 ( -8.21%)	        1.55	
align1=1, align2=7, len=40, max_char=127:         1.67 ( -7.95%)	        1.55	
align1=7, align2=1, len=40, max_char=255:         1.67 ( -8.09%)	        1.55	
align1=3, align2=4, len=40, max_char=127:         1.67 ( -7.96%)	        1.55	
align1=4, align2=3, len=40, max_char=255:         1.68 ( -7.62%)	        1.56	
align1=5, align2=7, len=40, max_char=127:         1.68 ( -7.93%)	        1.55	
align1=7, align2=5, len=40, max_char=127:         1.68 ( -8.31%)	        1.55	
align1=0, align2=4, len=44, max_char=127:         1.67 ( -8.03%)	        1.55	
align1=4, align2=0, len=44, max_char=255:         1.68 ( -0.58%)	        1.67	
align1=4, align2=4, len=44, max_char=127:         1.68 (  7.18%)	        1.80	
align1=2, align2=2, len=44, max_char=255:         1.68 ( -9.73%)	        1.53	
align1=2, align2=6, len=44, max_char=127:         1.55 (  0.55%)	        1.56	
align1=6, align2=2, len=44, max_char=255:         1.67 (  7.13%)	        1.80	
align1=1, align2=7, len=44, max_char=127:         1.67 ( -7.96%)	        1.55	
align1=7, align2=1, len=44, max_char=255:         1.67 (  7.23%)	        1.80	
align1=3, align2=4, len=44, max_char=127:         1.67 ( -8.04%)	        1.55	
align1=4, align2=3, len=44, max_char=255:         1.55 ( 11.99%)	        1.77	
align1=5, align2=7, len=44, max_char=127:         1.67 (  7.33%)	        1.80	
align1=7, align2=5, len=44, max_char=127:         1.68 (  7.15%)	        1.80	
align1=0, align2=4, len=48, max_char=127:         1.55 (  7.17%)	        1.67	
align1=4, align2=0, len=48, max_char=255:         1.68 (  7.06%)	        1.80	
align1=4, align2=4, len=48, max_char=127:         1.68 (  7.11%)	        1.80	
align1=2, align2=2, len=48, max_char=255:         1.67 (  7.23%)	        1.80	
align1=2, align2=6, len=48, max_char=127:         1.67 (  7.14%)	        1.80	
align1=6, align2=2, len=48, max_char=255:         1.67 (  7.04%)	        1.80	
align1=1, align2=7, len=48, max_char=127:         1.67 (  7.16%)	        1.80	
align1=7, align2=1, len=48, max_char=255:         1.55 ( 13.87%)	        1.80	
align1=3, align2=4, len=48, max_char=127:         1.67 (  7.11%)	        1.80	
align1=4, align2=3, len=48, max_char=255:         1.68 (  7.04%)	        1.80	
align1=5, align2=7, len=48, max_char=127:         1.68 (  7.06%)	        1.80	
align1=7, align2=5, len=48, max_char=127:         1.68 (  7.05%)	        1.80	
align1=0, align2=4, len=52, max_char=127:         1.67 (  7.21%)	        1.80	
align1=4, align2=0, len=52, max_char=255:         1.67 (  7.12%)	        1.80	
align1=4, align2=4, len=52, max_char=127:         1.68 (  7.22%)	        1.81	
align1=2, align2=2, len=52, max_char=255:         1.68 (  7.08%)	        1.80	
align1=2, align2=6, len=52, max_char=127:         1.67 (  7.20%)	        1.80	
align1=6, align2=2, len=52, max_char=255:         1.67 (  7.18%)	        1.80	
align1=1, align2=7, len=52, max_char=127:         1.67 (  7.19%)	        1.80	
align1=7, align2=1, len=52, max_char=255:         1.67 (  7.20%)	        1.80	
align1=3, align2=4, len=52, max_char=127:         1.67 (  7.31%)	        1.80	
align1=4, align2=3, len=52, max_char=255:         1.67 (  7.20%)	        1.80	
align1=5, align2=7, len=52, max_char=127:         1.67 (  7.16%)	        1.80	
align1=7, align2=5, len=52, max_char=127:         1.67 (  7.28%)	        1.80	
align1=0, align2=4, len=56, max_char=127:         1.67 (  7.05%)	        1.80	
align1=4, align2=0, len=56, max_char=255:         1.68 (  7.11%)	        1.80	
align1=4, align2=4, len=56, max_char=127:         1.68 (  7.06%)	        1.80	
align1=2, align2=2, len=56, max_char=255:         1.68 (  6.87%)	        1.80	
align1=2, align2=6, len=56, max_char=127:         1.68 (  7.13%)	        1.80	
align1=6, align2=2, len=56, max_char=255:         1.67 (  7.12%)	        1.80	
align1=1, align2=7, len=56, max_char=127:         1.67 (  7.24%)	        1.80	
align1=7, align2=1, len=56, max_char=255:         1.67 (  7.15%)	        1.80	
align1=3, align2=4, len=56, max_char=127:         1.67 (  7.21%)	        1.80	
align1=4, align2=3, len=56, max_char=255:         1.67 (  7.15%)	        1.80	
align1=5, align2=7, len=56, max_char=127:         1.67 (  7.22%)	        1.80	
align1=7, align2=5, len=56, max_char=127:         1.67 (  7.10%)	        1.80	
align1=0, align2=4, len=60, max_char=127:         1.67 (  7.20%)	        1.80	
align1=4, align2=0, len=60, max_char=255:         1.69 (  5.18%)	        1.78	
align1=4, align2=4, len=60, max_char=127:         1.69 (  6.36%)	        1.80	
align1=2, align2=2, len=60, max_char=255:         1.68 (  6.95%)	        1.80	
align1=2, align2=6, len=60, max_char=127:         1.68 (  7.03%)	        1.80	
align1=6, align2=2, len=60, max_char=255:         1.69 (  5.55%)	        1.79	
align1=1, align2=7, len=60, max_char=127:         1.67 (  7.16%)	        1.80	
align1=7, align2=1, len=60, max_char=255:         1.69 (  5.15%)	        1.78	
align1=3, align2=4, len=60, max_char=127:         1.67 (  7.30%)	        1.80	
align1=4, align2=3, len=60, max_char=255:         1.69 (  5.82%)	        1.79	
align1=5, align2=7, len=60, max_char=127:         1.69 (  6.37%)	        1.80	
align1=7, align2=5, len=60, max_char=127:         1.69 (  6.40%)	        1.80	
align1=0, align2=4, len=64, max_char=127:         1.57 (  6.37%)	        1.68	
align1=4, align2=0, len=64, max_char=255:         1.57 (  6.51%)	        1.68	
align1=4, align2=4, len=64, max_char=127:         1.69 (  6.39%)	        1.81	
align1=2, align2=2, len=64, max_char=255:         1.69 (  6.37%)	        1.80	
align1=2, align2=6, len=64, max_char=127:         1.69 (  6.27%)	        1.80	
align1=6, align2=2, len=64, max_char=255:         1.69 (  6.46%)	        1.81	
align1=1, align2=7, len=64, max_char=127:         1.69 (  6.38%)	        1.81	
align1=7, align2=1, len=64, max_char=255:         1.69 (  6.47%)	        1.80	
align1=3, align2=4, len=64, max_char=127:         1.69 (  6.07%)	        1.80	
align1=4, align2=3, len=64, max_char=255:         1.69 (  6.28%)	        1.80	
align1=5, align2=7, len=64, max_char=127:         1.69 (  6.39%)	        1.80	
align1=7, align2=5, len=64, max_char=127:         1.69 (  6.07%)	        1.80	
align1=0, align2=4, len=68, max_char=127:         1.69 (  6.28%)	        1.80	
align1=4, align2=0, len=68, max_char=255:         1.69 (  6.40%)	        1.81	
align1=4, align2=4, len=68, max_char=127:         1.69 (  6.68%)	        1.81	
align1=2, align2=2, len=68, max_char=255:         1.69 (  6.37%)	        1.80	
align1=2, align2=6, len=68, max_char=127:         1.69 (  6.66%)	        1.81	
align1=6, align2=2, len=68, max_char=255:         1.69 (  6.30%)	        1.80	
align1=1, align2=7, len=68, max_char=127:         1.69 (  6.28%)	        1.80	
align1=7, align2=1, len=68, max_char=255:         1.69 (  6.21%)	        1.80	
align1=3, align2=4, len=68, max_char=127:         1.69 (  6.28%)	        1.80	
align1=4, align2=3, len=68, max_char=255:         1.69 (  6.26%)	        1.80	
align1=5, align2=7, len=68, max_char=127:         1.69 (  6.28%)	        1.80	
align1=7, align2=5, len=68, max_char=127:         1.69 (  6.28%)	        1.80	
align1=0, align2=4, len=72, max_char=127:         1.69 (  6.07%)	        1.80	
align1=4, align2=0, len=72, max_char=255:         1.69 (  6.24%)	        1.80	
align1=4, align2=4, len=72, max_char=127:         1.69 (  6.28%)	        1.80	
align1=2, align2=2, len=72, max_char=255:         1.69 (  6.29%)	        1.80	
align1=2, align2=6, len=72, max_char=127:         1.69 (  6.39%)	        1.80	
align1=6, align2=2, len=72, max_char=255:         1.69 (  6.30%)	        1.80	
align1=1, align2=7, len=72, max_char=127:         1.69 (  6.29%)	        1.80	
align1=7, align2=1, len=72, max_char=255:         1.69 (  6.40%)	        1.80	
align1=3, align2=4, len=72, max_char=127:         1.69 (  6.27%)	        1.80	
align1=4, align2=3, len=72, max_char=255:         1.69 (  6.35%)	        1.80	
align1=5, align2=7, len=72, max_char=127:         1.69 (  6.03%)	        1.80	
align1=7, align2=5, len=72, max_char=127:         1.69 (  6.28%)	        1.80	
align1=0, align2=4, len=76, max_char=127:         1.69 (  6.29%)	        1.80	
align1=4, align2=0, len=76, max_char=255:         1.81 (  6.48%)	        1.93	
align1=4, align2=4, len=76, max_char=127:         1.94 ( -0.02%)	        1.94	
align1=2, align2=2, len=76, max_char=255:         1.69 (  5.88%)	        1.80	
align1=2, align2=6, len=76, max_char=127:         1.69 (  6.28%)	        1.80	
align1=6, align2=2, len=76, max_char=255:         1.94 ( -7.16%)	        1.81	
align1=1, align2=7, len=76, max_char=127:         1.69 (  5.89%)	        1.80	
align1=7, align2=1, len=76, max_char=255:         1.81 (  6.63%)	        1.94	
align1=3, align2=4, len=76, max_char=127:         1.69 (  5.80%)	        1.79	
align1=4, align2=3, len=76, max_char=255:         1.81 ( -0.03%)	        1.81	
align1=5, align2=7, len=76, max_char=127:         1.81 (  7.13%)	        1.95	
align1=7, align2=5, len=76, max_char=127:         1.94 ( -6.80%)	        1.81	
align1=0, align2=4, len=80, max_char=127:         1.80 (  0.31%)	        1.81	
align1=4, align2=0, len=80, max_char=255:         1.81 ( -0.09%)	        1.81	
align1=4, align2=4, len=80, max_char=127:         1.94 ( -0.12%)	        1.93	
align1=2, align2=2, len=80, max_char=255:         1.94 ( -0.06%)	        1.94	
align1=2, align2=6, len=80, max_char=127:         1.94 ( -7.36%)	        1.80	
align1=6, align2=2, len=80, max_char=255:         1.81 (  0.09%)	        1.81	
align1=1, align2=7, len=80, max_char=127:         1.94 ( -7.21%)	        1.81	
align1=7, align2=1, len=80, max_char=255:         1.94 (  0.16%)	        1.94	
align1=3, align2=4, len=80, max_char=127:         1.81 (  6.91%)	        1.94	
align1=4, align2=3, len=80, max_char=255:         1.81 (  6.63%)	        1.94	
align1=5, align2=7, len=80, max_char=127:         1.81 (  6.57%)	        1.94	
align1=7, align2=5, len=80, max_char=127:         1.94 ( -7.27%)	        1.81	
align1=0, align2=4, len=84, max_char=127:         1.94 (  0.18%)	        1.94	
align1=4, align2=0, len=84, max_char=255:         1.80 (  0.10%)	        1.81	
align1=4, align2=4, len=84, max_char=127:         1.94 ( -7.29%)	        1.80	
align1=2, align2=2, len=84, max_char=255:         1.81 (  0.11%)	        1.81	
align1=2, align2=6, len=84, max_char=127:         1.93 (  0.16%)	        1.94	
align1=6, align2=2, len=84, max_char=255:         1.93 (  0.49%)	        1.94	
align1=1, align2=7, len=84, max_char=127:         1.94 ( -0.08%)	        1.93	
align1=7, align2=1, len=84, max_char=255:         1.94 ( -0.02%)	        1.94	
align1=3, align2=4, len=84, max_char=127:         1.94 ( -0.09%)	        1.94	
align1=4, align2=3, len=84, max_char=255:         1.94 ( -6.81%)	        1.81	
align1=5, align2=7, len=84, max_char=127:         1.94 (  0.23%)	        1.94	
align1=7, align2=5, len=84, max_char=127:         1.94 (  0.18%)	        1.94	
align1=0, align2=4, len=88, max_char=127:         1.94 (  0.01%)	        1.94	
align1=4, align2=0, len=88, max_char=255:         1.94 (  0.04%)	        1.94	
align1=4, align2=4, len=88, max_char=127:         1.94 ( -0.10%)	        1.93	
align1=2, align2=2, len=88, max_char=255:         1.94 ( -0.18%)	        1.93	
align1=2, align2=6, len=88, max_char=127:         1.80 (  6.96%)	        1.94	
align1=6, align2=2, len=88, max_char=255:         1.94 ( -0.02%)	        1.94	
align1=1, align2=7, len=88, max_char=127:         1.94 (  0.02%)	        1.94	
align1=7, align2=1, len=88, max_char=255:         1.94 ( -7.11%)	        1.81	
align1=3, align2=4, len=88, max_char=127:         1.81 (  0.19%)	        1.81	
align1=4, align2=3, len=88, max_char=255:         1.94 ( -7.49%)	        1.80	
align1=5, align2=7, len=88, max_char=127:         1.94 ( -7.30%)	        1.81	
align1=7, align2=5, len=88, max_char=127:         1.81 (  6.64%)	        1.94	
align1=0, align2=4, len=92, max_char=127:         1.94 ( -6.89%)	        1.81	
align1=4, align2=0, len=92, max_char=255:         1.94 ( -1.30%)	        1.91	
align1=4, align2=4, len=92, max_char=127:         1.94 ( -0.48%)	        1.93	
align1=2, align2=2, len=92, max_char=255:         1.94 ( -2.35%)	        1.89	
align1=2, align2=6, len=92, max_char=127:         1.94 ( -6.82%)	        1.81	
align1=6, align2=2, len=92, max_char=255:         1.92 (  7.08%)	        2.07	
align1=1, align2=7, len=92, max_char=127:         1.92 (  1.06%)	        1.94	
align1=7, align2=1, len=92, max_char=255:         1.92 (  6.91%)	        2.06	
align1=3, align2=4, len=92, max_char=127:         1.92 ( -1.41%)	        1.89	
align1=4, align2=3, len=92, max_char=255:         1.92 (  6.92%)	        2.07	
align1=5, align2=7, len=92, max_char=127:         1.92 (  7.01%)	        2.06	
align1=7, align2=5, len=92, max_char=127:         1.93 (  6.32%)	        2.06	
align1=0, align2=4, len=96, max_char=127:         1.81 ( 12.52%)	        2.06	
align1=4, align2=0, len=96, max_char=255:         1.93 (  6.33%)	        2.06	
align1=4, align2=4, len=96, max_char=127:         1.94 (  6.25%)	        2.06	
align1=2, align2=2, len=96, max_char=255:         1.93 (  6.24%)	        2.06	
align1=2, align2=6, len=96, max_char=127:         1.93 (  6.30%)	        2.06	
align1=6, align2=2, len=96, max_char=255:         1.93 (  6.35%)	        2.07	
align1=1, align2=7, len=96, max_char=127:         1.93 (  6.36%)	        2.06	
align1=7, align2=1, len=96, max_char=255:         1.93 (  6.43%)	        2.07	
align1=3, align2=4, len=96, max_char=127:         1.94 (  6.26%)	        2.06	
align1=4, align2=3, len=96, max_char=255:         1.93 (  6.35%)	        2.07	
align1=5, align2=7, len=96, max_char=127:         1.94 (  6.24%)	        2.06	
align1=7, align2=5, len=96, max_char=127:         1.93 (  6.17%)	        2.06	
align1=0, align2=4, len=100, max_char=127:         1.93 (  6.25%)	        2.06	
align1=4, align2=0, len=100, max_char=255:         1.93 (  6.37%)	        2.06	
align1=4, align2=4, len=100, max_char=127:         1.94 (  6.24%)	        2.06	
align1=2, align2=2, len=100, max_char=255:         1.93 (  6.27%)	        2.06	
align1=2, align2=6, len=100, max_char=127:         1.93 (  6.40%)	        2.07	
align1=6, align2=2, len=100, max_char=255:         1.93 (  6.33%)	        2.06	
align1=1, align2=7, len=100, max_char=127:         1.93 (  6.30%)	        2.06	
align1=7, align2=1, len=100, max_char=255:         1.93 (  6.25%)	        2.06	
align1=3, align2=4, len=100, max_char=127:         1.94 (  6.25%)	        2.06	
align1=4, align2=3, len=100, max_char=255:         1.94 (  6.29%)	        2.07	
align1=5, align2=7, len=100, max_char=127:         1.93 (  6.36%)	        2.06	
align1=7, align2=5, len=100, max_char=127:         1.93 (  6.39%)	        2.07	
align1=0, align2=4, len=104, max_char=127:         1.93 (  6.39%)	        2.07	
align1=4, align2=0, len=104, max_char=255:         1.93 (  6.39%)	        2.07	
align1=4, align2=4, len=104, max_char=127:         1.94 (  6.42%)	        2.07	
align1=2, align2=2, len=104, max_char=255:         1.93 (  6.26%)	        2.06	
align1=2, align2=6, len=104, max_char=127:         1.93 (  6.28%)	        2.06	
align1=6, align2=2, len=104, max_char=255:         1.93 (  6.39%)	        2.07	
align1=1, align2=7, len=104, max_char=127:         1.93 (  6.32%)	        2.06	
align1=7, align2=1, len=104, max_char=255:         1.93 (  6.27%)	        2.06	
align1=3, align2=4, len=104, max_char=127:         1.93 (  6.27%)	        2.06	
align1=4, align2=3, len=104, max_char=255:         1.93 (  6.31%)	        2.06	
align1=5, align2=7, len=104, max_char=127:         1.93 (  6.32%)	        2.06	
align1=7, align2=5, len=104, max_char=127:         1.94 (  6.25%)	        2.06	
align1=0, align2=4, len=108, max_char=127:         1.93 (  6.38%)	        2.07	
align1=4, align2=0, len=108, max_char=255:         2.07 ( 10.88%)	        2.32	
align1=4, align2=4, len=108, max_char=127:         2.07 ( 15.72%)	        2.45	
align1=2, align2=2, len=108, max_char=255:         1.89 (  0.95%)	        1.90	
align1=2, align2=6, len=108, max_char=127:         1.89 (  2.62%)	        1.94	
align1=6, align2=2, len=108, max_char=255:         2.07 ( 15.73%)	        2.45	
align1=1, align2=7, len=108, max_char=127:         1.89 ( 13.95%)	        2.19	
align1=7, align2=1, len=108, max_char=255:         2.07 ( 15.62%)	        2.45	
align1=3, align2=4, len=108, max_char=127:         1.89 ( 18.68%)	        2.32	
align1=4, align2=3, len=108, max_char=255:         2.07 ( 15.66%)	        2.45	
align1=5, align2=7, len=108, max_char=127:         2.07 ( 15.64%)	        2.45	
align1=7, align2=5, len=108, max_char=127:         2.06 ( 15.71%)	        2.45	
align1=0, align2=4, len=112, max_char=127:         1.93 ( 21.12%)	        2.45	
align1=4, align2=0, len=112, max_char=255:         2.06 ( 15.80%)	        2.45	
align1=4, align2=4, len=112, max_char=127:         2.06 ( 15.65%)	        2.45	
align1=2, align2=2, len=112, max_char=255:         2.06 ( 15.76%)	        2.45	
align1=2, align2=6, len=112, max_char=127:         2.07 ( 15.65%)	        2.45	
align1=6, align2=2, len=112, max_char=255:         2.06 ( 15.71%)	        2.45	
align1=1, align2=7, len=112, max_char=127:         2.06 ( 15.67%)	        2.45	
align1=7, align2=1, len=112, max_char=255:         2.06 ( 15.70%)	        2.45	
align1=3, align2=4, len=112, max_char=127:         2.06 ( 15.77%)	        2.45	
align1=4, align2=3, len=112, max_char=255:         2.06 ( 15.79%)	        2.45	
align1=5, align2=7, len=112, max_char=127:         2.06 ( 15.66%)	        2.45	
align1=7, align2=5, len=112, max_char=127:         2.06 ( 15.67%)	        2.45	
align1=0, align2=4, len=116, max_char=127:         2.06 ( 15.66%)	        2.45	
align1=4, align2=0, len=116, max_char=255:         2.06 ( 15.73%)	        2.45	
align1=4, align2=4, len=116, max_char=127:         2.06 ( 15.81%)	        2.45	
align1=2, align2=2, len=116, max_char=255:         2.06 ( 15.69%)	        2.45	
align1=2, align2=6, len=116, max_char=127:         2.06 ( 15.76%)	        2.45	
align1=6, align2=2, len=116, max_char=255:         2.06 ( 15.77%)	        2.45	
align1=1, align2=7, len=116, max_char=127:         2.06 ( 15.66%)	        2.45	
align1=7, align2=1, len=116, max_char=255:         2.06 ( 15.76%)	        2.45	
align1=3, align2=4, len=116, max_char=127:         2.07 ( 15.62%)	        2.45	
align1=4, align2=3, len=116, max_char=255:         2.07 ( 15.71%)	        2.45	
align1=5, align2=7, len=116, max_char=127:         2.06 ( 15.72%)	        2.45	
align1=7, align2=5, len=116, max_char=127:         2.06 ( 15.70%)	        2.45	
align1=0, align2=4, len=120, max_char=127:         2.06 ( 15.70%)	        2.45	
align1=4, align2=0, len=120, max_char=255:         2.07 ( 15.68%)	        2.45	
align1=4, align2=4, len=120, max_char=127:         2.06 ( 15.78%)	        2.45	
align1=2, align2=2, len=120, max_char=255:         2.06 ( 15.76%)	        2.45	
align1=2, align2=6, len=120, max_char=127:         2.06 ( 15.77%)	        2.45	
align1=6, align2=2, len=120, max_char=255:         2.06 ( 15.71%)	        2.45	
align1=1, align2=7, len=120, max_char=127:         2.06 ( 15.74%)	        2.45	
align1=7, align2=1, len=120, max_char=255:         2.06 ( 15.71%)	        2.45	
align1=3, align2=4, len=120, max_char=127:         2.06 ( 15.69%)	        2.45	
align1=4, align2=3, len=120, max_char=255:         2.06 ( 15.67%)	        2.45	
align1=5, align2=7, len=120, max_char=127:         2.06 ( 15.61%)	        2.45	
align1=7, align2=5, len=120, max_char=127:         2.06 ( 15.79%)	        2.45	
align1=0, align2=4, len=124, max_char=127:         2.06 ( 15.66%)	        2.45	
align1=4, align2=0, len=124, max_char=255:         2.00 ( 13.97%)	        2.32	
align1=4, align2=4, len=124, max_char=127:         2.07 ( 15.74%)	        2.45	
align1=2, align2=2, len=124, max_char=255:         2.07 ( 15.76%)	        2.45	
align1=2, align2=6, len=124, max_char=127:         2.06 ( 15.66%)	        2.45	
align1=6, align2=2, len=124, max_char=255:         2.05 ( 16.60%)	        2.45	
align1=1, align2=7, len=124, max_char=127:         2.07 ( 15.45%)	        2.45	
align1=7, align2=1, len=124, max_char=255:         2.07 ( 15.76%)	        2.45	
align1=3, align2=4, len=124, max_char=127:         2.07 ( 15.55%)	        2.45	
align1=4, align2=3, len=124, max_char=255:         2.06 ( 15.93%)	        2.45	
align1=5, align2=7, len=124, max_char=127:         2.07 ( 15.78%)	        2.45	
align1=7, align2=5, len=124, max_char=127:         2.06 ( 15.72%)	        2.45	
align1=0, align2=4, len=128, max_char=127:         2.00 (  8.82%)	        2.19	
align1=4, align2=0, len=128, max_char=255:         1.99 ( 18.68%)	        2.45	
align1=4, align2=4, len=128, max_char=127:         1.98 ( 14.70%)	        2.32	
align1=2, align2=2, len=128, max_char=255:         1.98 ( 14.64%)	        2.32	
align1=2, align2=6, len=128, max_char=127:         1.99 (  9.10%)	        2.19	
align1=6, align2=2, len=128, max_char=255:         1.99 ( 18.77%)	        2.45	
align1=1, align2=7, len=128, max_char=127:         2.04 (  6.97%)	        2.19	
align1=7, align2=1, len=128, max_char=255:         1.99 ( 18.86%)	        2.45	
align1=3, align2=4, len=128, max_char=127:         2.00 (  8.56%)	        2.19	
align1=4, align2=3, len=128, max_char=255:         1.99 ( 18.76%)	        2.45	
align1=5, align2=7, len=128, max_char=127:         2.06 (  5.68%)	        2.19	
align1=7, align2=5, len=128, max_char=127:         2.06 ( 15.81%)	        2.45	
align1=0, align2=4, len=132, max_char=127:         2.07 (  5.60%)	        2.19	
align1=4, align2=0, len=132, max_char=255:         2.06 ( 15.75%)	        2.45	
align1=4, align2=4, len=132, max_char=127:         2.06 ( 15.78%)	        2.45	
align1=2, align2=2, len=132, max_char=255:         2.06 ( 15.87%)	        2.45	
align1=2, align2=6, len=132, max_char=127:         2.07 (  5.61%)	        2.19	
align1=6, align2=2, len=132, max_char=255:         2.06 ( 15.73%)	        2.45	
align1=1, align2=7, len=132, max_char=127:         2.04 ( 16.74%)	        2.45	
align1=7, align2=1, len=132, max_char=255:         2.06 ( 15.80%)	        2.45	
align1=3, align2=4, len=132, max_char=127:         2.07 ( 15.70%)	        2.45	
align1=4, align2=3, len=132, max_char=255:         2.07 ( 15.65%)	        2.45	
align1=5, align2=7, len=132, max_char=127:         2.06 ( 15.83%)	        2.45	
align1=7, align2=5, len=132, max_char=127:         1.99 ( 18.72%)	        2.45	
align1=0, align2=4, len=136, max_char=127:         2.06 ( 15.85%)	        2.45	
align1=4, align2=0, len=136, max_char=255:         2.06 ( 15.66%)	        2.45	
align1=4, align2=4, len=136, max_char=127:         1.98 ( 19.18%)	        2.45	
align1=2, align2=2, len=136, max_char=255:         2.06 ( 15.81%)	        2.45	
align1=2, align2=6, len=136, max_char=127:         2.07 ( 15.65%)	        2.45	
align1=6, align2=2, len=136, max_char=255:         1.99 ( 18.80%)	        2.45	
align1=1, align2=7, len=136, max_char=127:         2.07 ( 15.82%)	        2.45	
align1=7, align2=1, len=136, max_char=255:         1.99 ( 18.61%)	        2.45	
align1=3, align2=4, len=136, max_char=127:         2.07 ( 15.73%)	        2.45	
align1=4, align2=3, len=136, max_char=255:         2.06 ( 15.72%)	        2.45	
align1=5, align2=7, len=136, max_char=127:         1.99 ( 18.70%)	        2.45	
align1=7, align2=5, len=136, max_char=127:         2.06 ( 15.76%)	        2.45	
align1=0, align2=4, len=140, max_char=127:         2.06 ( 15.82%)	        2.45	
align1=4, align2=0, len=140, max_char=255:         2.15 ( 20.24%)	        2.69	
align1=4, align2=4, len=140, max_char=127:         2.18 ( 14.99%)	        2.56	
align1=2, align2=2, len=140, max_char=255:         1.98 ( 19.44%)	        2.45	
align1=2, align2=6, len=140, max_char=127:         2.23 (  8.92%)	        2.45	
align1=6, align2=2, len=140, max_char=255:         2.23 ( 12.88%)	        2.56	
align1=1, align2=7, len=140, max_char=127:         2.02 ( 17.75%)	        2.45	
align1=7, align2=1, len=140, max_char=255:         2.18 ( 18.63%)	        2.68	
align1=3, align2=4, len=140, max_char=127:         2.02 ( 17.59%)	        2.45	
align1=4, align2=3, len=140, max_char=255:         2.14 ( 16.06%)	        2.55	
align1=5, align2=7, len=140, max_char=127:         2.15 ( 15.98%)	        2.56	
align1=7, align2=5, len=140, max_char=127:         2.15 ( 15.93%)	        2.56	
align1=0, align2=4, len=144, max_char=127:         2.16 ( 19.72%)	        2.69	
align1=4, align2=0, len=144, max_char=255:         2.16 ( 19.66%)	        2.68	
align1=4, align2=4, len=144, max_char=127:         2.13 (  8.79%)	        2.33	
align1=2, align2=2, len=144, max_char=255:         2.13 ( 20.61%)	        2.68	
align1=2, align2=6, len=144, max_char=127:         2.15 ( 20.06%)	        2.69	
align1=6, align2=2, len=144, max_char=255:         2.15 ( 19.98%)	        2.69	
align1=1, align2=7, len=144, max_char=127:         2.15 ( 19.80%)	        2.68	
align1=7, align2=1, len=144, max_char=255:         2.15 ( 15.95%)	        2.56	
align1=3, align2=4, len=144, max_char=127:         2.15 ( 15.96%)	        2.56	
align1=4, align2=3, len=144, max_char=255:         2.15 ( 19.91%)	        2.68	
align1=5, align2=7, len=144, max_char=127:         2.15 ( 19.97%)	        2.69	
align1=7, align2=5, len=144, max_char=127:         2.19 ( 18.43%)	        2.69	
align1=0, align2=4, len=148, max_char=127:         2.15 ( 15.79%)	        2.56	
align1=4, align2=0, len=148, max_char=255:         2.19 ( 18.33%)	        2.68	
align1=4, align2=4, len=148, max_char=127:         2.13 ( 20.76%)	        2.68	
align1=2, align2=2, len=148, max_char=255:         2.13 ( 20.66%)	        2.68	
align1=2, align2=6, len=148, max_char=127:         2.15 ( 19.95%)	        2.69	
align1=6, align2=2, len=148, max_char=255:         2.15 ( 19.86%)	        2.68	
align1=1, align2=7, len=148, max_char=127:         2.15 ( 19.79%)	        2.68	
align1=7, align2=1, len=148, max_char=255:         2.15 ( 19.93%)	        2.68	
align1=3, align2=4, len=148, max_char=127:         2.16 ( 19.70%)	        2.69	
align1=4, align2=3, len=148, max_char=255:         2.15 ( 19.81%)	        2.68	
align1=5, align2=7, len=148, max_char=127:         2.16 ( 15.71%)	        2.56	
align1=7, align2=5, len=148, max_char=127:         2.15 ( 19.85%)	        2.69	
align1=0, align2=4, len=152, max_char=127:         2.15 ( 15.96%)	        2.56	
align1=4, align2=0, len=152, max_char=255:         2.19 ( 18.40%)	        2.68	
align1=4, align2=4, len=152, max_char=127:         2.13 ( 20.39%)	        2.68	
align1=2, align2=2, len=152, max_char=255:         2.18 ( 18.84%)	        2.68	
align1=2, align2=6, len=152, max_char=127:         2.15 ( 19.80%)	        2.68	
align1=6, align2=2, len=152, max_char=255:         2.16 ( 15.85%)	        2.56	
align1=1, align2=7, len=152, max_char=127:         2.15 ( 15.86%)	        2.56	
align1=7, align2=1, len=152, max_char=255:         2.20 ( 18.18%)	        2.68	
align1=3, align2=4, len=152, max_char=127:         2.15 ( 19.85%)	        2.69	
align1=4, align2=3, len=152, max_char=255:         2.15 ( 19.82%)	        2.68	
align1=5, align2=7, len=152, max_char=127:         2.15 ( 16.04%)	        2.56	
align1=7, align2=5, len=152, max_char=127:         2.19 ( 18.36%)	        2.68	
align1=0, align2=4, len=156, max_char=127:         2.16 ( 15.66%)	        2.56	
align1=4, align2=0, len=156, max_char=255:         2.28 ( 11.19%)	        2.56	
align1=4, align2=4, len=156, max_char=127:         2.24 ( 12.34%)	        2.56	
align1=2, align2=2, len=156, max_char=255:         2.13 ( 20.71%)	        2.69	
align1=2, align2=6, len=156, max_char=127:         2.15 ( 15.78%)	        2.56	
align1=6, align2=2, len=156, max_char=255:         2.28 ( 11.04%)	        2.56	
align1=1, align2=7, len=156, max_char=127:         2.15 ( 15.98%)	        2.56	
align1=7, align2=1, len=156, max_char=255:         2.28 ( 11.04%)	        2.56	
align1=3, align2=4, len=156, max_char=127:         2.15 ( 20.67%)	        2.71	
align1=4, align2=3, len=156, max_char=255:         2.28 ( 13.72%)	        2.64	
align1=5, align2=7, len=156, max_char=127:         2.28 ( 15.31%)	        2.69	
align1=7, align2=5, len=156, max_char=127:         2.29 ( 14.90%)	        2.69	
align1=0, align2=4, len=160, max_char=127:         2.28 ( 15.34%)	        2.69	
align1=4, align2=0, len=160, max_char=255:         2.33 ( 13.38%)	        2.69	
align1=4, align2=4, len=160, max_char=127:         2.24 ( 16.71%)	        2.69	
align1=2, align2=2, len=160, max_char=255:         2.24 ( 16.67%)	        2.69	
align1=2, align2=6, len=160, max_char=127:         2.28 ( 15.43%)	        2.69	
align1=6, align2=2, len=160, max_char=255:         2.33 ( 13.58%)	        2.69	
align1=1, align2=7, len=160, max_char=127:         2.28 ( 11.12%)	        2.56	
align1=7, align2=1, len=160, max_char=255:         2.29 ( 14.57%)	        2.68	
align1=3, align2=4, len=160, max_char=127:         2.28 ( 15.24%)	        2.69	
align1=4, align2=3, len=160, max_char=255:         2.29 ( 14.94%)	        2.69	
align1=5, align2=7, len=160, max_char=127:         2.27 ( 15.41%)	        2.69	
align1=7, align2=5, len=160, max_char=127:         2.33 ( 13.32%)	        2.69	
align1=0, align2=4, len=164, max_char=127:         2.28 ( 15.24%)	        2.69	
align1=4, align2=0, len=164, max_char=255:         2.29 ( 15.08%)	        2.69	
align1=4, align2=4, len=164, max_char=127:         2.25 ( 12.12%)	        2.56	
align1=2, align2=2, len=164, max_char=255:         2.25 ( 16.40%)	        2.69	
align1=2, align2=6, len=164, max_char=127:         2.28 ( 10.89%)	        2.56	
align1=6, align2=2, len=164, max_char=255:         2.33 (  8.89%)	        2.56	
align1=1, align2=7, len=164, max_char=127:         2.33 ( 13.53%)	        2.69	
align1=7, align2=1, len=164, max_char=255:         2.33 (  9.14%)	        2.56	
align1=3, align2=4, len=164, max_char=127:         2.32 ( 13.53%)	        2.68	
align1=4, align2=3, len=164, max_char=255:         2.29 ( 14.87%)	        2.69	
align1=5, align2=7, len=164, max_char=127:         2.27 ( 11.01%)	        2.55	
align1=7, align2=5, len=164, max_char=127:         2.29 ( 14.92%)	        2.69	
align1=0, align2=4, len=168, max_char=127:         2.27 ( 11.08%)	        2.56	
align1=4, align2=0, len=168, max_char=255:         2.28 ( 15.17%)	        2.69	
align1=4, align2=4, len=168, max_char=127:         2.25 ( 16.57%)	        2.69	
align1=2, align2=2, len=168, max_char=255:         2.25 ( 12.39%)	        2.56	
align1=2, align2=6, len=168, max_char=127:         2.27 ( 15.38%)	        2.69	
align1=6, align2=2, len=168, max_char=255:         2.29 ( 10.74%)	        2.56	
align1=1, align2=7, len=168, max_char=127:         2.28 ( 15.34%)	        2.69	
align1=7, align2=1, len=168, max_char=255:         2.28 ( 15.01%)	        2.69	
align1=3, align2=4, len=168, max_char=127:         2.28 ( 15.22%)	        2.69	
align1=4, align2=3, len=168, max_char=255:         2.29 ( 10.52%)	        2.56	
align1=5, align2=7, len=168, max_char=127:         2.28 ( 15.28%)	        2.69	
align1=7, align2=5, len=168, max_char=127:         2.33 (  9.24%)	        2.56	
align1=0, align2=4, len=172, max_char=127:         2.28 ( 11.07%)	        2.56	
align1=4, align2=0, len=172, max_char=255:         2.48 (  0.01%)	        2.48	
align1=4, align2=4, len=172, max_char=127:         2.45 (  4.51%)	        2.56	
align1=2, align2=2, len=172, max_char=255:         2.29 ( 10.36%)	        2.56	
align1=2, align2=6, len=172, max_char=127:         2.28 ( 11.17%)	        2.56	
align1=6, align2=2, len=172, max_char=255:         2.48 (  3.24%)	        2.56	
align1=1, align2=7, len=172, max_char=127:         2.28 ( 10.99%)	        2.56	
align1=7, align2=1, len=172, max_char=255:         2.42 (  9.73%)	        2.69	
align1=3, align2=4, len=172, max_char=127:         2.32 ( 13.59%)	        2.69	
align1=4, align2=3, len=172, max_char=255:         2.42 (  5.36%)	        2.56	
align1=5, align2=7, len=172, max_char=127:         2.48 (  3.35%)	        2.56	
align1=7, align2=5, len=172, max_char=127:         2.43 (  9.40%)	        2.68	
align1=0, align2=4, len=176, max_char=127:         2.42 (  9.99%)	        2.69	
align1=4, align2=0, len=176, max_char=255:         2.48 (  7.57%)	        2.68	
align1=4, align2=4, len=176, max_char=127:         2.39 (  6.85%)	        2.56	
align1=2, align2=2, len=176, max_char=255:         2.45 (  8.80%)	        2.69	
align1=2, align2=6, len=176, max_char=127:         2.42 (  5.63%)	        2.56	
align1=6, align2=2, len=176, max_char=255:         2.43 (  9.42%)	        2.68	
align1=1, align2=7, len=176, max_char=127:         2.42 ( 10.00%)	        2.68	
align1=7, align2=1, len=176, max_char=255:         2.43 (  5.12%)	        2.56	
align1=3, align2=4, len=176, max_char=127:         2.42 (  9.93%)	        2.69	
align1=4, align2=3, len=176, max_char=255:         2.48 (  7.49%)	        2.68	
align1=5, align2=7, len=176, max_char=127:         2.42 (  9.89%)	        2.69	
align1=7, align2=5, len=176, max_char=127:         2.42 (  9.69%)	        2.68	
align1=0, align2=4, len=180, max_char=127:         2.41 ( 10.00%)	        2.68	
align1=4, align2=0, len=180, max_char=255:         2.48 (  7.60%)	        2.69	
align1=4, align2=4, len=180, max_char=127:         2.39 ( 11.13%)	        2.69	
align1=2, align2=2, len=180, max_char=255:         2.45 (  8.82%)	        2.69	
align1=2, align2=6, len=180, max_char=127:         2.42 (  9.83%)	        2.68	
align1=6, align2=2, len=180, max_char=255:         2.43 (  5.28%)	        2.56	
align1=1, align2=7, len=180, max_char=127:         2.42 (  9.83%)	        2.69	
align1=7, align2=1, len=180, max_char=255:         2.43 (  9.58%)	        2.69	
align1=3, align2=4, len=180, max_char=127:         2.42 (  9.78%)	        2.68	
align1=4, align2=3, len=180, max_char=255:         2.43 (  9.39%)	        2.68	
align1=5, align2=7, len=180, max_char=127:         2.42 (  9.60%)	        2.68	
align1=7, align2=5, len=180, max_char=127:         2.43 (  9.44%)	        2.68	
align1=0, align2=4, len=184, max_char=127:         2.42 (  5.41%)	        2.56	
align1=4, align2=0, len=184, max_char=255:         2.43 (  9.40%)	        2.69	
align1=4, align2=4, len=184, max_char=127:         2.39 ( 11.04%)	        2.68	
align1=2, align2=2, len=184, max_char=255:         2.39 ( 10.95%)	        2.68	
align1=2, align2=6, len=184, max_char=127:         2.42 (  5.51%)	        2.56	
align1=6, align2=2, len=184, max_char=255:         2.43 (  9.40%)	        2.68	
align1=1, align2=7, len=184, max_char=127:         2.42 (  9.79%)	        2.68	
align1=7, align2=1, len=184, max_char=255:         2.43 (  9.41%)	        2.68	
align1=3, align2=4, len=184, max_char=127:         2.42 (  9.85%)	        2.68	
align1=4, align2=3, len=184, max_char=255:         2.43 (  9.45%)	        2.68	
align1=5, align2=7, len=184, max_char=127:         2.42 (  9.82%)	        2.68	
align1=7, align2=5, len=184, max_char=127:         2.43 (  5.06%)	        2.56	
align1=0, align2=4, len=188, max_char=127:         2.42 (  9.70%)	        2.68	
align1=4, align2=0, len=188, max_char=255:         2.55 (  5.38%)	        2.70	
align1=4, align2=4, len=188, max_char=127:         2.53 (  6.34%)	        2.70	
align1=2, align2=2, len=188, max_char=255:         2.39 ( 11.04%)	        2.69	
align1=2, align2=6, len=188, max_char=127:         2.42 (  9.62%)	        2.68	
align1=6, align2=2, len=188, max_char=255:         2.55 (  9.40%)	        2.81	
align1=1, align2=7, len=188, max_char=127:         2.42 (  9.90%)	        2.69	
align1=7, align2=1, len=188, max_char=255:         2.55 (  9.37%)	        2.81	
align1=3, align2=4, len=188, max_char=127:         2.48 (  3.27%)	        2.56	
align1=4, align2=3, len=188, max_char=255:         2.61 (  7.16%)	        2.81	
align1=5, align2=7, len=188, max_char=127:         2.55 (  9.26%)	        2.81	
align1=7, align2=5, len=188, max_char=127:         2.62 (  6.90%)	        2.81	
align1=0, align2=4, len=192, max_char=127:         2.55 (  9.12%)	        2.81	
align1=4, align2=0, len=192, max_char=255:         2.56 (  9.09%)	        2.81	
align1=4, align2=4, len=192, max_char=127:         2.53 (  6.16%)	        2.69	
align1=2, align2=2, len=192, max_char=255:         2.53 (  6.12%)	        2.69	
align1=2, align2=6, len=192, max_char=127:         2.61 (  7.18%)	        2.81	
align1=6, align2=2, len=192, max_char=255:         2.56 (  8.96%)	        2.81	
align1=1, align2=7, len=192, max_char=127:         2.55 (  9.24%)	        2.81	
align1=7, align2=1, len=192, max_char=255:         2.56 (  9.02%)	        2.81	
align1=3, align2=4, len=192, max_char=127:         2.55 (  9.32%)	        2.81	
align1=4, align2=3, len=192, max_char=255:         2.56 (  9.04%)	        2.81	
align1=5, align2=7, len=192, max_char=127:         2.55 (  9.22%)	        2.81	
align1=7, align2=5, len=192, max_char=127:         2.55 (  9.12%)	        2.81	
align1=0, align2=4, len=196, max_char=127:         2.55 (  9.21%)	        2.81	
align1=4, align2=0, len=196, max_char=255:         2.56 (  9.01%)	        2.81	
align1=4, align2=4, len=196, max_char=127:         2.52 ( 10.28%)	        2.81	
align1=2, align2=2, len=196, max_char=255:         2.53 (  6.35%)	        2.70	
align1=2, align2=6, len=196, max_char=127:         2.55 (  9.10%)	        2.81	
align1=6, align2=2, len=196, max_char=255:         2.55 (  9.26%)	        2.81	
align1=1, align2=7, len=196, max_char=127:         2.55 (  9.27%)	        2.81	
align1=7, align2=1, len=196, max_char=255:         2.56 (  8.94%)	        2.81	
align1=3, align2=4, len=196, max_char=127:         2.55 (  9.28%)	        2.81	
align1=4, align2=3, len=196, max_char=255:         2.56 (  9.07%)	        2.81	
align1=5, align2=7, len=196, max_char=127:         2.55 (  9.07%)	        2.81	
align1=7, align2=5, len=196, max_char=127:         2.56 ( 11.87%)	        2.90	
align1=0, align2=4, len=200, max_char=127:         2.55 (  9.23%)	        2.81	
align1=4, align2=0, len=200, max_char=255:         2.56 (  8.95%)	        2.81	
align1=4, align2=4, len=200, max_char=127:         2.53 (  6.35%)	        2.70	
align1=2, align2=2, len=200, max_char=255:         2.59 (  3.93%)	        2.70	
align1=2, align2=6, len=200, max_char=127:         2.55 (  9.17%)	        2.81	
align1=6, align2=2, len=200, max_char=255:         2.56 (  9.02%)	        2.81	
align1=1, align2=7, len=200, max_char=127:         2.55 (  9.32%)	        2.81	
align1=7, align2=1, len=200, max_char=255:         2.56 (  9.10%)	        2.81	
align1=3, align2=4, len=200, max_char=127:         2.61 (  7.15%)	        2.81	
align1=4, align2=3, len=200, max_char=255:         2.62 (  6.92%)	        2.81	
align1=5, align2=7, len=200, max_char=127:         2.61 (  7.32%)	        2.81	
align1=7, align2=5, len=200, max_char=127:         2.55 (  9.11%)	        2.81	
align1=0, align2=4, len=204, max_char=127:         2.55 (  5.53%)	        2.70	
align1=4, align2=0, len=204, max_char=255:         2.67 (  5.55%)	        2.82	
align1=4, align2=4, len=204, max_char=127:         2.65 (  5.94%)	        2.82	
align1=2, align2=2, len=204, max_char=255:         2.59 (  7.84%)	        2.81	
align1=2, align2=6, len=204, max_char=127:         2.55 (  9.34%)	        2.81	
align1=6, align2=2, len=204, max_char=255:         2.74 (  3.11%)	        2.83	
align1=1, align2=7, len=204, max_char=127:         2.55 (  5.37%)	        2.70	
align1=7, align2=1, len=204, max_char=255:         2.67 (  6.29%)	        2.85	
align1=3, align2=4, len=204, max_char=127:         2.55 (  9.29%)	        2.81	
align1=4, align2=3, len=204, max_char=255:         2.67 (  6.26%)	        2.85	
align1=5, align2=7, len=204, max_char=127:         2.67 (  5.14%)	        2.82	
align1=7, align2=5, len=204, max_char=127:         2.67 (  9.47%)	        2.95	
align1=0, align2=4, len=208, max_char=127:         2.67 (  9.40%)	        2.95	
align1=4, align2=0, len=208, max_char=255:         2.66 (  9.64%)	        2.95	
align1=4, align2=4, len=208, max_char=127:         2.66 (  9.97%)	        2.95	
align1=2, align2=2, len=208, max_char=255:         2.65 ( 10.13%)	        2.95	
align1=2, align2=6, len=208, max_char=127:         2.67 (  9.55%)	        2.95	
align1=6, align2=2, len=208, max_char=255:         2.67 (  9.41%)	        2.95	
align1=1, align2=7, len=208, max_char=127:         2.67 (  9.41%)	        2.95	
align1=7, align2=1, len=208, max_char=255:         2.67 (  9.59%)	        2.95	
align1=3, align2=4, len=208, max_char=127:         2.67 (  9.59%)	        2.95	
align1=4, align2=3, len=208, max_char=255:         2.67 (  9.53%)	        2.95	
align1=5, align2=7, len=208, max_char=127:         2.67 (  9.37%)	        2.95	
align1=7, align2=5, len=208, max_char=127:         2.66 (  9.67%)	        2.95	
align1=0, align2=4, len=212, max_char=127:         2.68 (  9.23%)	        2.95	
align1=4, align2=0, len=212, max_char=255:         2.67 (  9.41%)	        2.95	
align1=4, align2=4, len=212, max_char=127:         2.65 ( 10.06%)	        2.95	
align1=2, align2=2, len=212, max_char=255:         2.65 ( 10.06%)	        2.95	
align1=2, align2=6, len=212, max_char=127:         2.67 (  9.59%)	        2.95	
align1=6, align2=2, len=212, max_char=255:         2.66 (  9.63%)	        2.95	
align1=1, align2=7, len=212, max_char=127:         2.67 (  9.29%)	        2.95	
align1=7, align2=1, len=212, max_char=255:         3.09 ( -4.78%)	        2.95	
align1=3, align2=4, len=212, max_char=127:         2.74 (  7.16%)	        2.95	
align1=4, align2=3, len=212, max_char=255:         2.67 (  9.53%)	        2.95	
align1=5, align2=7, len=212, max_char=127:         2.74 (  7.14%)	        2.95	
align1=7, align2=5, len=212, max_char=127:         2.67 (  9.59%)	        2.95	
align1=0, align2=4, len=216, max_char=127:         2.67 (  9.62%)	        2.95	
align1=4, align2=0, len=216, max_char=255:         2.74 (  6.96%)	        2.95	
align1=4, align2=4, len=216, max_char=127:         2.66 (  9.93%)	        2.95	
align1=2, align2=2, len=216, max_char=255:         2.72 (  7.62%)	        2.95	
align1=2, align2=6, len=216, max_char=127:         2.67 (  9.47%)	        2.95	
align1=6, align2=2, len=216, max_char=255:         2.74 (  7.22%)	        2.95	
align1=1, align2=7, len=216, max_char=127:         2.67 (  9.49%)	        2.95	
align1=7, align2=1, len=216, max_char=255:         2.67 (  9.44%)	        2.95	
align1=3, align2=4, len=216, max_char=127:         2.68 (  9.31%)	        2.95	
align1=4, align2=3, len=216, max_char=255:         2.67 (  9.42%)	        2.95	
align1=5, align2=7, len=216, max_char=127:         2.67 (  9.44%)	        2.95	
align1=7, align2=5, len=216, max_char=127:         2.74 (  7.02%)	        2.95	
align1=0, align2=4, len=220, max_char=127:         2.67 (  9.46%)	        2.95	
align1=4, align2=0, len=220, max_char=255:         2.81 (  6.89%)	        3.02	
align1=4, align2=4, len=220, max_char=127:         2.80 (  5.32%)	        2.95	
align1=2, align2=2, len=220, max_char=255:         2.72 (  7.62%)	        2.95	
align1=2, align2=6, len=220, max_char=127:         2.67 (  9.53%)	        2.95	
align1=6, align2=2, len=220, max_char=255:         2.81 (  4.96%)	        2.95	
align1=1, align2=7, len=220, max_char=127:         2.67 (  5.37%)	        2.83	
align1=7, align2=1, len=220, max_char=255:         2.89 (  4.22%)	        3.01	
align1=3, align2=4, len=220, max_char=127:         2.74 (  7.09%)	        2.95	
align1=4, align2=3, len=220, max_char=255:         2.89 (  2.07%)	        2.96	
align1=5, align2=7, len=220, max_char=127:         2.81 (  5.10%)	        2.96	
align1=7, align2=5, len=220, max_char=127:         2.81 (  5.11%)	        2.96	
align1=0, align2=4, len=224, max_char=127:         2.81 (  4.83%)	        2.96	
align1=4, align2=0, len=224, max_char=255:         2.80 (  5.16%)	        2.96	
align1=4, align2=4, len=224, max_char=127:         2.80 (  5.22%)	        2.96	
align1=2, align2=2, len=224, max_char=255:         2.80 (  6.97%)	        3.01	
align1=2, align2=6, len=224, max_char=127:         2.81 (  6.41%)	        3.00	
align1=6, align2=2, len=224, max_char=255:         2.89 (  2.28%)	        2.96	
align1=1, align2=7, len=224, max_char=127:         2.81 (  5.08%)	        2.96	
align1=7, align2=1, len=224, max_char=255:         2.89 (  2.12%)	        2.95	
align1=3, align2=4, len=224, max_char=127:         2.81 (  5.08%)	        2.96	
align1=4, align2=3, len=224, max_char=255:         2.89 (  2.18%)	        2.95	
align1=5, align2=7, len=224, max_char=127:         2.81 (  5.16%)	        2.96	
align1=7, align2=5, len=224, max_char=127:         2.80 (  5.05%)	        2.95	
align1=0, align2=4, len=228, max_char=127:         2.81 (  4.86%)	        2.96	
align1=4, align2=0, len=228, max_char=255:         2.81 (  4.87%)	        2.95	
align1=4, align2=4, len=228, max_char=127:         2.80 ( 12.94%)	        3.22	
align1=2, align2=2, len=228, max_char=255:         2.89 (  1.39%)	        2.93	
align1=2, align2=6, len=228, max_char=127:         2.80 (  5.21%)	        2.96	
align1=6, align2=2, len=228, max_char=255:         2.81 (  4.87%)	        2.95	
align1=1, align2=7, len=228, max_char=127:         2.81 (  4.95%)	        2.96	
align1=7, align2=1, len=228, max_char=255:         2.81 (  4.85%)	        2.96	
align1=3, align2=4, len=228, max_char=127:         2.81 (  5.17%)	        2.96	
align1=4, align2=3, len=228, max_char=255:         2.81 (  4.99%)	        2.96	
align1=5, align2=7, len=228, max_char=127:         2.81 (  5.13%)	        2.96	
align1=7, align2=5, len=228, max_char=127:         2.81 (  5.00%)	        2.95	
align1=0, align2=4, len=232, max_char=127:         2.81 (  4.94%)	        2.96	
align1=4, align2=0, len=232, max_char=255:         2.81 (  5.08%)	        2.96	
align1=4, align2=4, len=232, max_char=127:         2.80 (  5.14%)	        2.95	
align1=2, align2=2, len=232, max_char=255:         2.80 (  5.18%)	        2.96	
align1=2, align2=6, len=232, max_char=127:         2.81 (  5.20%)	        2.96	
align1=6, align2=2, len=232, max_char=255:         2.81 (  5.12%)	        2.96	
align1=1, align2=7, len=232, max_char=127:         2.81 (  5.09%)	        2.96	
align1=7, align2=1, len=232, max_char=255:         2.81 (  5.14%)	        2.96	
align1=3, align2=4, len=232, max_char=127:         2.81 (  5.11%)	        2.96	
align1=4, align2=3, len=232, max_char=255:         2.81 (  4.78%)	        2.96	
align1=5, align2=7, len=232, max_char=127:         2.80 (  5.20%)	        2.96	
align1=7, align2=5, len=232, max_char=127:         2.81 (  4.84%)	        2.95	
align1=0, align2=4, len=236, max_char=127:         2.81 (  4.89%)	        2.96	
align1=4, align2=0, len=236, max_char=255:         2.93 (  6.02%)	        3.12	
align1=4, align2=4, len=236, max_char=127:         2.92 (  9.08%)	        3.21	
align1=2, align2=2, len=236, max_char=255:         2.80 (  5.42%)	        2.96	
align1=2, align2=6, len=236, max_char=127:         2.81 (  5.09%)	        2.96	
align1=6, align2=2, len=236, max_char=255:         3.01 (  6.25%)	        3.21	
align1=1, align2=7, len=236, max_char=127:         2.81 (  5.08%)	        2.96	
align1=7, align2=1, len=236, max_char=255:         2.92 (  9.12%)	        3.22	
align1=3, align2=4, len=236, max_char=127:         2.81 (  4.90%)	        2.96	
align1=4, align2=3, len=236, max_char=255:         2.93 (  8.90%)	        3.21	
align1=5, align2=7, len=236, max_char=127:         2.93 (  8.77%)	        3.21	
align1=7, align2=5, len=236, max_char=127:         2.93 (  8.93%)	        3.21	
align1=0, align2=4, len=240, max_char=127:         2.93 (  8.69%)	        3.21	
align1=4, align2=0, len=240, max_char=255:         2.93 (  8.97%)	        3.22	
align1=4, align2=4, len=240, max_char=127:         2.92 (  9.07%)	        3.21	
align1=2, align2=2, len=240, max_char=255:         2.93 (  8.91%)	        3.21	
align1=2, align2=6, len=240, max_char=127:         2.93 (  8.75%)	        3.21	
align1=6, align2=2, len=240, max_char=255:         2.93 (  8.85%)	        3.21	
align1=1, align2=7, len=240, max_char=127:         2.93 (  8.74%)	        3.21	
align1=7, align2=1, len=240, max_char=255:         2.93 (  8.86%)	        3.21	
align1=3, align2=4, len=240, max_char=127:         2.93 (  8.68%)	        3.21	
align1=4, align2=3, len=240, max_char=255:         2.92 (  9.07%)	        3.21	
align1=5, align2=7, len=240, max_char=127:         3.02 (  6.01%)	        3.21	
align1=7, align2=5, len=240, max_char=127:         2.93 (  8.85%)	        3.21	
align1=0, align2=4, len=244, max_char=127:         2.93 (  8.77%)	        3.21	
align1=4, align2=0, len=244, max_char=255:         2.93 (  8.79%)	        3.21	
align1=4, align2=4, len=244, max_char=127:         2.92 (  8.96%)	        3.21	
align1=2, align2=2, len=244, max_char=255:         2.93 (  8.80%)	        3.21	
align1=2, align2=6, len=244, max_char=127:         2.94 (  8.62%)	        3.21	
align1=6, align2=2, len=244, max_char=255:         2.93 (  8.84%)	        3.21	
align1=1, align2=7, len=244, max_char=127:         2.93 (  8.73%)	        3.21	
align1=7, align2=1, len=244, max_char=255:         2.93 (  8.90%)	        3.21	
align1=3, align2=4, len=244, max_char=127:         2.93 (  8.76%)	        3.21	
align1=4, align2=3, len=244, max_char=255:         2.92 (  8.90%)	        3.21	
align1=5, align2=7, len=244, max_char=127:         2.93 (  8.80%)	        3.21	
align1=7, align2=5, len=244, max_char=127:         2.92 (  9.00%)	        3.21	
align1=0, align2=4, len=248, max_char=127:         2.93 (  8.78%)	        3.21	
align1=4, align2=0, len=248, max_char=255:         2.93 (  8.88%)	        3.21	
align1=4, align2=4, len=248, max_char=127:         2.92 (  8.98%)	        3.21	
align1=2, align2=2, len=248, max_char=255:         2.92 (  8.98%)	        3.21	
align1=2, align2=6, len=248, max_char=127:         2.93 (  8.69%)	        3.21	
align1=6, align2=2, len=248, max_char=255:         2.93 (  8.84%)	        3.21	
align1=1, align2=7, len=248, max_char=127:         2.94 (  8.68%)	        3.21	
align1=7, align2=1, len=248, max_char=255:         2.93 (  8.94%)	        3.21	
align1=3, align2=4, len=248, max_char=127:         2.93 (  8.74%)	        3.21	
align1=4, align2=3, len=248, max_char=255:         2.92 (  8.83%)	        3.21	
align1=5, align2=7, len=248, max_char=127:         2.93 (  9.02%)	        3.22	
align1=7, align2=5, len=248, max_char=127:         2.92 (  9.01%)	        3.21	
align1=0, align2=4, len=252, max_char=127:         2.93 (  8.84%)	        3.21	
align1=4, align2=0, len=252, max_char=255:         3.10 (  4.19%)	        3.23	
align1=4, align2=4, len=252, max_char=127:         3.10 (  4.06%)	        3.23	
align1=2, align2=2, len=252, max_char=255:         2.93 (  8.98%)	        3.21	
align1=2, align2=6, len=252, max_char=127:         2.92 (  9.05%)	        3.21	
align1=6, align2=2, len=252, max_char=255:         3.09 (  4.11%)	        3.23	
align1=1, align2=7, len=252, max_char=127:         2.92 (  9.01%)	        3.21	
align1=7, align2=1, len=252, max_char=255:         3.09 (  4.07%)	        3.22	
align1=3, align2=4, len=252, max_char=127:         2.92 (  9.02%)	        3.21	
align1=4, align2=3, len=252, max_char=255:         3.09 (  4.29%)	        3.23	
align1=5, align2=7, len=252, max_char=127:         3.10 (  3.98%)	        3.23	
align1=7, align2=5, len=252, max_char=127:         3.09 (  4.07%)	        3.22	
align1=0, align2=4, len=256, max_char=127:         3.10 (  3.98%)	        3.23	
align1=4, align2=0, len=256, max_char=255:         3.10 (  3.77%)	        3.22	
align1=4, align2=4, len=256, max_char=127:         3.10 (  4.04%)	        3.23	
align1=2, align2=2, len=256, max_char=255:         3.10 (  4.11%)	        3.23	
align1=2, align2=6, len=256, max_char=127:         3.10 (  3.94%)	        3.23	
align1=6, align2=2, len=256, max_char=255:         3.10 (  3.86%)	        3.22	
align1=1, align2=7, len=256, max_char=127:         3.10 (  4.22%)	        3.24	
align1=7, align2=1, len=256, max_char=255:         3.09 (  4.02%)	        3.22	
align1=3, align2=4, len=256, max_char=127:         3.18 (  3.10%)	        3.29	
align1=4, align2=3, len=256, max_char=255:         3.18 (  1.13%)	        3.22	
align1=5, align2=7, len=256, max_char=127:         3.10 (  4.09%)	        3.23	
align1=7, align2=5, len=256, max_char=127:         3.09 (  3.96%)	        3.22	
align1=0, align2=4, len=260, max_char=127:         3.10 (  4.00%)	        3.23	
align1=4, align2=0, len=260, max_char=255:         3.09 (  3.92%)	        3.22	
align1=4, align2=4, len=260, max_char=127:         3.11 (  3.74%)	        3.23	
align1=2, align2=2, len=260, max_char=255:         3.10 (  3.80%)	        3.22	
align1=2, align2=6, len=260, max_char=127:         3.10 (  4.04%)	        3.23	
align1=6, align2=2, len=260, max_char=255:         3.09 (  4.02%)	        3.22	
align1=1, align2=7, len=260, max_char=127:         3.10 (  3.87%)	        3.23	
align1=7, align2=1, len=260, max_char=255:         3.10 (  3.77%)	        3.22	
align1=3, align2=4, len=260, max_char=127:         3.10 (  4.17%)	        3.23	
align1=4, align2=3, len=260, max_char=255:         3.09 (  4.19%)	        3.22	
align1=5, align2=7, len=260, max_char=127:         3.10 (  3.99%)	        3.23	
align1=7, align2=5, len=260, max_char=127:         3.09 (  4.07%)	        3.22	
align1=0, align2=4, len=264, max_char=127:         3.10 (  4.04%)	        3.23	
align1=4, align2=0, len=264, max_char=255:         3.17 (  3.21%)	        3.28	
align1=4, align2=4, len=264, max_char=127:         3.10 (  3.99%)	        3.23	
align1=2, align2=2, len=264, max_char=255:         3.18 (  3.22%)	        3.29	
align1=2, align2=6, len=264, max_char=127:         3.10 (  3.84%)	        3.23	
align1=6, align2=2, len=264, max_char=255:         3.18 (  1.22%)	        3.22	
align1=1, align2=7, len=264, max_char=127:         3.10 (  4.07%)	        3.23	
align1=7, align2=1, len=264, max_char=255:         3.09 (  4.01%)	        3.22	
align1=3, align2=4, len=264, max_char=127:         3.10 (  4.06%)	        3.23	
align1=4, align2=3, len=264, max_char=255:         3.09 (  3.95%)	        3.22	
align1=5, align2=7, len=264, max_char=127:         3.11 (  3.78%)	        3.23	
align1=7, align2=5, len=264, max_char=127:         3.09 (  5.70%)	        3.28	
align1=0, align2=4, len=268, max_char=127:         3.11 (  3.91%)	        3.24	
align1=4, align2=0, len=268, max_char=255:         3.22 (  4.04%)	        3.36	
align1=4, align2=4, len=268, max_char=127:         3.24 (  4.05%)	        3.37	
align1=2, align2=2, len=268, max_char=255:         3.10 (  3.96%)	        3.23	
align1=2, align2=6, len=268, max_char=127:         3.11 (  3.74%)	        3.23	
align1=6, align2=2, len=268, max_char=255:         3.23 (  4.24%)	        3.37	
align1=1, align2=7, len=268, max_char=127:         3.20 (  1.10%)	        3.24	
align1=7, align2=1, len=268, max_char=255:         3.22 (  4.56%)	        3.37	
align1=3, align2=4, len=268, max_char=127:         3.11 (  3.75%)	        3.23	
align1=4, align2=3, len=268, max_char=255:         3.23 (  4.02%)	        3.36	
align1=5, align2=7, len=268, max_char=127:         3.24 (  4.48%)	        3.39	
align1=7, align2=5, len=268, max_char=127:         3.23 (  4.03%)	        3.36	
align1=0, align2=4, len=272, max_char=127:         3.24 (  4.27%)	        3.39	
align1=4, align2=0, len=272, max_char=255:         3.22 (  4.22%)	        3.37	
align1=4, align2=4, len=272, max_char=127:         3.23 (  4.15%)	        3.37	
align1=2, align2=2, len=272, max_char=255:         3.23 (  3.98%)	        3.37	
align1=2, align2=6, len=272, max_char=127:         3.24 (  4.27%)	        3.39	
align1=6, align2=2, len=272, max_char=255:         3.23 (  4.07%)	        3.37	
align1=1, align2=7, len=272, max_char=127:         3.25 (  3.97%)	        3.39	
align1=7, align2=1, len=272, max_char=255:         3.23 (  4.18%)	        3.37	
align1=3, align2=4, len=272, max_char=127:         3.24 (  4.53%)	        3.40	
align1=4, align2=3, len=272, max_char=255:         3.23 (  4.28%)	        3.38	
align1=5, align2=7, len=272, max_char=127:         3.25 (  6.02%)	        3.45	
align1=7, align2=5, len=272, max_char=127:         3.23 (  3.89%)	        3.36	
align1=0, align2=4, len=276, max_char=127:         3.24 (  4.18%)	        3.38	
align1=4, align2=0, len=276, max_char=255:         3.31 (  1.66%)	        3.37	
align1=4, align2=4, len=276, max_char=127:         3.31 (  1.62%)	        3.37	
align1=2, align2=2, len=276, max_char=255:         3.23 (  4.33%)	        3.38	
align1=2, align2=6, len=276, max_char=127:         3.25 (  4.26%)	        3.39	
align1=6, align2=2, len=276, max_char=255:         3.32 (  1.53%)	        3.37	
align1=1, align2=7, len=276, max_char=127:         3.25 (  4.19%)	        3.39	
align1=7, align2=1, len=276, max_char=255:         3.32 (  1.49%)	        3.37	
align1=3, align2=4, len=276, max_char=127:         3.24 (  4.13%)	        3.38	
align1=4, align2=3, len=276, max_char=255:         3.31 (  1.57%)	        3.37	
align1=5, align2=7, len=276, max_char=127:         3.33 (  3.40%)	        3.44	
align1=7, align2=5, len=276, max_char=127:         3.22 (  5.70%)	        3.42	
align1=0, align2=4, len=280, max_char=127:         3.25 (  4.25%)	        3.39	
align1=4, align2=0, len=280, max_char=255:         3.23 (  4.22%)	        3.37	
align1=4, align2=4, len=280, max_char=127:         3.23 (  4.36%)	        3.38	
align1=2, align2=2, len=280, max_char=255:         3.23 (  4.20%)	        3.38	
align1=2, align2=6, len=280, max_char=127:         3.33 (  1.78%)	        3.39	
align1=6, align2=2, len=280, max_char=255:         3.23 (  3.89%)	        3.36	
align1=1, align2=7, len=280, max_char=127:         3.24 (  3.95%)	        3.38	
align1=7, align2=1, len=280, max_char=255:         3.23 (  4.26%)	        3.37	
align1=3, align2=4, len=280, max_char=127:         3.25 (  4.45%)	        3.40	
align1=4, align2=3, len=280, max_char=255:         3.23 (  5.96%)	        3.43	
align1=5, align2=7, len=280, max_char=127:         3.25 (  4.31%)	        3.39	
align1=7, align2=5, len=280, max_char=127:         3.23 (  4.43%)	        3.38	
align1=0, align2=4, len=284, max_char=127:         3.25 (  4.18%)	        3.39	
align1=4, align2=0, len=284, max_char=255:         3.37 (  4.69%)	        3.53	
align1=4, align2=4, len=284, max_char=127:         3.36 (  4.66%)	        3.53	
align1=2, align2=2, len=284, max_char=255:         3.24 (  4.32%)	        3.38	
align1=2, align2=6, len=284, max_char=127:         3.25 (  4.32%)	        3.39	
align1=6, align2=2, len=284, max_char=255:         3.46 (  1.72%)	        3.52	
align1=1, align2=7, len=284, max_char=127:         3.25 (  3.89%)	        3.38	
align1=7, align2=1, len=284, max_char=255:         3.36 (  4.60%)	        3.53	
align1=3, align2=4, len=284, max_char=127:         3.25 (  4.25%)	        3.40	
align1=4, align2=3, len=284, max_char=255:         3.36 (  4.51%)	        3.52	
align1=5, align2=7, len=284, max_char=127:         3.38 (  4.50%)	        3.54	
align1=7, align2=5, len=284, max_char=127:         3.37 (  5.85%)	        3.58	
align1=0, align2=4, len=288, max_char=127:         3.39 (  4.12%)	        3.53	
align1=4, align2=0, len=288, max_char=255:         3.37 (  4.55%)	        3.53	
align1=4, align2=4, len=288, max_char=127:         3.36 (  4.65%)	        3.53	
align1=2, align2=2, len=288, max_char=255:         3.45 (  1.94%)	        3.52	
align1=2, align2=6, len=288, max_char=127:         3.38 (  4.37%)	        3.54	
align1=6, align2=2, len=288, max_char=255:         3.37 (  4.72%)	        3.53	
align1=1, align2=7, len=288, max_char=127:         3.47 (  1.89%)	        3.54	
align1=7, align2=1, len=288, max_char=255:         3.37 (  6.41%)	        3.60	
align1=3, align2=4, len=288, max_char=127:         3.38 (  4.56%)	        3.54	
align1=4, align2=3, len=288, max_char=255:         3.37 (  6.60%)	        3.61	
align1=5, align2=7, len=288, max_char=127:         3.38 (  4.56%)	        3.54	
align1=7, align2=5, len=288, max_char=127:         3.37 (  4.55%)	        3.53	
align1=0, align2=4, len=292, max_char=127:         3.39 (  4.30%)	        3.54	
align1=4, align2=0, len=292, max_char=255:         3.37 (  4.18%)	        3.52	
align1=4, align2=4, len=292, max_char=127:         3.36 (  4.50%)	        3.52	
align1=2, align2=2, len=292, max_char=255:         3.45 (  3.82%)	        3.58	
align1=2, align2=6, len=292, max_char=127:         3.39 (  4.11%)	        3.53	
align1=6, align2=2, len=292, max_char=255:         3.37 (  4.46%)	        3.53	
align1=1, align2=7, len=292, max_char=127:         3.38 (  4.79%)	        3.55	
align1=7, align2=1, len=292, max_char=255:         3.37 (  4.58%)	        3.53	
align1=3, align2=4, len=292, max_char=127:         3.39 (  4.32%)	        3.54	
align1=4, align2=3, len=292, max_char=255:         3.37 (  4.38%)	        3.53	
align1=5, align2=7, len=292, max_char=127:         3.47 (  2.03%)	        3.55	
align1=7, align2=5, len=292, max_char=127:         3.37 (  4.64%)	        3.54	
align1=0, align2=4, len=296, max_char=127:         3.39 (  4.26%)	        3.54	
align1=4, align2=0, len=296, max_char=255:         3.37 (  4.68%)	        3.54	
align1=4, align2=4, len=296, max_char=127:         3.37 (  4.36%)	        3.52	
align1=2, align2=2, len=296, max_char=255:         3.36 (  4.54%)	        3.52	
align1=2, align2=6, len=296, max_char=127:         3.39 (  4.53%)	        3.55	
align1=6, align2=2, len=296, max_char=255:         3.37 (  4.36%)	        3.53	
align1=1, align2=7, len=296, max_char=127:         3.39 (  4.06%)	        3.54	
align1=7, align2=1, len=296, max_char=255:         3.37 (  4.24%)	        3.52	
align1=3, align2=4, len=296, max_char=127:         3.38 (  4.68%)	        3.55	
align1=4, align2=3, len=296, max_char=255:         3.38 (  4.43%)	        3.53	
align1=5, align2=7, len=296, max_char=127:         3.39 (  4.29%)	        3.54	
align1=7, align2=5, len=296, max_char=127:         3.37 (  4.43%)	        3.53	
align1=0, align2=4, len=300, max_char=127:         3.39 (  4.45%)	        3.55	
align1=4, align2=0, len=300, max_char=255:         3.54 (  5.97%)	        3.76	
align1=4, align2=4, len=300, max_char=127:         3.52 (  6.20%)	        3.75	
align1=2, align2=2, len=300, max_char=255:         3.37 (  4.38%)	        3.52	
align1=2, align2=6, len=300, max_char=127:         3.39 (  4.19%)	        3.54	
align1=6, align2=2, len=300, max_char=255:         3.54 (  6.01%)	        3.76	
align1=1, align2=7, len=300, max_char=127:         3.48 (  3.35%)	        3.60	
align1=7, align2=1, len=300, max_char=255:         3.53 (  5.87%)	        3.75	
align1=3, align2=4, len=300, max_char=127:         3.39 (  4.55%)	        3.55	
align1=4, align2=3, len=300, max_char=255:         3.53 (  5.83%)	        3.75	
align1=5, align2=7, len=300, max_char=127:         3.54 (  5.80%)	        3.76	
align1=7, align2=5, len=300, max_char=127:         3.54 (  5.90%)	        3.76	
align1=0, align2=4, len=304, max_char=127:         3.54 (  6.09%)	        3.77	
align1=4, align2=0, len=304, max_char=255:         3.54 (  5.92%)	        3.76	
align1=4, align2=4, len=304, max_char=127:         3.51 (  6.15%)	        3.74	
align1=2, align2=2, len=304, max_char=255:         3.51 (  6.16%)	        3.74	
align1=2, align2=6, len=304, max_char=127:         3.54 (  5.90%)	        3.77	
align1=6, align2=2, len=304, max_char=255:         3.54 (  5.75%)	        3.75	
align1=1, align2=7, len=304, max_char=127:         3.54 (  6.00%)	        3.77	
align1=7, align2=1, len=304, max_char=255:         3.53 (  5.92%)	        3.76	
align1=3, align2=4, len=304, max_char=127:         3.54 (  5.81%)	        3.76	
align1=4, align2=3, len=304, max_char=255:         3.54 (  5.69%)	        3.75	
align1=5, align2=7, len=304, max_char=127:         3.55 (  6.39%)	        3.79	
align1=7, align2=5, len=304, max_char=127:         3.54 (  5.89%)	        3.76	
align1=0, align2=4, len=308, max_char=127:         3.54 (  5.85%)	        3.76	
align1=4, align2=0, len=308, max_char=255:         3.53 (  6.03%)	        3.76	
align1=4, align2=4, len=308, max_char=127:         3.51 (  6.23%)	        3.75	
align1=2, align2=2, len=308, max_char=255:         3.52 (  6.10%)	        3.74	
align1=2, align2=6, len=308, max_char=127:         3.54 (  5.89%)	        3.77	
align1=6, align2=2, len=308, max_char=255:         3.54 (  5.89%)	        3.76	
align1=1, align2=7, len=308, max_char=127:         3.54 (  5.97%)	        3.77	
align1=7, align2=1, len=308, max_char=255:         3.54 (  5.83%)	        3.76	
align1=3, align2=4, len=308, max_char=127:         3.55 (  5.86%)	        3.77	
align1=4, align2=3, len=308, max_char=255:         3.54 (  5.87%)	        3.76	
align1=5, align2=7, len=308, max_char=127:         3.55 (  5.96%)	        3.77	
align1=7, align2=5, len=308, max_char=127:         3.54 (  5.82%)	        3.76	
align1=0, align2=4, len=312, max_char=127:         3.55 (  5.95%)	        3.77	
align1=4, align2=0, len=312, max_char=255:         3.54 (  5.79%)	        3.75	
align1=4, align2=4, len=312, max_char=127:         3.52 (  6.16%)	        3.75	
align1=2, align2=2, len=312, max_char=255:         3.51 (  6.15%)	        3.74	
align1=2, align2=6, len=312, max_char=127:         3.55 (  5.99%)	        3.77	
align1=6, align2=2, len=312, max_char=255:         3.54 (  5.72%)	        3.76	
align1=1, align2=7, len=312, max_char=127:         3.54 (  5.94%)	        3.77	
align1=7, align2=1, len=312, max_char=255:         3.54 (  5.73%)	        3.76	
align1=3, align2=4, len=312, max_char=127:         3.55 (  5.81%)	        3.77	
align1=4, align2=3, len=312, max_char=255:         3.54 (  5.89%)	        3.76	
align1=5, align2=7, len=312, max_char=127:         3.54 (  6.14%)	        3.77	
align1=7, align2=5, len=312, max_char=127:         3.54 (  5.77%)	        3.76	
align1=0, align2=4, len=316, max_char=127:         3.55 (  5.88%)	        3.77	
align1=4, align2=0, len=316, max_char=255:         3.69 (  6.03%)	        3.93	
align1=4, align2=4, len=316, max_char=127:         3.66 (  6.38%)	        3.91	
align1=2, align2=2, len=316, max_char=255:         3.52 (  6.22%)	        3.75	
align1=2, align2=6, len=316, max_char=127:         3.54 (  6.15%)	        3.78	
align1=6, align2=2, len=316, max_char=255:         3.69 (  5.85%)	        3.92	
align1=1, align2=7, len=316, max_char=127:         3.54 (  5.98%)	        3.77	
align1=7, align2=1, len=316, max_char=255:         3.69 (  5.71%)	        3.92	
align1=3, align2=4, len=316, max_char=127:         3.55 (  5.85%)	        3.77	
align1=4, align2=3, len=316, max_char=255:         3.69 (  5.95%)	        3.92	
align1=5, align2=7, len=316, max_char=127:         3.70 (  6.28%)	        3.95	
align1=7, align2=5, len=316, max_char=127:         3.69 (  5.82%)	        3.92	
align1=0, align2=4, len=320, max_char=127:         3.69 (  6.29%)	        3.94	
align1=4, align2=0, len=320, max_char=255:         3.69 (  6.05%)	        3.93	
align1=4, align2=4, len=320, max_char=127:         3.67 (  6.23%)	        3.91	
align1=2, align2=2, len=320, max_char=255:         3.74 (  4.43%)	        3.92	
align1=2, align2=6, len=320, max_char=127:         3.69 (  6.20%)	        3.93	
align1=6, align2=2, len=320, max_char=255:         3.69 (  5.87%)	        3.92	
align1=1, align2=7, len=320, max_char=127:         3.69 (  7.43%)	        3.99	
align1=7, align2=1, len=320, max_char=255:         3.69 (  7.26%)	        3.98	
align1=3, align2=4, len=320, max_char=127:         3.77 (  3.98%)	        3.93	
align1=4, align2=3, len=320, max_char=255:         3.77 (  5.15%)	        3.97	
align1=5, align2=7, len=320, max_char=127:         3.77 (  3.91%)	        3.93	
align1=7, align2=5, len=320, max_char=127:         3.77 (  3.86%)	        3.92	
align1=0, align2=4, len=324, max_char=127:         3.69 (  6.04%)	        3.93	
align1=4, align2=0, len=324, max_char=255:         3.78 (  3.74%)	        3.92	
align1=4, align2=4, len=324, max_char=127:         3.67 (  7.59%)	        3.97	
align1=2, align2=2, len=324, max_char=255:         4.04 ( -3.39%)	        3.91	
align1=2, align2=6, len=324, max_char=127:         3.69 (  6.29%)	        3.93	
align1=6, align2=2, len=324, max_char=255:         3.69 (  6.00%)	        3.93	
align1=1, align2=7, len=324, max_char=127:         3.69 (  7.41%)	        3.99	
align1=7, align2=1, len=324, max_char=255:         3.77 (  3.97%)	        3.93	
align1=3, align2=4, len=324, max_char=127:         3.69 (  7.43%)	        3.99	
align1=4, align2=3, len=324, max_char=255:         3.77 (  3.83%)	        3.92	
align1=5, align2=7, len=324, max_char=127:         3.69 (  6.39%)	        3.94	
align1=7, align2=5, len=324, max_char=127:         3.68 (  6.28%)	        3.93	
align1=0, align2=4, len=328, max_char=127:         3.69 (  6.17%)	        3.94	
align1=4, align2=0, len=328, max_char=255:         3.77 (  5.19%)	        3.97	
align1=4, align2=4, len=328, max_char=127:         3.66 (  6.53%)	        3.92	
align1=2, align2=2, len=328, max_char=255:         3.65 (  7.81%)	        3.96	
align1=2, align2=6, len=328, max_char=127:         3.69 (  6.02%)	        3.93	
align1=6, align2=2, len=328, max_char=255:         3.69 (  7.17%)	        3.97	
align1=1, align2=7, len=328, max_char=127:         3.69 (  7.49%)	        3.99	
align1=7, align2=1, len=328, max_char=255:         3.70 (  5.64%)	        3.92	
align1=3, align2=4, len=328, max_char=127:         3.77 (  3.92%)	        3.93	
align1=4, align2=3, len=328, max_char=255:         3.77 (  5.90%)	        4.00	
align1=5, align2=7, len=328, max_char=127:         3.77 (  4.11%)	        3.93	
align1=7, align2=5, len=328, max_char=127:         3.77 (  3.93%)	        3.92	
align1=0, align2=4, len=332, max_char=127:         3.69 (  6.15%)	        3.93	
align1=4, align2=0, len=332, max_char=255:         3.86 (  4.54%)	        4.05	
align1=4, align2=4, len=332, max_char=127:         3.84 (  5.79%)	        4.08	
align1=2, align2=2, len=332, max_char=255:         3.66 (  6.14%)	        3.90	
align1=2, align2=6, len=332, max_char=127:         3.77 (  4.06%)	        3.93	
align1=6, align2=2, len=332, max_char=255:         3.79 (  6.09%)	        4.04	
align1=1, align2=7, len=332, max_char=127:         3.69 (  5.84%)	        3.92	
align1=7, align2=1, len=332, max_char=255:         3.80 (  6.12%)	        4.04	
align1=3, align2=4, len=332, max_char=127:         3.69 (  7.48%)	        3.99	
align1=4, align2=3, len=332, max_char=255:         3.79 (  6.23%)	        4.04	
align1=5, align2=7, len=332, max_char=127:         3.79 (  7.70%)	        4.11	
align1=7, align2=5, len=332, max_char=127:         3.80 (  5.96%)	        4.04	
align1=0, align2=4, len=336, max_char=127:         3.80 (  6.44%)	        4.06	
align1=4, align2=0, len=336, max_char=255:         3.79 (  6.28%)	        4.05	
align1=4, align2=4, len=336, max_char=127:         3.76 (  6.70%)	        4.03	
align1=2, align2=2, len=336, max_char=255:         3.76 (  6.75%)	        4.04	
align1=2, align2=6, len=336, max_char=127:         3.79 (  6.49%)	        4.06	
align1=6, align2=2, len=336, max_char=255:         3.79 (  6.18%)	        4.04	
align1=1, align2=7, len=336, max_char=127:         3.80 (  6.43%)	        4.06	
align1=7, align2=1, len=336, max_char=255:         3.79 (  6.23%)	        4.04	
align1=3, align2=4, len=336, max_char=127:         3.79 (  6.55%)	        4.06	
align1=4, align2=3, len=336, max_char=255:         3.80 (  6.03%)	        4.04	
align1=5, align2=7, len=336, max_char=127:         3.79 (  6.43%)	        4.05	
align1=7, align2=5, len=336, max_char=127:         3.87 (  4.40%)	        4.04	
align1=0, align2=4, len=340, max_char=127:         3.79 (  6.51%)	        4.06	
align1=4, align2=0, len=340, max_char=255:         3.79 (  6.23%)	        4.04	
align1=4, align2=4, len=340, max_char=127:         3.76 (  6.63%)	        4.03	
align1=2, align2=2, len=340, max_char=255:         3.77 (  7.57%)	        4.08	
align1=2, align2=6, len=340, max_char=127:         3.79 (  6.64%)	        4.06	
align1=6, align2=2, len=340, max_char=255:         3.79 (  7.43%)	        4.09	
align1=1, align2=7, len=340, max_char=127:         3.88 (  4.33%)	        4.05	
align1=7, align2=1, len=340, max_char=255:         3.80 (  7.10%)	        4.09	
align1=3, align2=4, len=340, max_char=127:         3.80 (  6.71%)	        4.07	
align1=4, align2=3, len=340, max_char=255:         3.79 (  6.26%)	        4.05	
align1=5, align2=7, len=340, max_char=127:         3.79 (  6.63%)	        4.06	
align1=7, align2=5, len=340, max_char=127:         3.80 (  6.06%)	        4.04	
align1=0, align2=4, len=344, max_char=127:         3.80 (  6.41%)	        4.06	
align1=4, align2=0, len=344, max_char=255:         3.79 (  6.16%)	        4.04	
align1=4, align2=4, len=344, max_char=127:         3.76 (  6.77%)	        4.04	
align1=2, align2=2, len=344, max_char=255:         3.77 (  6.58%)	        4.03	
align1=2, align2=6, len=344, max_char=127:         3.79 (  6.58%)	        4.06	
align1=6, align2=2, len=344, max_char=255:         3.79 (  6.18%)	        4.04	
align1=1, align2=7, len=344, max_char=127:         3.79 (  6.41%)	        4.05	
align1=7, align2=1, len=344, max_char=255:         3.87 (  4.34%)	        4.04	
align1=3, align2=4, len=344, max_char=127:         3.80 (  6.48%)	        4.06	
align1=4, align2=3, len=344, max_char=255:         3.79 (  6.27%)	        4.05	
align1=5, align2=7, len=344, max_char=127:         3.80 (  6.43%)	        4.06	
align1=7, align2=5, len=344, max_char=127:         3.80 (  6.13%)	        4.05	
align1=0, align2=4, len=348, max_char=127:         3.79 (  6.63%)	        4.06	
align1=4, align2=0, len=348, max_char=255:         3.94 (  6.38%)	        4.21	
align1=4, align2=4, len=348, max_char=127:         3.91 (  6.95%)	        4.20	
align1=2, align2=2, len=348, max_char=255:         3.84 (  4.91%)	        4.04	
align1=2, align2=6, len=348, max_char=127:         3.80 (  6.51%)	        4.07	
align1=6, align2=2, len=348, max_char=255:         3.94 (  6.41%)	        4.21	
align1=1, align2=7, len=348, max_char=127:         3.88 (  5.59%)	        4.10	
align1=7, align2=1, len=348, max_char=255:         3.95 (  6.26%)	        4.21	
align1=3, align2=4, len=348, max_char=127:         3.80 (  6.37%)	        4.06	
align1=4, align2=3, len=348, max_char=255:         3.94 (  6.40%)	        4.21	
align1=5, align2=7, len=348, max_char=127:         3.95 (  6.55%)	        4.22	
align1=7, align2=5, len=348, max_char=127:         3.94 (  6.53%)	        4.22	
align1=0, align2=4, len=352, max_char=127:         3.94 (  6.73%)	        4.23	
align1=4, align2=0, len=352, max_char=255:         3.94 (  6.32%)	        4.21	
align1=4, align2=4, len=352, max_char=127:         3.92 (  6.81%)	        4.20	
align1=2, align2=2, len=352, max_char=255:         3.92 (  6.62%)	        4.20	
align1=2, align2=6, len=352, max_char=127:         4.17 (  1.28%)	        4.22	
align1=6, align2=2, len=352, max_char=255:         3.95 (  6.17%)	        4.21	
align1=1, align2=7, len=352, max_char=127:         3.95 (  6.78%)	        4.24	
align1=7, align2=1, len=352, max_char=255:         3.94 (  6.57%)	        4.22	
align1=3, align2=4, len=352, max_char=127:         3.95 (  6.51%)	        4.22	
align1=4, align2=3, len=352, max_char=255:         3.94 (  6.40%)	        4.21	
align1=5, align2=7, len=352, max_char=127:         3.95 (  6.52%)	        4.22	
align1=7, align2=5, len=352, max_char=127:         3.94 (  6.46%)	        4.22	
align1=0, align2=4, len=356, max_char=127:         3.94 (  7.27%)	        4.25	
align1=4, align2=0, len=356, max_char=255:         3.94 (  6.41%)	        4.21	
align1=4, align2=4, len=356, max_char=127:         3.91 (  6.78%)	        4.20	
align1=2, align2=2, len=356, max_char=255:         3.92 (  6.72%)	        4.20	
align1=2, align2=6, len=356, max_char=127:         3.94 (  6.70%)	        4.23	
align1=6, align2=2, len=356, max_char=255:         3.94 (  6.58%)	        4.21	
align1=1, align2=7, len=356, max_char=127:         3.95 (  6.54%)	        4.22	
align1=7, align2=1, len=356, max_char=255:         3.95 (  6.39%)	        4.22	
align1=3, align2=4, len=356, max_char=127:         4.02 (  4.70%)	        4.22	
align1=4, align2=3, len=356, max_char=255:         3.94 (  6.40%)	        4.21	
align1=5, align2=7, len=356, max_char=127:         3.94 (  6.86%)	        4.23	
align1=7, align2=5, len=356, max_char=127:         3.95 (  7.36%)	        4.26	
align1=0, align2=4, len=360, max_char=127:         3.94 (  6.55%)	        4.22	
align1=4, align2=0, len=360, max_char=255:         3.94 (  6.42%)	        4.21	
align1=4, align2=4, len=360, max_char=127:         3.91 (  6.67%)	        4.19	
align1=2, align2=2, len=360, max_char=255:         3.92 (  6.69%)	        4.20	
align1=2, align2=6, len=360, max_char=127:         3.94 (  6.79%)	        4.23	
align1=6, align2=2, len=360, max_char=255:         4.02 (  5.62%)	        4.26	
align1=1, align2=7, len=360, max_char=127:         3.95 (  6.55%)	        4.23	
align1=7, align2=1, len=360, max_char=255:         3.95 (  6.36%)	        4.21	
align1=3, align2=4, len=360, max_char=127:         3.95 (  6.48%)	        4.22	
align1=4, align2=3, len=360, max_char=255:         4.01 (  4.95%)	        4.22	
align1=5, align2=7, len=360, max_char=127:         3.94 (  6.75%)	        4.23	
align1=7, align2=5, len=360, max_char=127:         3.94 (  6.60%)	        4.22	
align1=0, align2=4, len=364, max_char=127:         3.95 (  8.42%)	        4.31	
align1=4, align2=0, len=364, max_char=255:         4.05 (  7.22%)	        4.37	
align1=4, align2=4, len=364, max_char=127:         4.03 (  8.09%)	        4.38	
align1=2, align2=2, len=364, max_char=255:         3.91 (  6.79%)	        4.20	
align1=2, align2=6, len=364, max_char=127:         3.94 (  6.65%)	        4.22	
align1=6, align2=2, len=364, max_char=255:         4.11 (  5.64%)	        4.36	
align1=1, align2=7, len=364, max_char=127:         3.95 (  7.79%)	        4.28	
align1=7, align2=1, len=364, max_char=255:         4.12 (  6.40%)	        4.40	
align1=3, align2=4, len=364, max_char=127:         3.95 (  6.34%)	        4.22	
align1=4, align2=3, len=364, max_char=255:         4.12 (  5.54%)	        4.36	
align1=5, align2=7, len=364, max_char=127:         4.05 (  7.26%)	        4.37	
align1=7, align2=5, len=364, max_char=127:         4.05 (  7.07%)	        4.36	
align1=0, align2=4, len=368, max_char=127:         4.05 (  7.36%)	        4.37	
align1=4, align2=0, len=368, max_char=255:         4.05 (  7.16%)	        4.36	
align1=4, align2=4, len=368, max_char=127:         4.03 (  7.21%)	        4.34	
align1=2, align2=2, len=368, max_char=255:         4.09 ( 10.93%)	        4.59	
align1=2, align2=6, len=368, max_char=127:         4.05 (  7.33%)	        4.37	
align1=6, align2=2, len=368, max_char=255:         4.06 (  6.97%)	        4.36	
align1=1, align2=7, len=368, max_char=127:         4.05 (  7.16%)	        4.37	
align1=7, align2=1, len=368, max_char=255:         4.05 (  7.11%)	        4.36	
align1=3, align2=4, len=368, max_char=127:         4.05 (  7.12%)	        4.36	
align1=4, align2=3, len=368, max_char=255:         4.06 (  6.96%)	        4.36	
align1=5, align2=7, len=368, max_char=127:         4.05 (  7.25%)	        4.37	
align1=7, align2=5, len=368, max_char=127:         4.05 (  7.37%)	        4.37	
align1=0, align2=4, len=372, max_char=127:         4.05 (  7.37%)	        4.38	
align1=4, align2=0, len=372, max_char=255:         4.06 (  7.07%)	        4.37	
align1=4, align2=4, len=372, max_char=127:         4.03 (  7.12%)	        4.34	
align1=2, align2=2, len=372, max_char=255:         4.03 (  7.15%)	        4.34	
align1=2, align2=6, len=372, max_char=127:         4.05 (  7.23%)	        4.37	
align1=6, align2=2, len=372, max_char=255:         4.11 (  5.82%)	        4.37	
align1=1, align2=7, len=372, max_char=127:         4.12 (  5.93%)	        4.38	
align1=7, align2=1, len=372, max_char=255:         4.05 (  7.23%)	        4.37	
align1=3, align2=4, len=372, max_char=127:         4.05 (  7.32%)	        4.37	
align1=4, align2=3, len=372, max_char=255:         4.05 (  7.20%)	        4.36	
align1=5, align2=7, len=372, max_char=127:         4.05 (  7.29%)	        4.37	
align1=7, align2=5, len=372, max_char=127:         4.06 (  7.08%)	        4.36	
align1=0, align2=4, len=376, max_char=127:         4.05 (  7.23%)	        4.37	
align1=4, align2=0, len=376, max_char=255:         4.05 (  7.15%)	        4.37	
align1=4, align2=4, len=376, max_char=127:         4.03 (  7.05%)	        4.33	
align1=2, align2=2, len=376, max_char=255:         4.02 (  7.37%)	        4.34	
align1=2, align2=6, len=376, max_char=127:         4.06 (  7.14%)	        4.37	
align1=6, align2=2, len=376, max_char=255:         4.05 (  7.07%)	        4.36	
align1=1, align2=7, len=376, max_char=127:         4.05 (  7.20%)	        4.37	
align1=7, align2=1, len=376, max_char=255:         4.05 (  7.20%)	        4.36	
align1=3, align2=4, len=376, max_char=127:         4.05 (  7.33%)	        4.37	
align1=4, align2=3, len=376, max_char=255:         4.06 (  7.11%)	        4.37	
align1=5, align2=7, len=376, max_char=127:         4.27 (  2.11%)	        4.37	
align1=7, align2=5, len=376, max_char=127:         4.05 (  8.15%)	        4.41	
align1=0, align2=4, len=380, max_char=127:         4.06 (  7.35%)	        4.38	
align1=4, align2=0, len=380, max_char=255:         4.18 (  7.96%)	        4.54	
align1=4, align2=4, len=380, max_char=127:         4.21 (  5.89%)	        4.48	
align1=2, align2=2, len=380, max_char=255:         4.03 (  7.36%)	        4.35	
align1=2, align2=6, len=380, max_char=127:         4.12 (  5.89%)	        4.38	
align1=6, align2=2, len=380, max_char=255:         4.19 (  7.02%)	        4.50	
align1=1, align2=7, len=380, max_char=127:         4.05 (  7.39%)	        4.38	
align1=7, align2=1, len=380, max_char=255:         4.25 (  5.63%)	        4.50	
align1=3, align2=4, len=380, max_char=127:         4.06 (  7.35%)	        4.38	
align1=4, align2=3, len=380, max_char=255:         4.19 (  7.00%)	        4.50	
align1=5, align2=7, len=380, max_char=127:         4.19 (  6.92%)	        4.50	
align1=7, align2=5, len=380, max_char=127:         4.24 (  5.85%)	        4.50	
align1=0, align2=4, len=384, max_char=127:         4.19 (  7.04%)	        4.51	
align1=4, align2=0, len=384, max_char=255:         4.18 ( 13.75%)	        4.85	
align1=4, align2=4, len=384, max_char=127:         4.16 (  7.18%)	        4.48	
align1=2, align2=2, len=384, max_char=255:         4.16 (  7.06%)	        4.47	
align1=2, align2=6, len=384, max_char=127:         4.19 (  7.21%)	        4.51	
align1=6, align2=2, len=384, max_char=255:         4.19 (  7.24%)	        4.52	
align1=1, align2=7, len=384, max_char=127:         4.19 (  7.10%)	        4.51	
align1=7, align2=1, len=384, max_char=255:         4.18 (  7.23%)	        4.50	
align1=3, align2=4, len=384, max_char=127:         4.19 (  8.12%)	        4.56	
align1=4, align2=3, len=384, max_char=255:         4.18 (  7.40%)	        4.52	
align1=5, align2=7, len=384, max_char=127:         4.19 (  7.15%)	        4.51	
align1=7, align2=5, len=384, max_char=127:         4.19 (  7.17%)	        4.51	
align1=0, align2=4, len=388, max_char=127:         4.19 (  6.96%)	        4.51	
align1=4, align2=0, len=388, max_char=255:         4.18 (  7.31%)	        4.51	
align1=4, align2=4, len=388, max_char=127:         4.16 (  7.08%)	        4.47	
align1=2, align2=2, len=388, max_char=255:         4.16 (  6.91%)	        4.47	
align1=2, align2=6, len=388, max_char=127:         4.19 (  7.08%)	        4.51	
align1=6, align2=2, len=388, max_char=255:         4.19 (  8.78%)	        4.59	
align1=1, align2=7, len=388, max_char=127:         4.19 (  7.11%)	        4.51	
align1=7, align2=1, len=388, max_char=255:         4.19 (  7.29%)	        4.52	
align1=3, align2=4, len=388, max_char=127:         4.19 (  7.17%)	        4.51	
align1=4, align2=3, len=388, max_char=255:         4.18 (  7.35%)	        4.51	
align1=5, align2=7, len=388, max_char=127:         4.19 (  6.98%)	        4.50	
align1=7, align2=5, len=388, max_char=127:         4.18 (  7.40%)	        4.52	
align1=0, align2=4, len=392, max_char=127:         4.19 (  7.06%)	        4.50	
align1=4, align2=0, len=392, max_char=255:         4.18 (  7.26%)	        4.51	
align1=4, align2=4, len=392, max_char=127:         4.16 (  7.13%)	        4.47	
align1=2, align2=2, len=392, max_char=255:         4.16 (  7.07%)	        4.48	
align1=2, align2=6, len=392, max_char=127:         4.19 (  7.04%)	        4.51	
align1=6, align2=2, len=392, max_char=255:         4.18 (  7.54%)	        4.52	
align1=1, align2=7, len=392, max_char=127:         4.19 (  7.08%)	        4.51	
align1=7, align2=1, len=392, max_char=255:         4.19 (  7.08%)	        4.50	
align1=3, align2=4, len=392, max_char=127:         4.19 (  8.66%)	        4.58	
align1=4, align2=3, len=392, max_char=255:         4.18 (  7.10%)	        4.50	
align1=5, align2=7, len=392, max_char=127:         4.18 (  7.18%)	        4.51	
align1=7, align2=5, len=392, max_char=127:         4.18 (  7.29%)	        4.51	
align1=0, align2=4, len=396, max_char=127:         4.19 (  6.99%)	        4.51	
align1=4, align2=0, len=396, max_char=255:         4.31 (  9.56%)	        4.77	
align1=4, align2=4, len=396, max_char=127:         4.29 (  8.48%)	        4.69	
align1=2, align2=2, len=396, max_char=255:         4.16 (  6.86%)	        4.47	
align1=2, align2=6, len=396, max_char=127:         4.19 (  7.07%)	        4.50	
align1=6, align2=2, len=396, max_char=255:         4.31 (  8.82%)	        4.73	
align1=1, align2=7, len=396, max_char=127:         4.19 (  7.15%)	        4.51	
align1=7, align2=1, len=396, max_char=255:         4.32 (  8.65%)	        4.73	
align1=3, align2=4, len=396, max_char=127:         4.19 (  7.07%)	        4.51	
align1=4, align2=3, len=396, max_char=255:         4.31 (  8.72%)	        4.73	
align1=5, align2=7, len=396, max_char=127:         4.32 (  8.59%)	        4.73	
align1=7, align2=5, len=396, max_char=127:         4.31 ( 10.37%)	        4.81	
align1=0, align2=4, len=400, max_char=127:         4.32 (  8.67%)	        4.73	
align1=4, align2=0, len=400, max_char=255:         4.31 (  8.80%)	        4.73	
align1=4, align2=4, len=400, max_char=127:         4.29 (  9.10%)	        4.72	
align1=2, align2=2, len=400, max_char=255:         4.34 (  8.12%)	        4.72	
align1=2, align2=6, len=400, max_char=127:         4.32 (  8.82%)	        4.73	
align1=6, align2=2, len=400, max_char=255:         4.32 (  9.32%)	        4.77	
align1=1, align2=7, len=400, max_char=127:         4.32 (  8.80%)	        4.73	
align1=7, align2=1, len=400, max_char=255:         4.31 (  8.84%)	        4.73	
align1=3, align2=4, len=400, max_char=127:         4.32 (  8.80%)	        4.73	
align1=4, align2=3, len=400, max_char=255:         4.31 (  8.90%)	        4.73	
align1=5, align2=7, len=400, max_char=127:         4.32 (  8.80%)	        4.74	
align1=7, align2=5, len=400, max_char=127:         4.32 (  9.32%)	        4.77	
align1=0, align2=4, len=404, max_char=127:         4.32 (  8.81%)	        4.73	
align1=4, align2=0, len=404, max_char=255:         4.32 (  8.78%)	        4.73	
align1=4, align2=4, len=404, max_char=127:         4.29 (  8.39%)	        4.68	
align1=2, align2=2, len=404, max_char=255:         4.29 (  8.44%)	        4.69	
align1=2, align2=6, len=404, max_char=127:         4.32 (  8.74%)	        4.73	
align1=6, align2=2, len=404, max_char=255:         4.32 (  8.80%)	        4.73	
align1=1, align2=7, len=404, max_char=127:         4.32 (  8.80%)	        4.73	
align1=7, align2=1, len=404, max_char=255:         4.32 (  8.87%)	        4.74	
align1=3, align2=4, len=404, max_char=127:         4.32 (  8.70%)	        4.73	
align1=4, align2=3, len=404, max_char=255:         4.32 (  8.82%)	        4.73	
align1=5, align2=7, len=404, max_char=127:         4.32 (  8.61%)	        4.73	
align1=7, align2=5, len=404, max_char=127:         4.32 (  8.78%)	        4.74	
align1=0, align2=4, len=408, max_char=127:         4.32 (  8.79%)	        4.73	
align1=4, align2=0, len=408, max_char=255:         4.32 (  8.85%)	        4.74	
align1=4, align2=4, len=408, max_char=127:         4.34 (  8.10%)	        4.72	
align1=2, align2=2, len=408, max_char=255:         4.29 (  8.42%)	        4.69	
align1=2, align2=6, len=408, max_char=127:         4.32 (  8.86%)	        4.74	
align1=6, align2=2, len=408, max_char=255:         4.31 (  8.93%)	        4.73	
align1=1, align2=7, len=408, max_char=127:         4.37 (  7.66%)	        4.73	
align1=7, align2=1, len=408, max_char=255:         4.32 (  8.79%)	        4.73	
align1=3, align2=4, len=408, max_char=127:         4.32 (  8.70%)	        4.73	
align1=4, align2=3, len=408, max_char=255:         4.32 (  8.74%)	        4.73	
align1=5, align2=7, len=408, max_char=127:         4.31 (  8.86%)	        4.73	
align1=7, align2=5, len=408, max_char=127:         4.32 (  8.81%)	        4.73	
align1=0, align2=4, len=412, max_char=127:         4.32 (  8.73%)	        4.73	
align1=4, align2=0, len=412, max_char=255:         4.44 (  9.74%)	        4.92	
align1=4, align2=4, len=412, max_char=127:         4.41 (  9.10%)	        4.85	
align1=2, align2=2, len=412, max_char=255:         4.34 (  7.49%)	        4.69	
align1=2, align2=6, len=412, max_char=127:         4.37 (  7.76%)	        4.73	
align1=6, align2=2, len=412, max_char=255:         4.45 (  9.49%)	        4.91	
align1=1, align2=7, len=412, max_char=127:         4.36 (  7.86%)	        4.74	
align1=7, align2=1, len=412, max_char=255:         5.05 ( -2.83%)	        4.92	
align1=3, align2=4, len=412, max_char=127:         4.32 (  8.62%)	        4.73	
align1=4, align2=3, len=412, max_char=255:         4.43 (  9.84%)	        4.91	
align1=5, align2=7, len=412, max_char=127:         4.46 (  9.18%)	        4.91	
align1=7, align2=5, len=412, max_char=127:         4.42 (  9.89%)	        4.91	
align1=0, align2=4, len=416, max_char=127:         4.44 (  9.59%)	        4.91	
align1=4, align2=0, len=416, max_char=255:         4.45 (  9.98%)	        4.95	
align1=4, align2=4, len=416, max_char=127:         4.41 (  9.23%)	        4.85	
align1=2, align2=2, len=416, max_char=255:         4.40 (  9.18%)	        4.85	
align1=2, align2=6, len=416, max_char=127:         4.47 (  9.03%)	        4.91	
align1=6, align2=2, len=416, max_char=255:         4.45 ( 10.10%)	        4.95	
align1=1, align2=7, len=416, max_char=127:         4.43 ( 10.28%)	        4.94	
align1=7, align2=1, len=416, max_char=255:         4.42 ( 10.06%)	        4.92	
align1=3, align2=4, len=416, max_char=127:         4.43 ( 10.30%)	        4.93	
align1=4, align2=3, len=416, max_char=255:         4.45 (  9.34%)	        4.91	
align1=5, align2=7, len=416, max_char=127:         4.42 (  9.85%)	        4.91	
align1=7, align2=5, len=416, max_char=127:         4.42 (  9.93%)	        4.91	
align1=0, align2=4, len=420, max_char=127:         4.42 (  9.94%)	        4.91	
align1=4, align2=0, len=420, max_char=255:         4.43 (  9.83%)	        4.91	
align1=4, align2=4, len=420, max_char=127:         4.40 (  9.95%)	        4.88	
align1=2, align2=2, len=420, max_char=255:         4.40 (  9.34%)	        4.85	
align1=2, align2=6, len=420, max_char=127:         4.42 ( 10.37%)	        4.94	
align1=6, align2=2, len=420, max_char=255:         4.42 ( 10.17%)	        4.92	
align1=1, align2=7, len=420, max_char=127:         4.43 (  9.84%)	        4.91	
align1=7, align2=1, len=420, max_char=255:         4.42 ( 10.09%)	        4.92	
align1=3, align2=4, len=420, max_char=127:         4.44 (  9.60%)	        4.91	
align1=4, align2=3, len=420, max_char=255:         4.42 ( 10.07%)	        4.92	
align1=5, align2=7, len=420, max_char=127:         4.43 (  9.70%)	        4.91	
align1=7, align2=5, len=420, max_char=127:         4.43 (  9.84%)	        4.91	
align1=0, align2=4, len=424, max_char=127:         4.42 ( 14.07%)	        5.15	
align1=4, align2=0, len=424, max_char=255:         4.42 ( 10.08%)	        4.92	
align1=4, align2=4, len=424, max_char=127:         4.41 (  9.06%)	        4.84	
align1=2, align2=2, len=424, max_char=255:         4.43 (  8.65%)	        4.85	
align1=2, align2=6, len=424, max_char=127:         4.42 (  9.78%)	        4.90	
align1=6, align2=2, len=424, max_char=255:         4.42 ( 10.13%)	        4.91	
align1=1, align2=7, len=424, max_char=127:         4.45 (  9.38%)	        4.91	
align1=7, align2=1, len=424, max_char=255:         4.43 (  9.93%)	        4.91	
align1=3, align2=4, len=424, max_char=127:         4.43 (  9.60%)	        4.90	
align1=4, align2=3, len=424, max_char=255:         4.42 ( 10.06%)	        4.91	
align1=5, align2=7, len=424, max_char=127:         4.43 (  9.66%)	        4.91	
align1=7, align2=5, len=424, max_char=127:         4.45 ( 10.02%)	        4.94	
align1=0, align2=4, len=428, max_char=127:         4.46 (  9.29%)	        4.91	
align1=4, align2=0, len=428, max_char=255:         4.64 (  7.69%)	        5.03	
align1=4, align2=4, len=428, max_char=127:         4.58 (  7.25%)	        4.94	
align1=2, align2=2, len=428, max_char=255:         4.40 (  9.32%)	        4.85	
align1=2, align2=6, len=428, max_char=127:         4.45 (  9.31%)	        4.91	
align1=6, align2=2, len=428, max_char=255:         4.61 (  8.20%)	        5.02	
align1=1, align2=7, len=428, max_char=127:         4.44 ( 10.18%)	        4.95	
align1=7, align2=1, len=428, max_char=255:         4.61 (  7.75%)	        4.99	
align1=3, align2=4, len=428, max_char=127:         4.43 (  9.77%)	        4.91	
align1=4, align2=3, len=428, max_char=255:         4.61 (  7.74%)	        4.99	
align1=5, align2=7, len=428, max_char=127:         4.65 (  6.78%)	        4.99	
align1=7, align2=5, len=428, max_char=127:         4.61 (  7.84%)	        5.00	
align1=0, align2=4, len=432, max_char=127:         4.61 (  7.76%)	        4.99	
align1=4, align2=0, len=432, max_char=255:         4.64 (  7.67%)	        5.03	
align1=4, align2=4, len=432, max_char=127:         4.58 (  7.14%)	        4.93	
align1=2, align2=2, len=432, max_char=255:         4.62 (  6.22%)	        4.93	
align1=2, align2=6, len=432, max_char=127:         4.65 (  6.96%)	        4.99	
align1=6, align2=2, len=432, max_char=255:         4.64 (  7.72%)	        5.02	
align1=1, align2=7, len=432, max_char=127:         4.61 (  7.73%)	        4.99	
align1=7, align2=1, len=432, max_char=255:         4.61 (  7.81%)	        5.00	
align1=3, align2=4, len=432, max_char=127:         4.65 (  6.89%)	        4.99	
align1=4, align2=3, len=432, max_char=255:         4.61 (  7.73%)	        5.00	
align1=5, align2=7, len=432, max_char=127:         4.65 (  6.72%)	        4.99	
align1=7, align2=5, len=432, max_char=127:         4.61 (  7.84%)	        5.00	
align1=0, align2=4, len=436, max_char=127:         4.62 (  7.65%)	        5.00	
align1=4, align2=0, len=436, max_char=255:         4.64 (  7.12%)	        5.00	
align1=4, align2=4, len=436, max_char=127:         4.58 (  7.42%)	        4.94	
align1=2, align2=2, len=436, max_char=255:         4.58 (  7.19%)	        4.94	
align1=2, align2=6, len=436, max_char=127:         4.61 (  7.85%)	        5.00	
align1=6, align2=2, len=436, max_char=255:         4.61 (  7.78%)	        5.00	
align1=1, align2=7, len=436, max_char=127:         4.61 (  7.57%)	        4.99	
align1=7, align2=1, len=436, max_char=255:         4.61 (  7.87%)	        5.00	
align1=3, align2=4, len=436, max_char=127:         4.61 (  7.66%)	        5.00	
align1=4, align2=3, len=436, max_char=255:         4.61 (  7.82%)	        5.00	
align1=5, align2=7, len=436, max_char=127:         4.61 (  7.54%)	        4.99	
align1=7, align2=5, len=436, max_char=127:         4.61 (  7.72%)	        5.00	
align1=0, align2=4, len=440, max_char=127:         4.61 (  7.65%)	        4.99	
align1=4, align2=0, len=440, max_char=255:         4.61 (  7.81%)	        5.00	
align1=4, align2=4, len=440, max_char=127:         4.58 (  7.30%)	        4.94	
align1=2, align2=2, len=440, max_char=255:         4.58 (  7.23%)	        4.94	
align1=2, align2=6, len=440, max_char=127:         4.61 (  7.64%)	        4.99	
align1=6, align2=2, len=440, max_char=255:         4.61 (  7.84%)	        5.00	
align1=1, align2=7, len=440, max_char=127:         4.61 (  7.57%)	        4.99	
align1=7, align2=1, len=440, max_char=255:         4.65 (  7.57%)	        5.03	
align1=3, align2=4, len=440, max_char=127:         4.61 (  7.65%)	        4.99	
align1=4, align2=3, len=440, max_char=255:         4.65 (  7.25%)	        5.01	
align1=5, align2=7, len=440, max_char=127:         4.70 (  5.96%)	        4.99	
align1=7, align2=5, len=440, max_char=127:         4.64 (  7.18%)	        5.00	
align1=0, align2=4, len=444, max_char=127:         4.62 (  7.64%)	        5.00	
align1=4, align2=0, len=444, max_char=255:         4.77 (  7.82%)	        5.17	
align1=4, align2=4, len=444, max_char=127:         4.73 (  7.09%)	        5.10	
align1=2, align2=2, len=444, max_char=255:         4.58 (  7.35%)	        4.94	
align1=2, align2=6, len=444, max_char=127:         4.62 (  8.13%)	        5.03	
align1=6, align2=2, len=444, max_char=255:         4.76 (  7.83%)	        5.16	
align1=1, align2=7, len=444, max_char=127:         4.62 (  7.62%)	        5.00	
align1=7, align2=1, len=444, max_char=255:         4.76 (  7.90%)	        5.16	
align1=3, align2=4, len=444, max_char=127:         4.62 (  7.65%)	        5.00	
align1=4, align2=3, len=444, max_char=255:         4.76 (  7.84%)	        5.16	
align1=5, align2=7, len=444, max_char=127:         4.77 (  7.46%)	        5.16	
align1=7, align2=5, len=444, max_char=127:         4.76 (  7.75%)	        5.16	
align1=0, align2=4, len=448, max_char=127:         4.77 (  7.53%)	        5.16	
align1=4, align2=0, len=448, max_char=255:         4.76 (  7.80%)	        5.17	
align1=4, align2=4, len=448, max_char=127:         4.78 (  6.22%)	        5.09	
align1=2, align2=2, len=448, max_char=255:         4.77 (  6.28%)	        5.09	
align1=2, align2=6, len=448, max_char=127:         4.80 (  6.80%)	        5.15	
align1=6, align2=2, len=448, max_char=255:         4.76 (  8.30%)	        5.20	
align1=1, align2=7, len=448, max_char=127:         4.77 (  7.35%)	        5.15	
align1=7, align2=1, len=448, max_char=255:         4.80 (  7.68%)	        5.20	
align1=3, align2=4, len=448, max_char=127:         4.77 (  7.41%)	        5.15	
align1=4, align2=3, len=448, max_char=255:         4.80 (  7.08%)	        5.16	
align1=5, align2=7, len=448, max_char=127:         4.77 (  7.40%)	        5.15	
align1=7, align2=5, len=448, max_char=127:         4.76 (  7.79%)	        5.16	
align1=0, align2=4, len=452, max_char=127:         4.78 (  7.29%)	        5.15	
align1=4, align2=0, len=452, max_char=255:         5.06 (  2.06%)	        5.17	
align1=4, align2=4, len=452, max_char=127:         4.74 (  7.02%)	        5.09	
align1=2, align2=2, len=452, max_char=255:         4.77 (  7.02%)	        5.13	
align1=2, align2=6, len=452, max_char=127:         4.77 (  7.47%)	        5.15	
align1=6, align2=2, len=452, max_char=255:         4.77 (  7.70%)	        5.16	
align1=1, align2=7, len=452, max_char=127:         4.77 (  7.51%)	        5.15	
align1=7, align2=1, len=452, max_char=255:         4.77 (  7.73%)	        5.17	
align1=3, align2=4, len=452, max_char=127:         4.77 (  7.95%)	        5.18	
align1=4, align2=3, len=452, max_char=255:         4.77 (  7.68%)	        5.16	
align1=5, align2=7, len=452, max_char=127:         4.77 (  7.96%)	        5.18	
align1=7, align2=5, len=452, max_char=127:         4.80 (  7.61%)	        5.19	
align1=0, align2=4, len=456, max_char=127:         4.77 (  7.42%)	        5.15	
align1=4, align2=0, len=456, max_char=255:         4.77 (  7.61%)	        5.16	
align1=4, align2=4, len=456, max_char=127:         4.73 (  7.10%)	        5.09	
align1=2, align2=2, len=456, max_char=255:         4.73 (  7.02%)	        5.09	
align1=2, align2=6, len=456, max_char=127:         4.77 (  7.98%)	        5.18	
align1=6, align2=2, len=456, max_char=255:         4.77 (  7.69%)	        5.16	
align1=1, align2=7, len=456, max_char=127:         4.77 (  7.34%)	        5.15	
align1=7, align2=1, len=456, max_char=255:         4.76 (  7.87%)	        5.17	
align1=3, align2=4, len=456, max_char=127:         4.77 (  7.95%)	        5.18	
align1=4, align2=3, len=456, max_char=255:         4.76 (  7.84%)	        5.16	
align1=5, align2=7, len=456, max_char=127:         4.77 (  7.37%)	        5.15	
align1=7, align2=5, len=456, max_char=127:         4.76 (  7.69%)	        5.16	
align1=0, align2=4, len=460, max_char=127:         4.77 (  7.29%)	        5.15	
align1=4, align2=0, len=460, max_char=255:         4.89 (  7.64%)	        5.30	
align1=4, align2=4, len=460, max_char=127:         4.86 (  7.22%)	        5.23	
align1=2, align2=2, len=460, max_char=255:         4.74 (  7.03%)	        5.10	
align1=2, align2=6, len=460, max_char=127:         4.77 (  7.34%)	        5.15	
align1=6, align2=2, len=460, max_char=255:         4.89 (  8.94%)	        5.37	
align1=1, align2=7, len=460, max_char=127:         4.77 (  7.46%)	        5.16	
align1=7, align2=1, len=460, max_char=255:         4.92 (  7.49%)	        5.32	
align1=3, align2=4, len=460, max_char=127:         4.78 (  7.36%)	        5.15	
align1=4, align2=3, len=460, max_char=255:         4.89 (  8.18%)	        5.32	
align1=5, align2=7, len=460, max_char=127:         4.91 (  7.21%)	        5.29	
align1=7, align2=5, len=460, max_char=127:         4.90 (  8.08%)	        5.33	
align1=0, align2=4, len=464, max_char=127:         4.91 (  7.25%)	        5.29	
align1=4, align2=0, len=464, max_char=255:         4.92 (  7.05%)	        5.30	
align1=4, align2=4, len=464, max_char=127:         4.86 (  7.02%)	        5.23	
align1=2, align2=2, len=464, max_char=255:         4.86 (  7.13%)	        5.23	
align1=2, align2=6, len=464, max_char=127:         4.93 (  6.72%)	        5.29	
align1=6, align2=2, len=464, max_char=255:         4.93 (  6.94%)	        5.30	
align1=1, align2=7, len=464, max_char=127:         5.04 (  5.28%)	        5.32	
align1=7, align2=1, len=464, max_char=255:         4.89 (  7.66%)	        5.30	
align1=3, align2=4, len=464, max_char=127:         4.90 (  7.41%)	        5.29	
align1=4, align2=3, len=464, max_char=255:         4.93 (  6.90%)	        5.29	
align1=5, align2=7, len=464, max_char=127:         4.90 (  7.33%)	        5.29	
align1=7, align2=5, len=464, max_char=127:         4.89 (  8.18%)	        5.33	
align1=0, align2=4, len=468, max_char=127:         4.90 (  7.36%)	        5.29	
align1=4, align2=0, len=468, max_char=255:         4.90 (  7.44%)	        5.29	
align1=4, align2=4, len=468, max_char=127:         4.85 (  7.12%)	        5.23	
align1=2, align2=2, len=468, max_char=255:         4.85 (  7.21%)	        5.23	
align1=2, align2=6, len=468, max_char=127:         4.90 (  7.92%)	        5.32	
align1=6, align2=2, len=468, max_char=255:         4.90 (  7.53%)	        5.29	
align1=1, align2=7, len=468, max_char=127:         4.90 (  7.42%)	        5.30	
align1=7, align2=1, len=468, max_char=255:         4.93 (  6.91%)	        5.30	
align1=3, align2=4, len=468, max_char=127:         5.00 (  5.46%)	        5.29	
align1=4, align2=3, len=468, max_char=255:         4.90 (  7.98%)	        5.32	
align1=5, align2=7, len=468, max_char=127:         4.94 (  6.64%)	        5.29	
align1=7, align2=5, len=468, max_char=127:         4.90 (  7.48%)	        5.29	
align1=0, align2=4, len=472, max_char=127:         4.90 (  7.31%)	        5.29	
align1=4, align2=0, len=472, max_char=255:         4.89 (  7.60%)	        5.29	
align1=4, align2=4, len=472, max_char=127:         4.86 (  7.14%)	        5.23	
align1=2, align2=2, len=472, max_char=255:         4.86 (  7.05%)	        5.23	
align1=2, align2=6, len=472, max_char=127:         4.90 (  7.36%)	        5.29	
align1=6, align2=2, len=472, max_char=255:         4.89 (  7.63%)	        5.30	
align1=1, align2=7, len=472, max_char=127:         4.90 (  7.31%)	        5.29	
align1=7, align2=1, len=472, max_char=255:         4.90 (  7.59%)	        5.30	
align1=3, align2=4, len=472, max_char=127:         4.90 (  7.32%)	        5.29	
align1=4, align2=3, len=472, max_char=255:         4.90 (  7.49%)	        5.29	
align1=5, align2=7, len=472, max_char=127:         4.94 (  6.54%)	        5.29	
align1=7, align2=5, len=472, max_char=127:         4.89 (  7.65%)	        5.30	
align1=0, align2=4, len=476, max_char=127:         4.91 (  7.30%)	        5.29	
align1=4, align2=0, len=476, max_char=255:         5.08 (  6.66%)	        5.44	
align1=4, align2=4, len=476, max_char=127:         5.04 (  6.86%)	        5.41	
align1=2, align2=2, len=476, max_char=255:         4.86 (  7.75%)	        5.27	
align1=2, align2=6, len=476, max_char=127:         4.91 (  7.22%)	        5.29	
align1=6, align2=2, len=476, max_char=255:         5.04 (  7.74%)	        5.46	
align1=1, align2=7, len=476, max_char=127:         4.90 (  7.28%)	        5.29	
align1=7, align2=1, len=476, max_char=255:         5.04 (  7.33%)	        5.44	
align1=3, align2=4, len=476, max_char=127:         4.94 (  6.61%)	        5.29	
align1=4, align2=3, len=476, max_char=255:         5.07 (  6.65%)	        5.44	
align1=5, align2=7, len=476, max_char=127:         5.35 (  1.30%)	        5.42	
align1=7, align2=5, len=476, max_char=127:         5.07 (  7.27%)	        5.47	
align1=0, align2=4, len=480, max_char=127:         5.04 (  7.61%)	        5.46	
align1=4, align2=0, len=480, max_char=255:         5.04 (  7.22%)	        5.43	
align1=4, align2=4, len=480, max_char=127:         4.99 (  7.09%)	        5.37	
align1=2, align2=2, len=480, max_char=255:         4.99 (  7.26%)	        5.38	
align1=2, align2=6, len=480, max_char=127:         5.04 (  7.16%)	        5.43	
align1=6, align2=2, len=480, max_char=255:         5.04 (  7.42%)	        5.45	
align1=1, align2=7, len=480, max_char=127:         5.04 (  7.04%)	        5.42	
align1=7, align2=1, len=480, max_char=255:         5.04 (  7.35%)	        5.44	
align1=3, align2=4, len=480, max_char=127:         5.05 (  7.00%)	        5.43	
align1=4, align2=3, len=480, max_char=255:         5.04 (  7.44%)	        5.44	
align1=5, align2=7, len=480, max_char=127:         5.04 (  7.03%)	        5.43	
align1=7, align2=5, len=480, max_char=127:         5.04 (  7.35%)	        5.44	
align1=0, align2=4, len=484, max_char=127:         5.04 (  7.08%)	        5.43	
align1=4, align2=0, len=484, max_char=255:         5.04 (  7.32%)	        5.44	
align1=4, align2=4, len=484, max_char=127:         4.99 (  7.10%)	        5.37	
align1=2, align2=2, len=484, max_char=255:         5.03 (  6.22%)	        5.37	
align1=2, align2=6, len=484, max_char=127:         5.04 (  7.05%)	        5.42	
align1=6, align2=2, len=484, max_char=255:         5.04 (  7.25%)	        5.43	
align1=1, align2=7, len=484, max_char=127:         5.05 (  6.95%)	        5.42	
align1=7, align2=1, len=484, max_char=255:         5.04 (  7.24%)	        5.44	
align1=3, align2=4, len=484, max_char=127:         5.08 (  6.37%)	        5.43	
align1=4, align2=3, len=484, max_char=255:         5.07 (  6.68%)	        5.44	
align1=5, align2=7, len=484, max_char=127:         5.05 (  7.05%)	        5.43	
align1=7, align2=5, len=484, max_char=127:         5.04 (  7.25%)	        5.44	
align1=0, align2=4, len=488, max_char=127:         5.04 (  7.16%)	        5.42	
align1=4, align2=0, len=488, max_char=255:         5.04 (  7.35%)	        5.44	
align1=4, align2=4, len=488, max_char=127:         4.99 (  7.09%)	        5.37	
align1=2, align2=2, len=488, max_char=255:         5.03 (  6.90%)	        5.41	
align1=2, align2=6, len=488, max_char=127:         5.04 (  7.02%)	        5.42	
align1=6, align2=2, len=488, max_char=255:         5.04 (  7.23%)	        5.43	
align1=1, align2=7, len=488, max_char=127:         5.04 (  7.07%)	        5.42	
align1=7, align2=1, len=488, max_char=255:         5.04 (  7.32%)	        5.44	
align1=3, align2=4, len=488, max_char=127:         5.04 (  7.14%)	        5.42	
align1=4, align2=3, len=488, max_char=255:         5.08 (  6.58%)	        5.43	
align1=5, align2=7, len=488, max_char=127:         5.04 (  7.06%)	        5.42	
align1=7, align2=5, len=488, max_char=127:         5.05 (  7.25%)	        5.44	
align1=0, align2=4, len=492, max_char=127:         5.04 (  7.07%)	        5.42	
align1=4, align2=0, len=492, max_char=255:         5.17 (  8.77%)	        5.67	
align1=4, align2=4, len=492, max_char=127:         5.12 ( 10.58%)	        5.72	
align1=2, align2=2, len=492, max_char=255:         4.99 (  7.03%)	        5.37	
align1=2, align2=6, len=492, max_char=127:         5.04 (  6.97%)	        5.42	
align1=6, align2=2, len=492, max_char=255:         5.17 (  8.85%)	        5.67	
align1=1, align2=7, len=492, max_char=127:         5.05 (  6.92%)	        5.43	
align1=7, align2=1, len=492, max_char=255:         5.21 (  8.06%)	        5.66	
align1=3, align2=4, len=492, max_char=127:         5.07 (  6.43%)	        5.42	
align1=4, align2=3, len=492, max_char=255:         5.17 ( 10.99%)	        5.81	
align1=5, align2=7, len=492, max_char=127:         5.17 ( 10.59%)	        5.79	
align1=7, align2=5, len=492, max_char=127:         5.21 ( 10.44%)	        5.81	
align1=0, align2=4, len=496, max_char=127:         5.17 ( 10.48%)	        5.78	
align1=4, align2=0, len=496, max_char=255:         5.17 ( 11.40%)	        5.84	
align1=4, align2=4, len=496, max_char=127:         5.12 ( 10.75%)	        5.73	
align1=2, align2=2, len=496, max_char=255:         5.20 (  8.84%)	        5.70	
align1=2, align2=6, len=496, max_char=127:         5.21 (  9.63%)	        5.76	
align1=6, align2=2, len=496, max_char=255:         5.17 ( 11.08%)	        5.82	
align1=1, align2=7, len=496, max_char=127:         5.17 ( 10.24%)	        5.76	
align1=7, align2=1, len=496, max_char=255:         5.17 ( 10.67%)	        5.79	
align1=3, align2=4, len=496, max_char=127:         5.17 ( 11.03%)	        5.81	
align1=4, align2=3, len=496, max_char=255:         5.17 ( 11.43%)	        5.84	
align1=5, align2=7, len=496, max_char=127:         5.17 ( 10.46%)	        5.77	
align1=7, align2=5, len=496, max_char=127:         5.17 ( 11.19%)	        5.83	
align1=0, align2=4, len=500, max_char=127:         5.18 ( 10.93%)	        5.81	
align1=4, align2=0, len=500, max_char=255:         5.17 ( 10.27%)	        5.76	
align1=4, align2=4, len=500, max_char=127:         5.12 ( 10.59%)	        5.72	
align1=2, align2=2, len=500, max_char=255:         5.12 ( 10.98%)	        5.75	
align1=2, align2=6, len=500, max_char=127:         5.26 (  7.09%)	        5.66	
align1=6, align2=2, len=500, max_char=255:         5.17 (  9.24%)	        5.70	
align1=1, align2=7, len=500, max_char=127:         5.18 (  8.49%)	        5.66	
align1=7, align2=1, len=500, max_char=255:         5.17 (  8.77%)	        5.67	
align1=3, align2=4, len=500, max_char=127:         5.17 (  8.59%)	        5.66	
align1=4, align2=3, len=500, max_char=255:         5.17 (  8.71%)	        5.67	
align1=5, align2=7, len=500, max_char=127:         5.18 (  8.53%)	        5.66	
align1=7, align2=5, len=500, max_char=127:         5.17 (  8.72%)	        5.67	
align1=0, align2=4, len=504, max_char=127:         5.17 (  8.50%)	        5.65	
align1=4, align2=0, len=504, max_char=255:         5.18 ( 11.06%)	        5.82	
align1=4, align2=4, len=504, max_char=127:         5.11 ( 11.76%)	        5.80	
align1=2, align2=2, len=504, max_char=255:         5.12 ( 10.80%)	        5.74	
align1=2, align2=6, len=504, max_char=127:         5.17 ( 13.14%)	        5.96	
align1=6, align2=2, len=504, max_char=255:         5.17 ( 10.64%)	        5.79	
align1=1, align2=7, len=504, max_char=127:         5.17 (  8.59%)	        5.66	
align1=7, align2=1, len=504, max_char=255:         5.18 (  8.66%)	        5.67	
align1=3, align2=4, len=504, max_char=127:         5.18 (  8.43%)	        5.65	
align1=4, align2=3, len=504, max_char=255:         5.17 (  9.10%)	        5.69	
align1=5, align2=7, len=504, max_char=127:         5.18 (  8.49%)	        5.66	
align1=7, align2=5, len=504, max_char=127:         5.18 (  9.08%)	        5.70	
align1=0, align2=4, len=508, max_char=127:         5.19 (  8.30%)	        5.66	
align1=4, align2=0, len=508, max_char=255:         5.36 (  9.84%)	        5.94	
align1=4, align2=4, len=508, max_char=127:         5.30 ( 10.26%)	        5.90	
align1=2, align2=2, len=508, max_char=255:         5.12 (  8.98%)	        5.63	
align1=2, align2=6, len=508, max_char=127:         5.19 ( 10.15%)	        5.77	
align1=6, align2=2, len=508, max_char=255:         5.32 (  9.00%)	        5.85	
align1=1, align2=7, len=508, max_char=127:         5.19 ( 10.22%)	        5.78	
align1=7, align2=1, len=508, max_char=255:         5.32 ( 11.06%)	        5.99	
align1=3, align2=4, len=508, max_char=127:         5.19 (  8.38%)	        5.66	
align1=4, align2=3, len=508, max_char=255:         5.32 ( 10.37%)	        5.94	
align1=5, align2=7, len=508, max_char=127:         5.36 ( 10.05%)	        5.96	
align1=7, align2=5, len=508, max_char=127:         5.33 ( 10.91%)	        5.99	
align1=0, align2=4, len=512, max_char=127:         5.32 ( 10.63%)	        5.95	
align1=4, align2=0, len=512, max_char=255:         5.36 ( 10.55%)	        6.00	
align1=4, align2=4, len=512, max_char=127:         5.26 ( 11.56%)	        5.95	
align1=2, align2=2, len=512, max_char=255:         5.25 (  9.61%)	        5.81	
align1=2, align2=6, len=512, max_char=127:         5.35 (  8.80%)	        5.87	
align1=6, align2=2, len=512, max_char=255:         5.37 ( 10.42%)	        5.99	
align1=1, align2=7, len=512, max_char=127:         5.32 ( 10.21%)	        5.93	
align1=7, align2=1, len=512, max_char=255:         5.33 ( 11.13%)	        6.00	
align1=3, align2=4, len=512, max_char=127:         5.36 (  9.40%)	        5.92	
align1=4, align2=3, len=512, max_char=255:         5.33 ( 10.93%)	        5.99	
align1=5, align2=7, len=512, max_char=127:         5.32 ( 10.72%)	        5.96	
align1=7, align2=5, len=512, max_char=127:         5.33 ( 10.74%)	        5.97	
align1=1, align2=0, len=1, max_char=127:         1.21 (  4.22%)	        1.26	
align1=0, align2=1, len=1, max_char=127:         1.21 (  4.20%)	        1.26	
align1=0, align2=0, len=1, max_char=127:         1.21 (  4.09%)	        1.26	
align1=1, align2=1, len=1, max_char=127:         1.21 (  9.79%)	        1.34	
align1=1, align2=0, len=2, max_char=127:         1.21 (  9.30%)	        1.33	
align1=0, align2=1, len=2, max_char=127:         1.21 (  9.48%)	        1.33	
align1=0, align2=0, len=2, max_char=127:         1.21 (  9.36%)	        1.33	
align1=1, align2=1, len=2, max_char=127:         1.21 (  9.54%)	        1.33	
align1=1, align2=0, len=4, max_char=127:         1.21 (  9.38%)	        1.33	
align1=0, align2=1, len=4, max_char=127:         1.21 (  9.45%)	        1.33	
align1=0, align2=0, len=4, max_char=127:         1.21 (  9.39%)	        1.33	
align1=1, align2=1, len=4, max_char=127:         1.21 (  9.49%)	        1.33	
align1=1, align2=0, len=8, max_char=127:         1.21 (  9.49%)	        1.33	
align1=0, align2=1, len=8, max_char=127:         1.21 (  9.43%)	        1.33	
align1=0, align2=0, len=8, max_char=127:         1.21 (  9.43%)	        1.33	
align1=1, align2=1, len=8, max_char=127:         1.21 (  9.50%)	        1.33	
align1=1, align2=0, len=16, max_char=127:         1.39 (  0.72%)	        1.40	
align1=0, align2=1, len=16, max_char=127:         1.39 (  0.01%)	        1.39	
align1=0, align2=0, len=16, max_char=127:         1.55 (-11.22%)	        1.39	
align1=1, align2=1, len=16, max_char=127:         1.55 (-11.32%)	        1.39	
align1=1, align2=0, len=32, max_char=127:         1.55 (  0.19%)	        1.56	
align1=0, align2=1, len=32, max_char=127:         1.68 ( -8.17%)	        1.55	
align1=0, align2=0, len=32, max_char=127:         1.55 ( -0.02%)	        1.55	
align1=1, align2=1, len=32, max_char=127:         1.67 ( -7.99%)	        1.55	
align1=1, align2=0, len=64, max_char=127:         1.57 (  6.55%)	        1.68	
align1=0, align2=1, len=64, max_char=127:         1.57 (  6.10%)	        1.67	
align1=0, align2=0, len=64, max_char=127:         1.69 (  6.28%)	        1.80	
align1=1, align2=1, len=64, max_char=127:         1.69 (  6.35%)	        1.80	
align1=1, align2=0, len=128, max_char=127:         1.99 ( 14.11%)	        2.31	
align1=0, align2=1, len=128, max_char=127:         1.99 (  9.01%)	        2.19	
align1=0, align2=0, len=128, max_char=127:         2.07 ( 15.75%)	        2.45	
align1=1, align2=1, len=128, max_char=127:         2.06 ( 15.85%)	        2.45	
align1=1, align2=0, len=256, max_char=127:         3.09 (  5.55%)	        3.28	
align1=0, align2=1, len=256, max_char=127:         3.10 (  5.65%)	        3.29	
align1=0, align2=0, len=256, max_char=127:         3.10 (  5.66%)	        3.29	
align1=1, align2=1, len=256, max_char=127:         3.10 (  5.77%)	        3.29	
align1=1, align2=0, len=512, max_char=127:         5.33 (  9.09%)	        5.86	
align1=0, align2=1, len=512, max_char=127:         5.32 (  8.66%)	        5.83	
align1=0, align2=0, len=512, max_char=127:         5.26 (  9.13%)	        5.79	
align1=1, align2=1, len=512, max_char=127:         5.26 (  9.54%)	        5.82	
align1=1, align2=0, len=1024, max_char=127:         9.83 ( 11.96%)	       11.16	
align1=0, align2=1, len=1024, max_char=127:         9.82 ( 11.90%)	       11.14	
align1=0, align2=0, len=1024, max_char=127:         9.59 ( 13.40%)	       11.07	
align1=1, align2=1, len=1024, max_char=127:         9.59 ( 13.53%)	       11.09	
align1=1, align2=0, len=2048, max_char=127:        18.13 ( 16.52%)	       21.72	
align1=0, align2=1, len=2048, max_char=127:        17.62 ( 18.65%)	       21.66	
align1=0, align2=0, len=2048, max_char=127:        17.14 ( 20.35%)	       21.51	
align1=1, align2=1, len=2048, max_char=127:        17.11 ( 20.62%)	       21.55	
align1=1, align2=0, len=4096, max_char=127:        38.24 ( 18.93%)	       47.17	
align1=0, align2=1, len=4096, max_char=127:        41.11 ( 12.60%)	       47.03	
align1=0, align2=0, len=4096, max_char=127:        36.76 ( 21.88%)	       47.05	
align1=1, align2=1, len=4096, max_char=127:        36.91 ( 21.75%)	       47.16	
align1=1, align2=0, len=8192, max_char=127:        73.93 ( 17.75%)	       89.88	
align1=0, align2=1, len=8192, max_char=127:        74.03 ( 17.32%)	       89.54	
align1=0, align2=0, len=8192, max_char=127:        71.81 ( 19.98%)	       89.74	
align1=1, align2=1, len=8192, max_char=127:        72.02 ( 19.46%)	       89.42	
align1=1, align2=0, len=16384, max_char=127:       138.44 ( 20.05%)	      173.15	
align1=0, align2=1, len=16384, max_char=127:       137.55 ( 20.56%)	      173.16	
align1=0, align2=0, len=16384, max_char=127:       130.24 ( 24.67%)	      172.89	
align1=1, align2=1, len=16384, max_char=127:       132.60 ( 23.35%)	      172.99	
align1=1, align2=0, len=32768, max_char=127:       257.74 ( 24.55%)	      341.60	
align1=0, align2=1, len=32768, max_char=127:       260.82 ( 23.63%)	      341.53	
align1=0, align2=0, len=32768, max_char=127:       249.26 ( 27.08%)	      341.82	
align1=1, align2=1, len=32768, max_char=127:       249.40 ( 27.04%)	      341.82	

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10
  2024-06-16 11:49 [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10 bmahi496
  2024-06-18 16:04 ` Paul E Murphy
@ 2024-06-20 21:40 ` Paul E Murphy
  2024-06-24 12:10   ` MAHESH BODAPATI
  1 sibling, 1 reply; 5+ messages in thread
From: Paul E Murphy @ 2024-06-20 21:40 UTC (permalink / raw)
  To: bmahi496, libc-alpha; +Cc: bergner



On 6/16/24 6:49 AM, bmahi496@linux.ibm.com wrote:

> +/* Implements the function
> +
> +   char * [r3] strcpy (char *dest [r3], const char *src [r4])
> +
> +   or
> +
> +   char * [r3] stpcpy (char *dest [r3], const char *src [r4])
> +
> +   if USE_AS_STPCPY is defined.
> +
> +   The implementation can load bytes past a NULL terminator, but only
> +   up to the next 16B/64B boundary, so it never crosses a page.  */

I think this comment is confusing.  Maybe it suffices to say that it 
never reads across a page boundary, but may read beyond the NUL terminator.


> +
> +
> +#define LXVP(xtp,dq,ra)	    \
> +	.long(((6)<<(32-6))		\
> +	      | ((((xtp)-32)>>1)<<(32-10)) \
> +	      | ((1)<<(32-11))	     \
> +	      | ((ra)<<(32-16))	    \
> +	      | dq)
> +
> +/* Load 4 quadwords, merge into one VR for speed and check for NULLs
> +   and branch to label if NULL is found.  */
> +#define CHECK_64B(offset,addr,label)	  \
> +	LXVP(v4+32,offset,addr);	    \
> +	LXVP(v6+32,offset+32,addr);	 \

Have you benchmarked using lxv vs lxvp here?  If the performance 
difference is marginal, I think this implementation could be used for P9 
too.


> +	vminub    v14,v4,v5;		\
> +	vminub    v15,v6,v7;		\
> +	vminub    v16,v14,v15;	      \
> +	vcmpequb. v0,v16,v18;	       \
> +	beq     cr6,$+12;		   \
> +	li      r7,offset;		  \
> +	b       L(label);		   \
> +	stxv    32+v5,(offset+0)(r11);      \
> +	stxv    32+v4,(offset+16)(r11);     \
> +	stxv    32+v7,(offset+32)(r11);     \
> +	stxv    32+v6,(offset+48)(r11)

Otherwise, this LGTM with trivial comments addressed.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10
  2024-06-20 21:40 ` Paul E Murphy
@ 2024-06-24 12:10   ` MAHESH BODAPATI
  0 siblings, 0 replies; 5+ messages in thread
From: MAHESH BODAPATI @ 2024-06-24 12:10 UTC (permalink / raw)
  To: Paul E Murphy, libc-alpha; +Cc: bergner


On 21/06/24 3:10 am, Paul E Murphy wrote:
>
>
> On 6/16/24 6:49 AM, bmahi496@linux.ibm.com wrote:
>
>> +/* Implements the function
>> +
>> +   char * [r3] strcpy (char *dest [r3], const char *src [r4])
>> +
>> +   or
>> +
>> +   char * [r3] stpcpy (char *dest [r3], const char *src [r4])
>> +
>> +   if USE_AS_STPCPY is defined.
>> +
>> +   The implementation can load bytes past a NULL terminator, but only
>> +   up to the next 16B/64B boundary, so it never crosses a page.  */
>
> I think this comment is confusing.  Maybe it suffices to say that it 
> never reads across a page boundary, but may read beyond the NUL 
> terminator.
>
>

I will update the comment.


>> +
>> +
>> +#define LXVP(xtp,dq,ra)        \
>> +    .long(((6)<<(32-6))        \
>> +          | ((((xtp)-32)>>1)<<(32-10)) \
>> +          | ((1)<<(32-11))         \
>> +          | ((ra)<<(32-16))        \
>> +          | dq)
>> +
>> +/* Load 4 quadwords, merge into one VR for speed and check for NULLs
>> +   and branch to label if NULL is found.  */
>> +#define CHECK_64B(offset,addr,label)      \
>> +    LXVP(v4+32,offset,addr);        \
>> +    LXVP(v6+32,offset+32,addr);     \
>
> Have you benchmarked using lxv vs lxvp here?  If the performance 
> difference is marginal, I think this implementation could be used for 
> P9 too.
>
>

No, I didn't check. I will do the bench-marking with lxv and update.


>> +    vminub    v14,v4,v5;        \
>> +    vminub    v15,v6,v7;        \
>> +    vminub    v16,v14,v15;          \
>> +    vcmpequb. v0,v16,v18;           \
>> +    beq     cr6,$+12;           \
>> +    li      r7,offset;          \
>> +    b       L(label);           \
>> +    stxv    32+v5,(offset+0)(r11);      \
>> +    stxv    32+v4,(offset+16)(r11);     \
>> +    stxv    32+v7,(offset+32)(r11);     \
>> +    stxv    32+v6,(offset+48)(r11)
>
> Otherwise, this LGTM with trivial comments addressed.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-06-25  3:10 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-06-16 11:49 [PATCH] powerpc64: Add optimized strcpy and stpcpy for POWER10 bmahi496
2024-06-18 16:04 ` Paul E Murphy
2024-06-19  5:47   ` MAHESH BODAPATI
2024-06-20 21:40 ` Paul E Murphy
2024-06-24 12:10   ` MAHESH BODAPATI

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).