Blame sysdeps/x86_64/multiarch/strcpy-avx2.S

Packit Service 2d0c0b
/* strcpy with AVX2
Packit Service 2d0c0b
   Copyright (C) 2011-2018 Free Software Foundation, Inc.
Packit Service 2d0c0b
   Contributed by Intel Corporation.
Packit Service 2d0c0b
   This file is part of the GNU C Library.
Packit Service 2d0c0b
Packit Service 2d0c0b
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 2d0c0b
   modify it under the terms of the GNU Lesser General Public
Packit Service 2d0c0b
   License as published by the Free Software Foundation; either
Packit Service 2d0c0b
   version 2.1 of the License, or (at your option) any later version.
Packit Service 2d0c0b
Packit Service 2d0c0b
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 2d0c0b
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 2d0c0b
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 2d0c0b
   Lesser General Public License for more details.
Packit Service 2d0c0b
Packit Service 2d0c0b
   You should have received a copy of the GNU Lesser General Public
Packit Service 2d0c0b
   License along with the GNU C Library; if not, see
Packit Service 2d0c0b
   <http://www.gnu.org/licenses/>.  */
Packit Service 2d0c0b
Packit Service 2d0c0b
#if IS_IN (libc)
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifndef USE_AS_STRCAT
Packit Service 2d0c0b
#  include <sysdep.h>
Packit Service 2d0c0b
Packit Service 2d0c0b
#  ifndef STRCPY
Packit Service 2d0c0b
#   define STRCPY  __strcpy_avx2
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
/* Number of bytes in a vector register */
Packit Service 2d0c0b
# ifndef VEC_SIZE
Packit Service 2d0c0b
#  define VEC_SIZE	32
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifndef VZEROUPPER
Packit Service 2d0c0b
#  define VZEROUPPER	vzeroupper
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
/* zero register */
Packit Service 2d0c0b
#define xmmZ	xmm0
Packit Service 2d0c0b
#define ymmZ	ymm0
Packit Service 2d0c0b
Packit Service 2d0c0b
/* mask register */
Packit Service 2d0c0b
#define ymmM	ymm1
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifndef USE_AS_STRCAT
Packit Service 2d0c0b
Packit Service 2d0c0b
	.section .text.avx,"ax",@progbits
Packit Service 2d0c0b
ENTRY (STRCPY)
Packit Service 2d0c0b
#  ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	mov	%rdx, %r8
Packit Service 2d0c0b
	test	%r8, %r8
Packit Service 2d0c0b
	jz	L(ExitZero)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	mov	%rsi, %rcx
Packit Service 2d0c0b
#  ifndef USE_AS_STPCPY
Packit Service 2d0c0b
	mov	%rdi, %rax      /* save result */
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpxor	%xmmZ, %xmmZ, %xmmZ
Packit Service 2d0c0b
Packit Service 2d0c0b
	and	$((VEC_SIZE * 4) - 1), %ecx
Packit Service 2d0c0b
	cmp	$(VEC_SIZE * 2), %ecx
Packit Service 2d0c0b
	jbe	L(SourceStringAlignmentLessTwoVecSize)
Packit Service 2d0c0b
Packit Service 2d0c0b
	and	$-VEC_SIZE, %rsi
Packit Service 2d0c0b
	and	$(VEC_SIZE - 1), %ecx
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpcmpeqb (%rsi), %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	shr	%cl, %rdx
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
#  if defined USE_AS_STPCPY || defined USE_AS_STRCAT
Packit Service 2d0c0b
	mov	$VEC_SIZE, %r10
Packit Service 2d0c0b
	sub	%rcx, %r10
Packit Service 2d0c0b
	cmp	%r10, %r8
Packit Service 2d0c0b
#  else
Packit Service 2d0c0b
	mov	$(VEC_SIZE + 1), %r10
Packit Service 2d0c0b
	sub	%rcx, %r10
Packit Service 2d0c0b
	cmp	%r10, %r8
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	jbe	L(CopyVecSizeTailCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeTail)
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpcmpeqb VEC_SIZE(%rsi), %ymmZ, %ymm2
Packit Service 2d0c0b
	vpmovmskb %ymm2, %edx
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	add	$VEC_SIZE, %r10
Packit Service 2d0c0b
	cmp	%r10, %r8
