Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/i386/string/wmemchr.S
48254 views
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
*/
35
ENTRY(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
49
bigloop: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
69
found: movl %edi,%eax
70
popl %ebx
71
popl %edi
72
ret
73
found4: leal 4(%edi),%edi
74
jmp found
75
found8: leal 8(%edi),%edi
76
jmp found
77
found12:leal 12(%edi),%edi
78
jmp found
79
found16:leal 16(%edi),%edi
80
jmp found
81
found20:leal 20(%edi),%edi
82
jmp found
83
found24:leal 24(%edi),%edi
84
jmp found
85
found28:leal 28(%edi),%edi
86
jmp found
87
88
/*
89
* Search remaining part of string.
90
*/
91
small: movl %ebx,%ecx
92
andl $7,%ecx
93
jz no
94
.p2align 2,0x90
95
smltop: cmpl %eax,(%edi)
96
je found
97
leal 4(%edi),%edi
98
decl %ecx
99
jnz smltop
100
no: xorl %eax,%eax
101
popl %ebx
102
popl %edi
103
ret
104
END(wmemchr)
105
106
.section .note.GNU-stack,"",%progbits
107
108