/* $OpenBSD: strncmp.S,v 1.3 2005/08/07 11:30:38 espie Exp $ */ /* * Written by J.T. Conklin <jtc@netbsd.org>. * Public domain. */ #include <machine/asm.h> /* * NOTE: I've unrolled the loop eight times: large enough to make a * significant difference, and small enough not to totally trash the * cache. */ ENTRY(strncmp) pushl %ebx movl 8(%esp),%eax movl 12(%esp),%ecx movl 16(%esp),%edx testl %edx,%edx jmp L2 /* Jump into the loop! */ .align 2,0x90 L1: incl %eax incl %ecx decl %edx L2: jz L4 /* strings are equal */ movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) jne L3 incl %eax incl %ecx decl %edx jz L4 movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) jne L3 incl %eax incl %ecx decl %edx jz L4 movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) jne L3 incl %eax incl %ecx decl %edx jz L4 movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) jne L3 incl %eax incl %ecx decl %edx jz L4 movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) jne L3 incl %eax incl %ecx decl %edx jz L4 movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) jne L3 incl %eax incl %ecx decl %edx jz L4 movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) jne L3 incl %eax incl %ecx decl %edx jz L4 movb (%eax),%bl testb %bl,%bl jz L3 cmpb %bl,(%ecx) je L1 .align 2,0x90 L3: movzbl (%eax),%eax /* unsigned comparision */ movzbl (%ecx),%ecx subl %ecx,%eax popl %ebx ret .align 2,0x90 L4: xorl %eax,%eax popl %ebx ret