/* Copyright (C) 2021,2022 fef . All rights reserved. */ #pragma once #include #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; }