Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  sse2-strcpy-slm.S

  Sprache: Sparc
 

/*
Copyright (c) 2014, Intel Corporation
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
    * this list of conditions and the following disclaimer.

    * Redistributions in binary form must reproduce the above copyright notice,
    * this list of conditions and the following disclaimer in the documentation
    * and/or other materials provided with the distribution.

    * Neither the name of Intel Corporation nor the names of its contributors
    * may be used to endorse or promote products derived from this software
    * without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


#ifndef USE_AS_STRCAT

# ifndef STRCPY
#  define STRCPY strcpy
# endif

# ifndef L
#  define L(label) .L##label
# endif

# ifndef cfi_startproc
#  define cfi_startproc .cfi_startproc
# endif

# ifndef cfi_endproc
#  define cfi_endproc .cfi_endproc
# endif

# ifndef ENTRY
#  define ENTRY(name) \
 .type name, @function; \
 .globl name; \
 .p2align 4; \
name: \
 cfi_startproc
# endif

# ifndef END
#  define END(name) \
 cfi_endproc; \
 .size name, .-name
# endif

#endif

#define JMPTBL(I, B) I - B
#define BRANCH_TO_JMPTBL_ENTRY(TABLE, INDEX, SCALE) \
 lea TABLE(%rip), %r11; \
 movslq (%r11, INDEX, SCALE), %rcx; \
 lea (%r11, %rcx), %rcx; \
 jmp *%rcx

#ifndef USE_AS_STRCAT

# define RETURN ret

.text
ENTRY (STRCPY)
# ifdef USE_AS_STRNCPY
 mov %rdx, %r8
 test %r8, %r8
 jz L(ExitZero)
# endif
 mov %rsi, %rcx
# ifndef USE_AS_STPCPY
 mov %rdi, %rax      /* save result */
# endif

#endif
 and $63, %rcx
 cmp $32, %rcx
 jbe L(SourceStringAlignmentLess32)

 and $-16, %rsi
 and $15, %rcx
 pxor %xmm0, %xmm0
 pxor %xmm1, %xmm1

 pcmpeqb (%rsi), %xmm1
 pmovmskb %xmm1, %rdx
 shr %cl, %rdx
#ifdef USE_AS_STRNCPY
# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
 mov $16, %r10
 sub %rcx, %r10
 cmp %r10, %r8
# else
 mov $17, %r10
 sub %rcx, %r10
 cmp %r10, %r8
# endif
 jbe L(CopyFrom1To16BytesTailCase2OrCase3)
#endif
 test %rdx, %rdx
 jnz L(CopyFrom1To16BytesTail)

 pcmpeqb 16(%rsi), %xmm0
 pmovmskb %xmm0, %rdx
#ifdef USE_AS_STRNCPY
 add $16, %r10
 cmp %r10, %r8
 jbe L(CopyFrom1To32BytesCase2OrCase3)
#endif
 test %rdx, %rdx
 jnz L(CopyFrom1To32Bytes)

 movdqu (%rsi, %rcx), %xmm1   /* copy 16 bytes */
 movdqu %xmm1, (%rdi)

/* If source adress alignment != destination adress alignment */
 .p2align 4
L(Unalign16Both):
 sub %rcx, %rdi
#ifdef USE_AS_STRNCPY
 add %rcx, %r8
#endif
 mov $16, %rcx
 movdqa (%rsi, %rcx), %xmm1
 movaps 16(%rsi, %rcx), %xmm2
 movdqu %xmm1, (%rdi, %rcx)
 pcmpeqb %xmm2, %xmm0
 pmovmskb %xmm0, %rdx
 add $16, %rcx
#ifdef USE_AS_STRNCPY
 sub $48, %r8
 jbe L(CopyFrom1To16BytesCase2OrCase3)
#endif
 test %rdx, %rdx
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 jnz L(CopyFrom1To16BytesUnalignedXmm2)
#else
 jnz L(CopyFrom1To16Bytes)
#endif

 movaps 16(%rsi, %rcx), %xmm3
 movdqu %xmm2, (%rdi, %rcx)
 pcmpeqb %xmm3, %xmm0
 pmovmskb %xmm0, %rdx
 add $16, %rcx
#ifdef USE_AS_STRNCPY
 sub $16, %r8
 jbe L(CopyFrom1To16BytesCase2OrCase3)
#endif
 test %rdx, %rdx
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 jnz L(CopyFrom1To16BytesUnalignedXmm3)
#else
 jnz L(CopyFrom1To16Bytes)
#endif

 movaps 16(%rsi, %rcx), %xmm4
 movdqu %xmm3, (%rdi, %rcx)
 pcmpeqb %xmm4, %xmm0
 pmovmskb %xmm0, %rdx
 add $16, %rcx
#ifdef USE_AS_STRNCPY
 sub $16, %r8
 jbe L(CopyFrom1To16BytesCase2OrCase3)
#endif
 test %rdx, %rdx
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 jnz L(CopyFrom1To16BytesUnalignedXmm4)
#else
 jnz L(CopyFrom1To16Bytes)
