mirror of https://gitee.com/openkylin/linux.git
69 lines
1.5 KiB
C
69 lines
1.5 KiB
C
/*
|
|
* arch/v850/lib/memset.c -- Memory initialization
|
|
*
|
|
* Copyright (C) 2001,02,04 NEC Corporation
|
|
* Copyright (C) 2001,02,04 Miles Bader <miles@gnu.org>
|
|
*
|
|
* This file is subject to the terms and conditions of the GNU General
|
|
* Public License. See the file COPYING in the main directory of this
|
|
* archive for more details.
|
|
*
|
|
* Written by Miles Bader <miles@gnu.org>
|
|
*/
|
|
|
|
#include <linux/types.h>
|
|
|
|
void *memset (void *dst, int val, __kernel_size_t count)
|
|
{
|
|
if (count) {
|
|
register unsigned loop;
|
|
register void *ptr asm ("ep") = dst;
|
|
|
|
/* replicate VAL into a long. */
|
|
val &= 0xff;
|
|
val |= val << 8;
|
|
val |= val << 16;
|
|
|
|
/* copy initial unaligned bytes. */
|
|
if ((long)ptr & 1) {
|
|
*(char *)ptr = val;
|
|
ptr = (void *)((char *)ptr + 1);
|
|
count--;
|
|
}
|
|
if (count > 2 && ((long)ptr & 2)) {
|
|
*(short *)ptr = val;
|
|
ptr = (void *)((short *)ptr + 1);
|
|
count -= 2;
|
|
}
|
|
|
|
/* 32-byte copying loop. */
|
|
for (loop = count / 32; loop; loop--) {
|
|
asm ("sst.w %0, 0[ep]; sst.w %0, 4[ep];"
|
|
"sst.w %0, 8[ep]; sst.w %0, 12[ep];"
|
|
"sst.w %0, 16[ep]; sst.w %0, 20[ep];"
|
|
"sst.w %0, 24[ep]; sst.w %0, 28[ep]"
|
|
:: "r" (val) : "memory");
|
|
ptr += 32;
|
|
}
|
|
count %= 32;
|
|
|
|
/* long copying loop. */
|
|
for (loop = count / 4; loop; loop--) {
|
|
*(long *)ptr = val;
|
|
ptr = (void *)((long *)ptr + 1);
|
|
}
|
|
count %= 4;
|
|
|
|
/* finish up with any trailing bytes. */
|
|
if (count & 2) {
|
|
*(short *)ptr = val;
|
|
ptr = (void *)((short *)ptr + 1);
|
|
}
|
|
if (count & 1) {
|
|
*(char *)ptr = val;
|
|
}
|
|
}
|
|
|
|
return dst;
|
|
}
|