169 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			169 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0 */
 | |
| // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
 | |
| 
 | |
| #include <linux/linkage.h>
 | |
| #include "sysdep.h"
 | |
| 
 | |
| ENTRY(strcmp)
 | |
| 	mov	a3, a0
 | |
| 	/* Check if the s1 addr is aligned.  */
 | |
| 	xor	a2, a3, a1
 | |
| 	andi	a2, 0x3
 | |
| 	bnez	a2, 7f
 | |
| 	andi	t1, a0, 0x3
 | |
| 	bnez	t1, 5f
 | |
| 
 | |
| 1:
 | |
| 	/* If aligned, load word each time.  */
 | |
| 	ldw	t0, (a3, 0)
 | |
| 	ldw	t1, (a1, 0)
 | |
| 	/* If s1[i] != s2[i], goto 2f.  */
 | |
| 	cmpne   t0, t1
 | |
| 	bt      2f
 | |
| 	/* If s1[i] == s2[i], check if s1 or s2 is at the end.  */
 | |
| 	tstnbz	t0
 | |
| 	/* If at the end, goto 3f (finish comparing).  */
 | |
| 	bf	3f
 | |
| 
 | |
| 	ldw	t0, (a3, 4)
 | |
| 	ldw	t1, (a1, 4)
 | |
| 	cmpne	t0, t1
 | |
| 	bt	2f
 | |
| 	tstnbz	t0
 | |
| 	bf	3f
 | |
| 
 | |
| 	ldw	t0, (a3, 8)
 | |
| 	ldw	t1, (a1, 8)
 | |
| 	cmpne	t0, t1
 | |
| 	bt	2f
 | |
| 	tstnbz	t0
 | |
| 	bf	3f
 | |
| 
 | |
| 	ldw	t0, (a3, 12)
 | |
| 	ldw	t1, (a1, 12)
 | |
| 	cmpne	t0, t1
 | |
| 	bt	2f
 | |
| 	tstnbz	t0
 | |
| 	bf	3f
 | |
| 
 | |
| 	ldw	t0, (a3, 16)
 | |
| 	ldw	t1, (a1, 16)
 | |
| 	cmpne	t0, t1
 | |
| 	bt	2f
 | |
| 	tstnbz	t0
 | |
| 	bf	3f
 | |
| 
 | |
| 	ldw	t0, (a3, 20)
 | |
| 	ldw	t1, (a1, 20)
 | |
| 	cmpne	t0, t1
 | |
| 	bt	2f
 | |
| 	tstnbz	t0
 | |
| 	bf	3f
 | |
| 
 | |
| 	ldw	t0, (a3, 24)
 | |
| 	ldw	t1, (a1, 24)
 | |
| 	cmpne	t0, t1
 | |
| 	bt	2f
 | |
| 	tstnbz	t0
 | |
| 	bf	3f
 | |
| 
 | |
| 	ldw	t0, (a3, 28)
 | |
| 	ldw	t1, (a1, 28)
 | |
| 	cmpne	t0, t1
 | |
| 	bt	2f
 | |
| 	tstnbz	t0
 | |
| 	bf	3f
 | |
| 
 | |
| 	addi	a3, 32
 | |
| 	addi	a1, 32
 | |
| 
 | |
| 	br	1b
 | |
| 
 | |
| # ifdef __CSKYBE__
 | |
| 	/* d[i] != s[i] in word, so we check byte 0.  */
 | |
| 2:
 | |
| 	xtrb0   a0, t0
 | |
| 	xtrb0   a2, t1
 | |
| 	subu    a0, a2
 | |
| 	bez     a2, 4f
 | |
| 	bnez    a0, 4f
 | |
| 
 | |
| 	/* check byte 1 */
 | |
| 	xtrb1   a0, t0
 | |
| 	xtrb1   a2, t1
 | |
| 	subu    a0, a2
 | |
| 	bez     a2, 4f
 | |
| 	bnez    a0, 4f
 | |
| 
 | |
| 	/* check byte 2 */
 | |
| 	xtrb2   a0, t0
 | |
| 	xtrb2   a2, t1
 | |
| 	subu    a0, a2
 | |
| 	bez     a2, 4f
 | |
| 	bnez    a0, 4f
 | |
| 
 | |
| 	/* check byte 3 */
 | |
| 	xtrb3   a0, t0
 | |
| 	xtrb3   a2, t1
 | |
| 	subu    a0, a2
 | |
| # else
 | |
| 	/* s1[i] != s2[i] in word, so we check byte 3.  */
 | |
| 2:
 | |
| 	xtrb3	a0, t0
 | |
| 	xtrb3	a2, t1
 | |
| 	subu    a0, a2
 | |
| 	bez     a2, 4f
 | |
| 	bnez    a0, 4f
 | |
| 
 | |
| 	/* check byte 2 */
 | |
| 	xtrb2	a0, t0
 | |
| 	xtrb2	a2, t1
 | |
| 	subu    a0, a2
 | |
| 	bez     a2, 4f
 | |
| 	bnez    a0, 4f
 | |
| 
 | |
| 	/* check byte 1 */
 | |
| 	xtrb1	a0, t0
 | |
| 	xtrb1	a2, t1
 | |
| 	subu	a0, a2
 | |
| 	bez	a2, 4f
 | |
| 	bnez    a0, 4f
 | |
| 
 | |
| 	/* check byte 0 */
 | |
| 	xtrb0	a0, t0
 | |
| 	xtrb0	a2, t1
 | |
| 	subu	a0, a2
 | |
| 
 | |
| # endif /* !__CSKYBE__ */
 | |
| 	jmp     lr
 | |
| 3:
 | |
| 	movi	a0, 0
 | |
| 4:
 | |
| 	jmp     lr
 | |
| 
 | |
| 	/* Compare when s1 or s2 is not aligned.  */
 | |
| 5:
 | |
| 	subi    t1, 4
 | |
| 6:
 | |
| 	ldb	a0, (a3, 0)
 | |
| 	ldb	a2, (a1, 0)
 | |
| 	subu	a0, a2
 | |
| 	bez	a2, 4b
 | |
| 	bnez	a0, 4b
 | |
| 	addi    t1, 1
 | |
| 	addi	a1, 1
 | |
| 	addi	a3, 1
 | |
| 	bnez	t1, 6b
 | |
| 	br	1b
 | |
| 
 | |
| 7:
 | |
| 	ldb	a0, (a3, 0)
 | |
| 	addi	a3, 1
 | |
| 	ldb	a2, (a1, 0)
 | |
| 	addi	a1, 1
 | |
| 	subu    a0, a2
 | |
| 	bnez    a0, 4b
 | |
| 	bnez	a2, 7b
 | |
| 	jmp	r15
 | |
| ENDPROC(strcmp)
 |