kern/arch/x86/include/arch/string/memset.h
fef f8a85a1541
happy new year 2022 uwu
May it be slightly less exhausting than 2021.
2022-01-01 03:49:33 +01:00

72 lines
1.1 KiB
C

/* Copyright (C) 2021,2022 fef <owo@fef.moe>. All rights reserved. */
#pragma once
#include <gay/types.h>
#define __HAVE_ARCH_MEMSET
extern void *memset(void *dest, int c, usize n);
#define __HAVE_ARCH_MEMSET16
static inline void *memset16(u16 *dest, u16 val, usize nbyte)
{
void *dst0 = dest;
nbyte /= 2;
__asm__ volatile(
" rep \n"
" stosw \n"
: "+c"(nbyte), "+D"(dest)
: "a"(val)
: "memory"
);
return dst0;
}
#define __HAVE_ARCH_MEMSET32
static inline void *memset32(u32 *dest, u32 val, usize nbyte)
{
void *dst0 = dest;
nbyte /= 4;
__asm__ volatile(
" rep \n"
" stosl \n"
: "+c"(nbyte), "+D"(dest)
: "a"(val)
: "memory"
);
return dst0;
}
#define __HAVE_ARCH_MEMSET64
static inline void *memset64(u64 *dest, u64 val, usize nbyte)
{
void *dst0 = dest;
nbyte /= 8;
#ifdef __x86_64__
__asm__ volatile(
" rep \n"
" stosq \n"
: "+c"(nbyte), "+D"(dest)
: "a"(val)
: "memory"
);
#else
__asm__ volatile(
"1: stosl \n"
" xchgl %3, %2 \n"
" stosl \n"
" xchgl %3, %2 \n"
" loop 1b \n"
: "+c"(nbyte), "+D"(dest)
: "a"((u32)val), "r"((u32)(val >> 32))
: "memory"
);
#endif
return dst0;
}