| /*	$OpenBSD: strncmp.S,v 1.3 2005/08/07 11:30:38 espie Exp $ */ | 
 | /* | 
 |  * Written by J.T. Conklin <jtc@netbsd.org>. | 
 |  * Public domain. | 
 |  */ | 
 |  | 
 | #include <private/bionic_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(strncmp) | 
 | 	pushl	%ebx | 
 | 	movl	8(%esp),%eax | 
 | 	movl	12(%esp),%ecx | 
 | 	movl	16(%esp),%edx | 
 | 	testl	%edx,%edx | 
 | 	jmp	L2			/* Jump into the loop! */ | 
 |  | 
 | 	.align 2,0x90 | 
 | L1:	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | L2:	jz	L4			/* strings are equal */ | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	jne	L3 | 
 |  | 
 | 	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | 	jz	L4 | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	jne	L3 | 
 |  | 
 | 	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | 	jz	L4 | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	jne	L3 | 
 |  | 
 | 	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | 	jz	L4 | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	jne	L3 | 
 |  | 
 | 	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | 	jz	L4 | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	jne	L3 | 
 |  | 
 | 	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | 	jz	L4 | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	jne	L3 | 
 |  | 
 | 	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | 	jz	L4 | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	jne	L3 | 
 |  | 
 | 	incl	%eax | 
 | 	incl	%ecx | 
 | 	decl	%edx | 
 | 	jz	L4 | 
 | 	movb	(%eax),%bl | 
 | 	testb	%bl,%bl | 
 | 	jz	L3 | 
 | 	cmpb	%bl,(%ecx) | 
 | 	je	L1 | 
 |  | 
 | 	.align 2,0x90 | 
 | L3:	movzbl	(%eax),%eax		/* unsigned comparision */ | 
 | 	movzbl	(%ecx),%ecx | 
 | 	subl	%ecx,%eax | 
 | 	popl	%ebx | 
 | 	ret | 
 | 	.align 2,0x90 | 
 | L4:	xorl	%eax,%eax | 
 | 	popl	%ebx | 
 | 	ret | 
 | END(strncmp) |