#endif

 movaps 16(%rsi, %rcx), %xmm1
 movdqu %xmm4, (%rdi, %rcx)
 pcmpeqb %xmm1, %xmm0
 pmovmskb %xmm0, %rdx
 add $16, %rcx
#ifdef USE_AS_STRNCPY
 sub $16, %r8
 jbe L(CopyFrom1To16BytesCase2OrCase3)
#endif
 test %rdx, %rdx
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 jnz L(CopyFrom1To16BytesUnalignedXmm1)
#else
 jnz L(CopyFrom1To16Bytes)
#endif

 movaps 16(%rsi, %rcx), %xmm2
 movdqu %xmm1, (%rdi, %rcx)
 pcmpeqb %xmm2, %xmm0
 pmovmskb %xmm0, %rdx
 add $16, %rcx
#ifdef USE_AS_STRNCPY
 sub $16, %r8
 jbe L(CopyFrom1To16BytesCase2OrCase3)
#endif
 test %rdx, %rdx
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 jnz L(CopyFrom1To16BytesUnalignedXmm2)
#else
 jnz L(CopyFrom1To16Bytes)
#endif

 movaps 16(%rsi, %rcx), %xmm3
 movdqu %xmm2, (%rdi, %rcx)
 pcmpeqb %xmm3, %xmm0
 pmovmskb %xmm0, %rdx
 add $16, %rcx
#ifdef USE_AS_STRNCPY
 sub $16, %r8
 jbe L(CopyFrom1To16BytesCase2OrCase3)
#endif
 test %rdx, %rdx
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 jnz L(CopyFrom1To16BytesUnalignedXmm3)
#else
 jnz L(CopyFrom1To16Bytes)
#endif

 movdqu %xmm3, (%rdi, %rcx)
 mov %rsi, %rdx
 lea 16(%rsi, %rcx), %rsi
 and $-0x40, %rsi
 sub %rsi, %rdx
 sub %rdx, %rdi
#ifdef USE_AS_STRNCPY
 lea 128(%r8, %rdx), %r8
#endif
L(Unaligned64Loop):
 movaps (%rsi), %xmm2
 movaps %xmm2, %xmm4
 movaps 16(%rsi), %xmm5
 movaps 32(%rsi), %xmm3
 movaps %xmm3, %xmm6
 movaps 48(%rsi), %xmm7
 pminub %xmm5, %xmm2
 pminub %xmm7, %xmm3
 pminub %xmm2, %xmm3
 pcmpeqb %xmm0, %xmm3
 pmovmskb %xmm3, %rdx
#ifdef USE_AS_STRNCPY
 sub $64, %r8
 jbe L(UnalignedLeaveCase2OrCase3)
#endif
 test %rdx, %rdx
 jnz L(Unaligned64Leave)

L(Unaligned64Loop_start):
 add $64, %rdi
 add $64, %rsi
 movdqu %xmm4, -64(%rdi)
 movaps (%rsi), %xmm2
 movdqa %xmm2, %xmm4
 movdqu %xmm5, -48(%rdi)
 movaps 16(%rsi), %xmm5
 pminub %xmm5, %xmm2
 movaps 32(%rsi), %xmm3
 movdqu %xmm6, -32(%rdi)
 movaps %xmm3, %xmm6
 movdqu %xmm7, -16(%rdi)
 movaps 48(%rsi), %xmm7
 pminub %xmm7, %xmm3
 pminub %xmm2, %xmm3
 pcmpeqb %xmm0, %xmm3
 pmovmskb %xmm3, %rdx
#ifdef USE_AS_STRNCPY
 sub $64, %r8
 jbe L(UnalignedLeaveCase2OrCase3)
#endif
 test %rdx, %rdx
 jz L(Unaligned64Loop_start)

L(Unaligned64Leave):
 pxor %xmm1, %xmm1

 pcmpeqb %xmm4, %xmm0
 pcmpeqb %xmm5, %xmm1
 pmovmskb %xmm0, %rdx
 pmovmskb %xmm1, %rcx
 test %rdx, %rdx
 jnz L(CopyFrom1To16BytesUnaligned_0)
 test %rcx, %rcx
 jnz L(CopyFrom1To16BytesUnaligned_16)

 pcmpeqb %xmm6, %xmm0
 pcmpeqb %xmm7, %xmm1
 pmovmskb %xmm0, %rdx
 pmovmskb %xmm1, %rcx
 test %rdx, %rdx
 jnz L(CopyFrom1To16BytesUnaligned_32)

 bsf %rcx, %rdx
 movdqu %xmm4, (%rdi)
 movdqu %xmm5, 16(%rdi)
 movdqu %xmm6, 32(%rdi)
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
# ifdef USE_AS_STPCPY
 lea 48(%rdi, %rdx), %rax
# endif
 movdqu %xmm7, 48(%rdi)
 add $15, %r8
 sub %rdx, %r8
 lea 49(%rdi, %rdx), %rdi
 jmp L(StrncpyFillTailWithZero)
#else
 add $48, %rsi
 add $48, %rdi
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)
#endif

