xref: /minix/lib/libc/arch/i386/string/strncmp.S (revision 0a6a1f1d)
1/*
2 * Written by J.T. Conklin <jtc@NetBSD.org>.
3 * Public domain.
4 */
5
6#include <machine/asm.h>
7
8#if defined(LIBC_SCCS)
9	RCSID("$NetBSD: strncmp.S,v 1.15 2014/05/23 02:34:19 uebayasi Exp $")
10#endif
11
12/*
13 * NOTE: I've unrolled the loop eight times: large enough to make a
14 * significant difference, and small enough not to totally trash the
15 * cache.
16 */
17
18ENTRY(strncmp)
19	pushl	%ebx
20	movl	8(%esp),%eax
21	movl	12(%esp),%ecx
22	movl	16(%esp),%edx
23	testl	%edx,%edx
24	jmp	L2			/* Jump into the loop! */
25
26	_ALIGN_TEXT,0x90
27L1:	incl	%eax
28	incl	%ecx
29	decl	%edx
30L2:	jz	L4			/* strings are equal */
31	movb	(%eax),%bl
32	testb	%bl,%bl
33	jz	L3
34	cmpb	%bl,(%ecx)
35	jne	L3
36
37	incl	%eax
38	incl	%ecx
39	decl	%edx
40	jz	L4
41	movb	(%eax),%bl
42	testb	%bl,%bl
43	jz	L3
44	cmpb	%bl,(%ecx)
45	jne	L3
46
47	incl	%eax
48	incl	%ecx
49	decl	%edx
50	jz	L4
51	movb	(%eax),%bl
52	testb	%bl,%bl
53	jz	L3
54	cmpb	%bl,(%ecx)
55	jne	L3
56
57	incl	%eax
58	incl	%ecx
59	decl	%edx
60	jz	L4
61	movb	(%eax),%bl
62	testb	%bl,%bl
63	jz	L3
64	cmpb	%bl,(%ecx)
65	jne	L3
66
67	incl	%eax
68	incl	%ecx
69	decl	%edx
70	jz	L4
71	movb	(%eax),%bl
72	testb	%bl,%bl
73	jz	L3
74	cmpb	%bl,(%ecx)
75	jne	L3
76
77	incl	%eax
78	incl	%ecx
79	decl	%edx
80	jz	L4
81	movb	(%eax),%bl
82	testb	%bl,%bl
83	jz	L3
84	cmpb	%bl,(%ecx)
85	jne	L3
86
87	incl	%eax
88	incl	%ecx
89	decl	%edx
90	jz	L4
91	movb	(%eax),%bl
92	testb	%bl,%bl
93	jz	L3
94	cmpb	%bl,(%ecx)
95	jne	L3
96
97	incl	%eax
98	incl	%ecx
99	decl	%edx
100	jz	L4
101	movb	(%eax),%bl
102	testb	%bl,%bl
103	jz	L3
104	cmpb	%bl,(%ecx)
105	je	L1
106
107	_ALIGN_TEXT,0x90
108L3:	movzbl	(%eax),%eax		/* unsigned comparison */
109	movzbl	(%ecx),%ecx
110	subl	%ecx,%eax
111	popl	%ebx
112	ret
113	_ALIGN_TEXT,0x90
114L4:	xorl	%eax,%eax
115	popl	%ebx
116	ret
117END(strncmp)
118