124 строки
1.5 KiB
ArmAsm
124 строки
1.5 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(strcpy)
|
|
mov a3, a0
|
|
/* Check if the src addr is aligned. */
|
|
andi t0, a1, 3
|
|
bnez t0, 11f
|
|
1:
|
|
/* Check if all the bytes in the word are not zero. */
|
|
ldw a2, (a1)
|
|
tstnbz a2
|
|
bf 9f
|
|
stw a2, (a3)
|
|
|
|
ldw a2, (a1, 4)
|
|
tstnbz a2
|
|
bf 2f
|
|
stw a2, (a3, 4)
|
|
|
|
ldw a2, (a1, 8)
|
|
tstnbz a2
|
|
bf 3f
|
|
stw a2, (a3, 8)
|
|
|
|
ldw a2, (a1, 12)
|
|
tstnbz a2
|
|
bf 4f
|
|
stw a2, (a3, 12)
|
|
|
|
ldw a2, (a1, 16)
|
|
tstnbz a2
|
|
bf 5f
|
|
stw a2, (a3, 16)
|
|
|
|
ldw a2, (a1, 20)
|
|
tstnbz a2
|
|
bf 6f
|
|
stw a2, (a3, 20)
|
|
|
|
ldw a2, (a1, 24)
|
|
tstnbz a2
|
|
bf 7f
|
|
stw a2, (a3, 24)
|
|
|
|
ldw a2, (a1, 28)
|
|
tstnbz a2
|
|
bf 8f
|
|
stw a2, (a3, 28)
|
|
|
|
addi a3, 32
|
|
addi a1, 32
|
|
br 1b
|
|
|
|
|
|
2:
|
|
addi a3, 4
|
|
br 9f
|
|
|
|
3:
|
|
addi a3, 8
|
|
br 9f
|
|
|
|
4:
|
|
addi a3, 12
|
|
br 9f
|
|
|
|
5:
|
|
addi a3, 16
|
|
br 9f
|
|
|
|
6:
|
|
addi a3, 20
|
|
br 9f
|
|
|
|
7:
|
|
addi a3, 24
|
|
br 9f
|
|
|
|
8:
|
|
addi a3, 28
|
|
9:
|
|
# ifdef __CSKYBE__
|
|
xtrb0 t0, a2
|
|
st.b t0, (a3)
|
|
bez t0, 10f
|
|
xtrb1 t0, a2
|
|
st.b t0, (a3, 1)
|
|
bez t0, 10f
|
|
xtrb2 t0, a2
|
|
st.b t0, (a3, 2)
|
|
bez t0, 10f
|
|
stw a2, (a3)
|
|
# else
|
|
xtrb3 t0, a2
|
|
st.b t0, (a3)
|
|
bez t0, 10f
|
|
xtrb2 t0, a2
|
|
st.b t0, (a3, 1)
|
|
bez t0, 10f
|
|
xtrb1 t0, a2
|
|
st.b t0, (a3, 2)
|
|
bez t0, 10f
|
|
stw a2, (a3)
|
|
# endif /* !__CSKYBE__ */
|
|
10:
|
|
jmp lr
|
|
|
|
11:
|
|
subi t0, 4
|
|
12:
|
|
ld.b a2, (a1)
|
|
st.b a2, (a3)
|
|
bez a2, 10b
|
|
addi t0, 1
|
|
addi a1, a1, 1
|
|
addi a3, a3, 1
|
|
bnez t0, 12b
|
|
jbr 1b
|
|
ENDPROC(strcpy)
|