1/* 2 * ==================================================== 3 * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and distribute this 6 * software is freely granted, provided that this notice 7 * is preserved. 8 * ==================================================== 9 */ 10 11 #include "i386mach.h" 12 13 .global SYM (memchr) 14 SOTYPE_FUNCTION(memchr) 15 16SYM (memchr): 17#ifdef __iamcu__ 18 pushl edi 19 movl eax,edi 20 movl edx,eax 21 xorl edx,edx 22 testl ecx,ecx 23 jz L20 24 25 repnz 26 scasb 27 28 setnz dl 29 decl edi 30 31 decl edx 32 andl edi,edx 33L20: 34 movl edx,eax 35 36 popl edi 37#else 38 pushl ebp 39 movl esp,ebp 40 pushl edi 41 movzbl 12(ebp),eax 42 movl 16(ebp),ecx 43 movl 8(ebp),edi 44 xorl edx,edx 45 testl ecx,ecx 46 jz L20 47 48#ifdef __OPTIMIZE_SIZE__ 49 50 cld 51 repnz 52 scasb 53 54 setnz dl 55 decl edi 56 57#else /* !__OPTIMIZE_SIZE__ */ 58/* Do byte-wise checks until string is aligned. */ 59 testl $3,edi 60 je L5 61 cmpb (edi),al 62 je L15 63 incl edi 64 decl ecx 65 je L20 66 67 testl $3,edi 68 je L5 69 cmpb (edi),al 70 je L15 71 incl edi 72 decl ecx 73 je L20 74 75 testl $3,edi 76 je L5 77 cmpb (edi),al 78 je L15 79 incl edi 80 decl ecx 81 je L20 82 83/* Create a mask, then check a word at a time. */ 84L5: 85 movb al,ah 86 movl eax,edx 87 sall $16,edx 88 orl edx,eax 89 pushl ebx 90 91 .p2align 4,,7 92L8: 93 subl $4,ecx 94 jc L9 95 movl (edi),edx 96 addl $4,edi 97 xorl eax,edx 98 leal -16843009(edx),ebx 99 notl edx 100 andl edx,ebx 101 testl $-2139062144,ebx 102 je L8 103 104 subl $4,edi 105 106L9: 107 popl ebx 108 xorl edx,edx 109 addl $4,ecx 110 je L20 111 112/* Final byte-wise checks. */ 113 .p2align 4,,7 114L10: 115 cmpb (edi),al 116 je L15 117 incl edi 118 decl ecx 119 jne L10 120 121 xorl edi,edi 122 123#endif /* !__OPTIMIZE_SIZE__ */ 124 125L15: 126 decl edx 127 andl edi,edx 128L20: 129 movl edx,eax 130 131 leal -4(ebp),esp 132 popl edi 133 leave 134#endif 135 ret 136 137#if defined(__linux__) && defined(__ELF__) 138.section .note.GNU-stack,"",%progbits 139#endif 140