Initial import from FreeBSD RELENG_4:
[dragonfly.git] / lib / libcr / i386 / string / strncmp.S
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  * $FreeBSD: src/lib/libc/i386/string/strncmp.S,v 1.6 1999/08/27 23:59:35 peter Exp $
31  */
32
33 #if defined(LIBC_RCS) && !defined(lint)
34         .text
35         .asciz "$FreeBSD: src/lib/libc/i386/string/strncmp.S,v 1.6 1999/08/27 23:59:35 peter Exp $"
36 #endif /* LIBC_RCS and not lint */
37
38 #include "DEFS.h"
39
40 /*
41  * strncmp(s1, s2, n)
42  *      return an integer greater than, equal to, or less than 0,
43  *      according as the first n characters of string s1 is greater
44  *      than, equal to, or less than the string s2.
45  *
46  * %eax - pointer to s1
47  * %ecx - pointer to s2
48  * %edx - length
49  *
50  * Written by:
51  *      J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
52  */
53
54 /*
55  * I've unrolled the loop eight times: large enough to make a
56  * significant difference, and small enough not to totally trash the
57  * cache.
58  *
59  * TODO: change all the jz's back to je for consistency.
60  */
61
62 ENTRY(strncmp)
63         pushl   %ebx
64         movl    8(%esp),%eax
65         movl    12(%esp),%ecx
66         movl    16(%esp),%edx
67         testl   %edx,%edx
68         jmp     L2                      /* Jump into the loop! */
69
70         .align 2,0x90
71 L1:     incl    %eax
72         incl    %ecx
73         decl    %edx
74 L2:     jz      L4                      /* strings are equal */
75         movb    (%eax),%bl
76         testb   %bl,%bl
77         jz      L3
78         cmpb    %bl,(%ecx)
79         jne     L3
80
81 /*
82  * XXX it might be best to move the next 4 instructions to the end of the
83  * unrolled part of the loop.  The unrolled part would then be
84  *      movb n(%eax),%bl; testb %bl, %bl; je L3; cmpb n(%ecx); jne L3
85  * or maybe better
86  *      movb n(%eax),%bl; cmpb n(%ecx); jne L3; testb %bl,%bl; je return_0
87  * for n = 0, 1, ..., 8.  The end of the loop would be
88  *      L1: addl $8,%eax; addl $8,%ecx; subl $8,%edx; cmpl $8,%edx; jae Lx
89  * where residual counts of 0 to 7 are handled at Lx.  However, this would
90  * be slower for short strings.  Cache effects are probably not so
91  * important because we are only handling a byte at a time.
92  */
93         incl    %eax
94         incl    %ecx
95         decl    %edx
96         jz      L4
97         movb    (%eax),%bl
98         testb   %bl,%bl
99         jz      L3
100         cmpb    %bl,(%ecx)
101         jne     L3
102
103         incl    %eax
104         incl    %ecx
105         decl    %edx
106         jz      L4
107         movb    (%eax),%bl
108         testb   %bl,%bl
109         jz      L3
110         cmpb    %bl,(%ecx)
111         jne     L3
112
113         incl    %eax
114         incl    %ecx
115         decl    %edx
116         jz      L4
117         movb    (%eax),%bl
118         testb   %bl,%bl
119         jz      L3
120         cmpb    %bl,(%ecx)
121         jne     L3
122
123         incl    %eax
124         incl    %ecx
125         decl    %edx
126         jz      L4
127         movb    (%eax),%bl
128         testb   %bl,%bl
129         jz      L3
130         cmpb    %bl,(%ecx)
131         jne     L3
132
133         incl    %eax
134         incl    %ecx
135         decl    %edx
136         jz      L4
137         movb    (%eax),%bl
138         testb   %bl,%bl
139         jz      L3
140         cmpb    %bl,(%ecx)
141         jne     L3
142
143         incl    %eax
144         incl    %ecx
145         decl    %edx
146         jz      L4
147         movb    (%eax),%bl
148         testb   %bl,%bl
149         jz      L3
150         cmpb    %bl,(%ecx)
151         jne     L3
152
153         incl    %eax
154         incl    %ecx
155         decl    %edx
156         jz      L4
157         movb    (%eax),%bl
158         testb   %bl,%bl
159         jz      L3
160         cmpb    %bl,(%ecx)
161         je      L1
162
163         .align 2,0x90
164 L3:     movzbl  (%eax),%eax             /* unsigned comparison */
165         movzbl  (%ecx),%ecx
166         subl    %ecx,%eax
167         popl    %ebx
168         ret
169         .align 2,0x90
170 L4:     xorl    %eax,%eax
171         popl    %ebx
172         ret