Packit Service 2d0c0b
	jbe	L(CopyTwoVecSizeCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jnz	L(CopyTwoVecSize)
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu (%rsi, %rcx), %ymm2   /* copy VEC_SIZE bytes */
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi)
Packit Service 2d0c0b
Packit Service 2d0c0b
/* If source address alignment != destination address alignment */
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(UnalignVecSizeBoth):
Packit Service 2d0c0b
	sub	%rcx, %rdi
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	add	%rcx, %r8
Packit Service 2d0c0b
	sbb	%rcx, %rcx
Packit Service 2d0c0b
	or	%rcx, %r8
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	mov	$VEC_SIZE, %rcx
Packit Service 2d0c0b
	vmovdqa (%rsi, %rcx), %ymm2
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi, %rcx)
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi, %rcx), %ymm2
Packit Service 2d0c0b
	vpcmpeqb %ymm2, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$(VEC_SIZE * 3), %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec2)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi, %rcx)
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi, %rcx), %ymm3
Packit Service 2d0c0b
	vpcmpeqb %ymm3, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec3)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu %ymm3, (%rdi, %rcx)
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi, %rcx), %ymm4
Packit Service 2d0c0b
	vpcmpeqb %ymm4, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec4)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi, %rcx)
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi, %rcx), %ymm2
Packit Service 2d0c0b
	vpcmpeqb %ymm2, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec2)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi, %rcx)
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi, %rcx), %ymm2
Packit Service 2d0c0b
	vpcmpeqb %ymm2, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec2)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi, %rcx), %ymm3
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi, %rcx)
Packit Service 2d0c0b
	vpcmpeqb %ymm3, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec3)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu %ymm3, (%rdi, %rcx)
Packit Service 2d0c0b
	mov	%rsi, %rdx
Packit Service 2d0c0b
	lea	VEC_SIZE(%rsi, %rcx), %rsi
Packit Service 2d0c0b
	and	$-(VEC_SIZE * 4), %rsi
Packit Service 2d0c0b
	sub	%rsi, %rdx
Packit Service 2d0c0b
	sub	%rdx, %rdi
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	lea	(VEC_SIZE * 8)(%r8, %rdx), %r8
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
L(UnalignedFourVecSizeLoop):
Packit Service 2d0c0b
	vmovdqa (%rsi), %ymm4
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi), %ymm5
Packit Service 2d0c0b
	vmovdqa (VEC_SIZE * 2)(%rsi), %ymm6
Packit Service 2d0c0b
	vmovdqa (VEC_SIZE * 3)(%rsi), %ymm7
Packit Service 2d0c0b
	vpminub %ymm5, %ymm4, %ymm2
Packit Service 2d0c0b
	vpminub %ymm7, %ymm6, %ymm3
Packit Service 2d0c0b
	vpminub %ymm2, %ymm3, %ymm3
Packit Service 2d0c0b
	vpcmpeqb %ymmM, %ymm3, %ymm3
Packit Service 2d0c0b
	vpmovmskb %ymm3, %edx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$(VEC_SIZE * 4), %r8
Packit Service 2d0c0b
	jbe	L(UnalignedLeaveCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jnz	L(UnalignedFourVecSizeLeave)
Packit Service 2d0c0b
Packit Service 2d0c0b
L(UnalignedFourVecSizeLoop_start):
Packit Service 2d0c0b
	add	$(VEC_SIZE * 4), %rdi
Packit Service 2d0c0b
	add	$(VEC_SIZE * 4), %rsi
Packit Service 2d0c0b
	vmovdqu %ymm4, -(VEC_SIZE * 4)(%rdi)
Packit Service 2d0c0b
	vmovdqa (%rsi), %ymm4
Packit Service 2d0c0b
	vmovdqu %ymm5, -(VEC_SIZE * 3)(%rdi)
Packit Service 2d0c0b
	vmovdqa VEC_SIZE(%rsi), %ymm5
Packit Service 2d0c0b
	vpminub %ymm5, %ymm4, %ymm2
Packit Service 2d0c0b
	vmovdqu %ymm6, -(VEC_SIZE * 2)(%rdi)
Packit Service 2d0c0b
	vmovdqa (VEC_SIZE * 2)(%rsi), %ymm6
Packit Service 2d0c0b
	vmovdqu %ymm7, -VEC_SIZE(%rdi)
Packit Service 2d0c0b
	vmovdqa (VEC_SIZE * 3)(%rsi), %ymm7
Packit Service 2d0c0b
	vpminub %ymm7, %ymm6, %ymm3
Packit Service 2d0c0b
	vpminub %ymm2, %ymm3, %ymm3
Packit Service 2d0c0b
	vpcmpeqb %ymmM, %ymm3, %ymm3
Packit Service 2d0c0b
	vpmovmskb %ymm3, %edx
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
	sub	$(VEC_SIZE * 4), %r8
Packit Service 2d0c0b
	jbe	L(UnalignedLeaveCase2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jz	L(UnalignedFourVecSizeLoop_start)
Packit Service 2d0c0b
Packit Service 2d0c0b
L(UnalignedFourVecSizeLeave):
Packit Service 2d0c0b
	vpcmpeqb %ymm4, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnaligned_0)
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpcmpeqb %ymm5, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %ecx
Packit Service 2d0c0b
	test	%ecx, %ecx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnaligned_16)
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpcmpeqb %ymm6, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnaligned_32)
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpcmpeqb %ymm7, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %ecx
Packit Service 2d0c0b
	bsf	%ecx, %edx
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi)
Packit Service 2d0c0b
	vmovdqu %ymm5, VEC_SIZE(%rdi)
