Use compiler intrinsics, where available
authorSam Lantinga <slouken@libsdl.org>
Mon, 17 Jan 2011 13:53:31 -0800
changeset 5012 2e282002bac3
parent 5011 d306007299ac
child 5013 9d6b527e0912
Use compiler intrinsics, where available
include/SDL_atomic.h
--- a/include/SDL_atomic.h	Mon Jan 17 13:52:40 2011 -0800
+++ b/include/SDL_atomic.h	Mon Jan 17 13:53:31 2011 -0800
@@ -113,18 +113,19 @@
 #ifndef SDL_DISABLE_ATOMIC_INLINE
 
 #if defined(__WIN32__)
-/* Don't include windows.h, since it may hose code that isn't expecting it,
-   but if someone has already included it, this is fair game... */
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
+#include <intrin.h>
 
-#define SDL_AtomicSet(a, v)     InterlockedExchange(&(a)->value, v)
+#define SDL_AtomicSet(a, v)     _InterlockedExchange(&(a)->value, (v))
 #define SDL_AtomicGet(a)        ((a)->value)
-#define SDL_AtomicAdd(a, v)     InterlockedAdd(&(a)->value, v)
-#define SDL_AtomicCAS(a, oldval, newval) (InterlockedCompareExchange(&(a)->value, newval, oldval) == (oldval))
-#define SDL_AtomicSetPtr(a, v)  InterlockedExchangePointer(a, v)
-#define SDL_AtomicGetPtr(a)     (*(a))
-#define SDL_AtomicCASPtr(a, oldval, newval) (InterlockedCompareExchangePointer(a, newval, oldval) == (oldval))
+#define SDL_AtomicAdd(a, v)     _InterlockedExchangeAdd(&(a)->value, (v))
+#define SDL_AtomicCAS(a, oldval, newval) (_InterlockedCompareExchange(&(a)->value, (newval), (oldval)) == (oldval))
+#define SDL_AtomicSetPtr(a, v)  (void)_InterlockedExchangePointer((a), (v))
+#define SDL_AtomicGetPtr(a)     (*(a))
+#if _M_IX86
+#define SDL_AtomicCASPtr(a, oldval, newval) (_InterlockedCompareExchange((long*)(a), (long)(newval), (long)(oldval)) == (long)(oldval))
+#else
+#define SDL_AtomicCASPtr(a, oldval, newval) (_InterlockedCompareExchangePointer((a), (newval), (oldval)) == (oldval))
+#endif
 
 #elif defined(__MACOSX__)
 #include <libkern/OSAtomic.h>