import less(1)
[unleashed/tickless.git] / usr / src / lib / libc / amd64 / gen / wschr.s
blobcf02082591d01045727ced90c91c96e62d24749f
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
19 * CDDL HEADER END
23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 .file "wschr.s"
30 / Wide character wcschr() implementation
32 / Algorithm based on Solaris 2.6 gen/strchr.s implementation
35 #include <sys/asm_linkage.h>
37 ANSI_PRAGMA_WEAK(wcschr,function)
38 ANSI_PRAGMA_WEAK(wschr,function)
40 .align 8 / accounts for .loop alignment and prolog
42 ENTRY(wcschr) /* (wchar_t *s, wchar_t wc) */
43 movq %rdi,%rax
44 .loop:
45 movl (%rax),%edx / %edx = wchar of string
46 cmpl %esi,%edx / find it?
47 je .found / yes
48 testl %edx,%edx / is it null?
49 je .notfound
51 movl 4(%rax),%edx / %edx = wchar of string
52 cmpl %esi,%edx / find it?
53 je .found1 / yes
54 testl %edx,%edx / is it null?
55 je .notfound
57 movl 8(%rax),%edx / %edx = wchar of string
58 cmpl %esi,%edx / find it?
59 je .found2 / yes
60 testl %edx,%edx / is it null?
61 je .notfound
63 movl 12(%rax),%edx / %edx = wchar of string
64 cmpl %esi,%edx / find it?
65 je .found3 / yes
66 addq $16,%rax
67 testl %edx,%edx / is it null?
68 jne .loop
70 .notfound:
71 xorl %eax,%eax / %rax = NULL
72 ret
74 .found3:
75 addq $12,%rax
76 ret
77 .found2:
78 addq $8,%rax
79 ret
80 .found1:
81 addq $4,%rax
82 .found:
83 ret
84 SET_SIZE(wcschr)
86 ENTRY(wschr)
87 jmp wcschr / tail call into wcschr
88 SET_SIZE(wschr)