77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
/*
 | 
						|
 * ====================================================
 | 
						|
 * 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):
 | 
						|
 | 
						|
	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
 | 
						|
	ret
 |