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

#include <linux/linkage.h>

#define SMALL   7 /* Must be at least 6 to deal with alignment/loop issues.  */

ENTRY_CFI(memset)
        mov_s   r4,r0
        or      r12,r0,r2
        bmsk.f  r12,r12,1
        extb_s  r1,r1
        asl     r3,r1,8
        beq.d   .Laligned
        or_s    r1,r1,r3
        brls    r2,SMALL,.Ltiny
        add     r3,r2,r0
        stb     r1,[r3,-1]
        bclr_s  r3,r3,0
        stw     r1,[r3,-2]
        bmsk.f  r12,r0,1
        add_s   r2,r2,r12
        sub.ne  r2,r2,4
        stb.ab  r1,[r4,1]
        and     r4,r4,-2
        stw.ab  r1,[r4,2]
        and     r4,r4,-4
.Laligned:      ; This code address should be aligned for speed.
        asl     r3,r1,16
        lsr.f   lp_count,r2,2
        or_s    r1,r1,r3
        lpne    .Loop_end
        st.ab   r1,[r4,4]
.Loop_end:
        j_s     [blink]

        .balign 4
.Ltiny:
        mov.f   lp_count,r2
        lpne    .Ltiny_end
        stb.ab  r1,[r4,1]
.Ltiny_end:
        j_s     [blink]
END_CFI(memset)

; memzero: @r0 = mem, @r1 = size_t
; memset:  @r0 = mem, @r1 = char, @r2 = size_t

ENTRY_CFI(memzero)
    ; adjust bzero args to memset args
    mov r2, r1
    mov r1, 0
    b  memset    ;tail call so need to tinker with blink
END_CFI(memzero)