1b6cbf720SGianluca Guida/* 2b6cbf720SGianluca Guida * Written by J.T. Conklin <jtc@NetBSD.org>. 3b6cbf720SGianluca Guida * Public domain. 4b6cbf720SGianluca Guida * Adapted for NetBSD/x86_64 by Frank van der Linden <fvdl@wasabisystems.com> 5b6cbf720SGianluca Guida */ 6b6cbf720SGianluca Guida 7b6cbf720SGianluca Guida#include <machine/asm.h> 8b6cbf720SGianluca Guida 9b6cbf720SGianluca Guida#if defined(LIBC_SCCS) 10*0a6a1f1dSLionel Sambuc RCSID("$NetBSD: memcmp.S,v 1.3 2014/03/22 19:16:34 jakllsch Exp $") 11b6cbf720SGianluca Guida#endif 12b6cbf720SGianluca Guida 13b6cbf720SGianluca GuidaENTRY(memcmp) 14b6cbf720SGianluca Guida movq %rdx,%rcx /* compare by longs */ 15b6cbf720SGianluca Guida shrq $3,%rcx 16b6cbf720SGianluca Guida repe 17b6cbf720SGianluca Guida cmpsq 18b6cbf720SGianluca Guida jne L5 /* do we match so far? */ 19b6cbf720SGianluca Guida 20b6cbf720SGianluca Guida movq %rdx,%rcx /* compare remainder by bytes */ 21b6cbf720SGianluca Guida andq $7,%rcx 22b6cbf720SGianluca Guida repe 23b6cbf720SGianluca Guida cmpsb 24b6cbf720SGianluca Guida jne L6 /* do we match? */ 25b6cbf720SGianluca Guida 26b6cbf720SGianluca Guida xorl %eax,%eax /* we match, return zero */ 27b6cbf720SGianluca Guida ret 28b6cbf720SGianluca Guida 29b6cbf720SGianluca GuidaL5: movl $8,%ecx /* We know that one of the next */ 30b6cbf720SGianluca Guida subq %rcx,%rdi /* eight pairs of bytes do not */ 31b6cbf720SGianluca Guida subq %rcx,%rsi /* match. */ 32b6cbf720SGianluca Guida repe 33b6cbf720SGianluca Guida cmpsb 34b6cbf720SGianluca GuidaL6: xorl %eax,%eax /* Perform unsigned comparison */ 35b6cbf720SGianluca Guida movb -1(%rdi),%al 36b6cbf720SGianluca Guida xorl %edx,%edx 37b6cbf720SGianluca Guida movb -1(%rsi),%dl 38b6cbf720SGianluca Guida subl %edx,%eax 39b6cbf720SGianluca Guida ret 40*0a6a1f1dSLionel SambucEND(memcmp) 41