xref: /minix3/lib/libc/arch/x86_64/string/strncmp.S (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
12fe8fb19SBen Gras/*
22fe8fb19SBen Gras * Written by J.T. Conklin <jtc@NetBSD.org>.
32fe8fb19SBen Gras * Public domain.
42fe8fb19SBen Gras */
52fe8fb19SBen Gras
62fe8fb19SBen Gras#include <machine/asm.h>
72fe8fb19SBen Gras
82fe8fb19SBen Gras#if defined(LIBC_SCCS)
9*0a6a1f1dSLionel Sambuc        RCSID("$NetBSD: strncmp.S,v 1.4 2014/05/22 15:01:57 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
182fe8fb19SBen GrasENTRY(strncmp)
192fe8fb19SBen Gras	testq	%rdx,%rdx
202fe8fb19SBen Gras	jmp	L2			/* Jump into the loop! */
212fe8fb19SBen Gras
222fe8fb19SBen GrasL1:	incq	%rdi
232fe8fb19SBen Gras	incq	%rsi
242fe8fb19SBen Gras	decq	%rdx
252fe8fb19SBen GrasL2:	jz	L4			/* strings are equal */
262fe8fb19SBen Gras	movb	(%rdi),%al
272fe8fb19SBen Gras	testb	%al,%al
282fe8fb19SBen Gras	jz	L3
292fe8fb19SBen Gras	cmpb	%al,(%rsi)
302fe8fb19SBen Gras	jne	L3
312fe8fb19SBen Gras
322fe8fb19SBen Gras	incq	%rdi
332fe8fb19SBen Gras	incq	%rsi
342fe8fb19SBen Gras	decq	%rdx
352fe8fb19SBen Gras	jz	L4
362fe8fb19SBen Gras	movb	(%rdi),%al
372fe8fb19SBen Gras	testb	%al,%al
382fe8fb19SBen Gras	jz	L3
392fe8fb19SBen Gras	cmpb	%al,(%rsi)
402fe8fb19SBen Gras	jne	L3
412fe8fb19SBen Gras
422fe8fb19SBen Gras	incq	%rdi
432fe8fb19SBen Gras	incq	%rsi
442fe8fb19SBen Gras	decq	%rdx
452fe8fb19SBen Gras	jz	L4
462fe8fb19SBen Gras	movb	(%rdi),%al
472fe8fb19SBen Gras	testb	%al,%al
482fe8fb19SBen Gras	jz	L3
492fe8fb19SBen Gras	cmpb	%al,(%rsi)
502fe8fb19SBen Gras	jne	L3
512fe8fb19SBen Gras
522fe8fb19SBen Gras	incq	%rdi
532fe8fb19SBen Gras	incq	%rsi
542fe8fb19SBen Gras	decq	%rdx
552fe8fb19SBen Gras	jz	L4
562fe8fb19SBen Gras	movb	(%rdi),%al
572fe8fb19SBen Gras	testb	%al,%al
582fe8fb19SBen Gras	jz	L3
592fe8fb19SBen Gras	cmpb	%al,(%rsi)
602fe8fb19SBen Gras	jne	L3
612fe8fb19SBen Gras
622fe8fb19SBen Gras	incq	%rdi
632fe8fb19SBen Gras	incq	%rsi
642fe8fb19SBen Gras	decq	%rdx
652fe8fb19SBen Gras	jz	L4
662fe8fb19SBen Gras	movb	(%rdi),%al
672fe8fb19SBen Gras	testb	%al,%al
682fe8fb19SBen Gras	jz	L3
692fe8fb19SBen Gras	cmpb	%al,(%rsi)
702fe8fb19SBen Gras	jne	L3
712fe8fb19SBen Gras
722fe8fb19SBen Gras	incq	%rdi
732fe8fb19SBen Gras	incq	%rsi
742fe8fb19SBen Gras	decq	%rdx
752fe8fb19SBen Gras	jz	L4
762fe8fb19SBen Gras	movb	(%rdi),%al
772fe8fb19SBen Gras	testb	%al,%al
782fe8fb19SBen Gras	jz	L3
792fe8fb19SBen Gras	cmpb	%al,(%rsi)
802fe8fb19SBen Gras	jne	L3
812fe8fb19SBen Gras
822fe8fb19SBen Gras	incq	%rdi
832fe8fb19SBen Gras	incq	%rsi
842fe8fb19SBen Gras	decq	%rdx
852fe8fb19SBen Gras	jz	L4
862fe8fb19SBen Gras	movb	(%rdi),%al
872fe8fb19SBen Gras	testb	%al,%al
882fe8fb19SBen Gras	jz	L3
892fe8fb19SBen Gras	cmpb	%al,(%rsi)
902fe8fb19SBen Gras	jne	L3
912fe8fb19SBen Gras
922fe8fb19SBen Gras	incq	%rdi
932fe8fb19SBen Gras	incq	%rsi
942fe8fb19SBen Gras	decq	%rdx
952fe8fb19SBen Gras	jz	L4
962fe8fb19SBen Gras	movb	(%rdi),%al
972fe8fb19SBen Gras	testb	%al,%al
982fe8fb19SBen Gras	jz	L3
992fe8fb19SBen Gras	cmpb	%al,(%rsi)
1002fe8fb19SBen Gras	je	L1
1012fe8fb19SBen Gras
1022fe8fb19SBen GrasL3:	movzbl	(%rdi),%eax		/* unsigned comparison */
1032fe8fb19SBen Gras	movzbl	(%rsi),%ecx
1042fe8fb19SBen Gras	subl	%ecx,%eax
1052fe8fb19SBen Gras	ret
1062fe8fb19SBen GrasL4:	xorl	%eax,%eax
1072fe8fb19SBen Gras	ret
108*0a6a1f1dSLionel SambucEND(strncmp)
109