about summary refs log tree commit diff
path: root/sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S
diff options
context:
space:
mode:
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
+