xref: /freebsd/lib/libc/i386/string/strncmp.S (revision daf1cffce2e07931f27c6c6998652e90df6ba87e)
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$
31 */
32
33#if defined(LIBC_RCS) && !defined(lint)
34	.text
35        .asciz "$FreeBSD$"
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
62ENTRY(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
71L1:	incl	%eax
72	incl	%ecx
73	decl	%edx
74L2:	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
164L3:	movzbl	(%eax),%eax		/* unsigned comparison */
165	movzbl	(%ecx),%ecx
166	subl	%ecx,%eax
167	popl	%ebx
168	ret
169	.align 2,0x90
170L4:	xorl	%eax,%eax
171	popl	%ebx
172	ret
173