root/arch/m68k/lib/memset.c

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

DEFINITIONS

This source file includes following definitions.
  1. memset

   1 /*
   2  * This file is subject to the terms and conditions of the GNU General Public
   3  * License.  See the file COPYING in the main directory of this archive
   4  * for more details.
   5  */
   6 
   7 #include <linux/module.h>
   8 #include <linux/string.h>
   9 
  10 void *memset(void *s, int c, size_t count)
  11 {
  12         void *xs = s;
  13         size_t temp;
  14 
  15         if (!count)
  16                 return xs;
  17         c &= 0xff;
  18         c |= c << 8;
  19         c |= c << 16;
  20         if ((long)s & 1) {
  21                 char *cs = s;
  22                 *cs++ = c;
  23                 s = cs;
  24                 count--;
  25         }
  26         if (count > 2 && (long)s & 2) {
  27                 short *ss = s;
  28                 *ss++ = c;
  29                 s = ss;
  30                 count -= 2;
  31         }
  32         temp = count >> 2;
  33         if (temp) {
  34                 long *ls = s;
  35 #if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE)
  36                 for (; temp; temp--)
  37                         *ls++ = c;
  38 #else
  39                 size_t temp1;
  40                 asm volatile (
  41                         "       movel %1,%2\n"
  42                         "       andw  #7,%2\n"
  43                         "       lsrl  #3,%1\n"
  44                         "       negw  %2\n"
  45                         "       jmp   %%pc@(2f,%2:w:2)\n"
  46                         "1:     movel %3,%0@+\n"
  47                         "       movel %3,%0@+\n"
  48                         "       movel %3,%0@+\n"
  49                         "       movel %3,%0@+\n"
  50                         "       movel %3,%0@+\n"
  51                         "       movel %3,%0@+\n"
  52                         "       movel %3,%0@+\n"
  53                         "       movel %3,%0@+\n"
  54                         "2:     dbra  %1,1b\n"
  55                         "       clrw  %1\n"
  56                         "       subql #1,%1\n"
  57                         "       jpl   1b"
  58                         : "=a" (ls), "=d" (temp), "=&d" (temp1)
  59                         : "d" (c), "0" (ls), "1" (temp));
  60 #endif
  61                 s = ls;
  62         }
  63         if (count & 2) {
  64                 short *ss = s;
  65                 *ss++ = c;
  66                 s = ss;
  67         }
  68         if (count & 1) {
  69                 char *cs = s;
  70                 *cs = c;
  71         }
  72         return xs;
  73 }
  74 EXPORT_SYMBOL(memset);

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