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

/* 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;
}