/* If source adress alignment == destination adress alignment */

L(SourceStringAlignmentLess32):
 pxor %xmm0, %xmm0
 movdqu (%rsi), %xmm1
 movdqu 16(%rsi), %xmm2
 pcmpeqb %xmm1, %xmm0
 pmovmskb %xmm0, %rdx

#ifdef USE_AS_STRNCPY
# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
 cmp $16, %r8
# else
 cmp $17, %r8
# endif
 jbe L(CopyFrom1To16BytesTail1Case2OrCase3)
#endif
 test %rdx, %rdx
 jnz L(CopyFrom1To16BytesTail1)

 pcmpeqb %xmm2, %xmm0
 movdqu %xmm1, (%rdi)
 pmovmskb %xmm0, %rdx

#ifdef USE_AS_STRNCPY
# if defined USE_AS_STPCPY || defined USE_AS_STRCAT
 cmp $32, %r8
# else
 cmp $33, %r8
# endif
 jbe L(CopyFrom1To32Bytes1Case2OrCase3)
#endif
 test %rdx, %rdx
 jnz L(CopyFrom1To32Bytes1)

 and $15, %rcx
 and $-16, %rsi

 jmp L(Unalign16Both)

/*------End of main part with loops---------------------*/

/* Case1 */

#if (!defined USE_AS_STRNCPY) || (defined USE_AS_STRCAT)
 .p2align 4
L(CopyFrom1To16Bytes):
 add %rcx, %rdi
 add %rcx, %rsi
 bsf %rdx, %rdx
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)
#endif
 .p2align 4
L(CopyFrom1To16BytesTail):
 add %rcx, %rsi
 bsf %rdx, %rdx
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)

 .p2align 4
L(CopyFrom1To32Bytes1):
 add $16, %rsi
 add $16, %rdi
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $16, %r8
#endif
L(CopyFrom1To16BytesTail1):
 bsf %rdx, %rdx
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)

 .p2align 4
L(CopyFrom1To32Bytes):
 bsf %rdx, %rdx
 add %rcx, %rsi
 add $16, %rdx
 sub %rcx, %rdx
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)

 .p2align 4
L(CopyFrom1To16BytesUnaligned_0):
 bsf %rdx, %rdx
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
# ifdef USE_AS_STPCPY
 lea (%rdi, %rdx), %rax
# endif
 movdqu %xmm4, (%rdi)
 add $63, %r8
 sub %rdx, %r8
 lea 1(%rdi, %rdx), %rdi
 jmp L(StrncpyFillTailWithZero)
#else
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)
#endif

 .p2align 4
L(CopyFrom1To16BytesUnaligned_16):
 bsf %rcx, %rdx
 movdqu %xmm4, (%rdi)
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
# ifdef USE_AS_STPCPY
 lea 16(%rdi, %rdx), %rax
# endif
 movdqu %xmm5, 16(%rdi)
 add $47, %r8
 sub %rdx, %r8
 lea 17(%rdi, %rdx), %rdi
 jmp L(StrncpyFillTailWithZero)
#else
 add $16, %rsi
 add $16, %rdi
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)
#endif

 .p2align 4
L(CopyFrom1To16BytesUnaligned_32):
 bsf %rdx, %rdx
 movdqu %xmm4, (%rdi)
 movdqu %xmm5, 16(%rdi)
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
# ifdef USE_AS_STPCPY
 lea 32(%rdi, %rdx), %rax
# endif
 movdqu %xmm6, 32(%rdi)
 add $31, %r8
 sub %rdx, %r8
 lea 33(%rdi, %rdx), %rdi
 jmp L(StrncpyFillTailWithZero)
#else
 add $32, %rsi
 add $32, %rdi
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)
#endif

#ifdef USE_AS_STRNCPY
# ifndef USE_AS_STRCAT 
 .p2align 4
L(CopyFrom1To16BytesUnalignedXmm6):
 movdqu %xmm6, (%rdi, %rcx)
 jmp L(CopyFrom1To16BytesXmmExit)

 .p2align 4
L(CopyFrom1To16BytesUnalignedXmm5):
 movdqu %xmm5, (%rdi, %rcx)
 jmp L(CopyFrom1To16BytesXmmExit)

 .p2align 4
L(CopyFrom1To16BytesUnalignedXmm4):
 movdqu %xmm4, (%rdi, %rcx)
 jmp L(CopyFrom1To16BytesXmmExit)

 .p2align 4
L(CopyFrom1To16BytesUnalignedXmm3):
 movdqu %xmm3, (%rdi, %rcx)
 jmp L(CopyFrom1To16BytesXmmExit)

 .p2align 4
L(CopyFrom1To16BytesUnalignedXmm1):
 movdqu %xmm1, (%rdi, %rcx)
 jmp L(CopyFrom1To16BytesXmmExit)
# endif

 .p2align 4
L(CopyFrom1To16BytesExit):
 BRANCH_TO_JMPTBL_ENTRY (L(ExitTable), %rdx, 4)

/* Case2 */

 .p2align 4