Packit Service 2d0c0b
	vmovdqu %ymm6, (VEC_SIZE * 2)(%rdi)
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(VEC_SIZE * 3)(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	vmovdqu %ymm7, (VEC_SIZE * 3)(%rdi)
Packit Service 2d0c0b
	add	$(VEC_SIZE - 1), %r8
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	lea	((VEC_SIZE * 3) + 1)(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jmp	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	add	$(VEC_SIZE * 3), %rsi
Packit Service 2d0c0b
	add	$(VEC_SIZE * 3), %rdi
Packit Service 2d0c0b
	jmp	L(CopyVecSizeExit)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
/* If source address alignment == destination address alignment */
Packit Service 2d0c0b
Packit Service 2d0c0b
L(SourceStringAlignmentLessTwoVecSize):
Packit Service 2d0c0b
	vmovdqu (%rsi), %ymm3
Packit Service 2d0c0b
	vmovdqu VEC_SIZE(%rsi), %ymm2
Packit Service 2d0c0b
	vpcmpeqb %ymm3, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
#  if defined USE_AS_STPCPY || defined USE_AS_STRCAT
Packit Service 2d0c0b
	cmp	$VEC_SIZE, %r8
Packit Service 2d0c0b
#  else
Packit Service 2d0c0b
	cmp	$(VEC_SIZE + 1), %r8
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	jbe	L(CopyVecSizeTail1Case2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeTail1)
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu %ymm3, (%rdi)
Packit Service 2d0c0b
	vpcmpeqb %ymm2, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
#  if defined USE_AS_STPCPY || defined USE_AS_STRCAT
Packit Service 2d0c0b
	cmp	$(VEC_SIZE * 2), %r8
Packit Service 2d0c0b
#  else
Packit Service 2d0c0b
	cmp	$((VEC_SIZE * 2) + 1), %r8
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	jbe	L(CopyTwoVecSize1Case2OrCase3)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
	jnz	L(CopyTwoVecSize1)
Packit Service 2d0c0b
Packit Service 2d0c0b
	and	$-VEC_SIZE, %rsi
Packit Service 2d0c0b
	and	$(VEC_SIZE - 1), %ecx
Packit Service 2d0c0b
	jmp	L(UnalignVecSizeBoth)
Packit Service 2d0c0b
Packit Service 2d0c0b
/*------End of main part with loops---------------------*/
Packit Service 2d0c0b
Packit Service 2d0c0b
/* Case1 */
Packit Service 2d0c0b
Packit Service 2d0c0b
# if (!defined USE_AS_STRNCPY) || (defined USE_AS_STRCAT)
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSize):
Packit Service 2d0c0b
	add	%rcx, %rdi
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
L(CopyVecSizeTail):
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
L(CopyVecSizeTail1):
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
L(CopyVecSizeExit):
Packit Service 2d0c0b
	cmp	$32, %edx
Packit Service 2d0c0b
	jae	L(Exit32_63)
Packit Service 2d0c0b
	cmp	$16, %edx
Packit Service 2d0c0b
	jae	L(Exit16_31)
Packit Service 2d0c0b
	cmp	$8, %edx
Packit Service 2d0c0b
	jae	L(Exit8_15)
Packit Service 2d0c0b
	cmp	$4, %edx
Packit Service 2d0c0b
	jae	L(Exit4_7)
Packit Service 2d0c0b
	cmp	$3, %edx
Packit Service 2d0c0b
	je	L(Exit3)
Packit Service 2d0c0b
	cmp	$1, %edx
Packit Service 2d0c0b
	ja	L(Exit2)
Packit Service 2d0c0b
	je	L(Exit1)
Packit Service 2d0c0b
	movb	$0, (%rdi)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	$1, %r8
Packit Service 2d0c0b
	lea	1(%rdi), %rdi
Packit Service 2d0c0b
	jnz	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyTwoVecSize1):
