1/* 2 * ==================================================== 3 * Copyright (C) 1998, 2002 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 (strchr) 14 SOTYPE_FUNCTION(strchr) 15 16SYM (strchr): 17 18 pushl ebp 19 movl esp,ebp 20 pushl edi 21 pushl ebx 22 xorl ebx,ebx 23 movl 8(ebp),edi 24 movb 12(ebp),bl 25 26#ifndef __OPTIMIZE_SIZE__ 27/* check if string is aligned, if not do check one byte at a time */ 28 test $3,edi 29 jne L9 30 31/* create 4 byte mask which is just the desired byte repeated 4 times */ 32 movl ebx,ecx 33 sall $8,ebx 34 subl $4,edi 35 orl ecx,ebx 36 movl ebx,edx 37 sall $16,ebx 38 orl edx,ebx 39 40/* loop performing 4 byte mask checking for 0 byte or desired byte */ 41 .p2align 4,,7 42L10: 43 addl $4,edi 44 movl (edi),ecx 45 leal -16843009(ecx),edx 46 movl ecx,eax 47 notl eax 48 andl eax,edx 49 testl $-2139062144,edx 50 jne L9 51 52 movl ebx,eax 53 xorl ecx,eax 54 leal -16843009(eax),edx 55 notl eax 56 andl eax,edx 57 testl $-2139062144,edx 58 je L10 59#endif /* not __OPTIMIZE_SIZE__ */ 60 61/* loop while (*s && *s++ != c) */ 62L9: 63 leal -1(edi),eax 64 .p2align 4,,7 65L15: 66 incl eax 67 movb (eax),dl 68 testb dl,dl 69 je L14 70 cmpb bl,dl 71 jne L15 72 73L14: 74/* if (*s == c) return address otherwise return NULL */ 75 cmpb bl,(eax) 76 je L19 77 xorl eax,eax 78 79L19: 80 leal -8(ebp),esp 81 popl ebx 82 popl edi 83 leave 84 ret 85 86