18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci// Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd. 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci#include <linux/linkage.h> 58c2ecf20Sopenharmony_ci#include "sysdep.h" 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ciENTRY(strcpy) 88c2ecf20Sopenharmony_ci mov a3, a0 98c2ecf20Sopenharmony_ci /* Check if the src addr is aligned. */ 108c2ecf20Sopenharmony_ci andi t0, a1, 3 118c2ecf20Sopenharmony_ci bnez t0, 11f 128c2ecf20Sopenharmony_ci1: 138c2ecf20Sopenharmony_ci /* Check if all the bytes in the word are not zero. */ 148c2ecf20Sopenharmony_ci ldw a2, (a1) 158c2ecf20Sopenharmony_ci tstnbz a2 168c2ecf20Sopenharmony_ci bf 9f 178c2ecf20Sopenharmony_ci stw a2, (a3) 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci ldw a2, (a1, 4) 208c2ecf20Sopenharmony_ci tstnbz a2 218c2ecf20Sopenharmony_ci bf 2f 228c2ecf20Sopenharmony_ci stw a2, (a3, 4) 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci ldw a2, (a1, 8) 258c2ecf20Sopenharmony_ci tstnbz a2 268c2ecf20Sopenharmony_ci bf 3f 278c2ecf20Sopenharmony_ci stw a2, (a3, 8) 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci ldw a2, (a1, 12) 308c2ecf20Sopenharmony_ci tstnbz a2 318c2ecf20Sopenharmony_ci bf 4f 328c2ecf20Sopenharmony_ci stw a2, (a3, 12) 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci ldw a2, (a1, 16) 358c2ecf20Sopenharmony_ci tstnbz a2 368c2ecf20Sopenharmony_ci bf 5f 378c2ecf20Sopenharmony_ci stw a2, (a3, 16) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci ldw a2, (a1, 20) 408c2ecf20Sopenharmony_ci tstnbz a2 418c2ecf20Sopenharmony_ci bf 6f 428c2ecf20Sopenharmony_ci stw a2, (a3, 20) 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci ldw a2, (a1, 24) 458c2ecf20Sopenharmony_ci tstnbz a2 468c2ecf20Sopenharmony_ci bf 7f 478c2ecf20Sopenharmony_ci stw a2, (a3, 24) 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci ldw a2, (a1, 28) 508c2ecf20Sopenharmony_ci tstnbz a2 518c2ecf20Sopenharmony_ci bf 8f 528c2ecf20Sopenharmony_ci stw a2, (a3, 28) 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci addi a3, 32 558c2ecf20Sopenharmony_ci addi a1, 32 568c2ecf20Sopenharmony_ci br 1b 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci2: 608c2ecf20Sopenharmony_ci addi a3, 4 618c2ecf20Sopenharmony_ci br 9f 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci3: 648c2ecf20Sopenharmony_ci addi a3, 8 658c2ecf20Sopenharmony_ci br 9f 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci4: 688c2ecf20Sopenharmony_ci addi a3, 12 698c2ecf20Sopenharmony_ci br 9f 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ci5: 728c2ecf20Sopenharmony_ci addi a3, 16 738c2ecf20Sopenharmony_ci br 9f 748c2ecf20Sopenharmony_ci 758c2ecf20Sopenharmony_ci6: 768c2ecf20Sopenharmony_ci addi a3, 20 778c2ecf20Sopenharmony_ci br 9f 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci7: 808c2ecf20Sopenharmony_ci addi a3, 24 818c2ecf20Sopenharmony_ci br 9f 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci8: 848c2ecf20Sopenharmony_ci addi a3, 28 858c2ecf20Sopenharmony_ci9: 868c2ecf20Sopenharmony_ci# ifdef __CSKYBE__ 878c2ecf20Sopenharmony_ci xtrb0 t0, a2 888c2ecf20Sopenharmony_ci st.b t0, (a3) 898c2ecf20Sopenharmony_ci bez t0, 10f 908c2ecf20Sopenharmony_ci xtrb1 t0, a2 918c2ecf20Sopenharmony_ci st.b t0, (a3, 1) 928c2ecf20Sopenharmony_ci bez t0, 10f 938c2ecf20Sopenharmony_ci xtrb2 t0, a2 948c2ecf20Sopenharmony_ci st.b t0, (a3, 2) 958c2ecf20Sopenharmony_ci bez t0, 10f 968c2ecf20Sopenharmony_ci stw a2, (a3) 978c2ecf20Sopenharmony_ci# else 988c2ecf20Sopenharmony_ci xtrb3 t0, a2 998c2ecf20Sopenharmony_ci st.b t0, (a3) 1008c2ecf20Sopenharmony_ci bez t0, 10f 1018c2ecf20Sopenharmony_ci xtrb2 t0, a2 1028c2ecf20Sopenharmony_ci st.b t0, (a3, 1) 1038c2ecf20Sopenharmony_ci bez t0, 10f 1048c2ecf20Sopenharmony_ci xtrb1 t0, a2 1058c2ecf20Sopenharmony_ci st.b t0, (a3, 2) 1068c2ecf20Sopenharmony_ci bez t0, 10f 1078c2ecf20Sopenharmony_ci stw a2, (a3) 1088c2ecf20Sopenharmony_ci# endif /* !__CSKYBE__ */ 1098c2ecf20Sopenharmony_ci10: 1108c2ecf20Sopenharmony_ci jmp lr 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci11: 1138c2ecf20Sopenharmony_ci subi t0, 4 1148c2ecf20Sopenharmony_ci12: 1158c2ecf20Sopenharmony_ci ld.b a2, (a1) 1168c2ecf20Sopenharmony_ci st.b a2, (a3) 1178c2ecf20Sopenharmony_ci bez a2, 10b 1188c2ecf20Sopenharmony_ci addi t0, 1 1198c2ecf20Sopenharmony_ci addi a1, a1, 1 1208c2ecf20Sopenharmony_ci addi a3, a3, 1 1218c2ecf20Sopenharmony_ci bnez t0, 12b 1228c2ecf20Sopenharmony_ci jbr 1b 1238c2ecf20Sopenharmony_ciENDPROC(strcpy) 124