Packit Service 2d0c0b
	add	$VEC_SIZE, %rsi
Packit Service 2d0c0b
	add	$VEC_SIZE, %rdi
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	jmp	L(CopyVecSizeTail1)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyTwoVecSize):
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
	add	$VEC_SIZE, %edx
Packit Service 2d0c0b
	sub	%ecx, %edx
Packit Service 2d0c0b
	jmp	L(CopyVecSizeExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnaligned_0):
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi)
Packit Service 2d0c0b
	add	$((VEC_SIZE * 4) - 1), %r8
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	lea	1(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jmp	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	jmp	L(CopyVecSizeExit)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnaligned_16):
Packit Service 2d0c0b
	bsf	%ecx, %edx
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi)
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	VEC_SIZE(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	vmovdqu %ymm5, VEC_SIZE(%rdi)
Packit Service 2d0c0b
	add	$((VEC_SIZE * 3) - 1), %r8
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	lea	(VEC_SIZE + 1)(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jmp	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	add	$VEC_SIZE, %rsi
Packit Service 2d0c0b
	add	$VEC_SIZE, %rdi
Packit Service 2d0c0b
	jmp	L(CopyVecSizeExit)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnaligned_32):
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi)
Packit Service 2d0c0b
	vmovdqu %ymm5, VEC_SIZE(%rdi)
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(VEC_SIZE * 2)(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	vmovdqu %ymm6, (VEC_SIZE * 2)(%rdi)
Packit Service 2d0c0b
	add	$((VEC_SIZE * 2) - 1), %r8
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	lea	((VEC_SIZE * 2) + 1)(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jmp	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
	add	$(VEC_SIZE * 2), %rsi
Packit Service 2d0c0b
	add	$(VEC_SIZE * 2), %rdi
Packit Service 2d0c0b
	jmp	L(CopyVecSizeExit)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
#  ifndef USE_AS_STRCAT
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnalignedVec6):
Packit Service 2d0c0b
	vmovdqu %ymm6, (%rdi, %rcx)
Packit Service 2d0c0b
	jmp	L(CopyVecSizeVecExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnalignedVec5):
Packit Service 2d0c0b
	vmovdqu %ymm5, (%rdi, %rcx)
Packit Service 2d0c0b
	jmp	L(CopyVecSizeVecExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnalignedVec4):
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi, %rcx)
Packit Service 2d0c0b
	jmp	L(CopyVecSizeVecExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnalignedVec3):
Packit Service 2d0c0b
	vmovdqu %ymm3, (%rdi, %rcx)
Packit Service 2d0c0b
	jmp	L(CopyVecSizeVecExit)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
Packit Service 2d0c0b
/* Case2 */
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeCase2):
Packit Service 2d0c0b
	add	$VEC_SIZE, %r8
Packit Service 2d0c0b
	add	%rcx, %rdi
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	cmp	%r8d, %edx
Packit Service 2d0c0b
	jb	L(CopyVecSizeExit)
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyTwoVecSizeCase2):
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	add	$VEC_SIZE, %edx
Packit Service 2d0c0b
	sub	%ecx, %edx
Packit Service 2d0c0b
	cmp	%r8d, %edx
Packit Service 2d0c0b
	jb	L(CopyVecSizeExit)
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
L(CopyVecSizeTailCase2):
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	cmp	%r8d, %edx
Packit Service 2d0c0b
	jb	L(CopyVecSizeExit)
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
L(CopyVecSizeTail1Case2):
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	cmp	%r8d, %edx
Packit Service 2d0c0b
	jb	L(CopyVecSizeExit)
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
/* Case2 or Case3,  Case3 */
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeCase2OrCase3):
Packit Service 2d0c0b
	test	%rdx, %rdx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeCase2)
Packit Service 2d0c0b
L(CopyVecSizeCase3):
Packit Service 2d0c0b
	add	$VEC_SIZE, %r8
