1/*
2 * Copyright (C) 2017 Hangzhou C-SKY Microsystems co.,ltd.
3 *
4 * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB
5 * in this tarball.
6 */
7
8#include <endian.h>
9#include "macro.S"
10
11#ifdef WANT_WIDE
12# define Wstrcpy wcscpy
13#else
14# define Wstrcpy strcpy
15#endif
16
17	.align 2
18	.global Wstrcpy
19	.type   Wstrcpy, @function
20Wstrcpy:
21
22        mov     a3, a0
23        or      a2, a1, a3
24        andi    t0, a2, 3
25        M_BEZ   t0, 2f
26        mov     t0, a1
27       1:
28        ld.b    a2, (t0)
29        stb     a2, (a3)
30        addi    t0, t0, 1
31        addi    a3, a3, 1
32        M_BNEZ  a2, 1b
33
34        jmp     r15
35
36       2:
37        ldw     a2, (a1)
38        tstnbz  a2
39        bf      11f
40        stw     a2, (a3)
41
42        ldw     a2, (a1, 4)
43        tstnbz  a2
44        bf      4f
45        stw     a2, (a3, 4)
46
47        ldw     a2, (a1, 8)
48        tstnbz  a2
49        bf      5f
50        stw     a2, (a3, 8)
51
52        ldw     a2, (a1, 12)
53        tstnbz  a2
54        bf      6f
55        stw     a2, (a3, 12)
56
57        ldw     a2, (a1, 16)
58        tstnbz  a2
59        bf      7f
60        stw     a2, (a3, 16)
61
62        ldw     a2, (a1, 20)
63        tstnbz  a2
64        bf      8f
65        stw     a2, (a3, 20)
66
67        ldw     a2, (a1, 24)
68        tstnbz  a2
69        bf      9f
70        stw     a2, (a3, 24)
71
72        ldw     a2, (a1, 28)
73        tstnbz  a2
74        bf      10f
75        stw     a2, (a3, 28)
76
77        addi     a3, 32
78        addi     a1, 32
79        br       2b
80
81       4:
82        addi    a3, 4
83        br      11f
84
85       5:
86        addi    a3, 8
87        br      11f
88
89       6:
90        addi    a3, 12
91        br      11f
92
93       7:
94        addi    a3, 16
95        br      11f
96
97       8:
98        addi    a3, 20
99        br      11f
100
101       9:
102        addi    a3, 24
103        br      11f
104
105       10:
106        addi    a3, 28
107       11:
108#ifdef __CSKYBE__
109        xtrb0   t0, a2
110        st.b    t0, (a3)
111        M_BEZ   t0, 5f
112        xtrb1   t0, a2
113        st.b    t0, (a3, 1)
114        M_BEZ   t0, 5f
115        xtrb2   t0, a2
116        st.b    t0, (a3, 2 )
117        M_BEZ   t0, 5f
118        stw     a2, (a3)
119#else
120        xtrb3   t0, a2
121        st.b    t0, (a3)
122        M_BEZ   t0, 5f
123        xtrb2   t0, a2
124        st.b    t0, (a3, 1)
125        M_BEZ   t0, 5f
126        xtrb1   t0, a2
127        st.b    t0, (a3, 2)
128        M_BEZ   t0, 5f
129        stw     a2, (a3)
130#endif
131       5:
132	jmp     r15
133
134
135libc_hidden_def(Wstrcpy)
136.weak Wstrcpy
137