From 5f55b90cbd5cee3b8918094082737d6619486d45 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 8 Mar 2011 22:48:21 -0800 Subject: [PATCH] Fixed linking x64 with Visual Studio 2010. --- src/events/SDL_touch.c | 2 +- src/stdlib/SDL_stdlib.c | 39 ++++++++++++++++++++++++- src/video/windows/SDL_windowskeyboard.c | 3 +- 3 files changed, 41 insertions(+), 3 deletions(-) mode change 100644 => 100755 src/stdlib/SDL_stdlib.c diff --git a/src/events/SDL_touch.c b/src/events/SDL_touch.c index 41e2c8e42..d55d17e26 100644 --- a/src/events/SDL_touch.c +++ b/src/events/SDL_touch.c @@ -123,7 +123,7 @@ SDL_AddTouch(const SDL_Touch * touch, char *name) SDL_OutOfMemory(); return -1; } - *SDL_touchPads[index] = *touch; + SDL_memcpy(SDL_touchPads[index], touch, sizeof(*touch)); /* we're setting the touch properties */ length = 0; diff --git a/src/stdlib/SDL_stdlib.c b/src/stdlib/SDL_stdlib.c old mode 100644 new mode 100755 index e6709bfe8..d8bf4e67c --- a/src/stdlib/SDL_stdlib.c +++ b/src/stdlib/SDL_stdlib.c @@ -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 + +#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 @@ RETZERO: /* *INDENT-ON* */ } -#endif /* _WIN64 */ +#endif /* _M_IX86 */ #endif /* MSC_VER */ diff --git a/src/video/windows/SDL_windowskeyboard.c b/src/video/windows/SDL_windowskeyboard.c index fc0c6550f..acc86a480 100644 --- a/src/video/windows/SDL_windowskeyboard.c +++ b/src/video/windows/SDL_windowskeyboard.c @@ -1247,10 +1247,11 @@ UILess_ReleaseSinks(SDL_VideoData *videodata) 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);