import less(1)
[unleashed/tickless.git] / usr / src / lib / libc / amd64 / gen / wslen.s
blob2a9bbddc27bc3318d5f81ad12ee0c63185ab56eb
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 "wslen.s"
30 * Wide character wcslen() implementation
32 * size_t
33 * wcslen(const wchar_t *s)
35 * const wchar_t *s0 = s + 1;
36 * while (*s++)
37 * ;
38 * return (s - s0);
40 */
42 #include <sys/asm_linkage.h>
44 ANSI_PRAGMA_WEAK(wcslen,function)
45 ANSI_PRAGMA_WEAK(wslen,function)
47 ENTRY(wcslen) /* (wchar_t *) */
48 xorl %eax,%eax
50 .align 8
51 .loop:
52 cmpl $0,(%rdi)
53 je .out0
54 cmpl $0,4(%rdi)
55 je .out1
56 cmpl $0,8(%rdi)
57 je .out2
58 cmpl $0,12(%rdi)
59 je .out3
60 addq $4,%rax
61 addq $16,%rdi
62 jmp .loop
64 .align 4
65 .out1:
66 incq %rax
67 .out0:
68 ret
70 .align 4
71 .out2:
72 addq $2,%rax
73 ret
75 .align 4
76 .out3:
77 addq $3, %rax
78 ret
79 SET_SIZE(wcslen)
81 ENTRY(wslen)
82 jmp wcslen / tail call into wcslen
83 SET_SIZE(wslen)