root/arch/csky/abiv2/strcpy.S
/* 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)