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)
|