commit d0f3efca650eccd5179e045cd07f7d723037defc
parent e25b74ca8069e340c3f2c267d09beed6d9328250
Author: Austin Clements <amdragon@mit.edu>
Date: Thu, 1 Sep 2011 10:41:21 -0400
Use stosl in memset; makes boot time bearable
Diffstat:
2 files changed, 14 insertions(+), 1 deletion(-)
diff --git a/string.c b/string.c
@@ -4,7 +4,11 @@
void*
memset(void *dst, int c, uint n)
{
- stosb(dst, c, n);
+ if ((int)dst%4 == 0 && n%4 == 0){
+ c &= 0xFF;
+ stosl(dst, (c<<24)|(c<<16)|(c<<8)|c, n/4);
+ } else
+ stosb(dst, c, n);
return dst;
}
diff --git a/x86.h b/x86.h
@@ -48,6 +48,15 @@ stosb(void *addr, int data, int cnt)
"memory", "cc");
}
+static inline void
+stosl(void *addr, int data, int cnt)
+{
+ asm volatile("cld; rep stosl" :
+ "=D" (addr), "=c" (cnt) :
+ "0" (addr), "1" (cnt), "a" (data) :
+ "memory", "cc");
+}
+
struct segdesc;
static inline void