L(CopyFrom1To16BytesCase2):
 add $16, %r8
 add %rcx, %rdi
 add %rcx, %rsi
 bsf %rdx, %rdx
 cmp %r8, %rdx
 jb L(CopyFrom1To16BytesExit)
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

 .p2align 4
L(CopyFrom1To32BytesCase2):
 add %rcx, %rsi
 bsf %rdx, %rdx
 add $16, %rdx
 sub %rcx, %rdx
 cmp %r8, %rdx
 jb L(CopyFrom1To16BytesExit)
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

L(CopyFrom1To16BytesTailCase2):
 add %rcx, %rsi
 bsf %rdx, %rdx
 cmp %r8, %rdx
 jb L(CopyFrom1To16BytesExit)
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

L(CopyFrom1To16BytesTail1Case2):
 bsf %rdx, %rdx
 cmp %r8, %rdx
 jb L(CopyFrom1To16BytesExit)
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

/* Case2 or Case3,  Case3 */

 .p2align 4
L(CopyFrom1To16BytesCase2OrCase3):
 test %rdx, %rdx
 jnz L(CopyFrom1To16BytesCase2)
L(CopyFrom1To16BytesCase3):
 add $16, %r8
 add %rcx, %rdi
 add %rcx, %rsi
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

 .p2align 4
L(CopyFrom1To32BytesCase2OrCase3):
 test %rdx, %rdx
 jnz L(CopyFrom1To32BytesCase2)
 add %rcx, %rsi
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

 .p2align 4
L(CopyFrom1To16BytesTailCase2OrCase3):
 test %rdx, %rdx
 jnz L(CopyFrom1To16BytesTailCase2)
 add %rcx, %rsi
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

 .p2align 4
L(CopyFrom1To32Bytes1Case2OrCase3):
 add $16, %rdi
 add $16, %rsi
 sub $16, %r8
L(CopyFrom1To16BytesTail1Case2OrCase3):
 test %rdx, %rdx
 jnz L(CopyFrom1To16BytesTail1Case2)
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

#endif

/*------------End labels regarding with copying 1-16 bytes--and 1-32 bytes----*/

 .p2align 4
L(Exit1):
 mov %dh, (%rdi)
