Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
0003 
0004 #include <linux/linkage.h>
0005 #include "sysdep.h"
0006 
0007 ENTRY(strcpy)
0008     mov a3, a0
0009     /* Check if the src addr is aligned.  */
0010         andi    t0, a1, 3
0011         bnez    t0, 11f
0012 1:
0013     /* Check if all the bytes in the word are not zero.  */
0014     ldw a2, (a1)
0015     tstnbz  a2
0016     bf  9f
0017     stw a2, (a3)
0018 
0019     ldw a2, (a1, 4)
0020     tstnbz  a2
0021     bf  2f
0022     stw a2, (a3, 4)
0023 
0024     ldw a2, (a1, 8)
0025     tstnbz  a2
0026     bf  3f
0027     stw a2, (a3, 8)
0028 
0029     ldw a2, (a1, 12)
0030     tstnbz  a2
0031     bf  4f
0032     stw a2, (a3, 12)
0033 
0034     ldw a2, (a1, 16)
0035     tstnbz  a2
0036     bf  5f
0037     stw a2, (a3, 16)
0038 
0039     ldw a2, (a1, 20)
0040     tstnbz  a2
0041     bf  6f
0042     stw a2, (a3, 20)
0043 
0044     ldw a2, (a1, 24)
0045     tstnbz  a2
0046     bf  7f
0047     stw a2, (a3, 24)
0048 
0049     ldw a2, (a1, 28)
0050     tstnbz  a2
0051     bf  8f
0052     stw a2, (a3, 28)
0053 
0054     addi    a3, 32
0055     addi    a1, 32
0056     br  1b
0057 
0058 
0059 2:
0060     addi    a3, 4
0061     br  9f
0062 
0063 3:
0064     addi    a3, 8
0065     br  9f
0066 
0067 4:
0068     addi    a3, 12
0069     br  9f
0070 
0071 5:
0072     addi    a3, 16
0073     br  9f
0074 
0075 6:
0076     addi    a3, 20
0077     br  9f
0078 
0079 7:
0080     addi    a3, 24
0081     br  9f
0082 
0083 8:
0084     addi    a3, 28
0085 9:
0086 # ifdef __CSKYBE__
0087     xtrb0   t0, a2
0088     st.b    t0, (a3)
0089     bez t0, 10f
0090     xtrb1   t0, a2
0091     st.b    t0, (a3, 1)
0092     bez t0, 10f
0093     xtrb2   t0, a2
0094     st.b    t0, (a3, 2)
0095     bez t0, 10f
0096     stw a2, (a3)
0097 # else
0098     xtrb3   t0, a2
0099     st.b    t0, (a3)
0100     bez t0, 10f
0101     xtrb2   t0, a2
0102     st.b    t0, (a3, 1)
0103     bez t0, 10f
0104     xtrb1   t0, a2
0105     st.b    t0, (a3, 2)
0106     bez t0, 10f
0107     stw a2, (a3)
0108 # endif /* !__CSKYBE__ */
0109 10:
0110     jmp lr
0111 
0112 11:
0113     subi    t0, 4
0114 12:
0115         ld.b    a2, (a1)
0116         st.b    a2, (a3)
0117         bez a2, 10b
0118     addi    t0, 1
0119         addi    a1, a1, 1
0120         addi    a3, a3, 1
0121     bnez    t0, 12b
0122     jbr 1b
0123 ENDPROC(strcpy)