1*ea6088e7Sguenther/* $OpenBSD: memcmp.S,v 1.6 2017/11/29 05:13:57 guenther Exp $ */ 2df930be7Sderaadt/* 3df930be7Sderaadt * Written by J.T. Conklin <jtc@netbsd.org>. 4df930be7Sderaadt * Public domain. 5df930be7Sderaadt */ 6df930be7Sderaadt 7*ea6088e7Sguenther#include "DEFS.h" 8df930be7Sderaadt 9df930be7SderaadtENTRY(memcmp) 10df930be7Sderaadt pushl %edi 11df930be7Sderaadt pushl %esi 12df930be7Sderaadt movl 12(%esp),%edi 13df930be7Sderaadt movl 16(%esp),%esi 14df930be7Sderaadt cld /* set compare direction forward */ 15df930be7Sderaadt 16df930be7Sderaadt movl 20(%esp),%ecx /* compare by words */ 17df930be7Sderaadt shrl $2,%ecx 18df930be7Sderaadt repe 19df930be7Sderaadt cmpsl 20df930be7Sderaadt jne L5 /* do we match so far? */ 21df930be7Sderaadt 22df930be7Sderaadt movl 20(%esp),%ecx /* compare remainder by bytes */ 23df930be7Sderaadt andl $3,%ecx 24df930be7Sderaadt repe 25df930be7Sderaadt cmpsb 26df930be7Sderaadt jne L6 /* do we match? */ 27df930be7Sderaadt 28df930be7Sderaadt xorl %eax,%eax /* we match, return zero */ 29df930be7Sderaadt popl %esi 30df930be7Sderaadt popl %edi 31df930be7Sderaadt ret 32df930be7Sderaadt 33df930be7SderaadtL5: movl $4,%ecx /* We know that one of the next */ 34df930be7Sderaadt subl %ecx,%edi /* four pairs of bytes do not */ 35df930be7Sderaadt subl %ecx,%esi /* match. */ 36df930be7Sderaadt repe 37df930be7Sderaadt cmpsb 38df930be7SderaadtL6: movzbl -1(%edi),%eax /* Perform unsigned comparison */ 39df930be7Sderaadt movzbl -1(%esi),%edx 40df930be7Sderaadt subl %edx,%eax 41df930be7Sderaadt popl %esi 42df930be7Sderaadt popl %edi 43df930be7Sderaadt ret 449b9d2a55SguentherEND_STRONG(memcmp) 45