Packit Service 2d0c0b
	add	%rcx, %rdi
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyTwoVecSizeCase2OrCase3):
Packit Service 2d0c0b
	test	%rdx, %rdx
Packit Service 2d0c0b
	jnz	L(CopyTwoVecSizeCase2)
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeTailCase2OrCase3):
Packit Service 2d0c0b
	test	%rdx, %rdx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeTailCase2)
Packit Service 2d0c0b
	add	%rcx, %rsi
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyTwoVecSize1Case2OrCase3):
Packit Service 2d0c0b
	add	$VEC_SIZE, %rdi
Packit Service 2d0c0b
	add	$VEC_SIZE, %rsi
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
L(CopyVecSizeTail1Case2OrCase3):
Packit Service 2d0c0b
	test	%rdx, %rdx
Packit Service 2d0c0b
	jnz	L(CopyVecSizeTail1Case2)
Packit Service 2d0c0b
	jmp	L(StrncpyExit)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
/*------------End labels regarding with copying 1-VEC_SIZE bytes--and 1-(VEC_SIZE*2) bytes----*/
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Exit1):
Packit Service 2d0c0b
	movzwl	(%rsi), %edx
Packit Service 2d0c0b
	mov	%dx, (%rdi)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	1(%rdi), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	$2, %r8
Packit Service 2d0c0b
	lea	2(%rdi), %rdi
Packit Service 2d0c0b
	jnz	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Exit2):
Packit Service 2d0c0b
	movzwl	(%rsi), %ecx
Packit Service 2d0c0b
	mov	%cx, (%rdi)
Packit Service 2d0c0b
	movb	$0, 2(%rdi)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	2(%rdi), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	$3, %r8
Packit Service 2d0c0b
	lea	3(%rdi), %rdi
Packit Service 2d0c0b
	jnz	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Exit3):
Packit Service 2d0c0b
	mov	(%rsi), %edx
Packit Service 2d0c0b
	mov	%edx, (%rdi)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	3(%rdi), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	$4, %r8
Packit Service 2d0c0b
	lea	4(%rdi), %rdi
Packit Service 2d0c0b
	jnz	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Exit4_7):
Packit Service 2d0c0b
	mov	(%rsi), %ecx
Packit Service 2d0c0b
	mov	%ecx, (%rdi)
Packit Service 2d0c0b
	mov	-3(%rsi, %rdx), %ecx
Packit Service 2d0c0b
	mov	%ecx, -3(%rdi, %rdx)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	sub	$1, %r8
Packit Service 2d0c0b
	lea	1(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jnz	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Exit8_15):
Packit Service 2d0c0b
	mov	(%rsi), %rcx
Packit Service 2d0c0b
	mov	-7(%rsi, %rdx), %r9
Packit Service 2d0c0b
	mov	%rcx, (%rdi)
Packit Service 2d0c0b
	mov	%r9, -7(%rdi, %rdx)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	sub	$1, %r8
Packit Service 2d0c0b
	lea	1(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jnz	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Exit16_31):
Packit Service 2d0c0b
	vmovdqu (%rsi), %xmm2
Packit Service 2d0c0b
	vmovdqu -15(%rsi, %rdx), %xmm3
Packit Service 2d0c0b
	vmovdqu %xmm2, (%rdi)
Packit Service 2d0c0b
	vmovdqu %xmm3, -15(%rdi, %rdx)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub %rdx, %r8
Packit Service 2d0c0b
	sub $1, %r8
Packit Service 2d0c0b
	lea 1(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jnz L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Exit32_63):
Packit Service 2d0c0b
	vmovdqu (%rsi), %ymm2
Packit Service 2d0c0b
	vmovdqu -31(%rsi, %rdx), %ymm3
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi)
Packit Service 2d0c0b
	vmovdqu %ymm3, -31(%rdi, %rdx)
Packit Service 2d0c0b
# ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %rdx), %rax
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
# if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	sub	$1, %r8
Packit Service 2d0c0b
	lea	1(%rdi, %rdx), %rdi
Packit Service 2d0c0b
	jnz	L(StrncpyFillTailWithZero)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifdef USE_AS_STRNCPY
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit1):
Packit Service 2d0c0b
	movzbl	(%rsi), %edx
Packit Service 2d0c0b
	mov	%dl, (%rdi)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	1(%rdi), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, 1(%rdi)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit2):
Packit Service 2d0c0b
	movzwl	(%rsi), %edx
