You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
1.1 KiB
C
73 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;
|
|
}
|