1/* 2 * Written by J.T. Conklin <jtc@acorntoolworks.com> 3 * Public domain. 4 */ 5 6#include <machine/asm.h> 7 8#if defined(LIBC_SCCS) 9 RCSID("$NetBSD: strcmp.S,v 1.17 2005/08/02 14:25:40 rpaulo Exp $") 10#endif 11 12ENTRY(strcmp) 13 pushl %esi 14 pushl %ebx 15 movl 12(%esp),%ebx 16 movl 16(%esp),%esi 17 18 /* 19 * Align s1 to word boundary. 20 * Consider unrolling loop? 21 */ 22.Ls1align: 23 testb $3,%bl 24 je .Ls1aligned 25 movb (%ebx),%al 26 incl %ebx 27 movb (%esi),%dl 28 incl %esi 29 testb %al,%al 30 je .Ldone 31 cmpb %al,%dl 32 je .Ls1align 33 jmp .Ldone 34 35 /* 36 * Check whether s2 is aligned to a word boundary. If it is, we 37 * can compare by words. Otherwise we have to compare by bytes. 38 */ 39.Ls1aligned: 40 testl $3,%esi 41 jne .Lbyte_loop 42 43 subl $4,%ebx 44 subl $4,%esi 45 46 _ALIGN_TEXT 47.Lword_loop: 48 movl 4(%ebx),%eax 49 addl $4,%ebx 50 movl 4(%esi),%edx 51 addl $4,%esi 52 cmpl %eax,%edx 53 jne .Lbyte_loop 54 subl $0x01010101,%edx 55 notl %eax 56 andl %eax,%edx 57 testl $0x80808080,%edx 58 je .Lword_loop 59 60 _ALIGN_TEXT 61.Lbyte_loop: 62 movb (%ebx),%al 63 incl %ebx 64 movb (%esi),%dl 65 incl %esi 66 testb %al,%al 67 je .Ldone 68 cmpb %al,%dl 69 je .Lbyte_loop 70 71.Ldone: 72 movzbl %al,%eax 73 movzbl %dl,%edx 74 subl %edx,%eax 75 popl %ebx 76 popl %esi 77 ret 78