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