root/arch/arc/lib/memcpy-700.S
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
 */

#include <linux/linkage.h>

ENTRY_CFI(memcpy)
        or      r3,r0,r1
        asl_s   r3,r3,30
        mov_s   r5,r0
        brls.d  r2,r3,.Lcopy_bytewise
        sub.f   r3,r2,1
        ld_s    r12,[r1,0]
        asr.f   lp_count,r3,3
        bbit0.d r3,2,.Lnox4
        bmsk_s  r2,r2,1
        st.ab   r12,[r5,4]
        ld.a    r12,[r1,4]
.Lnox4:
        lppnz   .Lendloop
        ld_s    r3,[r1,4]
        st.ab   r12,[r5,4]
        ld.a    r12,[r1,8]
        st.ab   r3,[r5,4]
.Lendloop:
        breq    r2,0,.Last_store
        ld      r3,[r5,0]
#ifdef __LITTLE_ENDIAN__
        add3    r2,-1,r2
        ; uses long immediate
        xor_s   r12,r12,r3
        bmsk    r12,r12,r2
    xor_s       r12,r12,r3
#else /* BIG ENDIAN */
        sub3    r2,31,r2
        ; uses long immediate
        xor_s   r3,r3,r12
        bmsk    r3,r3,r2
        xor_s   r12,r12,r3
#endif /* ENDIAN */
.Last_store:
        j_s.d   [blink]
        st      r12,[r5,0]

        .balign 4
.Lcopy_bytewise:
        jcs     [blink]
        ldb_s   r12,[r1,0]
        lsr.f   lp_count,r3
        bhs_s   .Lnox1
        stb.ab  r12,[r5,1]
        ldb.a   r12,[r1,1]
.Lnox1:
        lppnz   .Lendbloop
        ldb_s   r3,[r1,1]
        stb.ab  r12,[r5,1]
        ldb.a   r12,[r1,2]
        stb.ab  r3,[r5,1]
.Lendbloop:
        j_s.d   [blink]
        stb     r12,[r5,0]
END_CFI(memcpy)