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