Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1408 serge 1
#       memcmp()                                        Author: Kees J. Bot
2
#                                                               2 Jan 1994
3
 
4
# int memcmp(const void *s1, const void *s2, size_t n)
5
#       Compare two chunks of memory.
6
#
7
 
8
.intel_syntax
9
 
10
.globl _memcmp
11
 
12
        .text
13
	.align	16
14
_memcmp:
15
	cld
16
	push	ebp
17
	mov	ebp, esp
18
	push	esi
19
	push	edi
20
        mov     esi, [8+ebp]    # String s1
21
        mov     edi, [12+ebp]   # String s2
22
        mov     ecx, [16+ebp]   # Length
23
	cmp	ecx, 16
24
        jb      cbyte           # Don't bother being smart with short arrays
25
	mov	eax, esi
26
	or	eax, edi
27
	testb	al, 1
28
        jnz     cbyte           # Bit 0 set, use byte compare
29
	testb	al, 2
30
        jnz     cword           # Bit 1 set, use word compare
31
clword: shrd    eax, ecx, 2     # Save low two bits of ecx in eax
32
	shr	ecx, 2
33
	repe
34
        cmpsd                   # Compare longwords
35
	sub	esi, 4
36
	sub	edi, 4
37
        inc     ecx             # Recompare the last longword
38
        shld    ecx, eax, 2     # And any excess bytes
39
	jmp	last
40
cword:  shrd    eax, ecx, 1     # Save low bit of ecx in eax
41
	shr	ecx, 1
42
	repe
43
        cmpsw                   # Compare words
44
	sub	esi, 2
45
	sub	edi, 2
46
        inc     ecx             # Recompare the last word
47
        shld    ecx, eax, 1     # And one more byte?
48
cbyte:  test    ecx, ecx        # Set 'Z' flag if ecx = 0
49
last:	repe
50
        cmpsb                   # Look for the first differing byte
51
        seta    al              # al = (s1 > s2)
52
        setb    ah              # ah = (s1 < s2)
53
	subb	al, ah
54
        movsxb  eax, al         # eax = (s1 > s2) - (s1 < s2), i.e. -1, 0, 1
55
        mov     edx, esi        # For bcmp() to play with
56
	pop	edi
57
	pop	esi
58
	pop	ebp
59
	ret