Packit Service 2d0c0b
	mov	%dx, (%rdi)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	2(%rdi), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, 2(%rdi)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit3_4):
Packit Service 2d0c0b
	movzwl	(%rsi), %ecx
Packit Service 2d0c0b
	movzwl	-2(%rsi, %r8), %edx
Packit Service 2d0c0b
	mov	%cx, (%rdi)
Packit Service 2d0c0b
	mov	%dx, -2(%rdi, %r8)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %r8), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, (%rdi, %r8)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit5_8):
Packit Service 2d0c0b
	mov	(%rsi), %ecx
Packit Service 2d0c0b
	mov	-4(%rsi, %r8), %edx
Packit Service 2d0c0b
	mov	%ecx, (%rdi)
Packit Service 2d0c0b
	mov	%edx, -4(%rdi, %r8)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %r8), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, (%rdi, %r8)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit9_16):
Packit Service 2d0c0b
	mov	(%rsi), %rcx
Packit Service 2d0c0b
	mov	-8(%rsi, %r8), %rdx
Packit Service 2d0c0b
	mov	%rcx, (%rdi)
Packit Service 2d0c0b
	mov	%rdx, -8(%rdi, %r8)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %r8), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, (%rdi, %r8)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit17_32):
Packit Service 2d0c0b
	vmovdqu (%rsi), %xmm2
Packit Service 2d0c0b
	vmovdqu -16(%rsi, %r8), %xmm3
Packit Service 2d0c0b
	vmovdqu %xmm2, (%rdi)
Packit Service 2d0c0b
	vmovdqu %xmm3, -16(%rdi, %r8)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %r8), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, (%rdi, %r8)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit33_64):
Packit Service 2d0c0b
	/*  0/32, 31/16 */
Packit Service 2d0c0b
	vmovdqu (%rsi), %ymm2
Packit Service 2d0c0b
	vmovdqu -VEC_SIZE(%rsi, %r8), %ymm3
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi)
Packit Service 2d0c0b
	vmovdqu %ymm3, -VEC_SIZE(%rdi, %r8)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %r8), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, (%rdi, %r8)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyExit65):
Packit Service 2d0c0b
	/* 0/32, 32/32, 64/1 */
Packit Service 2d0c0b
	vmovdqu (%rsi), %ymm2
Packit Service 2d0c0b
	vmovdqu 32(%rsi), %ymm3
Packit Service 2d0c0b
	mov	64(%rsi), %cl
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi)
Packit Service 2d0c0b
	vmovdqu %ymm3, 32(%rdi)
Packit Service 2d0c0b
	mov	%cl, 64(%rdi)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	65(%rdi), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, 65(%rdi)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
#  ifndef USE_AS_STRCAT
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Fill1):
Packit Service 2d0c0b
	mov	%dl, (%rdi)
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Fill2):
Packit Service 2d0c0b
	mov	%dx, (%rdi)
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Fill3_4):
Packit Service 2d0c0b
	mov	%dx, (%rdi)
Packit Service 2d0c0b
	mov     %dx, -2(%rdi, %r8)
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Fill5_8):
Packit Service 2d0c0b
	mov	%edx, (%rdi)
Packit Service 2d0c0b
	mov     %edx, -4(%rdi, %r8)
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Fill9_16):
Packit Service 2d0c0b
	mov	%rdx, (%rdi)
Packit Service 2d0c0b
	mov	%rdx, -8(%rdi, %r8)
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(Fill17_32):
Packit Service 2d0c0b
	vmovdqu %xmmZ, (%rdi)
Packit Service 2d0c0b
	vmovdqu %xmmZ, -16(%rdi, %r8)
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeUnalignedVec2):
Packit Service 2d0c0b
	vmovdqu %ymm2, (%rdi, %rcx)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(CopyVecSizeVecExit):
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	add	$(VEC_SIZE - 1), %r8
Packit Service 2d0c0b
	add	%rcx, %rdi
Packit Service 2d0c0b
#   ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(%rdi, %rdx), %rax
Packit Service 2d0c0b
#   endif
Packit Service 2d0c0b
	sub	%rdx, %r8
Packit Service 2d0c0b
	lea	1(%rdi, %rdx), %rdi
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyFillTailWithZero):
Packit Service 2d0c0b
	xor	%edx, %edx
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(StrncpyFillExit)
Packit Service 2d0c0b
Packit Service 2d0c0b
	vmovdqu %ymmZ, (%rdi)
