Backed out commit 898992405fa7 because memset() does a byte fill and SDL_memset4() does a uint32 fill and this change breaks SDL_FillRect()
authorSam Lantinga <slouken@libsdl.org>
Tue, 09 Jul 2013 07:13:58 -0700
changeset 7385 6e90315f859a
parent 7384 07c5fcdd3cad
child 7386 ff3af8304053
Backed out commit 898992405fa7 because memset() does a byte fill and SDL_memset4() does a uint32 fill and this change breaks SDL_FillRect()
include/SDL_stdinc.h
--- a/include/SDL_stdinc.h	Tue Jul 09 10:25:16 2013 -0300
+++ b/include/SDL_stdinc.h	Tue Jul 09 07:13:58 2013 -0700
@@ -257,9 +257,33 @@
 /* Note that the semantics are different from memset() in that this is a 32-bit assignment */
 SDL_FORCE_INLINE void SDL_memset4(void *dst, int val, size_t dwords)
 {
-    SDL_memset(dst, val, dwords * 4);
+#if defined(__GNUC__) && defined(i386)
+    int u0, u1, u2;
+    __asm__ __volatile__ (
+        "cld \n\t"
+        "rep ; stosl \n\t"
+        : "=&D" (u0), "=&a" (u1), "=&c" (u2)
+        : "0" (dst), "1" (val), "2" (SDL_static_cast(Uint32, dwords))
+        : "memory"
+    );
+#else
+    size_t _n = (dwords + 3) / 4;
+    Uint32 *_p = SDL_static_cast(Uint32 *, dst);
+    Uint32 _val = (val);
+    if (dwords == 0)
+        return;
+    switch (dwords % 4)
+    {
+        case 0: do {    *_p++ = _val;
+        case 3:         *_p++ = _val;
+        case 2:         *_p++ = _val;
+        case 1:         *_p++ = _val;
+        } while ( --_n );
+    }
+#endif
 }
 
+
 extern DECLSPEC void *SDLCALL SDL_memcpy(void *dst, const void *src, size_t len);
 
 SDL_FORCE_INLINE void *SDL_memcpy4(void *dst, const void *src, size_t dwords)