xref: /minix3/lib/libc/arch/i386/string/strncmp.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
12fe8fb19SBen Gras/*
22fe8fb19SBen Gras * Written by J.T. Conklin <jtc@NetBSD.org>.
32fe8fb19SBen Gras * Public domain.
42fe8fb19SBen Gras */
5cbd276e4SArun Thomas
69a21d1a2SArun Thomas#include <machine/asm.h>
79a21d1a2SArun Thomas
82fe8fb19SBen Gras#if defined(LIBC_SCCS)
9*0a6a1f1dSLionel Sambuc	RCSID("$NetBSD: strncmp.S,v 1.15 2014/05/23 02:34:19 uebayasi Exp $")
102fe8fb19SBen Gras#endif
112fe8fb19SBen Gras
122fe8fb19SBen Gras/*
132fe8fb19SBen Gras * NOTE: I've unrolled the loop eight times: large enough to make a
142fe8fb19SBen Gras * significant difference, and small enough not to totally trash the
152fe8fb19SBen Gras * cache.
162fe8fb19SBen Gras */
172fe8fb19SBen Gras
189a21d1a2SArun ThomasENTRY(strncmp)
192fe8fb19SBen Gras	pushl	%ebx
202fe8fb19SBen Gras	movl	8(%esp),%eax
212fe8fb19SBen Gras	movl	12(%esp),%ecx
222fe8fb19SBen Gras	movl	16(%esp),%edx
232fe8fb19SBen Gras	testl	%edx,%edx
242fe8fb19SBen Gras	jmp	L2			/* Jump into the loop! */
252fe8fb19SBen Gras
262fe8fb19SBen Gras	_ALIGN_TEXT,0x90
272fe8fb19SBen GrasL1:	incl	%eax
282fe8fb19SBen Gras	incl	%ecx
292fe8fb19SBen Gras	decl	%edx
302fe8fb19SBen GrasL2:	jz	L4			/* strings are equal */
312fe8fb19SBen Gras	movb	(%eax),%bl
322fe8fb19SBen Gras	testb	%bl,%bl
332fe8fb19SBen Gras	jz	L3
342fe8fb19SBen Gras	cmpb	%bl,(%ecx)
352fe8fb19SBen Gras	jne	L3
362fe8fb19SBen Gras
372fe8fb19SBen Gras	incl	%eax
382fe8fb19SBen Gras	incl	%ecx
392fe8fb19SBen Gras	decl	%edx
402fe8fb19SBen Gras	jz	L4
412fe8fb19SBen Gras	movb	(%eax),%bl
422fe8fb19SBen Gras	testb	%bl,%bl
432fe8fb19SBen Gras	jz	L3
442fe8fb19SBen Gras	cmpb	%bl,(%ecx)
452fe8fb19SBen Gras	jne	L3
462fe8fb19SBen Gras
472fe8fb19SBen Gras	incl	%eax
482fe8fb19SBen Gras	incl	%ecx
492fe8fb19SBen Gras	decl	%edx
502fe8fb19SBen Gras	jz	L4
512fe8fb19SBen Gras	movb	(%eax),%bl
522fe8fb19SBen Gras	testb	%bl,%bl
532fe8fb19SBen Gras	jz	L3
542fe8fb19SBen Gras	cmpb	%bl,(%ecx)
552fe8fb19SBen Gras	jne	L3
562fe8fb19SBen Gras
572fe8fb19SBen Gras	incl	%eax
582fe8fb19SBen Gras	incl	%ecx
592fe8fb19SBen Gras	decl	%edx
602fe8fb19SBen Gras	jz	L4
612fe8fb19SBen Gras	movb	(%eax),%bl
622fe8fb19SBen Gras	testb	%bl,%bl
632fe8fb19SBen Gras	jz	L3
642fe8fb19SBen Gras	cmpb	%bl,(%ecx)
652fe8fb19SBen Gras	jne	L3
662fe8fb19SBen Gras
672fe8fb19SBen Gras	incl	%eax
682fe8fb19SBen Gras	incl	%ecx
692fe8fb19SBen Gras	decl	%edx
702fe8fb19SBen Gras	jz	L4
712fe8fb19SBen Gras	movb	(%eax),%bl
722fe8fb19SBen Gras	testb	%bl,%bl
732fe8fb19SBen Gras	jz	L3
742fe8fb19SBen Gras	cmpb	%bl,(%ecx)
752fe8fb19SBen Gras	jne	L3
762fe8fb19SBen Gras
772fe8fb19SBen Gras	incl	%eax
782fe8fb19SBen Gras	incl	%ecx
792fe8fb19SBen Gras	decl	%edx
802fe8fb19SBen Gras	jz	L4
812fe8fb19SBen Gras	movb	(%eax),%bl
822fe8fb19SBen Gras	testb	%bl,%bl
832fe8fb19SBen Gras	jz	L3
842fe8fb19SBen Gras	cmpb	%bl,(%ecx)
852fe8fb19SBen Gras	jne	L3
862fe8fb19SBen Gras
872fe8fb19SBen Gras	incl	%eax
882fe8fb19SBen Gras	incl	%ecx
892fe8fb19SBen Gras	decl	%edx
902fe8fb19SBen Gras	jz	L4
912fe8fb19SBen Gras	movb	(%eax),%bl
922fe8fb19SBen Gras	testb	%bl,%bl
932fe8fb19SBen Gras	jz	L3
942fe8fb19SBen Gras	cmpb	%bl,(%ecx)
952fe8fb19SBen Gras	jne	L3
962fe8fb19SBen Gras
972fe8fb19SBen Gras	incl	%eax
982fe8fb19SBen Gras	incl	%ecx
992fe8fb19SBen Gras	decl	%edx
1002fe8fb19SBen Gras	jz	L4
1012fe8fb19SBen Gras	movb	(%eax),%bl
1022fe8fb19SBen Gras	testb	%bl,%bl
1032fe8fb19SBen Gras	jz	L3
1042fe8fb19SBen Gras	cmpb	%bl,(%ecx)
1052fe8fb19SBen Gras	je	L1
1062fe8fb19SBen Gras
1072fe8fb19SBen Gras	_ALIGN_TEXT,0x90
1082fe8fb19SBen GrasL3:	movzbl	(%eax),%eax		/* unsigned comparison */
1092fe8fb19SBen Gras	movzbl	(%ecx),%ecx
1102fe8fb19SBen Gras	subl	%ecx,%eax
1112fe8fb19SBen Gras	popl	%ebx
1122fe8fb19SBen Gras	ret
1132fe8fb19SBen Gras	_ALIGN_TEXT,0x90
1142fe8fb19SBen GrasL4:	xorl	%eax,%eax
1152fe8fb19SBen Gras	popl	%ebx
1162fe8fb19SBen Gras	ret
117*0a6a1f1dSLionel SambucEND(strncmp)
118