xref: /illumos-gate/usr/src/lib/libc/amd64/gen/wschr.S (revision d17be682a2c70b4505d43c830bbd2603da11918d)
1/*
2 * CDDL HEADER START
3 *
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.
7 *
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.
12 *
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]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27	.file	"wschr.s"
28
29/
30/ Wide character wcschr() implementation
31/
32/ Algorithm based on Solaris 2.6 gen/strchr.s implementation
33/
34
35#include <sys/asm_linkage.h>
36
37	ANSI_PRAGMA_WEAK(wcschr,function)
38	ANSI_PRAGMA_WEAK(wschr,function)
39
40	.align	8		/ accounts for .loop alignment and prolog
41
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
50
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
56
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
62
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
69
70.notfound:
71	xorl	%eax,%eax	/ %rax = NULL
72	ret
73
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)
85
86	ENTRY(wschr)
87	jmp	wcschr		/ tail call into wcschr
88	SET_SIZE(wschr)
89