xref: /openbsd-src/sys/lib/libkern/arch/amd64/strcmp.S (revision 28c675773680115a49ba777d0361775c11aa12d6)
1*28c67577Sguenther/*	$OpenBSD: strcmp.S,v 1.6 2022/12/07 19:26:39 guenther Exp $	*/
28c688dc9Sreyk/*	$NetBSD: strcmp.S,v 1.2 2014/03/22 19:16:34 jakllsch Exp $	*/
38c688dc9Sreyk
4f5df1827Smickey/*
58c688dc9Sreyk * Written by J.T. Conklin <jtc@acorntoolworks.com>
6f5df1827Smickey * Public domain.
7f5df1827Smickey */
8f5df1827Smickey
9f5df1827Smickey#include <machine/asm.h>
10f5df1827Smickey
11f5df1827SmickeyENTRY(strcmp)
121d66f0a0Smortimer	RETGUARD_SETUP(strcmp, r10)
138c688dc9Sreyk	/*
148c688dc9Sreyk	 * Align s1 to word boundary.
158c688dc9Sreyk	 * Consider unrolling loop?
168c688dc9Sreyk	 */
178c688dc9Sreyk.Ls1align:
188c688dc9Sreyk	testb	$7,%dil
198c688dc9Sreyk	je	.Ls1aligned
208c688dc9Sreyk	movb	(%rdi),%al
21f5df1827Smickey	incq	%rdi
228c688dc9Sreyk	movb	(%rsi),%dl
23f5df1827Smickey	incq	%rsi
248c688dc9Sreyk	testb	%al,%al
258c688dc9Sreyk	je	.Ldone
268c688dc9Sreyk	cmpb	%al,%dl
278c688dc9Sreyk	je	.Ls1align
288c688dc9Sreyk	jmp	.Ldone
29f5df1827Smickey
308c688dc9Sreyk	/*
318c688dc9Sreyk	 * Check whether s2 is aligned to a word boundary.  If it is, we
328c688dc9Sreyk	 * can compare by words.  Otherwise we have to compare by bytes.
338c688dc9Sreyk	 */
348c688dc9Sreyk.Ls1aligned:
358c688dc9Sreyk	testb	$7,%sil
368c688dc9Sreyk	jne	.Lbyte_loop
37f5df1827Smickey
388c688dc9Sreyk	movabsq	$0x0101010101010101,%r8
398c688dc9Sreyk	subq	$8,%rdi
408c688dc9Sreyk	movabsq	$0x8080808080808080,%r9
418c688dc9Sreyk	subq	$8,%rsi
42f5df1827Smickey
438c688dc9Sreyk	_ALIGN_TEXT
448c688dc9Sreyk.Lword_loop:
458c688dc9Sreyk	movq	8(%rdi),%rax
468c688dc9Sreyk	addq	$8,%rdi
478c688dc9Sreyk	movq	8(%rsi),%rdx
488c688dc9Sreyk	addq	$8,%rsi
498c688dc9Sreyk	cmpq	%rax,%rdx
508c688dc9Sreyk	jne	.Lbyte_loop
518c688dc9Sreyk	subq	%r8,%rdx
528c688dc9Sreyk	notq	%rax
538c688dc9Sreyk	andq	%rax,%rdx
548c688dc9Sreyk	testq	%r9,%rdx
558c688dc9Sreyk	je	.Lword_loop
56f5df1827Smickey
578c688dc9Sreyk	_ALIGN_TEXT
588c688dc9Sreyk.Lbyte_loop:
598c688dc9Sreyk	movb	(%rdi),%al
60f5df1827Smickey	incq	%rdi
618c688dc9Sreyk	movb	(%rsi),%dl
62f5df1827Smickey	incq	%rsi
638c688dc9Sreyk	testb	%al,%al
648c688dc9Sreyk	je	.Ldone
658c688dc9Sreyk	cmpb	%al,%dl
668c688dc9Sreyk	je	.Lbyte_loop
67f5df1827Smickey
688c688dc9Sreyk.Ldone:
698c688dc9Sreyk	movzbq	%al,%rax
708c688dc9Sreyk	movzbq	%dl,%rdx
718c688dc9Sreyk	subq	%rdx,%rax
721d66f0a0Smortimer	RETGUARD_CHECK(strcmp, r10)
73f5df1827Smickey	ret
74fc541c5dSguenther	lfence
75*28c67577SguentherEND(strcmp)
76