1144518Sdavidxu/* 2144518Sdavidxu * Written by J.T. Conklin <jtc@acorntoolworks.com> 3144518Sdavidxu * Public domain. 4144518Sdavidxu */ 5144518Sdavidxu 6144518Sdavidxu#include <machine/asm.h> 7144518Sdavidxu__FBSDID("$FreeBSD$"); 8144518Sdavidxu 9144518Sdavidxu#if 0 10144518Sdavidxu RCSID("$NetBSD: strcmp.S,v 1.3 2004/07/19 20:04:41 drochner Exp $") 11144518Sdavidxu#endif 12144518Sdavidxu 13144518SdavidxuENTRY(strcmp) 14144518Sdavidxu /* 15144518Sdavidxu * Align s1 to word boundary. 16144518Sdavidxu * Consider unrolling loop? 17144518Sdavidxu */ 18144518Sdavidxu.Ls1align: 19144518Sdavidxu testb $7,%dil 20144518Sdavidxu je .Ls1aligned 21144518Sdavidxu movb (%rdi),%al 22144518Sdavidxu incq %rdi 23144518Sdavidxu movb (%rsi),%dl 24144518Sdavidxu incq %rsi 25144518Sdavidxu testb %al,%al 26144518Sdavidxu je .Ldone 27144518Sdavidxu cmpb %al,%dl 28144518Sdavidxu je .Ls1align 29144518Sdavidxu jmp .Ldone 30144518Sdavidxu 31144518Sdavidxu /* 32144518Sdavidxu * Check whether s2 is aligned to a word boundry. If it is, we 33144518Sdavidxu * can compare by words. Otherwise we have to compare by bytes. 34144518Sdavidxu */ 35144518Sdavidxu.Ls1aligned: 36144518Sdavidxu testb $7,%sil 37144518Sdavidxu jne .Lbyte_loop 38144518Sdavidxu 39144518Sdavidxu movabsq $0x0101010101010101,%r8 40165241Sdavidxu subq $8,%rdi 41165241Sdavidxu movabsq $0x8080808080808080,%r9 42144518Sdavidxu subq $8,%rsi 43144518Sdavidxu 44144518Sdavidxu .align 4 45144518Sdavidxu.Lword_loop: 46144518Sdavidxu movq 8(%rdi),%rax 47144518Sdavidxu addq $8,%rdi 48144518Sdavidxu movq 8(%rsi),%rdx 49144518Sdavidxu addq $8,%rsi 50144518Sdavidxu cmpq %rax,%rdx 51144518Sdavidxu jne .Lbyte_loop 52144518Sdavidxu subq %r8,%rdx 53144518Sdavidxu notq %rax 54144518Sdavidxu andq %rax,%rdx 55144518Sdavidxu testq %r9,%rdx 56144518Sdavidxu je .Lword_loop 57144518Sdavidxu 58144518Sdavidxu .align 4 59144518Sdavidxu.Lbyte_loop: 60144518Sdavidxu movb (%rdi),%al 61144518Sdavidxu incq %rdi 62144518Sdavidxu movb (%rsi),%dl 63144518Sdavidxu incq %rsi 64144518Sdavidxu testb %al,%al 65144518Sdavidxu je .Ldone 66144518Sdavidxu cmpb %al,%dl 67144518Sdavidxu je .Lbyte_loop 68144518Sdavidxu 69144518Sdavidxu.Ldone: 70144518Sdavidxu movzbq %al,%rax 71144518Sdavidxu movzbq %dl,%rdx 72144518Sdavidxu subq %rdx,%rax 73144518Sdavidxu ret 74144518SdavidxuEND(strcmp) 75144518Sdavidxu 76144518Sdavidxu .section .note.GNU-stack,"",%progbits 77144518Sdavidxu