#ifdef USE_AS_STPCPY
 lea (%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $1, %r8
 lea 1(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit2):
 mov (%rsi), %dx
 mov %dx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 1(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $2, %r8
 lea 2(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit3):
 mov (%rsi), %cx
 mov %cx, (%rdi)
 mov %dh, 2(%rdi)
#ifdef USE_AS_STPCPY
 lea 2(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $3, %r8
 lea 3(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit4):
 mov (%rsi), %edx
 mov %edx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 3(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $4, %r8
 lea 4(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit5):
 mov (%rsi), %ecx
 mov %dh, 4(%rdi)
 mov %ecx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 4(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $5, %r8
 lea 5(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit6):
 mov (%rsi), %ecx
 mov 4(%rsi), %dx
 mov %ecx, (%rdi)
 mov %dx, 4(%rdi)
#ifdef USE_AS_STPCPY
 lea 5(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $6, %r8
 lea 6(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit7):
 mov (%rsi), %ecx
 mov 3(%rsi), %edx
 mov %ecx, (%rdi)
 mov %edx, 3(%rdi)
#ifdef USE_AS_STPCPY
 lea 6(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $7, %r8
 lea 7(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit8):
 mov (%rsi), %rdx
 mov %rdx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 7(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $8, %r8
 lea 8(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit9):
 mov (%rsi), %rcx
 mov %dh, 8(%rdi)
 mov %rcx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 8(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $9, %r8
 lea 9(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit10):
 mov (%rsi), %rcx
 mov 8(%rsi), %dx
 mov %rcx, (%rdi)
 mov %dx, 8(%rdi)
#ifdef USE_AS_STPCPY
 lea 9(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $10, %r8
 lea 10(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit11):
 mov (%rsi), %rcx
 mov 7(%rsi), %edx
 mov %rcx, (%rdi)
 mov %edx, 7(%rdi)
#ifdef USE_AS_STPCPY
 lea 10(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $11, %r8
 lea 11(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit12):
 mov (%rsi), %rcx
 mov 8(%rsi), %edx
 mov %rcx, (%rdi)
 mov %edx, 8(%rdi)
#ifdef USE_AS_STPCPY
 lea 11(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $12, %r8
 lea 12(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit13):
 mov (%rsi), %rcx
 mov 5(%rsi), %rdx
 mov %rcx, (%rdi)
 mov %rdx, 5(%rdi)
#ifdef USE_AS_STPCPY
 lea 12(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $13, %r8
 lea 13(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit14):
 mov (%rsi), %rcx
 mov 6(%rsi), %rdx
 mov %rcx, (%rdi)
 mov %rdx, 6(%rdi)
#ifdef USE_AS_STPCPY
 lea 13(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $14, %r8
 lea 14(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit15):
 mov (%rsi), %rcx
 mov 7(%rsi), %rdx
 mov %rcx, (%rdi)
 mov %rdx, 7(%rdi)
#ifdef USE_AS_STPCPY
 lea 14(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $15, %r8
 lea 15(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit16):
 movdqu (%rsi), %xmm0
 movdqu %xmm0, (%rdi)
#ifdef USE_AS_STPCPY
 lea 15(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $16, %r8
 lea 16(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit17):
 movdqu (%rsi), %xmm0
 movdqu %xmm0, (%rdi)
 mov %dh, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 16(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $17, %r8
 lea 17(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit18):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %cx
 movdqu %xmm0, (%rdi)
 mov %cx, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 17(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $18, %r8
 lea 18(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit19):
 movdqu (%rsi), %xmm0
 mov 15(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %ecx, 15(%rdi)
#ifdef USE_AS_STPCPY
 lea 18(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $19, %r8
 lea 19(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit20):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %ecx, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 19(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $20, %r8
 lea 20(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit21):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %ecx, 16(%rdi)
 mov %dh, 20(%rdi)
#ifdef USE_AS_STPCPY
 lea 20(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $21, %r8
 lea 21(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit22):
 movdqu (%rsi), %xmm0
 mov 14(%rsi), %rcx
 movdqu %xmm0, (%rdi)
 mov %rcx, 14(%rdi)
#ifdef USE_AS_STPCPY
 lea 21(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $22, %r8
 lea 22(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit23):
 movdqu (%rsi), %xmm0
 mov 15(%rsi), %rcx
 movdqu %xmm0, (%rdi)
 mov %rcx, 15(%rdi)
#ifdef USE_AS_STPCPY
 lea 22(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $23, %r8
 lea 23(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit24):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rcx
 movdqu %xmm0, (%rdi)
 mov %rcx, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 23(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $24, %r8
 lea 24(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit25):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rcx
 movdqu %xmm0, (%rdi)
 mov %rcx, 16(%rdi)
 mov %dh, 24(%rdi)
#ifdef USE_AS_STPCPY
 lea 24(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $25, %r8
 lea 25(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit26):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rdx
 mov 24(%rsi), %cx
 movdqu %xmm0, (%rdi)
 mov %rdx, 16(%rdi)
 mov %cx, 24(%rdi)
#ifdef USE_AS_STPCPY
 lea 25(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $26, %r8
 lea 26(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit27):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rdx
 mov 23(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %rdx, 16(%rdi)
 mov %ecx, 23(%rdi)
#ifdef USE_AS_STPCPY
 lea 26(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $27, %r8
 lea 27(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit28):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rdx
 mov 24(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %rdx, 16(%rdi)
 mov %ecx, 24(%rdi)
#ifdef USE_AS_STPCPY
 lea 27(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $28, %r8
 lea 28(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit29):
 movdqu (%rsi), %xmm0
 movdqu 13(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 13(%rdi)
#ifdef USE_AS_STPCPY
 lea 28(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $29, %r8
 lea 29(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit30):
 movdqu (%rsi), %xmm0
 movdqu 14(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 14(%rdi)
#ifdef USE_AS_STPCPY
 lea 29(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $30, %r8
 lea 30(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit31):
 movdqu (%rsi), %xmm0
 movdqu 15(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 15(%rdi)
#ifdef USE_AS_STPCPY
 lea 30(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $31, %r8
 lea 31(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

 .p2align 4
L(Exit32):
 movdqu (%rsi), %xmm0
 movdqu 16(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 31(%rdi), %rax
#endif
#if defined USE_AS_STRNCPY && !defined USE_AS_STRCAT
 sub $32, %r8
 lea 32(%rdi), %rdi
 jnz L(StrncpyFillTailWithZero)
#endif
 RETURN

#ifdef USE_AS_STRNCPY

 .p2align 4
L(StrncpyExit0):
#ifdef USE_AS_STPCPY
 mov %rdi, %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, (%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit1):
 mov (%rsi), %dl
 mov %dl, (%rdi)
#ifdef USE_AS_STPCPY
 lea 1(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 1(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit2):
 mov (%rsi), %dx
 mov %dx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 2(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 2(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit3):
 mov (%rsi), %cx
 mov 2(%rsi), %dl
 mov %cx, (%rdi)
 mov %dl, 2(%rdi)
#ifdef USE_AS_STPCPY
 lea 3(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 3(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit4):
 mov (%rsi), %edx
 mov %edx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 4(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 4(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit5):
 mov (%rsi), %ecx
 mov 4(%rsi), %dl
 mov %ecx, (%rdi)
 mov %dl, 4(%rdi)
#ifdef USE_AS_STPCPY
 lea 5(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 5(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit6):
 mov (%rsi), %ecx
 mov 4(%rsi), %dx
 mov %ecx, (%rdi)
 mov %dx, 4(%rdi)
#ifdef USE_AS_STPCPY
 lea 6(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 6(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit7):
 mov (%rsi), %ecx
 mov 3(%rsi), %edx
 mov %ecx, (%rdi)
 mov %edx, 3(%rdi)
#ifdef USE_AS_STPCPY
 lea 7(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 7(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit8):
 mov (%rsi), %rdx
 mov %rdx, (%rdi)
#ifdef USE_AS_STPCPY
 lea 8(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 8(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit9):
 mov (%rsi), %rcx
 mov 8(%rsi), %dl
 mov %rcx, (%rdi)
 mov %dl, 8(%rdi)
#ifdef USE_AS_STPCPY
 lea 9(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 9(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit10):
 mov (%rsi), %rcx
 mov 8(%rsi), %dx
 mov %rcx, (%rdi)
 mov %dx, 8(%rdi)
#ifdef USE_AS_STPCPY
 lea 10(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 10(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit11):
 mov (%rsi), %rcx
 mov 7(%rsi), %edx
 mov %rcx, (%rdi)
 mov %edx, 7(%rdi)
#ifdef USE_AS_STPCPY
 lea 11(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 11(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit12):
 mov (%rsi), %rcx
 mov 8(%rsi), %edx
 mov %rcx, (%rdi)
 mov %edx, 8(%rdi)
#ifdef USE_AS_STPCPY
 lea 12(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 12(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit13):
 mov (%rsi), %rcx
 mov 5(%rsi), %rdx
 mov %rcx, (%rdi)
 mov %rdx, 5(%rdi)
#ifdef USE_AS_STPCPY
 lea 13(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 13(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit14):
 mov (%rsi), %rcx
 mov 6(%rsi), %rdx
 mov %rcx, (%rdi)
 mov %rdx, 6(%rdi)
#ifdef USE_AS_STPCPY
 lea 14(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 14(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit15):
 mov (%rsi), %rcx
 mov 7(%rsi), %rdx
 mov %rcx, (%rdi)
 mov %rdx, 7(%rdi)
#ifdef USE_AS_STPCPY
 lea 15(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 15(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit16):
 movdqu (%rsi), %xmm0
 movdqu %xmm0, (%rdi)
#ifdef USE_AS_STPCPY
 lea 16(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 16(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit17):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %cl
 movdqu %xmm0, (%rdi)
 mov %cl, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 17(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 17(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit18):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %cx
 movdqu %xmm0, (%rdi)
 mov %cx, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 18(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 18(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit19):
 movdqu (%rsi), %xmm0
 mov 15(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %ecx, 15(%rdi)
#ifdef USE_AS_STPCPY
 lea 19(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 19(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit20):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %ecx, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 20(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 20(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit21):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %ecx
 mov 20(%rsi), %dl
 movdqu %xmm0, (%rdi)
 mov %ecx, 16(%rdi)
 mov %dl, 20(%rdi)
#ifdef USE_AS_STPCPY
 lea 21(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 21(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit22):
 movdqu (%rsi), %xmm0
 mov 14(%rsi), %rcx
 movdqu %xmm0, (%rdi)
 mov %rcx, 14(%rdi)
#ifdef USE_AS_STPCPY
 lea 22(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 22(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit23):
 movdqu (%rsi), %xmm0
 mov 15(%rsi), %rcx
 movdqu %xmm0, (%rdi)
 mov %rcx, 15(%rdi)
#ifdef USE_AS_STPCPY
 lea 23(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 23(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit24):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rcx
 movdqu %xmm0, (%rdi)
 mov %rcx, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 24(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 24(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit25):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rdx
 mov 24(%rsi), %cl
 movdqu %xmm0, (%rdi)
 mov %rdx, 16(%rdi)
 mov %cl, 24(%rdi)
#ifdef USE_AS_STPCPY
 lea 25(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 25(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit26):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rdx
 mov 24(%rsi), %cx
 movdqu %xmm0, (%rdi)
 mov %rdx, 16(%rdi)
 mov %cx, 24(%rdi)
#ifdef USE_AS_STPCPY
 lea 26(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 26(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit27):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rdx
 mov 23(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %rdx, 16(%rdi)
 mov %ecx, 23(%rdi)
#ifdef USE_AS_STPCPY
 lea 27(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 27(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit28):
 movdqu (%rsi), %xmm0
 mov 16(%rsi), %rdx
 mov 24(%rsi), %ecx
 movdqu %xmm0, (%rdi)
 mov %rdx, 16(%rdi)
 mov %ecx, 24(%rdi)
#ifdef USE_AS_STPCPY
 lea 28(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 28(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit29):
 movdqu (%rsi), %xmm0
 movdqu 13(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 13(%rdi)
#ifdef USE_AS_STPCPY
 lea 29(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 29(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit30):
 movdqu (%rsi), %xmm0
 movdqu 14(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 14(%rdi)
#ifdef USE_AS_STPCPY
 lea 30(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 30(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit31):
 movdqu (%rsi), %xmm0
 movdqu 15(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 15(%rdi)
#ifdef USE_AS_STPCPY
 lea 31(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 31(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit32):
 movdqu (%rsi), %xmm0
 movdqu 16(%rsi), %xmm2
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 16(%rdi)
#ifdef USE_AS_STPCPY
 lea 32(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 32(%rdi)
#endif
 RETURN

 .p2align 4
L(StrncpyExit33):
 movdqu (%rsi), %xmm0
 movdqu 16(%rsi), %xmm2
 mov 32(%rsi), %cl
 movdqu %xmm0, (%rdi)
 movdqu %xmm2, 16(%rdi)
 mov %cl, 32(%rdi)
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 33(%rdi)
#endif
 RETURN

#ifndef USE_AS_STRCAT

 .p2align 4
L(Fill0):
 RETURN

 .p2align 4
L(Fill1):
 mov %dl, (%rdi)
 RETURN

 .p2align 4
L(Fill2):
 mov %dx, (%rdi)
 RETURN

 .p2align 4
L(Fill3):
 mov %edx, -1(%rdi)
 RETURN

 .p2align 4
L(Fill4):
 mov %edx, (%rdi)
 RETURN

 .p2align 4
L(Fill5):
 mov %edx, (%rdi)
 mov %dl, 4(%rdi)
 RETURN

 .p2align 4
L(Fill6):
 mov %edx, (%rdi)
 mov %dx, 4(%rdi)
 RETURN

 .p2align 4
L(Fill7):
 mov %rdx, -1(%rdi)
 RETURN

 .p2align 4
L(Fill8):
 mov %rdx, (%rdi)
 RETURN

 .p2align 4
L(Fill9):
 mov %rdx, (%rdi)
 mov %dl, 8(%rdi)
 RETURN

 .p2align 4
L(Fill10):
 mov %rdx, (%rdi)
 mov %dx, 8(%rdi)
 RETURN

 .p2align 4
L(Fill11):
 mov %rdx, (%rdi)
 mov %edx, 7(%rdi)
 RETURN

 .p2align 4
L(Fill12):
 mov %rdx, (%rdi)
 mov %edx, 8(%rdi)
 RETURN

 .p2align 4
L(Fill13):
 mov %rdx, (%rdi)
 mov %rdx, 5(%rdi)
 RETURN

 .p2align 4
L(Fill14):
 mov %rdx, (%rdi)
 mov %rdx, 6(%rdi)
 RETURN

 .p2align 4
L(Fill15):
 movdqu %xmm0, -1(%rdi)
 RETURN

 .p2align 4
L(Fill16):
 movdqu %xmm0, (%rdi)
 RETURN

 .p2align 4
L(CopyFrom1To16BytesUnalignedXmm2):
 movdqu %xmm2, (%rdi, %rcx)

 .p2align 4
L(CopyFrom1To16BytesXmmExit):
 bsf %rdx, %rdx
 add $15, %r8
 add %rcx, %rdi
#ifdef USE_AS_STPCPY
 lea (%rdi, %rdx), %rax
#endif
 sub %rdx, %r8
 lea 1(%rdi, %rdx), %rdi

 .p2align 4
L(StrncpyFillTailWithZero):
 pxor %xmm0, %xmm0
 xor %rdx, %rdx
 sub $16, %r8
 jbe L(StrncpyFillExit)

 movdqu %xmm0, (%rdi)
 add $16, %rdi

 mov %rdi, %rsi
 and $0xf, %rsi
 sub %rsi, %rdi
 add %rsi, %r8
 sub $64, %r8
 jb L(StrncpyFillLess64)

L(StrncpyFillLoopMovdqa):
 movdqa %xmm0, (%rdi)
 movdqa %xmm0, 16(%rdi)
 movdqa %xmm0, 32(%rdi)
 movdqa %xmm0, 48(%rdi)
 add $64, %rdi
 sub $64, %r8
 jae L(StrncpyFillLoopMovdqa)

L(StrncpyFillLess64):
 add $32, %r8
 jl L(StrncpyFillLess32)
 movdqa %xmm0, (%rdi)
 movdqa %xmm0, 16(%rdi)
 add $32, %rdi
 sub $16, %r8
 jl L(StrncpyFillExit)
 movdqa %xmm0, (%rdi)
 add $16, %rdi
 BRANCH_TO_JMPTBL_ENTRY (L(FillTable), %r8, 4)

L(StrncpyFillLess32):
 add $16, %r8
 jl L(StrncpyFillExit)
 movdqa %xmm0, (%rdi)
 add $16, %rdi
 BRANCH_TO_JMPTBL_ENTRY (L(FillTable), %r8, 4)

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
 jnz L(Unaligned64LeaveCase2)
L(Unaligned64LeaveCase3):
 lea 64(%r8), %rcx
 and $-16, %rcx
 add $48, %r8
 jl L(CopyFrom1To16BytesCase3)
 movdqu %xmm4, (%rdi)
 sub $16, %r8
 jb L(CopyFrom1To16BytesCase3)
 movdqu %xmm5, 16(%rdi)
 sub $16, %r8
 jb L(CopyFrom1To16BytesCase3)
 movdqu %xmm6, 32(%rdi)
 sub $16, %r8
 jb L(CopyFrom1To16BytesCase3)
 movdqu %xmm7, 48(%rdi)
#ifdef USE_AS_STPCPY
 lea 64(%rdi), %rax
#endif
#ifdef USE_AS_STRCAT
 xor %ch, %ch
 movb %ch, 64(%rdi)
#endif
 RETURN

 .p2align 4
L(Unaligned64LeaveCase2):
 xor %rcx, %rcx
 pcmpeqb %xmm4, %xmm0
 pmovmskb %xmm0, %rdx
 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)
 add $16, %rcx
 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
 movdqu %xmm5, 16(%rdi)
 add $16, %rcx
 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
 movdqu %xmm6, 32(%rdi)
 lea 16(%rdi, %rcx), %rdi
 lea 16(%rsi, %rcx), %rsi
 bsf %rdx, %rdx
 cmp %r8, %rdx
 jb L(CopyFrom1To16BytesExit)
 BRANCH_TO_JMPTBL_ENTRY (L(ExitStrncpyTable), %r8, 4)

 .p2align 4
L(ExitZero):
#ifndef USE_AS_STRCAT
 mov %rdi, %rax
#endif
 RETURN

#endif

#ifndef USE_AS_STRCAT
END (STRCPY)
#else
END (STRCAT)
#endif
 .p2align 4
 .section .rodata
L(ExitTable):
 .int JMPTBL(L(Exit1), L(ExitTable))
 .int JMPTBL(L(Exit2), L(ExitTable))
 .int JMPTBL(L(Exit3), L(ExitTable))
 .int JMPTBL(L(Exit4), L(ExitTable))
 .int JMPTBL(L(Exit5), L(ExitTable))
 .int JMPTBL(L(Exit6), L(ExitTable))
 .int JMPTBL(L(Exit7), L(ExitTable))
 .int JMPTBL(L(Exit8), L(ExitTable))
 .int JMPTBL(L(Exit9), L(ExitTable))
 .int JMPTBL(L(Exit10), L(ExitTable))
 .int JMPTBL(L(Exit11), L(ExitTable))
 .int JMPTBL(L(Exit12), L(ExitTable))
 .int JMPTBL(L(Exit13), L(ExitTable))
 .int JMPTBL(L(Exit14), L(ExitTable))
 .int JMPTBL(L(Exit15), L(ExitTable))
 .int JMPTBL(L(Exit16), L(ExitTable))
 .int JMPTBL(L(Exit17), L(ExitTable))
 .int JMPTBL(L(Exit18), L(ExitTable))
 .int JMPTBL(L(Exit19), L(ExitTable))
 .int JMPTBL(L(Exit20), L(ExitTable))
 .int JMPTBL(L(Exit21), L(ExitTable))
 .int JMPTBL(L(Exit22), L(ExitTable))
 .int JMPTBL(L(Exit23), L(ExitTable))
 .int JMPTBL(L(Exit24), L(ExitTable))
 .int JMPTBL(L(Exit25), L(ExitTable))
 .int JMPTBL(L(Exit26), L(ExitTable))
 .int JMPTBL(L(Exit27), L(ExitTable))
 .int JMPTBL(L(Exit28), L(ExitTable))
 .int JMPTBL(L(Exit29), L(ExitTable))
 .int JMPTBL(L(Exit30), L(ExitTable))
 .int JMPTBL(L(Exit31), L(ExitTable))
 .int JMPTBL(L(Exit32), L(ExitTable))
#ifdef USE_AS_STRNCPY
L(ExitStrncpyTable):
 .int JMPTBL(L(StrncpyExit0), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit1), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit2), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit3), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit4), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit5), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit6), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit7), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit8), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit9), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit10), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit11), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit12), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit13), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit14), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit15), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit16), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit17), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit18), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit19), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit20), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit21), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit22), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit23), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit24), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit25), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit26), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit27), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit28), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit29), L(ExitStrncpyTable))
 .int JMPTBL(L(StrncpyExit30), 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))
 .int JMPTBL(L(Fill1), L(FillTable))
 .int JMPTBL(L(Fill2), L(FillTable))
 .int JMPTBL(L(Fill3), L(FillTable))
 .int JMPTBL(L(Fill4), L(FillTable))
 .int JMPTBL(L(Fill5), L(FillTable))
 .int JMPTBL(L(Fill6), L(FillTable))
 .int JMPTBL(L(Fill7), L(FillTable))
 .int JMPTBL(L(Fill8), L(FillTable))
 .int JMPTBL(L(Fill9), L(FillTable))
 .int JMPTBL(L(Fill10), L(FillTable))
 .int JMPTBL(L(Fill11), L(FillTable))
 .int JMPTBL(L(Fill12), L(FillTable))
 .int JMPTBL(L(Fill13), L(FillTable))
 .int JMPTBL(L(Fill14), L(FillTable))
 .int JMPTBL(L(Fill15), L(FillTable))
 .int JMPTBL(L(Fill16), L(FillTable))
# endif
#endif

Messung V0.5 in Prozent
C=95 H=97 G=95

¤ Dauer der Verarbeitung: 0.19 Sekunden  (vorverarbeitet am  2026-06-28) ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

PVS Prover

Isabelle Prover

NIST Cobol Testsuite

Cephes Mathematical Library

Vienna Development Method

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik