Updated to fedora-glibc-20090414T2104
[glibc.git] / sysdeps / x86_64 / strrchr.S
blobc75b485ca3ecc8e61b0589e734dfe93bb6eb32f6
1 /* strrchr (str, ch) -- Return pointer to last occurrence of CH in STR.
2    For AMD x86-64.
3    Copyright (C) 2009 Free Software Foundation, Inc.
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 #include <sysdep.h>
24         .text
25 ENTRY (strrchr)
26         movd    %esi, %xmm1
27         movq    %rdi, %rcx
28         punpcklbw %xmm1, %xmm1
29         andq    $~15, %rdi
30         pxor    %xmm2, %xmm2
31         punpcklbw %xmm1, %xmm1
32         orl     $0xffffffff, %esi
33         movdqa  (%rdi), %xmm0
34         pshufd  $0, %xmm1, %xmm1
35         subq    %rdi, %rcx
36         movdqa  %xmm0, %xmm3
37         leaq    16(%rdi), %rdi
38         pcmpeqb %xmm1, %xmm0
39         pcmpeqb %xmm2, %xmm3
40         shl     %cl, %esi
41         pmovmskb %xmm0, %edx
42         pmovmskb %xmm3, %ecx
43         andl    %esi, %edx
44         andl    %esi, %ecx
45         xorl    %eax, %eax
46         movl    %edx, %esi
47         orl     %ecx, %esi
48         jnz     1f
50 2:      movdqa  (%rdi), %xmm0
51         leaq    16(%rdi), %rdi
52         movdqa  %xmm0, %xmm3
53         pcmpeqb %xmm1, %xmm0
54         pcmpeqb %xmm2, %xmm3
55         pmovmskb %xmm0, %edx
56         pmovmskb %xmm3, %ecx
57         movl    %edx, %esi
58         orl     %ecx, %esi
59         jz      2b
61 1:      bsfl    %ecx, %r9d
62         movl    $0xffffffff, %r8d
63         movl    $31, %ecx
64         jnz     5f
66         bsrl    %edx, %edx
67         jz      2b
68         leaq    -16(%rdi,%rdx), %rax
69         jmp     2b
71 5:      subl    %r9d, %ecx
72         shrl    %cl, %r8d
73         andl    %r8d, %edx
74         bsrl    %edx, %edx
75         jz      4f
76         leaq    -16(%rdi,%rdx), %rax
77 4:      ret
78 END (strrchr)
80 weak_alias (strrchr, rindex)
81 libc_hidden_builtin_def (strrchr)