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