xref: /minix3/common/lib/libc/arch/i386/string/memcmp.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1b6cbf720SGianluca Guida/*
2b6cbf720SGianluca Guida * Written by J.T. Conklin <jtc@NetBSD.org>.
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: memcmp.S,v 1.3 2014/03/22 19:38:46 jakllsch Exp $")
10b6cbf720SGianluca Guida#endif
11b6cbf720SGianluca Guida
12b6cbf720SGianluca GuidaENTRY(memcmp)
13b6cbf720SGianluca Guida	pushl	%edi
14b6cbf720SGianluca Guida	pushl	%esi
15b6cbf720SGianluca Guida	movl	12(%esp),%edi
16b6cbf720SGianluca Guida	movl	16(%esp),%esi
17b6cbf720SGianluca Guida
18b6cbf720SGianluca Guida	movl	20(%esp),%ecx		/* compare by words */
19b6cbf720SGianluca Guida	shrl	$2,%ecx
20b6cbf720SGianluca Guida	repe
21b6cbf720SGianluca Guida	cmpsl
22b6cbf720SGianluca Guida	jne	L5			/* do we match so far? */
23b6cbf720SGianluca Guida
24b6cbf720SGianluca Guida	movl	20(%esp),%ecx		/* compare remainder by bytes */
25b6cbf720SGianluca Guida	andl	$3,%ecx
26b6cbf720SGianluca Guida	repe
27b6cbf720SGianluca Guida	cmpsb
28b6cbf720SGianluca Guida	jne	L6			/* do we match? */
29b6cbf720SGianluca Guida
30b6cbf720SGianluca Guida	xorl	%eax,%eax		/* we match, return zero	*/
31b6cbf720SGianluca Guida	popl	%esi
32b6cbf720SGianluca Guida	popl	%edi
33b6cbf720SGianluca Guida	ret
34b6cbf720SGianluca Guida
35b6cbf720SGianluca GuidaL5:	movl	$4,%ecx			/* We know that one of the next	*/
36b6cbf720SGianluca Guida	subl	%ecx,%edi		/* four pairs of bytes do not	*/
37b6cbf720SGianluca Guida	subl	%ecx,%esi		/* match.			*/
38b6cbf720SGianluca Guida	repe
39b6cbf720SGianluca Guida	cmpsb
40b6cbf720SGianluca GuidaL6:	xorl	%eax,%eax		/* Perform unsigned comparison	*/
41b6cbf720SGianluca Guida	movb	-1(%edi),%al
42b6cbf720SGianluca Guida	xorl	%edx,%edx
43b6cbf720SGianluca Guida	movb	-1(%esi),%dl
44b6cbf720SGianluca Guida	subl    %edx,%eax
45b6cbf720SGianluca Guida	popl	%esi
46b6cbf720SGianluca Guida	popl	%edi
47b6cbf720SGianluca Guida	ret
48*0a6a1f1dSLionel SambucEND(memcmp)
49