^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include "sysdep.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) ENTRY(strcpy)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) mov a3, a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) /* Check if the src addr is aligned. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) andi t0, a1, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) bnez t0, 11f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) /* Check if all the bytes in the word are not zero. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ldw a2, (a1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) bf 9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) stw a2, (a3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ldw a2, (a1, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) bf 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) stw a2, (a3, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ldw a2, (a1, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) bf 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) stw a2, (a3, 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ldw a2, (a1, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) bf 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) stw a2, (a3, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ldw a2, (a1, 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) bf 5f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) stw a2, (a3, 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ldw a2, (a1, 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) bf 6f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) stw a2, (a3, 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ldw a2, (a1, 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) bf 7f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) stw a2, (a3, 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ldw a2, (a1, 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) tstnbz a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) bf 8f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) stw a2, (a3, 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) addi a3, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) addi a1, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) br 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) addi a3, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) br 9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) addi a3, 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) br 9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) addi a3, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) br 9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) addi a3, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) br 9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) 6:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) addi a3, 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) br 9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) 7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) addi a3, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) br 9f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) 8:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) addi a3, 28
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) 9:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) # ifdef __CSKYBE__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) xtrb0 t0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) st.b t0, (a3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) bez t0, 10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) xtrb1 t0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) st.b t0, (a3, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) bez t0, 10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) xtrb2 t0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) st.b t0, (a3, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) bez t0, 10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) stw a2, (a3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) # else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) xtrb3 t0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) st.b t0, (a3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) bez t0, 10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) xtrb2 t0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) st.b t0, (a3, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) bez t0, 10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) xtrb1 t0, a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) st.b t0, (a3, 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) bez t0, 10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) stw a2, (a3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) # endif /* !__CSKYBE__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) jmp lr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 11:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) subi t0, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 12:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) ld.b a2, (a1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) st.b a2, (a3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) bez a2, 10b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) addi t0, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) addi a1, a1, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) addi a3, a3, 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) bnez t0, 12b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) jbr 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) ENDPROC(strcpy)