[PATCH] PowerPC: stpcpy optimization for PPC64/POWER7

Adhemerval Zanella azanella@linux.vnet.ibm.com
Wed Sep 25 13:28:00 GMT 2013


On 16-09-2013 11:30, Adhemerval Zanella wrote:
> Hi all,
>
> Following Alan Modra suggestion, it is a stpcpy optimization patch for PPC64.
> This patch optimizes the default PPC64 by adding doubleword stores/loads
> increasing aligned throughput for large sizes.
>
> For POWER7 version it also removed unneeded branch prediction and use cmpb
> instructions instead of the bitwise operation to find string's end. This saved
> some cycles for both aligned and unaligned cases.
>
> Tested on PPC64 power4/power7 and I'm attaching the benchtests output for each
> case (default master, default optimized, power7 master, and power7 optimized).
>
>
Based on the previous patch I added an optimization when both source
and destiny pointers have the same alignment. Basically the algorithm
copy byte a byte until the pointers are doubleword aligned and then
uses the doubleword copy. It shows a slight boost for sizes higher than
32 bytes (benchtest output in attachments).

---

2013-09-25  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>

        * sysdeps/powerpc/powerpc64/stpcpy.S (__stpcpy): Add doubleword read
    and write to provide a boost for large inputs. Also fix little endian
    issues.
    * sysdeps/powerpc/powerpc64/power7/stpcpy.S: New file.

--

