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