root/arch/sh/lib/memset.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /* $Id: memset.S,v 1.1 2000/04/14 16:49:01 mjd Exp $
   3  *
   4  * "memset" implementation of SuperH
   5  *
   6  * Copyright (C) 1999  Niibe Yutaka
   7  *
   8  */
   9 
  10 /*
  11  *            void *memset(void *s, int c, size_t n);
  12  */
  13 
  14 #include <linux/linkage.h>
  15 
  16 ENTRY(memset)
  17         tst     r6,r6
  18         bt/s    5f              ! if n=0, do nothing
  19          add    r6,r4
  20         mov     #12,r0
  21         cmp/gt  r6,r0
  22         bt/s    4f              ! if it's too small, set a byte at once
  23          mov    r4,r0
  24         and     #3,r0
  25         cmp/eq  #0,r0
  26         bt/s    2f              ! It's aligned
  27          sub    r0,r6
  28 1:
  29         dt      r0
  30         bf/s    1b
  31          mov.b  r5,@-r4
  32 2:                              ! make VVVV
  33         extu.b  r5,r5
  34         swap.b  r5,r0           !   V0
  35         or      r0,r5           !   VV
  36         swap.w  r5,r0           ! VV00
  37         or      r0,r5           ! VVVV
  38         !
  39         mov     r6,r0
  40         shlr2   r0
  41         shlr    r0              ! r0 = r6 >> 3
  42 3:
  43         dt      r0
  44         mov.l   r5,@-r4         ! set 8-byte at once
  45         bf/s    3b
  46          mov.l  r5,@-r4
  47         !
  48         mov     #7,r0
  49         and     r0,r6
  50         tst     r6,r6
  51         bt      5f
  52         ! fill bytes
  53 4:
  54         dt      r6
  55         bf/s    4b
  56          mov.b  r5,@-r4
  57 5:
  58         rts
  59          mov    r4,r0

/* [<][>][^][v][top][bottom][index][help] */