11.1Schristos/*
21.1Schristos * Written by J.T. Conklin <jtc@acorntoolworks.com>
31.1Schristos * Public domain.
41.1Schristos */
51.1Schristos
61.1Schristos#include <machine/asm.h>
71.1Schristos
81.1Schristos#if defined(LIBC_SCCS)
91.2Sjakllsch	RCSID("$NetBSD: strcmp.S,v 1.2 2014/03/22 19:16:34 jakllsch Exp $")
101.1Schristos#endif
111.1Schristos
121.1SchristosENTRY(strcmp)
131.1Schristos	/*
141.1Schristos	 * Align s1 to word boundary.
151.1Schristos	 * Consider unrolling loop?
161.1Schristos	 */
171.1Schristos.Ls1align:
181.1Schristos	testb	$7,%dil
191.1Schristos	je	.Ls1aligned
201.1Schristos	movb	(%rdi),%al
211.1Schristos	incq	%rdi
221.1Schristos	movb	(%rsi),%dl
231.1Schristos	incq	%rsi
241.1Schristos	testb	%al,%al
251.1Schristos	je	.Ldone
261.1Schristos	cmpb	%al,%dl
271.1Schristos	je	.Ls1align
281.1Schristos	jmp	.Ldone
291.1Schristos
301.1Schristos	/*
311.1Schristos	 * Check whether s2 is aligned to a word boundary.  If it is, we
321.1Schristos	 * can compare by words.  Otherwise we have to compare by bytes.
331.1Schristos	 */
341.1Schristos.Ls1aligned:
351.1Schristos	testb	$7,%sil
361.1Schristos	jne	.Lbyte_loop
371.1Schristos
381.1Schristos	movabsq	$0x0101010101010101,%r8
391.1Schristos	subq	$8,%rdi
401.1Schristos	movabsq	$0x8080808080808080,%r9
411.1Schristos	subq	$8,%rsi
421.1Schristos
431.1Schristos	_ALIGN_TEXT
441.1Schristos.Lword_loop:
451.1Schristos	movq	8(%rdi),%rax
461.1Schristos	addq	$8,%rdi
471.1Schristos	movq	8(%rsi),%rdx
481.1Schristos	addq	$8,%rsi
491.1Schristos	cmpq	%rax,%rdx
501.1Schristos	jne	.Lbyte_loop
511.1Schristos	subq	%r8,%rdx
521.1Schristos	notq	%rax
531.1Schristos	andq	%rax,%rdx
541.1Schristos	testq	%r9,%rdx
551.1Schristos	je	.Lword_loop
561.1Schristos
571.1Schristos	_ALIGN_TEXT
581.1Schristos.Lbyte_loop:
591.1Schristos	movb	(%rdi),%al
601.1Schristos	incq	%rdi
611.1Schristos	movb	(%rsi),%dl
621.1Schristos	incq	%rsi
631.1Schristos	testb	%al,%al
641.1Schristos	je	.Ldone
651.1Schristos	cmpb	%al,%dl
661.1Schristos	je	.Lbyte_loop
671.1Schristos
681.1Schristos.Ldone:
691.1Schristos	movzbq	%al,%rax
701.1Schristos	movzbq	%dl,%rdx
711.1Schristos	subq	%rdx,%rax
721.1Schristos	ret
731.2SjakllschEND(strcmp)
74