/* strcpy with SSE2 and unaligned load
- Copyright (C) 2011 Free Software Foundation, Inc.
+ Copyright (C) 2011-2019 Free Software Foundation, Inc.
Contributed by Intel Corporation.
This file is part of the GNU C Library.
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, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
-#ifndef NOT_IN_libc
+#if IS_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
lea TABLE(%rip), %r11; \
movslq (%r11, INDEX, SCALE), %rcx; \
lea (%r11, %rcx), %rcx; \
- jmp *%rcx
+ _CET_NOTRACK jmp *%rcx
- .text
+# ifndef USE_AS_STRCAT
+
+.text
ENTRY (STRCPY)
-# ifdef USE_AS_STRNCPY
- mov %rdx, %r8
- test %r8, %r8
+# ifdef USE_AS_STRNCPY
+ mov %RDX_LP, %R8_LP
+ test %R8_LP, %R8_LP
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
- jz L(SourceStringAlignmentZero)
+ and $63, %rcx
+ cmp $32, %rcx
+ jbe L(SourceStringAlignmentLess32)
and $-16, %rsi
+ and $15, %rcx
pxor %xmm0, %xmm0
pxor %xmm1, %xmm1
pcmpeqb (%rsi), %xmm1
-# ifdef USE_AS_STRNCPY
- add %rcx, %r8
-# endif
pmovmskb %xmm1, %rdx
shr %cl, %rdx
+
# ifdef USE_AS_STRNCPY
-# if defined USE_AS_STPCPY
- cmp $16, %r8
+# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
+ mov $16, %r10
+ sub %rcx, %r10
+ cmp %r10, %r8
# else
- cmp $17, %r8
+ mov $17, %r10
+ sub %rcx, %r10
+ cmp %r10, %r8
# endif
jbe L(CopyFrom1To16BytesTailCase2OrCase3)
# endif
pcmpeqb 16(%rsi), %xmm0
pmovmskb %xmm0, %rdx
+
# ifdef USE_AS_STRNCPY
-# if defined USE_AS_STPCPY
- cmp $32, %r8
-# else
- cmp $33, %r8
-# endif
+ add $16, %r10
+ cmp %r10, %r8
jbe L(CopyFrom1To32BytesCase2OrCase3)
# endif
test %rdx, %rdx
movdqu (%rsi, %rcx), %xmm1 /* copy 16 bytes */
movdqu %xmm1, (%rdi)
- sub %rcx, %rdi
-
-/* If source adress alignment != destination adress alignment */
+/* If source address alignment != destination address alignment */
.p2align 4
L(Unalign16Both):
+ sub %rcx, %rdi
+# ifdef USE_AS_STRNCPY
+ add %rcx, %r8
+ sbb %rcx, %rcx
+ or %rcx, %r8
+# endif
mov $16, %rcx
movdqa (%rsi, %rcx), %xmm1
movaps 16(%rsi, %rcx), %xmm2
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)
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)
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)
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)
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)
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)
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
BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)
# endif
-/* If source adress alignment == destination adress alignment */
+/* If source address alignment == destination address alignment */
-L(SourceStringAlignmentZero):
+L(SourceStringAlignmentLess32):
pxor %xmm0, %xmm0
- movdqa (%rsi), %xmm1
+ movdqu (%rsi), %xmm1
+ movdqu 16(%rsi), %xmm2
pcmpeqb %xmm1, %xmm0
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
test %rdx, %rdx
jnz L(CopyFrom1To16BytesTail1)
- pcmpeqb 16(%rsi), %xmm0
+ pcmpeqb %xmm2, %xmm0
movdqu %xmm1, (%rdi)
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
# endif
test %rdx, %rdx
jnz L(CopyFrom1To32Bytes1)
+
+ and $-16, %rsi
+ and $15, %rcx
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
# endif
.p2align 4
L(CopyFrom1To16BytesTail):
-# if defined USE_AS_STRNCPY
- sub %rcx, %r8
-# endif
add %rcx, %rsi
bsf %rdx, %rdx
BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)
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):
.p2align 4
L(CopyFrom1To32Bytes):
-# if defined USE_AS_STRNCPY
- sub %rcx, %r8
-# endif
bsf %rdx, %rdx
add %rcx, %rsi
add $16, %rdx
.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
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
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
# endif
# ifdef USE_AS_STRNCPY
+# ifndef USE_AS_STRCAT
.p2align 4
L(CopyFrom1To16BytesUnalignedXmm6):
movdqu %xmm6, (%rdi, %rcx)
L(CopyFrom1To16BytesUnalignedXmm1):
movdqu %xmm1, (%rdi, %rcx)
jmp L(CopyFrom1To16BytesXmmExit)
+# endif
.p2align 4
L(CopyFrom1To16BytesExit):
.p2align 4
L(CopyFrom1To32BytesCase2):
- sub %rcx, %r8
add %rcx, %rsi
bsf %rdx, %rdx
add $16, %rdx
BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)
L(CopyFrom1To16BytesTailCase2):
- sub %rcx, %r8
add %rcx, %rsi
bsf %rdx, %rdx
cmp %r8, %rdx
L(CopyFrom1To32BytesCase2OrCase3):
test %rdx, %rdx
jnz L(CopyFrom1To32BytesCase2)
- sub %rcx, %r8
add %rcx, %rsi
BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)
L(CopyFrom1To16BytesTailCase2OrCase3):
test %rdx, %rdx
jnz L(CopyFrom1To16BytesTailCase2)
- sub %rcx, %r8
add %rcx, %rsi
BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)
# 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):
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
# 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)
.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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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)
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
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
.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):
.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))
.int JMPTBL(L(Fill14), L(FillTable))
.int JMPTBL(L(Fill15), L(FillTable))
.int JMPTBL(L(Fill16), L(FillTable))
+# endif
# endif
#endif