xref: /openbsd-src/sys/lib/libkern/arch/amd64/memcmp.S (revision 5cd8e87fa7cd53a2131a2fe6e6551a2efe02ce90)
1f5df1827Smickey/*
2f5df1827Smickey * Written by J.T. Conklin <jtc@netbsd.org>.
3f5df1827Smickey * Public domain.
4f5df1827Smickey * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com>
5f5df1827Smickey */
6f5df1827Smickey
7f5df1827Smickey#include <machine/asm.h>
8f5df1827Smickey
9f5df1827SmickeyENTRY(memcmp)
101d66f0a0Smortimer	RETGUARD_SETUP(memcmp, r11)
11f5df1827Smickey	movq	%rdx,%rcx		/* compare by longs */
12f5df1827Smickey	shrq	$3,%rcx
13f5df1827Smickey	repe
14f5df1827Smickey	cmpsq
15*5cd8e87fSguenther	jne	5f			/* do we match so far? */
16f5df1827Smickey
17f5df1827Smickey	movq	%rdx,%rcx		/* compare remainder by bytes */
18f5df1827Smickey	andq	$7,%rcx
19f5df1827Smickey	repe
20f5df1827Smickey	cmpsb
21*5cd8e87fSguenther	jne	6f			/* do we match? */
22f5df1827Smickey
23f5df1827Smickey	xorl	%eax,%eax		/* we match, return zero	*/
24*5cd8e87fSguenther	jmp	7f
25f5df1827Smickey
26*5cd8e87fSguenther5:	movl	$8,%ecx			/* We know that one of the next	*/
27f5df1827Smickey	subq	%rcx,%rdi		/* eight pairs of bytes do not	*/
28f5df1827Smickey	subq	%rcx,%rsi		/* match.			*/
29f5df1827Smickey	repe
30f5df1827Smickey	cmpsb
31*5cd8e87fSguenther6:	xorl	%eax,%eax		/* Perform unsigned comparison	*/
32f5df1827Smickey	movb	-1(%rdi),%al
33f5df1827Smickey	xorl	%edx,%edx
34f5df1827Smickey	movb	-1(%rsi),%dl
35f5df1827Smickey	subl    %edx,%eax
36*5cd8e87fSguenther7:	RETGUARD_CHECK(memcmp, r11)
37f5df1827Smickey	ret
38fc541c5dSguenther	lfence
39*5cd8e87fSguentherEND(memcmp)
40