| /* $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 |
| END(strncmp) |