Packit Service 2d0c0b
	add	$VEC_SIZE, %rdi
Packit Service 2d0c0b
Packit Service 2d0c0b
	mov	%rdi, %rsi
Packit Service 2d0c0b
	and	$(VEC_SIZE - 1), %esi
Packit Service 2d0c0b
	sub	%rsi, %rdi
Packit Service 2d0c0b
	add	%rsi, %r8
Packit Service 2d0c0b
	sub	$(VEC_SIZE * 4), %r8
Packit Service 2d0c0b
	jb	L(StrncpyFillLessFourVecSize)
Packit Service 2d0c0b
Packit Service 2d0c0b
L(StrncpyFillLoopVmovdqa):
Packit Service 2d0c0b
	vmovdqa %ymmZ, (%rdi)
Packit Service 2d0c0b
	vmovdqa %ymmZ, VEC_SIZE(%rdi)
Packit Service 2d0c0b
	vmovdqa %ymmZ, (VEC_SIZE * 2)(%rdi)
Packit Service 2d0c0b
	vmovdqa %ymmZ, (VEC_SIZE * 3)(%rdi)
Packit Service 2d0c0b
	add	$(VEC_SIZE * 4), %rdi
Packit Service 2d0c0b
	sub	$(VEC_SIZE * 4), %r8
Packit Service 2d0c0b
	jae	L(StrncpyFillLoopVmovdqa)
Packit Service 2d0c0b
Packit Service 2d0c0b
L(StrncpyFillLessFourVecSize):
Packit Service 2d0c0b
	add	$(VEC_SIZE * 2), %r8
Packit Service 2d0c0b
	jl	L(StrncpyFillLessTwoVecSize)
Packit Service 2d0c0b
	vmovdqa %ymmZ, (%rdi)
Packit Service 2d0c0b
	vmovdqa %ymmZ, VEC_SIZE(%rdi)
Packit Service 2d0c0b
	add	$(VEC_SIZE * 2), %rdi
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jl	L(StrncpyFillExit)
Packit Service 2d0c0b
	vmovdqa %ymmZ, (%rdi)
Packit Service 2d0c0b
	add	$VEC_SIZE, %rdi
Packit Service 2d0c0b
	jmp	L(Fill)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyFillLessTwoVecSize):
Packit Service 2d0c0b
	add	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jl	L(StrncpyFillExit)
Packit Service 2d0c0b
	vmovdqa %ymmZ, (%rdi)
Packit Service 2d0c0b
	add	$VEC_SIZE, %rdi
Packit Service 2d0c0b
	jmp	L(Fill)
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(StrncpyFillExit):
Packit Service 2d0c0b
	add	$VEC_SIZE, %r8
Packit Service 2d0c0b
L(Fill):
Packit Service 2d0c0b
	cmp	$17, %r8d
Packit Service 2d0c0b
	jae	L(Fill17_32)
Packit Service 2d0c0b
	cmp	$9, %r8d
Packit Service 2d0c0b
	jae	L(Fill9_16)
Packit Service 2d0c0b
	cmp	$5, %r8d
Packit Service 2d0c0b
	jae	L(Fill5_8)
Packit Service 2d0c0b
	cmp	$3, %r8d
Packit Service 2d0c0b
	jae	L(Fill3_4)
Packit Service 2d0c0b
	cmp	$1, %r8d
Packit Service 2d0c0b
	ja	L(Fill2)
Packit Service 2d0c0b
	je	L(Fill1)
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
/* end of ifndef USE_AS_STRCAT */
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(UnalignedLeaveCase2OrCase3):
Packit Service 2d0c0b
	test	%rdx, %rdx
Packit Service 2d0c0b
	jnz	L(UnalignedFourVecSizeLeaveCase2)
Packit Service 2d0c0b
L(UnalignedFourVecSizeLeaveCase3):
Packit Service 2d0c0b
	lea	(VEC_SIZE * 4)(%r8), %rcx
Packit Service 2d0c0b
	and	$-VEC_SIZE, %rcx
Packit Service 2d0c0b
	add	$(VEC_SIZE * 3), %r8
