11.1Schristos/* 21.1Schristos * Written by J.T. Conklin <jtc@acorntoolworks.com> 31.1Schristos * Public domain. 41.1Schristos */ 51.1Schristos 61.1Schristos#include <machine/asm.h> 71.1Schristos 81.1Schristos#if defined(LIBC_SCCS) 91.2Sjakllsch RCSID("$NetBSD: strcmp.S,v 1.2 2014/03/22 19:16:34 jakllsch Exp $") 101.1Schristos#endif 111.1Schristos 121.1SchristosENTRY(strcmp) 131.1Schristos /* 141.1Schristos * Align s1 to word boundary. 151.1Schristos * Consider unrolling loop? 161.1Schristos */ 171.1Schristos.Ls1align: 181.1Schristos testb $7,%dil 191.1Schristos je .Ls1aligned 201.1Schristos movb (%rdi),%al 211.1Schristos incq %rdi 221.1Schristos movb (%rsi),%dl 231.1Schristos incq %rsi 241.1Schristos testb %al,%al 251.1Schristos je .Ldone 261.1Schristos cmpb %al,%dl 271.1Schristos je .Ls1align 281.1Schristos jmp .Ldone 291.1Schristos 301.1Schristos /* 311.1Schristos * Check whether s2 is aligned to a word boundary. If it is, we 321.1Schristos * can compare by words. Otherwise we have to compare by bytes. 331.1Schristos */ 341.1Schristos.Ls1aligned: 351.1Schristos testb $7,%sil 361.1Schristos jne .Lbyte_loop 371.1Schristos 381.1Schristos movabsq $0x0101010101010101,%r8 391.1Schristos subq $8,%rdi 401.1Schristos movabsq $0x8080808080808080,%r9 411.1Schristos subq $8,%rsi 421.1Schristos 431.1Schristos _ALIGN_TEXT 441.1Schristos.Lword_loop: 451.1Schristos movq 8(%rdi),%rax 461.1Schristos addq $8,%rdi 471.1Schristos movq 8(%rsi),%rdx 481.1Schristos addq $8,%rsi 491.1Schristos cmpq %rax,%rdx 501.1Schristos jne .Lbyte_loop 511.1Schristos subq %r8,%rdx 521.1Schristos notq %rax 531.1Schristos andq %rax,%rdx 541.1Schristos testq %r9,%rdx 551.1Schristos je .Lword_loop 561.1Schristos 571.1Schristos _ALIGN_TEXT 581.1Schristos.Lbyte_loop: 591.1Schristos movb (%rdi),%al 601.1Schristos incq %rdi 611.1Schristos movb (%rsi),%dl 621.1Schristos incq %rsi 631.1Schristos testb %al,%al 641.1Schristos je .Ldone 651.1Schristos cmpb %al,%dl 661.1Schristos je .Lbyte_loop 671.1Schristos 681.1Schristos.Ldone: 691.1Schristos movzbq %al,%rax 701.1Schristos movzbq %dl,%rdx 711.1Schristos subq %rdx,%rax 721.1Schristos ret 731.2SjakllschEND(strcmp) 74