x86: ASM fast memset()
This commit is contained in:
@ -20,4 +20,23 @@ static inline void *__inline_memcpy(void *to, const void *from, size_t n)
|
|||||||
return to;
|
return to;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ARCH_FAST_MEMSET
|
||||||
|
|
||||||
|
static inline void *__inline_memset(void *s, unsigned long c, size_t count)
|
||||||
|
{
|
||||||
|
int d0, d1;
|
||||||
|
asm volatile("rep ; stosl\n\t"
|
||||||
|
"testb $2,%b3\n\t"
|
||||||
|
"je 1f\n\t"
|
||||||
|
"stosw\n"
|
||||||
|
"1:\ttestb $1,%b3\n\t"
|
||||||
|
"je 2f\n\t"
|
||||||
|
"stosb\n"
|
||||||
|
"2:"
|
||||||
|
: "=&c" (d0), "=&D" (d1)
|
||||||
|
: "a" (c), "q" (count), "0" (count/4), "1" ((long)s)
|
||||||
|
: "memory");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -36,6 +36,10 @@ void *memset(void *s, int n, size_t l);
|
|||||||
#define fast_memcpy memcpy
|
#define fast_memcpy memcpy
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef ARCH_FAST_MEMSET
|
||||||
|
#define memset __inline_memset
|
||||||
|
#endif
|
||||||
|
|
||||||
extern int snprintf(char * buf, size_t size, const char *fmt, ...);
|
extern int snprintf(char * buf, size_t size, const char *fmt, ...);
|
||||||
extern int sprintf(char * buf, const char *fmt, ...);
|
extern int sprintf(char * buf, const char *fmt, ...);
|
||||||
extern int sscanf(const char * buf, const char * fmt, ...);
|
extern int sscanf(const char * buf, const char * fmt, ...);
|
||||||
|
|||||||
@ -13,6 +13,7 @@
|
|||||||
#include <kmalloc.h>
|
#include <kmalloc.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <memory.h>
|
#include <memory.h>
|
||||||
|
#include <arch-string.h>
|
||||||
|
|
||||||
size_t strlen(const char *p)
|
size_t strlen(const char *p)
|
||||||
{
|
{
|
||||||
@ -153,6 +154,7 @@ void *memcpy_long(void *dest, const void *src, size_t n)
|
|||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef ARCH_FAST_MEMSET
|
||||||
void *memset(void *s, int c, size_t n)
|
void *memset(void *s, int c, size_t n)
|
||||||
{
|
{
|
||||||
char *s_aligned = (void *)(((unsigned long)s + 7) & ~7);
|
char *s_aligned = (void *)(((unsigned long)s + 7) & ~7);
|
||||||
@ -187,6 +189,7 @@ void *memset(void *s, int c, size_t n)
|
|||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
int memcmp(const void *s1, const void *s2, size_t n)
|
int memcmp(const void *s1, const void *s2, size_t n)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user