xref: /minix3/common/lib/libc/arch/i386/string/strcmp.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1b6cbf720SGianluca Guida/*
2b6cbf720SGianluca Guida * Written by J.T. Conklin <jtc@acorntoolworks.com>
3b6cbf720SGianluca Guida * Public domain.
4b6cbf720SGianluca Guida */
5b6cbf720SGianluca Guida
6b6cbf720SGianluca Guida#include <machine/asm.h>
7b6cbf720SGianluca Guida
8b6cbf720SGianluca Guida#if defined(LIBC_SCCS)
9*0a6a1f1dSLionel Sambuc	RCSID("$NetBSD: strcmp.S,v 1.2 2014/03/22 19:38:46 jakllsch Exp $")
10b6cbf720SGianluca Guida#endif
11b6cbf720SGianluca Guida
12b6cbf720SGianluca GuidaENTRY(strcmp)
13b6cbf720SGianluca Guida	pushl	%esi
14b6cbf720SGianluca Guida	pushl	%ebx
15b6cbf720SGianluca Guida	movl	12(%esp),%ebx
16b6cbf720SGianluca Guida	movl	16(%esp),%esi
17b6cbf720SGianluca Guida
18b6cbf720SGianluca Guida	/*
19b6cbf720SGianluca Guida	 * Align s1 to word boundary.
20b6cbf720SGianluca Guida	 * Consider unrolling loop?
21b6cbf720SGianluca Guida	 */
22b6cbf720SGianluca Guida.Ls1align:
23b6cbf720SGianluca Guida	testb	$3,%bl
24b6cbf720SGianluca Guida	je	.Ls1aligned
25b6cbf720SGianluca Guida	movb	(%ebx),%al
26b6cbf720SGianluca Guida	incl	%ebx
27b6cbf720SGianluca Guida	movb	(%esi),%dl
28b6cbf720SGianluca Guida	incl	%esi
29b6cbf720SGianluca Guida	testb	%al,%al
30b6cbf720SGianluca Guida	je	.Ldone
31b6cbf720SGianluca Guida	cmpb	%al,%dl
32b6cbf720SGianluca Guida	je	.Ls1align
33b6cbf720SGianluca Guida	jmp	.Ldone
34b6cbf720SGianluca Guida
35b6cbf720SGianluca Guida	/*
36b6cbf720SGianluca Guida	 * Check whether s2 is aligned to a word boundary.  If it is, we
37b6cbf720SGianluca Guida	 * can compare by words.  Otherwise we have to compare by bytes.
38b6cbf720SGianluca Guida	 */
39b6cbf720SGianluca Guida.Ls1aligned:
40b6cbf720SGianluca Guida	testl	$3,%esi
41b6cbf720SGianluca Guida	jne	.Lbyte_loop
42b6cbf720SGianluca Guida
43b6cbf720SGianluca Guida	subl	$4,%ebx
44b6cbf720SGianluca Guida	subl	$4,%esi
45b6cbf720SGianluca Guida
46b6cbf720SGianluca Guida	_ALIGN_TEXT
47b6cbf720SGianluca Guida.Lword_loop:
48b6cbf720SGianluca Guida	movl	4(%ebx),%eax
49b6cbf720SGianluca Guida	addl	$4,%ebx
50b6cbf720SGianluca Guida	movl	4(%esi),%edx
51b6cbf720SGianluca Guida	addl	$4,%esi
52b6cbf720SGianluca Guida	cmpl	%eax,%edx
53b6cbf720SGianluca Guida	jne	.Lbyte_loop
54b6cbf720SGianluca Guida	subl	$0x01010101,%edx
55b6cbf720SGianluca Guida	notl	%eax
56b6cbf720SGianluca Guida	andl	%eax,%edx
57b6cbf720SGianluca Guida	testl	$0x80808080,%edx
58b6cbf720SGianluca Guida	je	.Lword_loop
59b6cbf720SGianluca Guida
60b6cbf720SGianluca Guida	_ALIGN_TEXT
61b6cbf720SGianluca Guida.Lbyte_loop:
62b6cbf720SGianluca Guida	movb	(%ebx),%al
63b6cbf720SGianluca Guida	incl	%ebx
64b6cbf720SGianluca Guida	movb	(%esi),%dl
65b6cbf720SGianluca Guida	incl	%esi
66b6cbf720SGianluca Guida	testb	%al,%al
67b6cbf720SGianluca Guida	je	.Ldone
68b6cbf720SGianluca Guida	cmpb	%al,%dl
69b6cbf720SGianluca Guida	je	.Lbyte_loop
70b6cbf720SGianluca Guida
71b6cbf720SGianluca Guida.Ldone:
72b6cbf720SGianluca Guida	movzbl	%al,%eax
73b6cbf720SGianluca Guida	movzbl	%dl,%edx
74b6cbf720SGianluca Guida	subl	%edx,%eax
75b6cbf720SGianluca Guida	popl	%ebx
76b6cbf720SGianluca Guida	popl	%esi
77b6cbf720SGianluca Guida	ret
78*0a6a1f1dSLionel SambucEND(strcmp)
79