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