1 1.1 cgd /* 2 1.13 salo * Written by J.T. Conklin <jtc (at) NetBSD.org>. 3 1.10 jtc * Public domain. 4 1.1 cgd */ 5 1.1 cgd 6 1.9 jtc #include <machine/asm.h> 7 1.9 jtc 8 1.3 jtc #if defined(LIBC_SCCS) 9 1.15 uebayasi RCSID("$NetBSD: strncmp.S,v 1.15 2014/05/23 02:34:19 uebayasi Exp $") 10 1.3 jtc #endif 11 1.1 cgd 12 1.1 cgd /* 13 1.10 jtc * NOTE: I've unrolled the loop eight times: large enough to make a 14 1.1 cgd * significant difference, and small enough not to totally trash the 15 1.7 jtc * cache. 16 1.1 cgd */ 17 1.1 cgd 18 1.1 cgd ENTRY(strncmp) 19 1.1 cgd pushl %ebx 20 1.1 cgd movl 8(%esp),%eax 21 1.1 cgd movl 12(%esp),%ecx 22 1.1 cgd movl 16(%esp),%edx 23 1.7 jtc testl %edx,%edx 24 1.1 cgd jmp L2 /* Jump into the loop! */ 25 1.1 cgd 26 1.12 kleink _ALIGN_TEXT,0x90 27 1.1 cgd L1: incl %eax 28 1.1 cgd incl %ecx 29 1.1 cgd decl %edx 30 1.8 mycroft L2: jz L4 /* strings are equal */ 31 1.1 cgd movb (%eax),%bl 32 1.2 jtc testb %bl,%bl 33 1.8 mycroft jz L3 34 1.1 cgd cmpb %bl,(%ecx) 35 1.1 cgd jne L3 36 1.7 jtc 37 1.1 cgd incl %eax 38 1.1 cgd incl %ecx 39 1.1 cgd decl %edx 40 1.8 mycroft jz L4 41 1.1 cgd movb (%eax),%bl 42 1.2 jtc testb %bl,%bl 43 1.8 mycroft jz L3 44 1.1 cgd cmpb %bl,(%ecx) 45 1.1 cgd jne L3 46 1.7 jtc 47 1.1 cgd incl %eax 48 1.1 cgd incl %ecx 49 1.1 cgd decl %edx 50 1.8 mycroft jz L4 51 1.1 cgd movb (%eax),%bl 52 1.2 jtc testb %bl,%bl 53 1.8 mycroft jz L3 54 1.1 cgd cmpb %bl,(%ecx) 55 1.1 cgd jne L3 56 1.7 jtc 57 1.1 cgd incl %eax 58 1.1 cgd incl %ecx 59 1.1 cgd decl %edx 60 1.8 mycroft jz L4 61 1.1 cgd movb (%eax),%bl 62 1.2 jtc testb %bl,%bl 63 1.8 mycroft jz L3 64 1.1 cgd cmpb %bl,(%ecx) 65 1.1 cgd jne L3 66 1.7 jtc 67 1.1 cgd incl %eax 68 1.1 cgd incl %ecx 69 1.1 cgd decl %edx 70 1.8 mycroft jz L4 71 1.1 cgd movb (%eax),%bl 72 1.2 jtc testb %bl,%bl 73 1.8 mycroft jz L3 74 1.1 cgd cmpb %bl,(%ecx) 75 1.1 cgd jne L3 76 1.7 jtc 77 1.1 cgd incl %eax 78 1.1 cgd incl %ecx 79 1.1 cgd decl %edx 80 1.8 mycroft jz L4 81 1.1 cgd movb (%eax),%bl 82 1.2 jtc testb %bl,%bl 83 1.8 mycroft jz L3 84 1.1 cgd cmpb %bl,(%ecx) 85 1.1 cgd jne L3 86 1.7 jtc 87 1.1 cgd incl %eax 88 1.1 cgd incl %ecx 89 1.1 cgd decl %edx 90 1.8 mycroft jz L4 91 1.1 cgd movb (%eax),%bl 92 1.2 jtc testb %bl,%bl 93 1.8 mycroft jz L3 94 1.1 cgd cmpb %bl,(%ecx) 95 1.1 cgd jne L3 96 1.7 jtc 97 1.1 cgd incl %eax 98 1.1 cgd incl %ecx 99 1.1 cgd decl %edx 100 1.8 mycroft jz L4 101 1.1 cgd movb (%eax),%bl 102 1.2 jtc testb %bl,%bl 103 1.8 mycroft jz L3 104 1.1 cgd cmpb %bl,(%ecx) 105 1.1 cgd je L1 106 1.7 jtc 107 1.12 kleink _ALIGN_TEXT,0x90 108 1.14 rpaulo L3: movzbl (%eax),%eax /* unsigned comparison */ 109 1.6 jtc movzbl (%ecx),%ecx 110 1.1 cgd subl %ecx,%eax 111 1.1 cgd popl %ebx 112 1.1 cgd ret 113 1.12 kleink _ALIGN_TEXT,0x90 114 1.1 cgd L4: xorl %eax,%eax 115 1.1 cgd popl %ebx 116 1.1 cgd ret 117 1.15 uebayasi END(strncmp) 118