Cygwin: access: Fix X_OK behaviour for backup operators and admins
[newlib-cygwin.git] / newlib / libc / machine / i386 / memcmp.S
blob4a01b826e6bb1c75471335f882dd216f38553865
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  */
11         #include "i386mach.h"
13         .global SYM (memcmp)
14        SOTYPE_FUNCTION(memcmp)
16 SYM (memcmp):
18 #ifdef __iamcu__
19         pushl edi
20         pushl esi
21         movl eax,edi
22         movl edx,esi
23         cld
25 /* check if length is zero in which case just return 0 */
27         xorl eax,eax
28         testl ecx,ecx
29         jz L4
31 /* compare any unaligned bytes or remainder bytes */
32         repz
33         cmpsb
35 /* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */
36         xorl edx,edx
37         movb -1(esi),dl
38         movb -1(edi),al
39         subl edx,eax
41 L4:
42         popl esi
43         popl edi
44 #else
45         pushl ebp
46         movl esp,ebp
47         subl $16,esp
48         pushl ebx
49         pushl edi
50         pushl esi
51         movl 8(ebp),edi
52         movl 12(ebp),esi
53         movl 16(ebp),ecx
54         cld
56 /* check if length is zero in which case just return 0 */
58         xorl eax,eax
59         testl ecx,ecx
60         jz L4
62 #ifndef __OPTIMIZE_SIZE__
64 /* if aligned on long boundary, compare doublewords at a time first */
66         movl edi,eax
67         orl esi,eax
68         testb $3,al
69         jne BYTECMP
70         movl ecx,ebx
71         shrl $2,ecx             /* calculate number of long words to compare */
72         repz
73         cmpsl
74         jz L5
75         subl $4,esi
76         subl $4,edi
77         movl $4,ecx
78         jmp BYTECMP
79 L5:
80         andl $3,ebx             /* calculate number of remaining bytes */
81         movl ebx,ecx
83 #endif /* not __OPTIMIZE_SIZE__ */
85 BYTECMP: /* compare any unaligned bytes or remainder bytes */
86         repz
87         cmpsb
89 /* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */
90 L3:
91         xorl edx,edx
92         movb -1(esi),dl
93         xorl eax,eax
94         movb -1(edi),al
95         subl edx,eax
97 L4:
98         leal -28(ebp),esp
99         popl esi
100         popl edi
101         popl ebx
102         leave
103 #endif
104         ret