Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/lib/libc/i386/string/strncmp.S
48254 views
1
/*
2
* Copyright (c) 1993,94 Winning Strategies, Inc.
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
* 3. All advertising materials mentioning features or use of this software
14
* must display the following acknowledgement:
15
* This product includes software developed by Winning Strategies, Inc.
16
* 4. The name of the author may not be used to endorse or promote products
17
* derived from this software without specific prior written permission
18
*
19
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
*/
30
31
#include <machine/asm.h>
32
/*
33
* strncmp(s1, s2, n)
34
* return an integer greater than, equal to, or less than 0,
35
* according as the first n characters of string s1 is greater
36
* than, equal to, or less than the string s2.
37
*
38
* %eax - pointer to s1
39
* %ecx - pointer to s2
40
* %edx - length
41
*
42
* Written by:
43
* J.T. Conklin ([email protected]), Winning Strategies, Inc.
44
*/
45
46
/*
47
* I've unrolled the loop eight times: large enough to make a
48
* significant difference, and small enough not to totally trash the
49
* cache.
50
*
51
* TODO: change all the jz's back to je for consistency.
52
*/
53
54
ENTRY(strncmp)
55
pushl %ebx
56
movl 8(%esp),%eax
57
movl 12(%esp),%ecx
58
movl 16(%esp),%edx
59
testl %edx,%edx
60
jmp L2 /* Jump into the loop! */
61
62
.align 2,0x90
63
L1: incl %eax
64
incl %ecx
65
decl %edx
66
L2: jz L4 /* strings are equal */
67
movb (%eax),%bl
68
testb %bl,%bl
69
jz L3
70
cmpb %bl,(%ecx)
71
jne L3
72
73
/*
74
* XXX it might be best to move the next 4 instructions to the end of the
75
* unrolled part of the loop. The unrolled part would then be
76
* movb n(%eax),%bl; testb %bl, %bl; je L3; cmpb n(%ecx); jne L3
77
* or maybe better
78
* movb n(%eax),%bl; cmpb n(%ecx); jne L3; testb %bl,%bl; je return_0
79
* for n = 0, 1, ..., 8. The end of the loop would be
80
* L1: addl $8,%eax; addl $8,%ecx; subl $8,%edx; cmpl $8,%edx; jae Lx
81
* where residual counts of 0 to 7 are handled at Lx. However, this would
82
* be slower for short strings. Cache effects are probably not so
83
* important because we are only handling a byte at a time.
84
*/
85
incl %eax
86
incl %ecx
87
decl %edx
88
jz L4
89
movb (%eax),%bl
90
testb %bl,%bl
91
jz L3
92
cmpb %bl,(%ecx)
93
jne L3
94
95
incl %eax
96
incl %ecx
97
decl %edx
98
jz L4
99
movb (%eax),%bl
100
testb %bl,%bl
101
jz L3
102
cmpb %bl,(%ecx)
103
jne L3
104
105
incl %eax
106
incl %ecx
107
decl %edx
108
jz L4
109
movb (%eax),%bl
110
testb %bl,%bl
111
jz L3
112
cmpb %bl,(%ecx)
113
jne L3
114
115
incl %eax
116
incl %ecx
117
decl %edx
118
jz L4
119
movb (%eax),%bl
120
testb %bl,%bl
121
jz L3
122
cmpb %bl,(%ecx)
123
jne L3
124
125
incl %eax
126
incl %ecx
127
decl %edx
128
jz L4
129
movb (%eax),%bl
130
testb %bl,%bl
131
jz L3
132
cmpb %bl,(%ecx)
133
jne L3
134
135
incl %eax
136
incl %ecx
137
decl %edx
138
jz L4
139
movb (%eax),%bl
140
testb %bl,%bl
141
jz L3
142
cmpb %bl,(%ecx)
143
jne L3
144
145
incl %eax
146
incl %ecx
147
decl %edx
148
jz L4
149
movb (%eax),%bl
150
testb %bl,%bl
151
jz L3
152
cmpb %bl,(%ecx)
153
je L1
154
155
.align 2,0x90
156
L3: movzbl (%eax),%eax /* unsigned comparison */
157
movzbl (%ecx),%ecx
158
subl %ecx,%eax
159
popl %ebx
160
ret
161
.align 2,0x90
162
L4: xorl %eax,%eax
163
popl %ebx
164
ret
165
END(strncmp)
166
167
.section .note.GNU-stack,"",%progbits
168
169