xref: /openbsd-src/lib/libc/arch/amd64/string/strcmp.S (revision 631951aab24dc7dce7719dfa2487185ea5ef120f)
1*631951aaSmortimer/*	$OpenBSD: strcmp.S,v 1.8 2018/07/03 23:14:05 mortimer Exp $	*/
2c2a49701Sreyk/*	$NetBSD: strcmp.S,v 1.2 2014/03/22 19:16:34 jakllsch Exp $	*/
3c2a49701Sreyk
45b859c19Sderaadt/*
5c2a49701Sreyk * Written by J.T. Conklin <jtc@acorntoolworks.com>
65b859c19Sderaadt * Public domain.
75b859c19Sderaadt */
85b859c19Sderaadt
9b4551fdeSguenther#include "DEFS.h"
105b859c19Sderaadt
115b859c19SderaadtENTRY(strcmp)
12*631951aaSmortimer	RETGUARD_SETUP(strcmp, r11)
13c2a49701Sreyk	/*
14c2a49701Sreyk	 * Align s1 to word boundary.
15c2a49701Sreyk	 * Consider unrolling loop?
16c2a49701Sreyk	 */
17c2a49701Sreyk.Ls1align:
18c2a49701Sreyk	testb	$7,%dil
19c2a49701Sreyk	je	.Ls1aligned
20c2a49701Sreyk	movb	(%rdi),%al
215b859c19Sderaadt	incq	%rdi
22c2a49701Sreyk	movb	(%rsi),%dl
235b859c19Sderaadt	incq	%rsi
24c2a49701Sreyk	testb	%al,%al
25c2a49701Sreyk	je	.Ldone
26c2a49701Sreyk	cmpb	%al,%dl
27c2a49701Sreyk	je	.Ls1align
28c2a49701Sreyk	jmp	.Ldone
295b859c19Sderaadt
30c2a49701Sreyk	/*
31c2a49701Sreyk	 * Check whether s2 is aligned to a word boundary.  If it is, we
32c2a49701Sreyk	 * can compare by words.  Otherwise we have to compare by bytes.
33c2a49701Sreyk	 */
34c2a49701Sreyk.Ls1aligned:
35c2a49701Sreyk	testb	$7,%sil
36c2a49701Sreyk	jne	.Lbyte_loop
375b859c19Sderaadt
38c2a49701Sreyk	movabsq	$0x0101010101010101,%r8
39c2a49701Sreyk	subq	$8,%rdi
40c2a49701Sreyk	movabsq	$0x8080808080808080,%r9
41c2a49701Sreyk	subq	$8,%rsi
425b859c19Sderaadt
43c2a49701Sreyk	_ALIGN_TEXT
44c2a49701Sreyk.Lword_loop:
45c2a49701Sreyk	movq	8(%rdi),%rax
46c2a49701Sreyk	addq	$8,%rdi
47c2a49701Sreyk	movq	8(%rsi),%rdx
48c2a49701Sreyk	addq	$8,%rsi
49c2a49701Sreyk	cmpq	%rax,%rdx
50c2a49701Sreyk	jne	.Lbyte_loop
51c2a49701Sreyk	subq	%r8,%rdx
52c2a49701Sreyk	notq	%rax
53c2a49701Sreyk	andq	%rax,%rdx
54c2a49701Sreyk	testq	%r9,%rdx
55c2a49701Sreyk	je	.Lword_loop
565b859c19Sderaadt
57c2a49701Sreyk	_ALIGN_TEXT
58c2a49701Sreyk.Lbyte_loop:
59c2a49701Sreyk	movb	(%rdi),%al
605b859c19Sderaadt	incq	%rdi
61c2a49701Sreyk	movb	(%rsi),%dl
625b859c19Sderaadt	incq	%rsi
63c2a49701Sreyk	testb	%al,%al
64c2a49701Sreyk	je	.Ldone
65c2a49701Sreyk	cmpb	%al,%dl
66c2a49701Sreyk	je	.Lbyte_loop
675b859c19Sderaadt
68c2a49701Sreyk.Ldone:
69c2a49701Sreyk	movzbq	%al,%rax
70c2a49701Sreyk	movzbq	%dl,%rdx
71c2a49701Sreyk	subq	%rdx,%rax
72*631951aaSmortimer	RETGUARD_CHECK(strcmp, r11)
735b859c19Sderaadt	ret
749b9d2a55SguentherEND_STRONG(strcmp)
75