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