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:16:34 jakllsch Exp $") 10b6cbf720SGianluca Guida#endif 11b6cbf720SGianluca Guida 12b6cbf720SGianluca GuidaENTRY(strcmp) 13b6cbf720SGianluca Guida /* 14b6cbf720SGianluca Guida * Align s1 to word boundary. 15b6cbf720SGianluca Guida * Consider unrolling loop? 16b6cbf720SGianluca Guida */ 17b6cbf720SGianluca Guida.Ls1align: 18b6cbf720SGianluca Guida testb $7,%dil 19b6cbf720SGianluca Guida je .Ls1aligned 20b6cbf720SGianluca Guida movb (%rdi),%al 21b6cbf720SGianluca Guida incq %rdi 22b6cbf720SGianluca Guida movb (%rsi),%dl 23b6cbf720SGianluca Guida incq %rsi 24b6cbf720SGianluca Guida testb %al,%al 25b6cbf720SGianluca Guida je .Ldone 26b6cbf720SGianluca Guida cmpb %al,%dl 27b6cbf720SGianluca Guida je .Ls1align 28b6cbf720SGianluca Guida jmp .Ldone 29b6cbf720SGianluca Guida 30b6cbf720SGianluca Guida /* 31b6cbf720SGianluca Guida * Check whether s2 is aligned to a word boundary. If it is, we 32b6cbf720SGianluca Guida * can compare by words. Otherwise we have to compare by bytes. 33b6cbf720SGianluca Guida */ 34b6cbf720SGianluca Guida.Ls1aligned: 35b6cbf720SGianluca Guida testb $7,%sil 36b6cbf720SGianluca Guida jne .Lbyte_loop 37b6cbf720SGianluca Guida 38b6cbf720SGianluca Guida movabsq $0x0101010101010101,%r8 39b6cbf720SGianluca Guida subq $8,%rdi 40b6cbf720SGianluca Guida movabsq $0x8080808080808080,%r9 41b6cbf720SGianluca Guida subq $8,%rsi 42b6cbf720SGianluca Guida 43b6cbf720SGianluca Guida _ALIGN_TEXT 44b6cbf720SGianluca Guida.Lword_loop: 45b6cbf720SGianluca Guida movq 8(%rdi),%rax 46b6cbf720SGianluca Guida addq $8,%rdi 47b6cbf720SGianluca Guida movq 8(%rsi),%rdx 48b6cbf720SGianluca Guida addq $8,%rsi 49b6cbf720SGianluca Guida cmpq %rax,%rdx 50b6cbf720SGianluca Guida jne .Lbyte_loop 51b6cbf720SGianluca Guida subq %r8,%rdx 52b6cbf720SGianluca Guida notq %rax 53b6cbf720SGianluca Guida andq %rax,%rdx 54b6cbf720SGianluca Guida testq %r9,%rdx 55b6cbf720SGianluca Guida je .Lword_loop 56b6cbf720SGianluca Guida 57b6cbf720SGianluca Guida _ALIGN_TEXT 58b6cbf720SGianluca Guida.Lbyte_loop: 59b6cbf720SGianluca Guida movb (%rdi),%al 60b6cbf720SGianluca Guida incq %rdi 61b6cbf720SGianluca Guida movb (%rsi),%dl 62b6cbf720SGianluca Guida incq %rsi 63b6cbf720SGianluca Guida testb %al,%al 64b6cbf720SGianluca Guida je .Ldone 65b6cbf720SGianluca Guida cmpb %al,%dl 66b6cbf720SGianluca Guida je .Lbyte_loop 67b6cbf720SGianluca Guida 68b6cbf720SGianluca Guida.Ldone: 69b6cbf720SGianluca Guida movzbq %al,%rax 70b6cbf720SGianluca Guida movzbq %dl,%rdx 71b6cbf720SGianluca Guida subq %rdx,%rax 72b6cbf720SGianluca Guida ret 73*0a6a1f1dSLionel SambucEND(strcmp) 74