1/* 2 * Written by J.T. Conklin <jtc@NetBSD.org>. 3 * Public domain. 4 */ 5 6#include <machine/asm.h> 7 8#if defined(LIBC_SCCS) 9 RCSID("$NetBSD: strncmp.S,v 1.4 2014/05/22 15:01:57 uebayasi Exp $") 10#endif 11 12/* 13 * NOTE: I've unrolled the loop eight times: large enough to make a 14 * significant difference, and small enough not to totally trash the 15 * cache. 16 */ 17 18ENTRY(strncmp) 19 testq %rdx,%rdx 20 jmp L2 /* Jump into the loop! */ 21 22L1: incq %rdi 23 incq %rsi 24 decq %rdx 25L2: jz L4 /* strings are equal */ 26 movb (%rdi),%al 27 testb %al,%al 28 jz L3 29 cmpb %al,(%rsi) 30 jne L3 31 32 incq %rdi 33 incq %rsi 34 decq %rdx 35 jz L4 36 movb (%rdi),%al 37 testb %al,%al 38 jz L3 39 cmpb %al,(%rsi) 40 jne L3 41 42 incq %rdi 43 incq %rsi 44 decq %rdx 45 jz L4 46 movb (%rdi),%al 47 testb %al,%al 48 jz L3 49 cmpb %al,(%rsi) 50 jne L3 51 52 incq %rdi 53 incq %rsi 54 decq %rdx 55 jz L4 56 movb (%rdi),%al 57 testb %al,%al 58 jz L3 59 cmpb %al,(%rsi) 60 jne L3 61 62 incq %rdi 63 incq %rsi 64 decq %rdx 65 jz L4 66 movb (%rdi),%al 67 testb %al,%al 68 jz L3 69 cmpb %al,(%rsi) 70 jne L3 71 72 incq %rdi 73 incq %rsi 74 decq %rdx 75 jz L4 76 movb (%rdi),%al 77 testb %al,%al 78 jz L3 79 cmpb %al,(%rsi) 80 jne L3 81 82 incq %rdi 83 incq %rsi 84 decq %rdx 85 jz L4 86 movb (%rdi),%al 87 testb %al,%al 88 jz L3 89 cmpb %al,(%rsi) 90 jne L3 91 92 incq %rdi 93 incq %rsi 94 decq %rdx 95 jz L4 96 movb (%rdi),%al 97 testb %al,%al 98 jz L3 99 cmpb %al,(%rsi) 100 je L1 101 102L3: movzbl (%rdi),%eax /* unsigned comparison */ 103 movzbl (%rsi),%ecx 104 subl %ecx,%eax 105 ret 106L4: xorl %eax,%eax 107 ret 108END(strncmp) 109