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