Packit Service 2d0c0b
	jl	L(CopyVecSizeCase3)
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi)
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jb	L(CopyVecSizeCase3)
Packit Service 2d0c0b
	vmovdqu %ymm5, VEC_SIZE(%rdi)
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jb	L(CopyVecSizeCase3)
Packit Service 2d0c0b
	vmovdqu %ymm6, (VEC_SIZE * 2)(%rdi)
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jb	L(CopyVecSizeCase3)
Packit Service 2d0c0b
	vmovdqu %ymm7, (VEC_SIZE * 3)(%rdi)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	lea	(VEC_SIZE * 4)(%rdi), %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, (VEC_SIZE * 4)(%rdi)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(UnalignedFourVecSizeLeaveCase2):
Packit Service 2d0c0b
	xor	%ecx, %ecx
Packit Service 2d0c0b
	vpcmpeqb %ymm4, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	add	$(VEC_SIZE * 3), %r8
Packit Service 2d0c0b
	jle	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
#  ifndef USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec4)
Packit Service 2d0c0b
#  else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	vpcmpeqb %ymm5, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	vmovdqu %ymm4, (%rdi)
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
#  ifndef USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec5)
Packit Service 2d0c0b
#  else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpcmpeqb %ymm6, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	vmovdqu %ymm5, VEC_SIZE(%rdi)
Packit Service 2d0c0b
	add	$VEC_SIZE, %rcx
Packit Service 2d0c0b
	sub	$VEC_SIZE, %r8
Packit Service 2d0c0b
	jbe	L(CopyVecSizeCase2OrCase3)
Packit Service 2d0c0b
	test	%edx, %edx
Packit Service 2d0c0b
#  ifndef USE_AS_STRCAT
Packit Service 2d0c0b
	jnz	L(CopyVecSizeUnalignedVec6)
Packit Service 2d0c0b
#  else
Packit Service 2d0c0b
	jnz	L(CopyVecSize)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
Packit Service 2d0c0b
	vpcmpeqb %ymm7, %ymmZ, %ymmM
Packit Service 2d0c0b
	vpmovmskb %ymmM, %edx
Packit Service 2d0c0b
	vmovdqu %ymm6, (VEC_SIZE * 2)(%rdi)
Packit Service 2d0c0b
	lea	VEC_SIZE(%rdi, %rcx), %rdi
Packit Service 2d0c0b
	lea	VEC_SIZE(%rsi, %rcx), %rsi
Packit Service 2d0c0b
	bsf	%edx, %edx
Packit Service 2d0c0b
	cmp	%r8d, %edx
Packit Service 2d0c0b
	jb	L(CopyVecSizeExit)
Packit Service 2d0c0b
L(StrncpyExit):
Packit Service 2d0c0b
	cmp	$65, %r8d
Packit Service 2d0c0b
	je	L(StrncpyExit65)
Packit Service 2d0c0b
	cmp	$33, %r8d
Packit Service 2d0c0b
	jae	L(StrncpyExit33_64)
Packit Service 2d0c0b
	cmp	$17, %r8d
Packit Service 2d0c0b
	jae	L(StrncpyExit17_32)
Packit Service 2d0c0b
	cmp	$9, %r8d
Packit Service 2d0c0b
	jae	L(StrncpyExit9_16)
Packit Service 2d0c0b
	cmp	$5, %r8d
Packit Service 2d0c0b
	jae	L(StrncpyExit5_8)
Packit Service 2d0c0b
	cmp	$3, %r8d
Packit Service 2d0c0b
	jae	L(StrncpyExit3_4)
Packit Service 2d0c0b
	cmp	$1, %r8d
Packit Service 2d0c0b
	ja	L(StrncpyExit2)
Packit Service 2d0c0b
	je	L(StrncpyExit1)
Packit Service 2d0c0b
#  ifdef USE_AS_STPCPY
Packit Service 2d0c0b
	mov	%rdi, %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
#  ifdef USE_AS_STRCAT
Packit Service 2d0c0b
	movb	$0, (%rdi)
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
	.p2align 4
Packit Service 2d0c0b
L(ExitZero):
Packit Service 2d0c0b
#  ifndef USE_AS_STRCAT
Packit Service 2d0c0b
	mov	%rdi, %rax
Packit Service 2d0c0b
#  endif
Packit Service 2d0c0b
	VZEROUPPER
Packit Service 2d0c0b
	ret
Packit Service 2d0c0b
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
Packit Service 2d0c0b
# ifndef USE_AS_STRCAT
Packit Service 2d0c0b
END (STRCPY)
Packit Service 2d0c0b
# else
Packit Service 2d0c0b
END (STRCAT)
Packit Service 2d0c0b
# endif
Packit Service 2d0c0b
#endif