48 lines
1.1 KiB
C
48 lines
1.1 KiB
C
#ifndef MEM_H
|
|
#define MEM_H
|
|
|
|
static inline void memcpy(void * dest, const void * src, size_t n)
|
|
{
|
|
uint32_t r0, r1, r2;
|
|
__asm__ __volatile__ (
|
|
"cld\n\t"
|
|
"rep movsb"
|
|
: "=&c" (r0), "=&S" (r1), "=&D" (r2)
|
|
: "2" (dest), "1" (src), "0" (n)
|
|
: "memory");
|
|
}
|
|
|
|
static inline void memcpy32(void * dest, const void * src, size_t count)
|
|
{
|
|
uint32_t r0, r1, r2;
|
|
__asm__ __volatile__ (
|
|
"cld\n\t"
|
|
"rep movsd"
|
|
: "=&c" (r0), "=&S" (r1), "=&D" (r2)
|
|
: "2" (dest), "1" (src), "0" (count)
|
|
: "memory");
|
|
}
|
|
|
|
static inline void * memmove(void * dest, const void * src, size_t count)
|
|
{
|
|
return __builtin_memmove(dest, src, count);
|
|
}
|
|
|
|
static inline void * memset(void * dest, int val, size_t count)
|
|
{
|
|
return __builtin_memset(dest, val, count);
|
|
}
|
|
|
|
static inline void memset32(void * dest, uint32_t val, size_t count)
|
|
{
|
|
uint32_t r0, r1;
|
|
__asm__ __volatile__ (
|
|
"cld\n\t"
|
|
"rep stosl"
|
|
: "=&c" (r0), "=&D" (r1)
|
|
: "a" (val), "1" (dest), "0" (count)
|
|
: "memory");
|
|
}
|
|
|
|
#endif
|