1/*-
2 * Copyright (c) 2003 Tim J. Robbins.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <machine/asm.h>
28/*
29 * wchar_t *
30 * wmemchr(const wchar_t *buf, wchar_t c, size_t n) --
31 *	Search the wide character array `buf', which has length `n',
32 *	the character `c', return a pointer to it if found, or NULL on
33 *	failure.
34 */
35ENTRY(wmemchr)
36	pushl	%edi
37	pushl	%ebx
38	movl	12(%esp),%edi		/* Buffer */
39	movl	16(%esp),%eax		/* Wide character */
40	movl	20(%esp),%ecx		/* Length of buffer */
41
42	/*
43	 * Search in chunks of 8 wide characters (32 bytes).
44	 */
45	movl	%ecx,%ebx
46	shrl	$3,%ecx
47	jz	small
48.p2align 4,0x90
49bigloop:cmpl	%eax,(%edi)
50	je	found
51	cmpl	%eax,4(%edi)
52	je	found4
53	cmpl	%eax,8(%edi)
54	je	found8
55	cmpl	%eax,12(%edi)
56	je	found12
57	cmpl	%eax,16(%edi)
58	je	found16
59	cmpl	%eax,20(%edi)
60	je	found20
61	cmpl	%eax,24(%edi)
62	je	found24
63	cmpl	%eax,28(%edi)
64	je	found28
65	leal	32(%edi),%edi
66	decl	%ecx
67	jnz	bigloop
68	jmp	small
69found:	movl	%edi,%eax
70	popl	%ebx
71	popl	%edi
72	ret
73found4:	leal	4(%edi),%edi
74	jmp	found
75found8:	leal	8(%edi),%edi
76	jmp	found
77found12:leal	12(%edi),%edi
78	jmp	found
79found16:leal	16(%edi),%edi
80	jmp	found
81found20:leal	20(%edi),%edi
82	jmp	found
83found24:leal	24(%edi),%edi
84	jmp	found
85found28:leal	28(%edi),%edi
86	jmp	found
87
88	/*
89	 * Search remaining part of string.
90	 */
91small:	movl	%ebx,%ecx
92	andl	$7,%ecx
93	jz	no
94.p2align 2,0x90
95smltop:	cmpl	%eax,(%edi)
96	je	found
97	leal	4(%edi),%edi
98	decl	%ecx
99	jnz	smltop
100no:	xorl	%eax,%eax
101	popl	%ebx
102	popl	%edi
103	ret
104END(wmemchr)
105
106	.section .note.GNU-stack,"",%progbits
107