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#ifdef __iamcu__ 19 pushl edi 20 pushl esi 21 movl eax,edi 22 movl edx,esi 23 cld 24 25/* check if length is zero in which case just return 0 */ 26 27 xorl eax,eax 28 testl ecx,ecx 29 jz L4 30 31/* compare any unaligned bytes or remainder bytes */ 32 repz 33 cmpsb 34 35/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */ 36 xorl edx,edx 37 movb -1(esi),dl 38 movb -1(edi),al 39 subl edx,eax 40 41L4: 42 popl esi 43 popl edi 44#else 45 pushl ebp 46 movl esp,ebp 47 subl $16,esp 48 pushl ebx 49 pushl edi 50 pushl esi 51 movl 8(ebp),edi 52 movl 12(ebp),esi 53 movl 16(ebp),ecx 54 cld 55 56/* check if length is zero in which case just return 0 */ 57 58 xorl eax,eax 59 testl ecx,ecx 60 jz L4 61 62#ifndef __OPTIMIZE_SIZE__ 63 64/* if aligned on long boundary, compare doublewords at a time first */ 65 66 movl edi,eax 67 orl esi,eax 68 testb $3,al 69 jne BYTECMP 70 movl ecx,ebx 71 shrl $2,ecx /* calculate number of long words to compare */ 72 repz 73 cmpsl 74 jz L5 75 subl $4,esi 76 subl $4,edi 77 movl $4,ecx 78 jmp BYTECMP 79L5: 80 andl $3,ebx /* calculate number of remaining bytes */ 81 movl ebx,ecx 82 83#endif /* not __OPTIMIZE_SIZE__ */ 84 85BYTECMP: /* compare any unaligned bytes or remainder bytes */ 86 repz 87 cmpsb 88 89/* set output to be < 0 if less than, 0 if equal, or > 0 if greater than */ 90L3: 91 xorl edx,edx 92 movb -1(esi),dl 93 xorl eax,eax 94 movb -1(edi),al 95 subl edx,eax 96 97L4: 98 leal -28(ebp),esp 99 popl esi 100 popl edi 101 popl ebx 102 leave 103#endif 104 ret 105 106#if defined(__linux__) && defined(__ELF__) 107.section .note.GNU-stack,"",%progbits 108#endif 109