aboutsummaryrefslogtreecommitdiff
path: root/newlib/libc/machine/i386/memcmp.S
blob: 4a01b826e6bb1c75471335f882dd216f38553865 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
 * ====================================================
 * Copyright (C) 1998, 2002 by Red Hat Inc. All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this
 * software is freely granted, provided that this notice
 * is preserved.
 * ====================================================
 */

	#include "i386mach.h"

	.global SYM (memcmp)
       SOTYPE_FUNCTION(memcmp)

SYM (memcmp):

#ifdef __iamcu__
	pushl edi
	pushl esi
	movl eax,edi
	movl edx,esi
	cld

/* check if length is zero in which case just return 0 */

	xorl eax,eax
	testl ecx,ecx
	jz L4

/* compare any unaligned bytes or remainder bytes */
	repz
	cmpsb

/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */
	xorl edx,edx
	movb -1(esi),dl
	movb -1(edi),al
	subl edx,eax

L4:
	popl esi
	popl edi
#else
	pushl ebp
	movl esp,ebp
	subl $16,esp
	pushl ebx
	pushl edi
	pushl esi
	movl 8(ebp),edi
	movl 12(ebp),esi
	movl 16(ebp),ecx
	cld

/* check if length is zero in which case just return 0 */

	xorl eax,eax
	testl ecx,ecx
	jz L4

#ifndef __OPTIMIZE_SIZE__

/* if aligned on long boundary, compare doublewords at a time first */

	movl edi,eax
	orl esi,eax
	testb $3,al
	jne BYTECMP
	movl ecx,ebx
	shrl $2,ecx		/* calculate number of long words to compare */
	repz
	cmpsl
	jz L5
	subl $4,esi
	subl $4,edi
	movl $4,ecx
	jmp BYTECMP
L5:
	andl $3,ebx		/* calculate number of remaining bytes */
	movl ebx,ecx

#endif /* not __OPTIMIZE_SIZE__ */

BYTECMP: /* compare any unaligned bytes or remainder bytes */
	repz
	cmpsb

/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */
L3:
	xorl edx,edx
	movb -1(esi),dl
	xorl eax,eax
	movb -1(edi),al
	subl edx,eax

L4:
	leal -28(ebp),esp
	popl esi
	popl edi
	popl ebx
	leave
#endif
	ret