Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / machine / i386 / memchr.S
blobd9b0bf2b7ca5697688c0297d0198b9cf9d0da04f
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  */
11         #include "i386mach.h"
13         .global SYM (memchr)
14        SOTYPE_FUNCTION(memchr)
16 SYM (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
25         repnz
26         scasb
28         setnz   dl
29         decl    edi
31         decl    edx
32         andl    edi,edx
33 L20:
34         movl    edx,eax
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
48 #ifdef __OPTIMIZE_SIZE__
50         cld
51         repnz
52         scasb
54         setnz   dl
55         decl    edi
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
67         testl   $3,edi
68         je      L5
69         cmpb    (edi),al
70         je      L15
71         incl    edi
72         decl    ecx
73         je      L20
75         testl   $3,edi
76         je      L5
77         cmpb    (edi),al
78         je      L15
79         incl    edi
80         decl    ecx
81         je      L20
83 /* Create a mask, then check a word at a time.  */
84 L5:
85         movb    al,ah
86         movl    eax,edx
87         sall    $16,edx
88         orl     edx,eax
89         pushl   ebx
91         .p2align 4,,7
92 L8:
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
104         subl    $4,edi
107         popl    ebx
108         xorl    edx,edx
109         addl    $4,ecx
110         je      L20
112 /* Final byte-wise checks.  */
113         .p2align 4,,7
114 L10:
115         cmpb    (edi),al
116         je      L15
117         incl    edi
118         decl    ecx
119         jne     L10
121         xorl    edi,edi
123 #endif /* !__OPTIMIZE_SIZE__ */
125 L15:
126         decl    edx
127         andl    edi,edx
128 L20:
129         movl    edx,eax
131         leal    -4(ebp),esp
132         popl    edi
133         leave
134 #endif
135         ret