linux/arch/m68k/lib/memset.c
<<
>>
Prefs
   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
  10void *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}
  74EXPORT_SYMBOL(memset);
  75