diff --git a/sysdeps/powerpc/powerpc64/power7/stpcpy.S b/sysdeps/powerpc/powerpc64/power7/stpcpy.S
new file mode 100644
index 0000000..fbd3c33
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/power7/stpcpy.S
@@ -0,0 +1,255 @@
+/* Optimized stpcpy implementation for PowerPC64/POWER7.
+   Copyright (C) 2013 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
+   <http://www.gnu.org/licenses/>.  */
+
+#include <sysdep.h>
+
+/* Implements the function
+
+   char * [r3] stpcpy (char *dest [r3], const char *src [r4])
+
+   with aligned memory accesses when possible using the following algorithm:
+
+   if (((((uintptr_t)dst & 0x7UL) == 0) && ((uintptr_t)src & 0x7UL) == 0))
+     goto aligned_doubleword_copy;
+   if (((((uintptr_t)dst & 0x3UL) == 0) && ((uintptr_t)src & 0x3UL) == 0))
+     goto aligned_word_copy;
+   if (((uintptr_t)dst & 0x7UL) == ((uintptr_t)src & 0x7UL))
+     goto same_alignment;
+   goto unaligned;
+
+   The aligned comparison are made using cmpb instructions.  */
+
+	.machine  power7
+EALIGN (__stpcpy, 4, 0)
+	CALL_MCOUNT 2
+
+#define rTMP	r0
+#define rRTN	r3	/* pointer to previous word/doubleword in dest */
+#define rSRC	r4	/* pointer to previous word/doubleword in src */
+#define rMASK	r5	/* mask 0xffffffff | 0xffffffffffffffff */
+#define rWORD	r6	/* current word from src */
+#define rALT	r7	/* alternate word from src */
+#define rRTNAL	r8	/* alignment of return pointer */
+#define rSRCAL	r9	/* alignment of source pointer */
+#define rALCNT	r10	/* bytes to read to reach 8 bytes alignment */
+#define rSUBAL	r11	/* doubleword minus unaligned displacement */
+
+	or	rTMP, rSRC, rRTN
+	clrldi.	rTMP, rTMP, 61
+	bne	L(check_word_alignment)
+	b	L(aligned_doubleword_copy)
+	
+L(same_alignment):
+/* Src and dst with same alignment: align both to doubleword.  */
+	mr	rALCNT, rRTN
+	lbz	rWORD, 0(rSRC)
+	subfic	rSUBAL, rRTNAL, 8
+	addi	rRTN, rRTN, 1
+	addi	rSRC, rSRC, 1
+	cmpdi	cr7, rWORD, 0
+	stb	rWORD, 0(rALCNT)
+	beq	cr7, L(s2)
+
+	add	rALCNT, rALCNT, rSUBAL
+	subf	rALCNT, rRTN, rALCNT
+	addi	rALCNT, rALCNT, 1
+	mtctr	rALCNT
+	b	L(s1)
+
+	.align 4
+L(s0):
+	addi	rSRC, rSRC, 1
+	lbz	rWORD, -1(rSRC)
+	cmpdi	cr7, rWORD, 0
+	stb	rWORD, -1(rALCNT)
+	beqlr	cr7
+	mr	rRTN, rALCNT
+L(s1):
+	addi	rALCNT, rRTN,1
+	bdnz	L(s0)
+	b L(aligned_doubleword_copy)
+	.align 4
+L(s2):
+	mr	rRTN, rALCNT
+	blr
+
+/* For doubleword aligned memory, operate using doubleword load and stores.  */
+	.align 4
+L(aligned_doubleword_copy):
+	li	rMASK, 0
+	addi	rRTN, rRTN, -8
+	ld	rWORD, 0(rSRC)
+	b	L(g2)
+
+	.align 4
+L(g0):	ldu	rALT, 8(rSRC)
+	stdu	rWORD, 8(rRTN)
+	cmpb	rTMP, rALT, rMASK
+	cmpdi	rTMP, 0
+	bne	L(g1)
+	ldu	rWORD, 8(rSRC)
+	stdu	rALT, 8(rRTN)
+L(g2):	cmpb	rTMP, rWORD, rMASK
+	cmpdi	rTMP, 0		/* If rTMP is 0, no null's have been found.  */
+	beq	L(g0)
+
+	mr	rALT, rWORD
+/* We've hit the end of the string.  Do the rest byte-by-byte.  */
+L(g1):
+#ifdef __LITTLE_ENDIAN__
+	extrdi.	rTMP, rALT, 8, 56
+	stbu	rALT, 8(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 48
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 40
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 32
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 24
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 16
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 8
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi	rTMP, rALT, 8, 0
+	stbu	rTMP, 1(rRTN)
+#else
+	extrdi.	rTMP, rALT, 8, 0
+	stbu	rTMP, 8(rRTN)
+	beqlr
+	extrdi.	rTMP, rALT, 8, 8
+	stbu	rTMP, 1(rRTN)
+	beqlr
+	extrdi.	rTMP, rALT, 8, 16
+	stbu	rTMP, 1(rRTN)
+	beqlr
+	extrdi.	rTMP, rALT, 8, 24
+	stbu	rTMP, 1(rRTN)
+	beqlr
+	extrdi.	rTMP, rALT, 8, 32
+	stbu	rTMP, 1(rRTN)
+	beqlr
+	extrdi.	rTMP, rALT, 8, 40
+	stbu	rTMP, 1(rRTN)
+	beqlr
+	extrdi.	rTMP, rALT, 8, 48
+	stbu	rTMP, 1(rRTN)
+	beqlr
+	stbu	rALT, 1(rRTN)
+#endif
+	blr
+
+L(check_word_alignment):
+	clrldi. rTMP, rTMP, 62
+	beq	L(aligned_word_copy)
+	rldicl	rRTNAL, rRTN, 0, 61
+	rldicl	rSRCAL, rSRC, 0, 61
+	cmpld	cr7, rSRCAL, rRTNAL
+	beq	cr7, L(same_alignment)
+	b	L(unaligned)
+
+/* For word aligned memory, operate using word load and stores.  */
+	.align	4
+L(aligned_word_copy):
+	li	rMASK, 0
+	addi	rRTN, rRTN, -4
+	lwz	rWORD, 0(rSRC)
+	b	L(g5)
+
+	.align	4
+L(g3):	lwzu	rALT, 4(rSRC)
+	stwu	rWORD, 4(rRTN)
+	cmpb	rTMP, rALT, rMASK
+	cmpwi	rTMP, 0
+	bne	L(g4)
+	lwzu	rWORD, 4(rSRC)
+	stwu	rALT, 4(rRTN)
+L(g5):	cmpb	rTMP, rWORD, rMASK
+	cmpwi	rTMP, 0		/* If rTMP is 0, no null in word.  */
+	beq	L(g3)
+
+	mr      rALT, rWORD
+/* We've hit the end of the string.  Do the rest byte-by-byte.  */
+L(g4):
+#ifdef __LITTLE_ENDIAN__
+	rlwinm.	rTMP, rALT, 0, 24, 31
+	stbu	rALT, 4(rRTN)
+	beqlr-
+	rlwinm.	rTMP, rALT, 24, 24, 31
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	rlwinm.	rTMP, rALT, 16, 24, 31
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	rlwinm	rTMP, rALT, 8, 24, 31
+	stbu	rTMP, 1(rRTN)
+#else
+	rlwinm. rTMP, rALT, 8, 24, 31
+	stbu    rTMP, 4(rRTN)
+	beqlr
+	rlwinm. rTMP, rALT, 16, 24, 31
+	stbu    rTMP, 1(rRTN)
+	beqlr
+	rlwinm. rTMP, rALT, 24, 24, 31
+	stbu    rTMP, 1(rRTN)
+	beqlr
+	stbu    rALT, 1(rRTN)
+#endif
+	blr
+
+/* Oh well.  In this case, we just do a byte-by-byte copy.  */
+	.align	4
+L(unaligned):
+	lbz	rWORD, 0(rSRC)
+	addi	rRTN, rRTN, -1
+	cmpdi	rWORD, 0
+	beq	L(u2)
+
+	.align 	5
+L(u0):	lbzu	rALT, 1(rSRC)
+	stbu	rWORD, 1(rRTN)
+	cmpdi	rALT, 0
+	beq	L(u1)
+	lbzu	rWORD, 1(rSRC)
+	stbu	rALT, 1(rRTN)
+	cmpdi	rWORD, 0
+	beq	L(u2)
+	lbzu	rALT, 1(rSRC)
+	stbu	rWORD, 1(rRTN)
+	cmpdi	rALT, 0
+	beq	L(u1)
+	lbzu	rWORD, 1(rSRC)
+	stbu	rALT, 1(rRTN)
+	cmpdi	rWORD, 0
+	bne	L(u0)
+L(u2):	stbu	rWORD, 1(rRTN)
+	blr
+L(u1):	stbu	rALT, 1(rRTN)
+	blr
+END (__stpcpy)
+
+weak_alias (__stpcpy, stpcpy)
+libc_hidden_def (__stpcpy)
+libc_hidden_builtin_def (stpcpy)
diff --git a/sysdeps/powerpc/powerpc64/stpcpy.S b/sysdeps/powerpc/powerpc64/stpcpy.S
index 070cd46..4ea7d5a 100644
--- a/sysdeps/powerpc/powerpc64/stpcpy.S
+++ b/sysdeps/powerpc/powerpc64/stpcpy.S
@@ -26,35 +26,39 @@ EALIGN (__stpcpy, 4, 0)
 	CALL_MCOUNT 2
 
 #define rTMP	r0
-#define rRTN	r3
-#define rDEST	r3		/* pointer to previous word in dest */
-#define rSRC	r4		/* pointer to previous word in src */
-#define rWORD	r6		/* current word from src */
-#define rFEFE	r7		/* 0xfefefeff */
-#define r7F7F	r8		/* 0x7f7f7f7f */
-#define rNEG	r9		/* ~(word in src | 0x7f7f7f7f) */
-#define rALT	r10		/* alternate word from src */
-
-	or	rTMP, rSRC, rDEST
-	clrldi.	rTMP, rTMP, 62
-	addi	rDEST, rDEST, -4
-	bne	L(unaligned)
+#define rRTN	r3	/* pointer to previous word/doubleword in dest */
+#define rSRC	r4	/* pointer to previous word/doubleword in src */
+#define rWORD	r6	/* current word from src */
+#define rFEFE	r7	/* constant 0xfefefeff | 0xfefefefefefefeff */
+#define r7F7F	r8	/* constant 0x7f7f7f7f | 0x7f7f7f7f7f7f7f7f */
+#define rNEG	r9	/* ~(word in s1 | r7F7F) */
+#define rALT	r10	/* alternate word from src */
+
+	or	rTMP, rSRC, rRTN
+	clrldi.	rTMP, rTMP, 61
+	bne	L(check_word_alignment)
+
+/* For doubleword aligned memory, operate using doubleword load and stores.  */
+	addi	rRTN, rRTN, -8
 
 	lis	rFEFE, -0x101
 	lis	r7F7F, 0x7f7f
-	lwz	rWORD, 0(rSRC)
+	ld	rWORD, 0(rSRC)
 	addi	rFEFE, rFEFE, -0x101
 	addi	r7F7F, r7F7F, 0x7f7f
+	sldi	rTMP, rFEFE, 32
+	insrdi	r7F7F, r7F7F, 32, 0
+	add	rFEFE, rFEFE, rTMP
 	b	L(g2)
 
-L(g0):	lwzu	rALT, 4(rSRC)
-	stwu	rWORD, 4(rDEST)
+L(g0):	ldu	rALT, 8(rSRC)
+	stdu	rWORD, 8(rRTN)
 	add	rTMP, rFEFE, rALT
 	nor	rNEG, r7F7F, rALT
 	and.	rTMP, rTMP, rNEG
 	bne-	L(g1)
-	lwzu	rWORD, 4(rSRC)
-	stwu	rALT, 4(rDEST)
+	ldu	rWORD, 8(rSRC)
+	stdu	rALT, 8(rRTN)
 L(g2):	add	rTMP, rFEFE, rWORD
 	nor	rNEG, r7F7F, rWORD
 	and.	rTMP, rTMP, rNEG
@@ -62,16 +66,111 @@ L(g2):	add	rTMP, rFEFE, rWORD
 
 	mr	rALT, rWORD
 /* We've hit the end of the string.  Do the rest byte-by-byte.  */
-L(g1):	rlwinm.	rTMP, rALT, 8, 24, 31
-	stbu	rTMP, 4(rDEST)
+L(g1):
+#ifdef __LITTLE_ENDIAN__
+	extrdi.	rTMP, rALT, 8, 56
+	stbu	rALT, 8(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 48
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 40
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 32
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 24
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 16
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 8
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi	rTMP, rALT, 8, 0
+	stbu	rTMP, 1(rRTN)
+#else
+	extrdi.	rTMP, rALT, 8, 0
+	stbu	rTMP, 8(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 8
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 16
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 24
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 32
+	stbu	rTMP, 1(rRTN)
+	beqlr
+	extrdi.	rTMP, rALT, 8, 40
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	extrdi.	rTMP, rALT, 8, 48
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	stbu	rALT, 1(rRTN)
+#endif
+	blr
+
+L(check_word_alignment):
+	clrldi. rTMP, rTMP, 62
+	bne     L(unaligned)
+
+/* For word aligned memory, operate using word load and stores.  */
+	addi	rRTN, rRTN, -4
+
+	lis	rFEFE, -0x101
+	lis	r7F7F, 0x7f7f
+	lwz	rWORD, 0(rSRC)
+	addi	rFEFE, rFEFE, -0x101
+	addi	r7F7F, r7F7F, 0x7f7f
+	b	L(g5)
+
+L(g3):	lwzu	rALT, 4(rSRC)
+	stwu	rWORD, 4(rRTN)
+	add	rTMP, rFEFE, rALT
+	nor	rNEG, r7F7F, rALT
+	and.	rTMP, rTMP, rNEG
+	bne-	L(g4)
+	lwzu	rWORD, 4(rSRC)
+	stwu	rALT, 4(rRTN)
+L(g5):	add	rTMP, rFEFE, rWORD
+	nor	rNEG, r7F7F, rWORD
+	and.	rTMP, rTMP, rNEG
+	beq+	L(g3)
+
+	mr	rALT, rWORD
+/* We've hit the end of the string.  Do the rest byte-by-byte.  */
+L(g4):
+#ifdef __LITTLE_ENDIAN__
+	rlwinm.	rTMP, rALT, 0, 24, 31
+	stbu	rALT, 4(rRTN)
+	beqlr-
+	rlwinm.	rTMP, rALT, 24, 24, 31
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	rlwinm.	rTMP, rALT, 16, 24, 31
+	stbu	rTMP, 1(rRTN)
+	beqlr-
+	rlwinm	rTMP, rALT, 8, 24, 31
+	stbu	rTMP, 1(rRTN)
+#else
+	rlwinm.	rTMP, rALT, 8, 24, 31
+	stbu	rTMP, 4(rRTN)
 	beqlr-
 	rlwinm.	rTMP, rALT, 16, 24, 31
-	stbu	rTMP, 1(rDEST)
+	stbu	rTMP, 1(rRTN)
 	beqlr-
 	rlwinm.	rTMP, rALT, 24, 24, 31
-	stbu	rTMP, 1(rDEST)
+	stbu	rTMP, 1(rRTN)
 	beqlr-
-	stbu	rALT, 1(rDEST)
+	stbu	rALT, 1(rRTN)
+#endif
 	blr
 
 /* Oh well.  In this case, we just do a byte-by-byte copy.  */
@@ -79,22 +178,22 @@ L(g1):	rlwinm.	rTMP, rALT, 8, 24, 31
 	nop
 L(unaligned):
 	lbz	rWORD, 0(rSRC)
-	addi	rDEST, rDEST, 3
+	addi	rRTN, rRTN, -1
 	cmpwi	rWORD, 0
 	beq-	L(u2)
 
 L(u0):	lbzu	rALT, 1(rSRC)
-	stbu	rWORD, 1(rDEST)
+	stbu	rWORD, 1(rRTN)
 	cmpwi	rALT, 0
 	beq-	L(u1)
 	nop		/* Let 601 load start of loop.  */
 	lbzu	rWORD, 1(rSRC)
-	stbu	rALT, 1(rDEST)
+	stbu	rALT, 1(rRTN)
 	cmpwi	rWORD, 0
 	bne+	L(u0)
-L(u2):	stbu	rWORD, 1(rDEST)
+L(u2):	stbu	rWORD, 1(rRTN)
 	blr
-L(u1):	stbu	rALT, 1(rDEST)
+L(u1):	stbu	rALT, 1(rRTN)
 	blr
 END (__stpcpy)



-------------- next part --------------
                       	stpcpy	simple_stpcpy
Length    0, alignments in bytes  0/ 0:	4.9375	4.25
Length    0, alignments in bytes  0/ 0:	4.59375	3.48438
Length    0, alignments in bytes  0/ 0:	4.64062	3.54688
Length    0, alignments in bytes  0/ 0:	4.45312	3.6875
Length    1, alignments in bytes  0/ 0:	4.98438	4.17188
Length    1, alignments in bytes  0/ 0:	4.79688	3.98438
Length    1, alignments in bytes  0/ 1:	4.3125	4.8125
Length    1, alignments in bytes  1/ 0:	3.82812	4.73438
Length    2, alignments in bytes  0/ 0:	5.09375	4.625
Length    2, alignments in bytes  0/ 0:	5.15625	4.09375
Length    2, alignments in bytes  0/ 2:	6.10938	5.07812
Length    2, alignments in bytes  2/ 0:	4.6875	4.625
Length    3, alignments in bytes  0/ 0:	5.59375	5.76562
Length    3, alignments in bytes  0/ 0:	5.5	5.4375
Length    3, alignments in bytes  0/ 3:	6.29688	6.34375
Length    3, alignments in bytes  3/ 0:	5.01562	5.5
Length    4, alignments in bytes  0/ 0:	5.95312	5.82812
Length    4, alignments in bytes  0/ 0:	5.84375	5.73438
Length    4, alignments in bytes  0/ 4:	4.625	5.78125
Length    4, alignments in bytes  4/ 0:	4.125	5.96875
Length    5, alignments in bytes  0/ 0:	6.10938	6.82812
Length    5, alignments in bytes  0/ 0:	6.03125	6.26562
Length    5, alignments in bytes  0/ 5:	6.59375	6.23438
Length    5, alignments in bytes  5/ 0:	5.60938	6.14062
Length    6, alignments in bytes  0/ 0:	7	8.01562
Length    6, alignments in bytes  0/ 0:	6.85938	7.39062
Length    6, alignments in bytes  0/ 6:	6.21875	7
Length    6, alignments in bytes  6/ 0:	5.65625	7.75
Length    7, alignments in bytes  0/ 0:	7.26562	8.20312
Length    7, alignments in bytes  0/ 0:	6.6875	8.79688
Length    7, alignments in bytes  0/ 7:	6.42188	7.78125
Length    7, alignments in bytes  7/ 0:	5.98438	7.78125
Length    8, alignments in bytes  0/ 0:	4.95312	9.375
Length    8, alignments in bytes  0/ 0:	4.59375	9.09375
Length    8, alignments in bytes  0/ 0:	4.51562	9.14062
Length    8, alignments in bytes  0/ 0:	4.5625	9.0625
Length    9, alignments in bytes  0/ 0:	5	12
Length    9, alignments in bytes  0/ 0:	4.84375	12
Length    9, alignments in bytes  0/ 1:	6.64062	37.6875
Length    9, alignments in bytes  1/ 0:	5.9375	9.70312
Length   10, alignments in bytes  0/ 0:	5.5	12.75
Length   10, alignments in bytes  0/ 0:	5.45312	12.75
Length   10, alignments in bytes  0/ 2:	33.7344	26.5
Length   10, alignments in bytes  2/ 0:	5.76562	12.7188
Length   11, alignments in bytes  0/ 0:	5.01562	16
Length   11, alignments in bytes  0/ 0:	5.03125	16.1406
Length   11, alignments in bytes  0/ 3:	18.7656	20.8281
Length   11, alignments in bytes  3/ 0:	6.375	13.5
Length   12, alignments in bytes  0/ 0:	5.5	14.2969
Length   12, alignments in bytes  0/ 0:	5.3125	14.3281
Length   12, alignments in bytes  0/ 4:	5.15625	16.6094
Length   12, alignments in bytes  4/ 0:	4.85938	14.3281
Length   13, alignments in bytes  0/ 0:	6.04688	15.3594
Length   13, alignments in bytes  0/ 0:	5.8125	15.4375
Length   13, alignments in bytes  0/ 5:	13.8438	15.4688
Length   13, alignments in bytes  5/ 0:	7.5	15.0469
Length   14, alignments in bytes  0/ 0:	7.875	16.1406
Length   14, alignments in bytes  0/ 0:	7.70312	16.1094
Length   14, alignments in bytes  0/ 6:	12.1719	15.875
Length   14, alignments in bytes  6/ 0:	7.60938	15.7812
Length   15, alignments in bytes  0/ 0:	6.73438	17
Length   15, alignments in bytes  0/ 0:	6.59375	16.9688
Length   15, alignments in bytes  0/ 7:	11.7969	16.9062
Length   15, alignments in bytes  7/ 0:	8.40625	16.625
Length   16, alignments in bytes  0/ 0:	7	17.8281
Length   16, alignments in bytes  7/ 2:	8.45312	17.3281
Length   32, alignments in bytes  0/ 0:	5.1875	30.4375
Length   32, alignments in bytes  6/ 4:	14.7344	30.5
Length   64, alignments in bytes  0/ 0:	6.65625	56.1719
Length   64, alignments in bytes  5/ 6:	31.2188	240.5
Length  128, alignments in bytes  0/ 0:	9.5	107.25
Length  128, alignments in bytes  4/ 0:	21.8125	104.078
Length  256, alignments in bytes  0/ 0:	21.0312	209.75
Length  256, alignments in bytes  3/ 2:	105.5	215.75
Length  512, alignments in bytes  0/ 0:	35.8125	415.484
Length  512, alignments in bytes  2/ 4:	2072.45	1016.06
Length 1024, alignments in bytes  0/ 0:	65.6406	866.859
Length 1024, alignments in bytes  1/ 6:	1036.38	880.859
Length   16, alignments in bytes  1/ 2:	8	62.5
Length   16, alignments in bytes  2/ 1:	7.625	17.3594
Length   16, alignments in bytes  1/ 1:	10	19.5156
Length   16, alignments in bytes  1/ 1:	9.73438	19.7031
Length   32, alignments in bytes  2/ 4:	123.438	64.6562
Length   32, alignments in bytes  4/ 2:	13.7031	30.4688
Length   32, alignments in bytes  2/ 2:	9.89062	30.4062
Length   32, alignments in bytes  2/ 2:	9.375	30.3906
Length   64, alignments in bytes  3/ 6:	127.156	101.219
Length   64, alignments in bytes  6/ 3:	31	54.75
Length   64, alignments in bytes  3/ 3:	10.875	56.9375
Length   64, alignments in bytes  3/ 3:	10.5781	56.7969
Length  128, alignments in bytes  4/ 0:	21.6406	104.031
Length  128, alignments in bytes  0/ 4:	21.4375	141.203
Length  128, alignments in bytes  4/ 4:	21.4531	108.172
Length  128, alignments in bytes  4/ 4:	21.5312	108.078
Length  256, alignments in bytes  5/ 2:	105.75	212.281
Length  256, alignments in bytes  2/ 5:	500.328	369.703
Length  256, alignments in bytes  5/ 5:	24.9375	210.5
Length  256, alignments in bytes  5/ 5:	24.25	210.5
Length  512, alignments in bytes  6/ 4:	204.812	411.75
Length  512, alignments in bytes  4/ 6:	2089.36	1019.56
Length  512, alignments in bytes  6/ 6:	39	415.656
Length  512, alignments in bytes  6/ 6:	38.9688	415.328
Length 1024, alignments in bytes  7/ 6:	402.953	824.641
Length 1024, alignments in bytes  6/ 7:	402.969	3636.14
Length 1024, alignments in bytes  7/ 7:	68.1562	824.906
Length 1024, alignments in bytes  7/ 7:	67.75	824.875


More information about the Libc-alpha mailing list