From d0f3efca650eccd5179e045cd07f7d723037defc Mon Sep 17 00:00:00 2001
From: Austin Clements <amdragon@mit.edu>
Date: Thu, 1 Sep 2011 10:41:21 -0400
Subject: [PATCH] Use stosl in memset; makes boot time bearable

---
 string.c | 6 +++++-
 x86.h    | 9 +++++++++
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/string.c b/string.c
index a557dc5..d066c18 100644
--- 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
index 828d5bc..0c3feae 100644
--- 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
-- 
GitLab