source: trunk/minix/lib/i386/string/memcmp.s@ 9

Last change on this file since 9 was 9, checked in by Mattia Monga, 13 years ago

Minix 3.1.2a

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