fixes for host gcc 4.6.1
[zpugcc/jano.git] / toolchain / gcc / newlib / libc / machine / i386 / memcmp.S
blob26b8ef1b6de692353586605f1fcebb403793e077
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         pushl ebp
19         movl esp,ebp
20         subl $16,esp
21         pushl ebx
22         pushl edi
23         pushl esi
24         movl 8(ebp),edi
25         movl 12(ebp),esi
26         movl 16(ebp),ecx
27         cld
29 /* check if length is zero in which case just return 0 */
31         xorl eax,eax
32         testl ecx,ecx
33         jz L4
35 #ifndef __OPTIMIZE_SIZE__
37 /* if aligned on long boundary, compare doublewords at a time first */
39         movl edi,eax
40         orl esi,eax
41         testb $3,al
42         jne BYTECMP
43         movl ecx,ebx
44         shrl $2,ecx             /* calculate number of long words to compare */
45         repz
46         cmpsl
47         jz L5
48         subl $4,esi
49         subl $4,edi
50         movl $4,ecx
51         jmp BYTECMP
52 L5:
53         andl $3,ebx             /* calculate number of remaining bytes */
54         movl ebx,ecx
56 #endif /* not __OPTIMIZE_SIZE__ */
58 BYTECMP: /* compare any unaligned bytes or remainder bytes */
59         repz
60         cmpsb
62 /* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */
63 L3:
64         xorl edx,edx
65         movb -1(esi),dl
66         xorl eax,eax
67         movb -1(edi),al
68         subl edx,eax
70 L4:
71         leal -28(ebp),esp
72         popl esi
73         popl edi
74         popl ebx
75         leave
76         ret