1*631951aaSmortimer/* $OpenBSD: strcmp.S,v 1.8 2018/07/03 23:14:05 mortimer Exp $ */ 2c2a49701Sreyk/* $NetBSD: strcmp.S,v 1.2 2014/03/22 19:16:34 jakllsch Exp $ */ 3c2a49701Sreyk 45b859c19Sderaadt/* 5c2a49701Sreyk * Written by J.T. Conklin <jtc@acorntoolworks.com> 65b859c19Sderaadt * Public domain. 75b859c19Sderaadt */ 85b859c19Sderaadt 9b4551fdeSguenther#include "DEFS.h" 105b859c19Sderaadt 115b859c19SderaadtENTRY(strcmp) 12*631951aaSmortimer RETGUARD_SETUP(strcmp, r11) 13c2a49701Sreyk /* 14c2a49701Sreyk * Align s1 to word boundary. 15c2a49701Sreyk * Consider unrolling loop? 16c2a49701Sreyk */ 17c2a49701Sreyk.Ls1align: 18c2a49701Sreyk testb $7,%dil 19c2a49701Sreyk je .Ls1aligned 20c2a49701Sreyk movb (%rdi),%al 215b859c19Sderaadt incq %rdi 22c2a49701Sreyk movb (%rsi),%dl 235b859c19Sderaadt incq %rsi 24c2a49701Sreyk testb %al,%al 25c2a49701Sreyk je .Ldone 26c2a49701Sreyk cmpb %al,%dl 27c2a49701Sreyk je .Ls1align 28c2a49701Sreyk jmp .Ldone 295b859c19Sderaadt 30c2a49701Sreyk /* 31c2a49701Sreyk * Check whether s2 is aligned to a word boundary. If it is, we 32c2a49701Sreyk * can compare by words. Otherwise we have to compare by bytes. 33c2a49701Sreyk */ 34c2a49701Sreyk.Ls1aligned: 35c2a49701Sreyk testb $7,%sil 36c2a49701Sreyk jne .Lbyte_loop 375b859c19Sderaadt 38c2a49701Sreyk movabsq $0x0101010101010101,%r8 39c2a49701Sreyk subq $8,%rdi 40c2a49701Sreyk movabsq $0x8080808080808080,%r9 41c2a49701Sreyk subq $8,%rsi 425b859c19Sderaadt 43c2a49701Sreyk _ALIGN_TEXT 44c2a49701Sreyk.Lword_loop: 45c2a49701Sreyk movq 8(%rdi),%rax 46c2a49701Sreyk addq $8,%rdi 47c2a49701Sreyk movq 8(%rsi),%rdx 48c2a49701Sreyk addq $8,%rsi 49c2a49701Sreyk cmpq %rax,%rdx 50c2a49701Sreyk jne .Lbyte_loop 51c2a49701Sreyk subq %r8,%rdx 52c2a49701Sreyk notq %rax 53c2a49701Sreyk andq %rax,%rdx 54c2a49701Sreyk testq %r9,%rdx 55c2a49701Sreyk je .Lword_loop 565b859c19Sderaadt 57c2a49701Sreyk _ALIGN_TEXT 58c2a49701Sreyk.Lbyte_loop: 59c2a49701Sreyk movb (%rdi),%al 605b859c19Sderaadt incq %rdi 61c2a49701Sreyk movb (%rsi),%dl 625b859c19Sderaadt incq %rsi 63c2a49701Sreyk testb %al,%al 64c2a49701Sreyk je .Ldone 65c2a49701Sreyk cmpb %al,%dl 66c2a49701Sreyk je .Lbyte_loop 675b859c19Sderaadt 68c2a49701Sreyk.Ldone: 69c2a49701Sreyk movzbq %al,%rax 70c2a49701Sreyk movzbq %dl,%rdx 71c2a49701Sreyk subq %rdx,%rax 72*631951aaSmortimer RETGUARD_CHECK(strcmp, r11) 735b859c19Sderaadt ret 749b9d2a55SguentherEND_STRONG(strcmp) 75