1*28c67577Sguenther/* $OpenBSD: strcmp.S,v 1.6 2022/12/07 19:26:39 guenther Exp $ */ 28c688dc9Sreyk/* $NetBSD: strcmp.S,v 1.2 2014/03/22 19:16:34 jakllsch Exp $ */ 38c688dc9Sreyk 4f5df1827Smickey/* 58c688dc9Sreyk * Written by J.T. Conklin <jtc@acorntoolworks.com> 6f5df1827Smickey * Public domain. 7f5df1827Smickey */ 8f5df1827Smickey 9f5df1827Smickey#include <machine/asm.h> 10f5df1827Smickey 11f5df1827SmickeyENTRY(strcmp) 121d66f0a0Smortimer RETGUARD_SETUP(strcmp, r10) 138c688dc9Sreyk /* 148c688dc9Sreyk * Align s1 to word boundary. 158c688dc9Sreyk * Consider unrolling loop? 168c688dc9Sreyk */ 178c688dc9Sreyk.Ls1align: 188c688dc9Sreyk testb $7,%dil 198c688dc9Sreyk je .Ls1aligned 208c688dc9Sreyk movb (%rdi),%al 21f5df1827Smickey incq %rdi 228c688dc9Sreyk movb (%rsi),%dl 23f5df1827Smickey incq %rsi 248c688dc9Sreyk testb %al,%al 258c688dc9Sreyk je .Ldone 268c688dc9Sreyk cmpb %al,%dl 278c688dc9Sreyk je .Ls1align 288c688dc9Sreyk jmp .Ldone 29f5df1827Smickey 308c688dc9Sreyk /* 318c688dc9Sreyk * Check whether s2 is aligned to a word boundary. If it is, we 328c688dc9Sreyk * can compare by words. Otherwise we have to compare by bytes. 338c688dc9Sreyk */ 348c688dc9Sreyk.Ls1aligned: 358c688dc9Sreyk testb $7,%sil 368c688dc9Sreyk jne .Lbyte_loop 37f5df1827Smickey 388c688dc9Sreyk movabsq $0x0101010101010101,%r8 398c688dc9Sreyk subq $8,%rdi 408c688dc9Sreyk movabsq $0x8080808080808080,%r9 418c688dc9Sreyk subq $8,%rsi 42f5df1827Smickey 438c688dc9Sreyk _ALIGN_TEXT 448c688dc9Sreyk.Lword_loop: 458c688dc9Sreyk movq 8(%rdi),%rax 468c688dc9Sreyk addq $8,%rdi 478c688dc9Sreyk movq 8(%rsi),%rdx 488c688dc9Sreyk addq $8,%rsi 498c688dc9Sreyk cmpq %rax,%rdx 508c688dc9Sreyk jne .Lbyte_loop 518c688dc9Sreyk subq %r8,%rdx 528c688dc9Sreyk notq %rax 538c688dc9Sreyk andq %rax,%rdx 548c688dc9Sreyk testq %r9,%rdx 558c688dc9Sreyk je .Lword_loop 56f5df1827Smickey 578c688dc9Sreyk _ALIGN_TEXT 588c688dc9Sreyk.Lbyte_loop: 598c688dc9Sreyk movb (%rdi),%al 60f5df1827Smickey incq %rdi 618c688dc9Sreyk movb (%rsi),%dl 62f5df1827Smickey incq %rsi 638c688dc9Sreyk testb %al,%al 648c688dc9Sreyk je .Ldone 658c688dc9Sreyk cmpb %al,%dl 668c688dc9Sreyk je .Lbyte_loop 67f5df1827Smickey 688c688dc9Sreyk.Ldone: 698c688dc9Sreyk movzbq %al,%rax 708c688dc9Sreyk movzbq %dl,%rdx 718c688dc9Sreyk subq %rdx,%rax 721d66f0a0Smortimer RETGUARD_CHECK(strcmp, r10) 73f5df1827Smickey ret 74fc541c5dSguenther lfence 75*28c67577SguentherEND(strcmp) 76