forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
1.5 KiB
123 lines
1.5 KiB
/* 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)
|
|
|