| /* | 
 |  * Copyright (C) 2004-2007 Atmel Corporation | 
 |  * | 
 |  * This file is subject to the terms and conditions of the GNU Lesser General | 
 |  * Public License.  See the file "COPYING.LIB" in the main directory of this | 
 |  * archive for more details. | 
 |  */ | 
 |  | 
 | #include <features.h> | 
 |  | 
 | #define s1 r12 | 
 | #define s2 r11 | 
 | #define len r10 | 
 |  | 
 | 	.text | 
 | 	.global strcmp | 
 | 	.type	strcmp, @function | 
 | 	.align	1 | 
 | strcmp: | 
 | 	mov	r8, 3 | 
 | 	tst	s1, r8 | 
 | 	brne	.Lunaligned_s1 | 
 | 	tst	s2, r8 | 
 | 	brne	.Lunaligned_s2 | 
 |  | 
 | 1:	ld.w	r8, s1++ | 
 | 	ld.w	r9, s2++ | 
 | 	cp.w	r8, r9 | 
 | 	brne	2f | 
 | 	tnbz	r8 | 
 | 	brne	1b | 
 | 	retal	0 | 
 |  | 
 | 2:	bfextu	r12, r8, 24, 8 | 
 | 	bfextu	r11, r9, 24, 8 | 
 | 	sub	r12, r11 | 
 | 	retne	r12 | 
 | 	cp.w	r11, 0 | 
 | 	reteq	0 | 
 | 	bfextu	r12, r8, 16, 8 | 
 | 	bfextu	r11, r9, 16, 8 | 
 | 	sub	r12, r11 | 
 | 	retne	r12 | 
 | 	cp.w	r11, 0 | 
 | 	reteq	0 | 
 | 	bfextu	r12, r8, 8, 8 | 
 | 	bfextu	r11, r9, 8, 8 | 
 | 	sub	r12, r11 | 
 | 	retne	r12 | 
 | 	cp.w	r11, 0 | 
 | 	reteq	0 | 
 | 	bfextu	r12, r8, 0, 8 | 
 | 	bfextu	r11, r9, 0, 8 | 
 | 	sub	r12, r11 | 
 | 	retal	r12 | 
 |  | 
 | .Lunaligned_s1: | 
 | 3:	tst	s1, r8 | 
 | 	breq	4f | 
 | 	ld.ub	r10, s1++ | 
 | 	ld.ub	r9, s2++ | 
 | 	sub	r10, r9 | 
 | 	retne	r10 | 
 | 	cp.w	r9, 0 | 
 | 	brne	3b | 
 | 	retal	r10 | 
 |  | 
 | 4:	tst	s2, r8 | 
 | 	breq	1b | 
 |  | 
 | .Lunaligned_s2: | 
 | 	/* | 
 | 	 * s1 and s2 can't both be aligned, and unaligned word loads | 
 | 	 * can trigger spurious exceptions if we cross a page boundary. | 
 | 	 * Do it the slow way... | 
 | 	 */ | 
 | 1:	ld.ub	r8, s1++ | 
 | 	ld.ub	r9, s2++ | 
 | 	sub	r8, r9 | 
 | 	retne	r8 | 
 | 	cp.w	r9, 0 | 
 | 	brne	1b | 
 | 	retal	0 | 
 |  | 
 | 	.size	strcmp, . - strcmp | 
 |  | 
 | libc_hidden_def(strcmp) | 
 | #ifndef __UCLIBC_HAS_LOCALE__ | 
 | strong_alias(strcmp, strcoll) | 
 | libc_hidden_def(strcoll) | 
 | #endif |