[PATCH] D36071: [builtins] Use _Interlocked* intrinsics for atomics on MSVC
Martin Storsjö via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 2 01:20:23 PDT 2017
mstorsjo updated this revision to Diff 109292.
mstorsjo retitled this revision from "[compiler-rt] [builtins] Only include immintrin.h if it is used" to "[builtins] Use _Interlocked* intrinsics for atomics on MSVC".
mstorsjo edited the summary of this revision.
https://reviews.llvm.org/D36071
Files:
lib/builtins/emutls.c
Index: lib/builtins/emutls.c
===================================================================
--- lib/builtins/emutls.c
+++ lib/builtins/emutls.c
@@ -102,7 +102,6 @@
#include <malloc.h>
#include <stdio.h>
#include <assert.h>
-#include <immintrin.h>
static LPCRITICAL_SECTION emutls_mutex;
static DWORD emutls_tls_index = TLS_OUT_OF_INDEXES;
@@ -207,24 +206,29 @@
/* Provide atomic load/store functions for emutls_get_index if built with MSVC.
*/
#if !defined(__ATOMIC_RELEASE)
+#include <intrin.h>
enum { __ATOMIC_ACQUIRE = 2, __ATOMIC_RELEASE = 3 };
static __inline uintptr_t __atomic_load_n(void *ptr, unsigned type) {
assert(type == __ATOMIC_ACQUIRE);
#ifdef _WIN64
- return (uintptr_t) _load_be_u64(ptr);
+#ifdef _M_X64
+ return _InterlockedOr64_np(ptr, 0);
#else
- return (uintptr_t) _load_be_u32(ptr);
+ return _InterlockedAdd64(ptr, 0);
+#endif
+#else
+ return _InterlockedAdd(ptr, 0);
#endif
}
static __inline void __atomic_store_n(void *ptr, uintptr_t val, unsigned type) {
assert(type == __ATOMIC_RELEASE);
#ifdef _WIN64
- _store_be_u64(ptr, val);
+ _InterlockedExchangePointer((void*volatile*)ptr, (void*) val);
#else
- _store_be_u32(ptr, val);
+ _InterlockedExchange(ptr, val);
#endif
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D36071.109292.patch
Type: text/x-patch
Size: 1269 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170802/79c68ed2/attachment.bin>
More information about the llvm-commits
mailing list