Work around old buggy program which cannot cope with memcpy semantics.
[glibc.git] / sysdeps / x86_64 / multiarch / strlen-sse4.S
blob6b16ea7fa645829600dda58c86ea8639943f9575
1 /* strlen with SSE4
2    Copyright (C) 2009, 2010 Free Software Foundation, Inc.
3    Contributed by Ulrich Drepper <drepper@redhat.com>.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 #if defined SHARED && !defined NOT_IN_libc
23 #include <sysdep.h>
25         .section .text.sse4.2,"ax",@progbits
26 ENTRY (__strlen_sse42)
27         pxor    %xmm1, %xmm1
28         movl    %edi, %ecx
29         movq    %rdi, %r8
30         andq    $~15, %rdi
31         xor     %edi, %ecx
32         pcmpeqb (%rdi), %xmm1
33         pmovmskb %xmm1, %edx
34         shrl    %cl, %edx
35         shll    %cl, %edx
36         andl    %edx, %edx
37         jnz     L(less16bytes)
38         pxor    %xmm1, %xmm1
40         .p2align 4
41 L(more64bytes_loop):
42         pcmpistri $0x08, 16(%rdi), %xmm1
43         jz      L(more32bytes)
45         pcmpistri $0x08, 32(%rdi), %xmm1
46         jz      L(more48bytes)
48         pcmpistri $0x08, 48(%rdi), %xmm1
49         jz      L(more64bytes)
51         add     $64, %rdi
52         pcmpistri $0x08, (%rdi), %xmm1
53         jnz     L(more64bytes_loop)
54         leaq    (%rdi,%rcx), %rax
55         subq    %r8, %rax
56         ret
58         .p2align 4
59 L(more32bytes):
60         leaq    16(%rdi,%rcx, 1), %rax
61         subq    %r8, %rax
62         ret
64         .p2align 4
65 L(more48bytes):
66         leaq    32(%rdi,%rcx, 1), %rax
67         subq    %r8, %rax
68         ret
70         .p2align 4
71 L(more64bytes):
72         leaq    48(%rdi,%rcx, 1), %rax
73         subq    %r8, %rax
74         ret
76         .p2align 4
77 L(less16bytes):
78         subq    %r8, %rdi
79         bsfl    %edx, %eax
80         addq    %rdi, %rax
81         ret
83 END (__strlen_sse42)
85 #endif