|  | /*	$OpenBSD: strcmp.S,v 1.3 2005/08/07 11:30:38 espie Exp $ */ | 
|  | /* | 
|  | * Written by J.T. Conklin <jtc@netbsd.org>. | 
|  | * Public domain. | 
|  | */ | 
|  |  | 
|  | #include <machine/asm.h> | 
|  |  | 
|  | /* | 
|  | * NOTE: I've unrolled the loop eight times: large enough to make a | 
|  | * significant difference, and small enough not to totally trash the | 
|  | * cache. | 
|  | */ | 
|  |  | 
|  | ENTRY(strcmp) | 
|  | movl	0x04(%esp),%eax | 
|  | movl	0x08(%esp),%edx | 
|  | jmp	L2			/* Jump into the loop! */ | 
|  |  | 
|  | .align	2,0x90 | 
|  | L1:	incl	%eax | 
|  | incl	%edx | 
|  | L2:	movb	(%eax),%cl | 
|  | testb	%cl,%cl			/* null terminator??? */ | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx)		/* chars match??? */ | 
|  | jne	L3 | 
|  | incl	%eax | 
|  | incl	%edx | 
|  | movb	(%eax),%cl | 
|  | testb	%cl,%cl | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx) | 
|  | jne	L3 | 
|  | incl	%eax | 
|  | incl	%edx | 
|  | movb	(%eax),%cl | 
|  | testb	%cl,%cl | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx) | 
|  | jne	L3 | 
|  | incl	%eax | 
|  | incl	%edx | 
|  | movb	(%eax),%cl | 
|  | testb	%cl,%cl | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx) | 
|  | jne	L3 | 
|  | incl	%eax | 
|  | incl	%edx | 
|  | movb	(%eax),%cl | 
|  | testb	%cl,%cl | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx) | 
|  | jne	L3 | 
|  | incl	%eax | 
|  | incl	%edx | 
|  | movb	(%eax),%cl | 
|  | testb	%cl,%cl | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx) | 
|  | jne	L3 | 
|  | incl	%eax | 
|  | incl	%edx | 
|  | movb	(%eax),%cl | 
|  | testb	%cl,%cl | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx) | 
|  | jne	L3 | 
|  | incl	%eax | 
|  | incl	%edx | 
|  | movb	(%eax),%cl | 
|  | testb	%cl,%cl | 
|  | jz	L3 | 
|  | cmpb	%cl,(%edx) | 
|  | je	L1 | 
|  | .align 2, 0x90 | 
|  | L3:	movzbl	(%eax),%eax		/* unsigned comparison */ | 
|  | movzbl	(%edx),%edx | 
|  | subl	%edx,%eax | 
|  | ret |