1*737e0611Stedu/* $OpenBSD: memcmp.S,v 1.2 2014/11/29 18:51:23 tedu Exp $ */ 2b15d0bebSmillert 3b15d0bebSmillert/* 4b15d0bebSmillert * Written by J.T. Conklin <jtc@netbsd.org>. 5b15d0bebSmillert * Public domain. 6b15d0bebSmillert */ 7b15d0bebSmillert 8b15d0bebSmillert#include <machine/asm.h> 9b15d0bebSmillert 10b15d0bebSmillertENTRY(memcmp) 11b15d0bebSmillert pushl %edi 12b15d0bebSmillert pushl %esi 13b15d0bebSmillert movl 12(%esp),%edi 14b15d0bebSmillert movl 16(%esp),%esi 15b15d0bebSmillert 16b15d0bebSmillert movl 20(%esp),%ecx /* compare by words */ 17b15d0bebSmillert shrl $2,%ecx 18b15d0bebSmillert repe 19b15d0bebSmillert cmpsl 20b15d0bebSmillert jne L5 /* do we match so far? */ 21b15d0bebSmillert 22b15d0bebSmillert movl 20(%esp),%ecx /* compare remainder by bytes */ 23b15d0bebSmillert andl $3,%ecx 24b15d0bebSmillert repe 25b15d0bebSmillert cmpsb 26b15d0bebSmillert jne L6 /* do we match? */ 27b15d0bebSmillert 28b15d0bebSmillert xorl %eax,%eax /* we match, return zero */ 29b15d0bebSmillert popl %esi 30b15d0bebSmillert popl %edi 31b15d0bebSmillert ret 32b15d0bebSmillert 33b15d0bebSmillertL5: movl $4,%ecx /* We know that one of the next */ 34b15d0bebSmillert subl %ecx,%edi /* four pairs of bytes do not */ 35b15d0bebSmillert subl %ecx,%esi /* match. */ 36b15d0bebSmillert repe 37b15d0bebSmillert cmpsb 38b15d0bebSmillertL6: movzbl -1(%edi),%eax /* Perform unsigned comparison */ 39b15d0bebSmillert movzbl -1(%esi),%edx 40b15d0bebSmillert subl %edx,%eax 41b15d0bebSmillert popl %esi 42b15d0bebSmillert popl %edi 43b15d0bebSmillert ret 44