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