aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
diff options
context:
space:
mode:
authorLiubov Dmitrieva <liubov.dmitrieva@gmail.com>2011-07-19 17:11:54 -0400
committerUlrich Drepper <drepper@gmail.com>2011-07-19 17:11:54 -0400
commit99710781cc47002612e609c7dc5f34692b64e9b3 (patch)
treeac3c980ce57d0420fff758faffbd59d111026219 /sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
parent7dc6bd90c569c49807462b0740b18e32fab4d8b7 (diff)
downloadglibc-99710781cc47002612e609c7dc5f34692b64e9b3.tar
glibc-99710781cc47002612e609c7dc5f34692b64e9b3.tar.gz
glibc-99710781cc47002612e609c7dc5f34692b64e9b3.tar.bz2
glibc-99710781cc47002612e609c7dc5f34692b64e9b3.zip
Improve 64 bit strcat functions with SSE2/SSSE3
Diffstat (limited to 'sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S')
-rw-r--r--sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S451
1 files changed, 312 insertions, 139 deletions
diff --git a/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S b/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
index 9a8d1860a0..6de8c47ad4 100644
--- a/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
+++ b/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
@@ -20,10 +20,13 @@
#ifndef NOT_IN_libc
-# include <sysdep.h>
+# ifndef USE_AS_STRCAT
+# include <sysdep.h>
+
+# ifndef STRCPY
+# define STRCPY __strcpy_sse2_unaligned
+# endif
-# ifndef STRCPY
-# define STRCPY __strcpy_sse2_unaligned
# endif
# define JMPTBL(I, B) I - B
@@ -33,16 +36,20 @@
lea (%r11, %rcx), %rcx; \
jmp *%rcx
- .text
+# ifndef USE_AS_STRCAT
+
+.text
ENTRY (STRCPY)
-# ifdef USE_AS_STRNCPY
+# ifdef USE_AS_STRNCPY
mov %rdx, %r8
test %r8, %r8
jz L(ExitZero)
-# endif
+# endif
mov %rsi, %rcx
-# ifndef USE_AS_STPCPY
+# ifndef USE_AS_STPCPY
mov %rdi, %rax /* save result */
+# endif
+
# endif
and $15, %rcx
@@ -59,7 +66,7 @@ ENTRY (STRCPY)
pmovmskb %xmm1, %rdx
shr %cl, %rdx
# ifdef USE_AS_STRNCPY
-# if defined USE_AS_STPCPY
+# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
cmp $16, %r8
# else
cmp $17, %r8
@@ -72,7 +79,7 @@ ENTRY (STRCPY)
pcmpeqb 16(%rsi), %xmm0
pmovmskb %xmm0, %rdx
# ifdef USE_AS_STRNCPY
-# if defined USE_AS_STPCPY
+# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
cmp $32, %r8
# else
cmp $33, %r8
@@ -102,7 +109,7 @@ L(Unalign16Both):
jbe L(CopyFrom1To16BytesCase2OrCase3)
# endif
test %rdx, %rdx
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm2)
# else
jnz L(CopyFrom1To16Bytes)
@@ -118,7 +125,7 @@ L(Unalign16Both):
jbe L(CopyFrom1To16BytesCase2OrCase3)
# endif
test %rdx, %rdx
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm3)
# else
jnz L(CopyFrom1To16Bytes)
@@ -134,7 +141,7 @@ L(Unalign16Both):
jbe L(CopyFrom1To16BytesCase2OrCase3)
# endif
test %rdx, %rdx
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm4)
# else
jnz L(CopyFrom1To16Bytes)
@@ -150,7 +157,7 @@ L(Unalign16Both):
jbe L(CopyFrom1To16BytesCase2OrCase3)
# endif
test %rdx, %rdx
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm1)
# else
jnz L(CopyFrom1To16Bytes)
@@ -166,7 +173,7 @@ L(Unalign16Both):
jbe L(CopyFrom1To16BytesCase2OrCase3)
# endif
test %rdx, %rdx
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm2)
# else
jnz L(CopyFrom1To16Bytes)
@@ -182,7 +189,7 @@ L(Unalign16Both):
jbe L(CopyFrom1To16BytesCase2OrCase3)
# endif
test %rdx, %rdx
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm3)
# else
jnz L(CopyFrom1To16Bytes)
@@ -264,10 +271,10 @@ L(Unaligned64Leave):
movdqu %xmm4, (%rdi)
movdqu %xmm5, 16(%rdi)
movdqu %xmm6, 32(%rdi)
-# if defined USE_AS_STRNCPY
-# ifdef USE_AS_STPCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
+# ifdef USE_AS_STPCPY
lea 48(%rdi, %rdx), %rax
-# endif
+# endif
movdqu %xmm7, 48(%rdi)
add $15, %r8
sub %rdx, %r8
@@ -288,7 +295,7 @@ L(SourceStringAlignmentZero):
pmovmskb %xmm0, %rdx
# ifdef USE_AS_STRNCPY
-# if defined USE_AS_STPCPY
+# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
cmp $16, %r8
# else
cmp $17, %r8
@@ -303,7 +310,7 @@ L(SourceStringAlignmentZero):
pmovmskb %xmm0, %rdx
# ifdef USE_AS_STRNCPY
-# if defined USE_AS_STPCPY
+# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
cmp $32, %r8
# else
cmp $33, %r8
@@ -314,11 +321,11 @@ L(SourceStringAlignmentZero):
jnz L(CopyFrom1To32Bytes1)
jmp L(Unalign16Both)
-/* ------End of main part with loops--------------------- */
+/*------End of main part with loops---------------------*/
/* Case1 */
-# if (!defined USE_AS_STRNCPY)
+# if (!defined USE_AS_STRNCPY) || (defined USE_AS_STRCAT)
.p2align 4
L(CopyFrom1To16Bytes):
add %rcx, %rdi
@@ -328,7 +335,7 @@ L(CopyFrom1To16Bytes):
# endif
.p2align 4
L(CopyFrom1To16BytesTail):
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub %rcx, %r8
# endif
add %rcx, %rsi
@@ -339,7 +346,7 @@ L(CopyFrom1To16BytesTail):
L(CopyFrom1To32Bytes1):
add $16, %rsi
add $16, %rdi
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $16, %r8
# endif
L(CopyFrom1To16BytesTail1):
@@ -348,7 +355,7 @@ L(CopyFrom1To16BytesTail1):
.p2align 4
L(CopyFrom1To32Bytes):
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub %rcx, %r8
# endif
bsf %rdx, %rdx
@@ -360,10 +367,10 @@ L(CopyFrom1To32Bytes):
.p2align 4
L(CopyFrom1To16BytesUnaligned_0):
bsf %rdx, %rdx
-# if defined USE_AS_STRNCPY
-# ifdef USE_AS_STPCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
+# ifdef USE_AS_STPCPY
lea (%rdi, %rdx), %rax
-# endif
+# endif
movdqu %xmm4, (%rdi)
add $63, %r8
sub %rdx, %r8
@@ -377,10 +384,10 @@ L(CopyFrom1To16BytesUnaligned_0):
L(CopyFrom1To16BytesUnaligned_16):
bsf %rcx, %rdx
movdqu %xmm4, (%rdi)
-# if defined USE_AS_STRNCPY
-# ifdef USE_AS_STPCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
+# ifdef USE_AS_STPCPY
lea 16(%rdi, %rdx), %rax
-# endif
+# endif
movdqu %xmm5, 16(%rdi)
add $47, %r8
sub %rdx, %r8
@@ -397,10 +404,10 @@ L(CopyFrom1To16BytesUnaligned_32):
bsf %rdx, %rdx
movdqu %xmm4, (%rdi)
movdqu %xmm5, 16(%rdi)
-# if defined USE_AS_STRNCPY
-# ifdef USE_AS_STPCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
+# ifdef USE_AS_STPCPY
lea 32(%rdi, %rdx), %rax
-# endif
+# endif
movdqu %xmm6, 32(%rdi)
add $31, %r8
sub %rdx, %r8
@@ -413,6 +420,7 @@ L(CopyFrom1To16BytesUnaligned_32):
# endif
# ifdef USE_AS_STRNCPY
+# ifndef USE_AS_STRCAT
.p2align 4
L(CopyFrom1To16BytesUnalignedXmm6):
movdqu %xmm6, (%rdi, %rcx)
@@ -437,6 +445,7 @@ L(CopyFrom1To16BytesUnalignedXmm3):
L(CopyFrom1To16BytesUnalignedXmm1):
movdqu %xmm1, (%rdi, %rcx)
jmp L(CopyFrom1To16BytesXmmExit)
+# endif
.p2align 4
L(CopyFrom1To16BytesExit):
@@ -519,7 +528,7 @@ L(CopyFrom1To16BytesTail1Case2OrCase3):
# endif
-/* ----End labels regarding with copying 1-16 bytes--and 1-32 bytes---- */
+/*------------End labels regarding with copying 1-16 bytes--and 1-32 bytes----*/
.p2align 4
L(Exit1):
@@ -527,7 +536,7 @@ L(Exit1):
# ifdef USE_AS_STPCPY
lea (%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $1, %r8
lea 1(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -541,7 +550,7 @@ L(Exit2):
# ifdef USE_AS_STPCPY
lea 1(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $2, %r8
lea 2(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -556,7 +565,7 @@ L(Exit3):
# ifdef USE_AS_STPCPY
lea 2(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $3, %r8
lea 3(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -570,7 +579,7 @@ L(Exit4):
# ifdef USE_AS_STPCPY
lea 3(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $4, %r8
lea 4(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -585,7 +594,7 @@ L(Exit5):
# ifdef USE_AS_STPCPY
lea 4(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $5, %r8
lea 5(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -601,7 +610,7 @@ L(Exit6):
# ifdef USE_AS_STPCPY
lea 5(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $6, %r8
lea 6(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -617,7 +626,7 @@ L(Exit7):
# ifdef USE_AS_STPCPY
lea 6(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $7, %r8
lea 7(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -631,7 +640,7 @@ L(Exit8):
# ifdef USE_AS_STPCPY
lea 7(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $8, %r8
lea 8(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -646,7 +655,7 @@ L(Exit9):
# ifdef USE_AS_STPCPY
lea 8(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $9, %r8
lea 9(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -662,7 +671,7 @@ L(Exit10):
# ifdef USE_AS_STPCPY
lea 9(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $10, %r8
lea 10(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -678,7 +687,7 @@ L(Exit11):
# ifdef USE_AS_STPCPY
lea 10(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $11, %r8
lea 11(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -694,7 +703,7 @@ L(Exit12):
# ifdef USE_AS_STPCPY
lea 11(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $12, %r8
lea 12(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -710,7 +719,7 @@ L(Exit13):
# ifdef USE_AS_STPCPY
lea 12(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $13, %r8
lea 13(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -726,7 +735,7 @@ L(Exit14):
# ifdef USE_AS_STPCPY
lea 13(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $14, %r8
lea 14(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -742,7 +751,7 @@ L(Exit15):
# ifdef USE_AS_STPCPY
lea 14(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $15, %r8
lea 15(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -756,7 +765,7 @@ L(Exit16):
# ifdef USE_AS_STPCPY
lea 15(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $16, %r8
lea 16(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -771,7 +780,7 @@ L(Exit17):
# ifdef USE_AS_STPCPY
lea 16(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $17, %r8
lea 17(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -787,7 +796,7 @@ L(Exit18):
# ifdef USE_AS_STPCPY
lea 17(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $18, %r8
lea 18(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -803,7 +812,7 @@ L(Exit19):
# ifdef USE_AS_STPCPY
lea 18(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $19, %r8
lea 19(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -819,7 +828,7 @@ L(Exit20):
# ifdef USE_AS_STPCPY
lea 19(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $20, %r8
lea 20(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -836,7 +845,7 @@ L(Exit21):
# ifdef USE_AS_STPCPY
lea 20(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $21, %r8
lea 21(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -852,7 +861,7 @@ L(Exit22):
# ifdef USE_AS_STPCPY
lea 21(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $22, %r8
lea 22(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -868,7 +877,7 @@ L(Exit23):
# ifdef USE_AS_STPCPY
lea 22(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $23, %r8
lea 23(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -884,7 +893,7 @@ L(Exit24):
# ifdef USE_AS_STPCPY
lea 23(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $24, %r8
lea 24(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -901,7 +910,7 @@ L(Exit25):
# ifdef USE_AS_STPCPY
lea 24(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $25, %r8
lea 25(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -919,7 +928,7 @@ L(Exit26):
# ifdef USE_AS_STPCPY
lea 25(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $26, %r8
lea 26(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -937,7 +946,7 @@ L(Exit27):
# ifdef USE_AS_STPCPY
lea 26(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $27, %r8
lea 27(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -955,7 +964,7 @@ L(Exit28):
# ifdef USE_AS_STPCPY
lea 27(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $28, %r8
lea 28(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -971,7 +980,7 @@ L(Exit29):
# ifdef USE_AS_STPCPY
lea 28(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $29, %r8
lea 29(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -987,7 +996,7 @@ L(Exit30):
# ifdef USE_AS_STPCPY
lea 29(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $30, %r8
lea 30(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -1003,7 +1012,7 @@ L(Exit31):
# ifdef USE_AS_STPCPY
lea 30(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $31, %r8
lea 31(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -1019,7 +1028,7 @@ L(Exit32):
# ifdef USE_AS_STPCPY
lea 31(%rdi), %rax
# endif
-# if defined USE_AS_STRNCPY
+# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
sub $32, %r8
lea 32(%rdi), %rdi
jnz L(StrncpyFillTailWithZero)
@@ -1030,27 +1039,39 @@ L(Exit32):
.p2align 4
L(StrncpyExit0):
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
mov %rdi, %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, (%rdi)
+# endif
ret
.p2align 4
L(StrncpyExit1):
mov (%rsi), %dl
mov %dl, (%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 1(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 1(%rdi)
+# endif
ret
.p2align 4
L(StrncpyExit2):
mov (%rsi), %dx
mov %dx, (%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 2(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 2(%rdi)
+# endif
ret
.p2align 4
@@ -1059,18 +1080,26 @@ L(StrncpyExit3):
mov 2(%rsi), %dl
mov %cx, (%rdi)
mov %dl, 2(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 3(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 3(%rdi)
+# endif
ret
.p2align 4
L(StrncpyExit4):
mov (%rsi), %edx
mov %edx, (%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 4(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 4(%rdi)
+# endif
ret
.p2align 4
@@ -1079,9 +1108,13 @@ L(StrncpyExit5):
mov 4(%rsi), %dl
mov %ecx, (%rdi)
mov %dl, 4(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 5(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 5(%rdi)
+# endif
ret
.p2align 4
@@ -1090,9 +1123,13 @@ L(StrncpyExit6):
mov 4(%rsi), %dx
mov %ecx, (%rdi)
mov %dx, 4(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 6(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 6(%rdi)
+# endif
ret
.p2align 4
@@ -1101,18 +1138,26 @@ L(StrncpyExit7):
mov 3(%rsi), %edx
mov %ecx, (%rdi)
mov %edx, 3(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 7(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 7(%rdi)
+# endif
ret
.p2align 4
L(StrncpyExit8):
mov (%rsi), %rdx
mov %rdx, (%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 8(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 8(%rdi)
+# endif
ret
.p2align 4
@@ -1121,9 +1166,13 @@ L(StrncpyExit9):
mov 8(%rsi), %dl
mov %rcx, (%rdi)
mov %dl, 8(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 9(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 9(%rdi)
+# endif
ret
.p2align 4
@@ -1132,9 +1181,13 @@ L(StrncpyExit10):
mov 8(%rsi), %dx
mov %rcx, (%rdi)
mov %dx, 8(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 10(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 10(%rdi)
+# endif
ret
.p2align 4
@@ -1143,9 +1196,13 @@ L(StrncpyExit11):
mov 7(%rsi), %edx
mov %rcx, (%rdi)
mov %edx, 7(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 11(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 11(%rdi)
+# endif
ret
.p2align 4
@@ -1154,9 +1211,13 @@ L(StrncpyExit12):
mov 8(%rsi), %edx
mov %rcx, (%rdi)
mov %edx, 8(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 12(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 12(%rdi)
+# endif
ret
.p2align 4
@@ -1165,9 +1226,13 @@ L(StrncpyExit13):
mov 5(%rsi), %rdx
mov %rcx, (%rdi)
mov %rdx, 5(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 13(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 13(%rdi)
+# endif
ret
.p2align 4
@@ -1176,9 +1241,13 @@ L(StrncpyExit14):
mov 6(%rsi), %rdx
mov %rcx, (%rdi)
mov %rdx, 6(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 14(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 14(%rdi)
+# endif
ret
.p2align 4
@@ -1187,18 +1256,26 @@ L(StrncpyExit15):
mov 7(%rsi), %rdx
mov %rcx, (%rdi)
mov %rdx, 7(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 15(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 15(%rdi)
+# endif
ret
.p2align 4
L(StrncpyExit16):
movdqu (%rsi), %xmm0
movdqu %xmm0, (%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 16(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 16(%rdi)
+# endif
ret
.p2align 4
@@ -1207,9 +1284,13 @@ L(StrncpyExit17):
mov 16(%rsi), %cl
movdqu %xmm0, (%rdi)
mov %cl, 16(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 17(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 17(%rdi)
+# endif
ret
.p2align 4
@@ -1218,9 +1299,13 @@ L(StrncpyExit18):
mov 16(%rsi), %cx
movdqu %xmm0, (%rdi)
mov %cx, 16(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 18(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 18(%rdi)
+# endif
ret
.p2align 4
@@ -1229,9 +1314,13 @@ L(StrncpyExit19):
mov 15(%rsi), %ecx
movdqu %xmm0, (%rdi)
mov %ecx, 15(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 19(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 19(%rdi)
+# endif
ret
.p2align 4
@@ -1240,9 +1329,13 @@ L(StrncpyExit20):
mov 16(%rsi), %ecx
movdqu %xmm0, (%rdi)
mov %ecx, 16(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 20(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 20(%rdi)
+# endif
ret
.p2align 4
@@ -1253,9 +1346,13 @@ L(StrncpyExit21):
movdqu %xmm0, (%rdi)
mov %ecx, 16(%rdi)
mov %dl, 20(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 21(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 21(%rdi)
+# endif
ret
.p2align 4
@@ -1264,9 +1361,13 @@ L(StrncpyExit22):
mov 14(%rsi), %rcx
movdqu %xmm0, (%rdi)
mov %rcx, 14(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 22(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 22(%rdi)
+# endif
ret
.p2align 4
@@ -1275,9 +1376,13 @@ L(StrncpyExit23):
mov 15(%rsi), %rcx
movdqu %xmm0, (%rdi)
mov %rcx, 15(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 23(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 23(%rdi)
+# endif
ret
.p2align 4
@@ -1286,9 +1391,13 @@ L(StrncpyExit24):
mov 16(%rsi), %rcx
movdqu %xmm0, (%rdi)
mov %rcx, 16(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 24(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 24(%rdi)
+# endif
ret
.p2align 4
@@ -1299,9 +1408,13 @@ L(StrncpyExit25):
movdqu %xmm0, (%rdi)
mov %rdx, 16(%rdi)
mov %cl, 24(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 25(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 25(%rdi)
+# endif
ret
.p2align 4
@@ -1312,9 +1425,13 @@ L(StrncpyExit26):
movdqu %xmm0, (%rdi)
mov %rdx, 16(%rdi)
mov %cx, 24(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 26(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 26(%rdi)
+# endif
ret
.p2align 4
@@ -1325,9 +1442,13 @@ L(StrncpyExit27):
movdqu %xmm0, (%rdi)
mov %rdx, 16(%rdi)
mov %ecx, 23(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 27(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 27(%rdi)
+# endif
ret
.p2align 4
@@ -1338,9 +1459,13 @@ L(StrncpyExit28):
movdqu %xmm0, (%rdi)
mov %rdx, 16(%rdi)
mov %ecx, 24(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 28(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 28(%rdi)
+# endif
ret
.p2align 4
@@ -1349,9 +1474,13 @@ L(StrncpyExit29):
movdqu 13(%rsi), %xmm2
movdqu %xmm0, (%rdi)
movdqu %xmm2, 13(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 29(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 29(%rdi)
+# endif
ret
.p2align 4
@@ -1360,9 +1489,13 @@ L(StrncpyExit30):
movdqu 14(%rsi), %xmm2
movdqu %xmm0, (%rdi)
movdqu %xmm2, 14(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 30(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 30(%rdi)
+# endif
ret
.p2align 4
@@ -1371,9 +1504,13 @@ L(StrncpyExit31):
movdqu 15(%rsi), %xmm2
movdqu %xmm0, (%rdi)
movdqu %xmm2, 15(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 31(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 31(%rdi)
+# endif
ret
.p2align 4
@@ -1382,9 +1519,13 @@ L(StrncpyExit32):
movdqu 16(%rsi), %xmm2
movdqu %xmm0, (%rdi)
movdqu %xmm2, 16(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 32(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 32(%rdi)
+# endif
ret
.p2align 4
@@ -1395,8 +1536,14 @@ L(StrncpyExit33):
movdqu %xmm0, (%rdi)
movdqu %xmm2, 16(%rdi)
mov %cl, 32(%rdi)
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 33(%rdi)
+# endif
ret
+# ifndef USE_AS_STRCAT
+
.p2align 4
L(Fill0):
ret
@@ -1498,9 +1645,9 @@ L(CopyFrom1To16BytesXmmExit):
bsf %rdx, %rdx
add $15, %r8
add %rcx, %rdi
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea (%rdi, %rdx), %rax
-# endif
+# endif
sub %rdx, %r8
lea 1(%rdi, %rdx), %rdi
@@ -1553,6 +1700,9 @@ L(StrncpyFillExit):
add $16, %r8
BRANCH_TO_JMPTBL_ENTRY (L(FillTable), %r8, 4)
+/* end of ifndef USE_AS_STRCAT */
+# endif
+
.p2align 4
L(UnalignedLeaveCase2OrCase3):
test %rdx, %rdx
@@ -1572,9 +1722,13 @@ L(Unaligned64LeaveCase3):
sub $16, %r8
jb L(CopyFrom1To16BytesCase3)
movdqu %xmm7, 48(%rdi)
-# ifdef USE_AS_STPCPY
+# ifdef USE_AS_STPCPY
lea 64(%rdi), %rax
-# endif
+# endif
+# ifdef USE_AS_STRCAT
+ xor %ch, %ch
+ movb %ch, 64(%rdi)
+# endif
ret
.p2align 4
@@ -1585,8 +1739,11 @@ L(Unaligned64LeaveCase2):
add $48, %r8
jle L(CopyFrom1To16BytesCase2OrCase3)
test %rdx, %rdx
+# ifndef USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm4)
-
+# else
+ jnz L(CopyFrom1To16Bytes)
+# endif
pcmpeqb %xmm5, %xmm0
pmovmskb %xmm0, %rdx
movdqu %xmm4, (%rdi)
@@ -1594,7 +1751,11 @@ L(Unaligned64LeaveCase2):
sub $16, %r8
jbe L(CopyFrom1To16BytesCase2OrCase3)
test %rdx, %rdx
+# ifndef USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm5)
+# else
+ jnz L(CopyFrom1To16Bytes)
+# endif
pcmpeqb %xmm6, %xmm0
pmovmskb %xmm0, %rdx
@@ -1603,7 +1764,11 @@ L(Unaligned64LeaveCase2):
sub $16, %r8
jbe L(CopyFrom1To16BytesCase2OrCase3)
test %rdx, %rdx
+# ifndef USE_AS_STRCAT
jnz L(CopyFrom1To16BytesUnalignedXmm6)
+# else
+ jnz L(CopyFrom1To16Bytes)
+# endif
pcmpeqb %xmm7, %xmm0
pmovmskb %xmm0, %rdx
@@ -1617,13 +1782,18 @@ L(Unaligned64LeaveCase2):
.p2align 4
L(ExitZero):
+# ifndef USE_AS_STRCAT
mov %rdi, %rax
+# endif
ret
# endif
+# ifndef USE_AS_STRCAT
END (STRCPY)
-
+# else
+END (STRCAT)
+# endif
.p2align 4
.section .rodata
L(ExitTable):
@@ -1695,6 +1865,7 @@ L(ExitStrncpyTable):
.int JMPTBL(L(StrncpyExit31), L(ExitStrncpyTable))
.int JMPTBL(L(StrncpyExit32), L(ExitStrncpyTable))
.int JMPTBL(L(StrncpyExit33), L(ExitStrncpyTable))
+# ifndef USE_AS_STRCAT
.p2align 4
L(FillTable):
.int JMPTBL(L(Fill0), L(FillTable))
@@ -1714,5 +1885,7 @@ L(FillTable):
.int JMPTBL(L(Fill14), L(FillTable))
.int JMPTBL(L(Fill15), L(FillTable))
.int JMPTBL(L(Fill16), L(FillTable))
+# endif
# endif
#endif
+