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 (memcmp)
14       SOTYPE_FUNCTION(memcmp)
15
16SYM (memcmp):
17
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
28
29/* check if length is zero in which case just return 0 */
30
31	xorl eax,eax
32	testl ecx,ecx
33	jz L4
34
35#ifndef __OPTIMIZE_SIZE__
36
37/* if aligned on long boundary, compare doublewords at a time first */
38
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
52L5:
53	andl $3,ebx		/* calculate number of remaining bytes */
54	movl ebx,ecx
55
56#endif /* not __OPTIMIZE_SIZE__ */
57
58BYTECMP: /* compare any unaligned bytes or remainder bytes */
59	repz
60	cmpsb
61
62/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */
63L3:
64	xorl edx,edx
65	movb -1(esi),dl
66	xorl eax,eax
67	movb -1(edi),al
68	subl edx,eax
69
70L4:
71	leal -28(ebp),esp
72	popl esi
73	popl edi
74	popl ebx
75	leave
76	ret
77