xref: /openbsd-src/sys/lib/libkern/arch/i386/memcmp.S (revision 737e061132473fb2b37fc15648b2a2378e910cae)
1*737e0611Stedu/*	$OpenBSD: memcmp.S,v 1.2 2014/11/29 18:51:23 tedu Exp $	*/
2b15d0bebSmillert
3b15d0bebSmillert/*
4b15d0bebSmillert * Written by J.T. Conklin <jtc@netbsd.org>.
5b15d0bebSmillert * Public domain.
6b15d0bebSmillert */
7b15d0bebSmillert
8b15d0bebSmillert#include <machine/asm.h>
9b15d0bebSmillert
10b15d0bebSmillertENTRY(memcmp)
11b15d0bebSmillert	pushl	%edi
12b15d0bebSmillert	pushl	%esi
13b15d0bebSmillert	movl	12(%esp),%edi
14b15d0bebSmillert	movl	16(%esp),%esi
15b15d0bebSmillert
16b15d0bebSmillert	movl	20(%esp),%ecx		/* compare by words */
17b15d0bebSmillert	shrl	$2,%ecx
18b15d0bebSmillert	repe
19b15d0bebSmillert	cmpsl
20b15d0bebSmillert	jne	L5			/* do we match so far? */
21b15d0bebSmillert
22b15d0bebSmillert	movl	20(%esp),%ecx		/* compare remainder by bytes */
23b15d0bebSmillert	andl	$3,%ecx
24b15d0bebSmillert	repe
25b15d0bebSmillert	cmpsb
26b15d0bebSmillert	jne	L6			/* do we match? */
27b15d0bebSmillert
28b15d0bebSmillert	xorl	%eax,%eax		/* we match, return zero	*/
29b15d0bebSmillert	popl	%esi
30b15d0bebSmillert	popl	%edi
31b15d0bebSmillert	ret
32b15d0bebSmillert
33b15d0bebSmillertL5:	movl	$4,%ecx			/* We know that one of the next	*/
34b15d0bebSmillert	subl	%ecx,%edi		/* four pairs of bytes do not	*/
35b15d0bebSmillert	subl	%ecx,%esi		/* match.			*/
36b15d0bebSmillert	repe
37b15d0bebSmillert	cmpsb
38b15d0bebSmillertL6:	movzbl  -1(%edi),%eax		/* Perform unsigned comparison	*/
39b15d0bebSmillert	movzbl	-1(%esi),%edx
40b15d0bebSmillert	subl	%edx,%eax
41b15d0bebSmillert	popl	%esi
42b15d0bebSmillert	popl	%edi
43b15d0bebSmillert	ret
44