|  | /*	$OpenBSD: memcmp.S,v 1.4 2005/08/07 11:30:38 espie Exp $ */ | 
|  | /* | 
|  | * Written by J.T. Conklin <jtc@netbsd.org>. | 
|  | * Public domain. | 
|  | */ | 
|  |  | 
|  | #include <machine/asm.h> | 
|  |  | 
|  | ENTRY(memcmp) | 
|  | pushl	%edi | 
|  | pushl	%esi | 
|  | movl	12(%esp),%edi | 
|  | movl	16(%esp),%esi | 
|  | cld				/* set compare direction forward */ | 
|  |  | 
|  | movl	20(%esp),%ecx		/* compare by words */ | 
|  | shrl	$2,%ecx | 
|  | repe | 
|  | cmpsl | 
|  | jne	L5			/* do we match so far? */ | 
|  |  | 
|  | movl	20(%esp),%ecx		/* compare remainder by bytes */ | 
|  | andl	$3,%ecx | 
|  | repe | 
|  | cmpsb | 
|  | jne	L6			/* do we match? */ | 
|  |  | 
|  | xorl	%eax,%eax		/* we match, return zero	*/ | 
|  | popl	%esi | 
|  | popl	%edi | 
|  | ret | 
|  |  | 
|  | L5:	movl	$4,%ecx			/* We know that one of the next	*/ | 
|  | subl	%ecx,%edi		/* four pairs of bytes do not	*/ | 
|  | subl	%ecx,%esi		/* match.			*/ | 
|  | repe | 
|  | cmpsb | 
|  | L6:	movzbl  -1(%edi),%eax		/* Perform unsigned comparison	*/ | 
|  | movzbl	-1(%esi),%edx | 
|  | subl	%edx,%eax | 
|  | popl	%esi | 
|  | popl	%edi | 
|  | ret |