11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*	$OpenBSD: strcmp.S,v 1.3 2005/08/07 11:30:38 espie Exp $ */
21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Written by J.T. Conklin <jtc@netbsd.org>.
41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Public domain.
51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
7851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h>
81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/*
101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * NOTE: I've unrolled the loop eight times: large enough to make a
111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * significant difference, and small enough not to totally trash the
121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * cache.
131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */
141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectENTRY(strcmp)
161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	0x04(%esp),%eax
171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movl	0x08(%esp),%edx
181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jmp	L2			/* Jump into the loop! */
191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project
201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	.align	2,0x90
211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectL1:	incl	%eax
221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectL2:	movb	(%eax),%cl
241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl			/* null terminator??? */
251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)		/* chars match??? */
271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jne	L3
281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%eax
291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movb	(%eax),%cl
311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl
321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)
341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jne	L3
351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%eax
361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movb	(%eax),%cl
381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl
391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)
411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jne	L3
421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%eax
431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movb	(%eax),%cl
451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl
461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)
481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jne	L3
491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%eax
501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movb	(%eax),%cl
521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl
531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)
551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jne	L3
561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%eax
571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movb	(%eax),%cl
591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl
601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)
621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jne	L3
631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%eax
641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movb	(%eax),%cl
661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl
671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)
691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jne	L3
701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%eax
711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	incl	%edx
721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movb	(%eax),%cl
731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	testb	%cl,%cl
741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	jz	L3
751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	cmpb	%cl,(%edx)
761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	je	L1
771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	.align 2, 0x90
781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectL3:	movzbl	(%eax),%eax		/* unsigned comparison */
791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	movzbl	(%edx),%edx
801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	subl	%edx,%eax
811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project	ret
826719500dbd9330d7539d2db3dcf3e8ad1858c7aaElliott HughesEND(strcmp)
83