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