Fixed linking x64 with Visual Studio 2010.
authorSam Lantinga <slouken@libsdl.org>
Tue, 08 Mar 2011 22:48:21 -0800
changeset 5455 5fbf5fc81aa8
parent 5454 fcb803889365
child 5456 63258b963fc1
Fixed linking x64 with Visual Studio 2010.
src/events/SDL_touch.c
src/stdlib/SDL_stdlib.c
src/video/windows/SDL_windowskeyboard.c
--- a/src/events/SDL_touch.c	Tue Mar 08 16:58:45 2011 -0800
+++ b/src/events/SDL_touch.c	Tue Mar 08 22:48:21 2011 -0800
@@ -123,7 +123,7 @@
         SDL_OutOfMemory();
         return -1;
     }
-    *SDL_touchPads[index] = *touch;
+    SDL_memcpy(SDL_touchPads[index], touch, sizeof(*touch));
 
     /* we're setting the touch properties */
     length = 0;
--- a/src/stdlib/SDL_stdlib.c	Tue Mar 08 16:58:45 2011 -0800
+++ b/src/stdlib/SDL_stdlib.c	Tue Mar 08 22:48:21 2011 -0800
@@ -35,6 +35,43 @@
 __declspec(selectany) int _fltused = 1;
 #endif
 
+/* The optimizer on Visual Studio 2010 generates memcpy() calls */
+#if _MSC_VER == 1600 && defined(_WIN64) && !defined(_DEBUG)
+#include <intrin.h>
+
+#pragma function(memcpy)
+void * memcpy ( void * destination, const void * source, size_t num )
+{
+    const Uint8 *src = (const Uint8 *)source;
+    Uint8 *dst = (Uint8 *)destination;
+    size_t i;
+    
+    /* All WIN64 architectures have SSE, right? */
+    if (!((uintptr_t) src & 15) && !((uintptr_t) dst & 15)) {
+        __m128 values[4];
+        for (i = num / 64; i--;) {
+            _mm_prefetch(src, _MM_HINT_NTA);
+            values[0] = *(__m128 *) (src + 0);
+            values[1] = *(__m128 *) (src + 16);
+            values[2] = *(__m128 *) (src + 32);
+            values[3] = *(__m128 *) (src + 48);
+            _mm_stream_ps((float *) (dst + 0), values[0]);
+            _mm_stream_ps((float *) (dst + 16), values[1]);
+            _mm_stream_ps((float *) (dst + 32), values[2]);
+            _mm_stream_ps((float *) (dst + 48), values[3]);
+            src += 64;
+            dst += 64;
+        }
+        num &= 63;
+    }
+
+    while (num--) {
+        *dst++ = *src++;
+    }
+    return destination;
+}
+#endif /* _MSC_VER == 1600 && defined(_WIN64) && !defined(_DEBUG) */
+
 #ifdef _M_IX86
 
 void
@@ -697,7 +734,7 @@
     /* *INDENT-ON* */
 }
 
-#endif /* _WIN64 */
+#endif /* _M_IX86 */
 
 #endif /* MSC_VER */
 
--- a/src/video/windows/SDL_windowskeyboard.c	Tue Mar 08 16:58:45 2011 -0800
+++ b/src/video/windows/SDL_windowskeyboard.c	Tue Mar 08 22:48:21 2011 -0800
@@ -1247,10 +1247,11 @@
 static void *
 StartDrawToBitmap(HDC hdc, HBITMAP *hhbm, int width, int height)
 {
-    BITMAPINFO info = {0};
+    BITMAPINFO info;
     BITMAPINFOHEADER *infoHeader = &info.bmiHeader;
     BYTE *bits = NULL;
     if (hhbm) {
+        SDL_zero(info);
         infoHeader->biSize = sizeof(BITMAPINFOHEADER);
         infoHeader->biWidth = width;
         infoHeader->biHeight = -1 * SDL_abs(height);