linux/arch/arc/lib/memset.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
   4 */
   5
   6#include <linux/linkage.h>
   7
   8#define SMALL   7 /* Must be at least 6 to deal with alignment/loop issues.  */
   9
  10ENTRY_CFI(memset)
  11        mov_s   r4,r0
  12        or      r12,r0,r2
  13        bmsk.f  r12,r12,1
  14        extb_s  r1,r1
  15        asl     r3,r1,8
  16        beq.d   .Laligned
  17        or_s    r1,r1,r3
  18        brls    r2,SMALL,.Ltiny
  19        add     r3,r2,r0
  20        stb     r1,[r3,-1]
  21        bclr_s  r3,r3,0
  22        stw     r1,[r3,-2]
  23        bmsk.f  r12,r0,1
  24        add_s   r2,r2,r12
  25        sub.ne  r2,r2,4
  26        stb.ab  r1,[r4,1]
  27        and     r4,r4,-2
  28        stw.ab  r1,[r4,2]
  29        and     r4,r4,-4
  30.Laligned:      ; This code address should be aligned for speed.
  31        asl     r3,r1,16
  32        lsr.f   lp_count,r2,2
  33        or_s    r1,r1,r3
  34        lpne    .Loop_end
  35        st.ab   r1,[r4,4]
  36.Loop_end:
  37        j_s     [blink]
  38
  39        .balign 4
  40.Ltiny:
  41        mov.f   lp_count,r2
  42        lpne    .Ltiny_end
  43        stb.ab  r1,[r4,1]
  44.Ltiny_end:
  45        j_s     [blink]
  46END_CFI(memset)
  47
  48; memzero: @r0 = mem, @r1 = size_t
  49; memset:  @r0 = mem, @r1 = char, @r2 = size_t
  50
  51ENTRY_CFI(memzero)
  52    ; adjust bzero args to memset args
  53    mov r2, r1
  54    mov r1, 0
  55    b  memset    ;tail call so need to tinker with blink
  56END_CFI(memzero)
  57