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