xref: /openbsd-src/lib/libc/arch/i386/string/memcmp.S (revision ea6088e7d368d53c49ebfdf4520275cec2f78f5b)
1*ea6088e7Sguenther/*	$OpenBSD: memcmp.S,v 1.6 2017/11/29 05:13:57 guenther Exp $ */
2df930be7Sderaadt/*
3df930be7Sderaadt * Written by J.T. Conklin <jtc@netbsd.org>.
4df930be7Sderaadt * Public domain.
5df930be7Sderaadt */
6df930be7Sderaadt
7*ea6088e7Sguenther#include "DEFS.h"
8df930be7Sderaadt
9df930be7SderaadtENTRY(memcmp)
10df930be7Sderaadt	pushl	%edi
11df930be7Sderaadt	pushl	%esi
12df930be7Sderaadt	movl	12(%esp),%edi
13df930be7Sderaadt	movl	16(%esp),%esi
14df930be7Sderaadt	cld				/* set compare direction forward */
15df930be7Sderaadt
16df930be7Sderaadt	movl	20(%esp),%ecx		/* compare by words */
17df930be7Sderaadt	shrl	$2,%ecx
18df930be7Sderaadt	repe
19df930be7Sderaadt	cmpsl
20df930be7Sderaadt	jne	L5			/* do we match so far? */
21df930be7Sderaadt
22df930be7Sderaadt	movl	20(%esp),%ecx		/* compare remainder by bytes */
23df930be7Sderaadt	andl	$3,%ecx
24df930be7Sderaadt	repe
25df930be7Sderaadt	cmpsb
26df930be7Sderaadt	jne	L6			/* do we match? */
27df930be7Sderaadt
28df930be7Sderaadt	xorl	%eax,%eax		/* we match, return zero	*/
29df930be7Sderaadt	popl	%esi
30df930be7Sderaadt	popl	%edi
31df930be7Sderaadt	ret
32df930be7Sderaadt
33df930be7SderaadtL5:	movl	$4,%ecx			/* We know that one of the next	*/
34df930be7Sderaadt	subl	%ecx,%edi		/* four pairs of bytes do not	*/
35df930be7Sderaadt	subl	%ecx,%esi		/* match.			*/
36df930be7Sderaadt	repe
37df930be7Sderaadt	cmpsb
38df930be7SderaadtL6:	movzbl  -1(%edi),%eax		/* Perform unsigned comparison	*/
39df930be7Sderaadt	movzbl	-1(%esi),%edx
40df930be7Sderaadt	subl	%edx,%eax
41df930be7Sderaadt	popl	%esi
42df930be7Sderaadt	popl	%edi
43df930be7Sderaadt	ret
449b9d2a55SguentherEND_STRONG(memcmp)
45