| /* | 
 |  * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com) | 
 |  * | 
 |  * This program is free software; you can redistribute it and/or modify | 
 |  * it under the terms of the GNU General Public License version 2 as | 
 |  * published by the Free Software Foundation. | 
 |  */ | 
 |  | 
 | #include <linux/linkage.h> | 
 |  | 
 | ENTRY_CFI(strcmp) | 
 | 	or	r2, r0, r1 | 
 | 	bmsk_s	r2, r2, 1 | 
 | 	brne	r2, 0, @.Lcharloop | 
 |  | 
 | ;;; s1 and s2 are word aligned | 
 | 	ld.ab	r2, [r0, 4] | 
 |  | 
 | 	mov_s	r12, 0x01010101 | 
 | 	ror	r11, r12 | 
 | 	.align  4 | 
 | .LwordLoop: | 
 | 	ld.ab	r3, [r1, 4] | 
 | 	;; Detect NULL char in str1 | 
 | 	sub	r4, r2, r12 | 
 | 	ld.ab	r5, [r0, 4] | 
 | 	bic	r4, r4, r2 | 
 | 	and	r4, r4, r11 | 
 | 	brne.d.nt	r4, 0, .LfoundNULL | 
 | 	;; Check if the read locations are the same | 
 | 	cmp	r2, r3 | 
 | 	beq.d	.LwordLoop | 
 | 	mov.eq	r2, r5 | 
 |  | 
 | 	;; A match is found, spot it out | 
 | #ifdef __LITTLE_ENDIAN__ | 
 | 	swape	r3, r3 | 
 | 	mov_s	r0, 1 | 
 | 	swape	r2, r2 | 
 | #else | 
 | 	mov_s	r0, 1 | 
 | #endif | 
 | 	cmp_s	r2, r3 | 
 | 	j_s.d	[blink] | 
 | 	bset.lo	r0, r0, 31 | 
 |  | 
 | 	.align 4 | 
 | .LfoundNULL: | 
 | #ifdef __BIG_ENDIAN__ | 
 | 	swape	r4, r4 | 
 | 	swape	r2, r2 | 
 | 	swape	r3, r3 | 
 | #endif | 
 | 	;; Find null byte | 
 | 	ffs	r0, r4 | 
 | 	bmsk	r2, r2, r0 | 
 | 	bmsk	r3, r3, r0 | 
 | 	swape	r2, r2 | 
 | 	swape	r3, r3 | 
 | 	;; make the return value | 
 | 	sub.f	r0, r2, r3 | 
 | 	mov.hi	r0, 1 | 
 | 	j_s.d	[blink] | 
 | 	bset.lo	r0, r0, 31 | 
 |  | 
 | 	.align 4 | 
 | .Lcharloop: | 
 | 	ldb.ab	r2, [r0, 1] | 
 | 	ldb.ab	r3, [r1, 1] | 
 | 	nop | 
 | 	breq	r2, 0, .Lcmpend | 
 | 	breq	r2, r3, .Lcharloop | 
 |  | 
 | 	.align 4 | 
 | .Lcmpend: | 
 | 	j_s.d	[blink] | 
 | 	sub	r0, r2, r3 | 
 | END_CFI(strcmp) |