3 #ifndef INCLUDE_NN_NLIB_PLATFORM_WIN32_H_ 4 #define INCLUDE_NN_NLIB_PLATFORM_WIN32_H_ 5 #ifndef INCLUDE_NN_NLIB_PLATFORM_H_ 6 # error do not include directly 11 #if !defined(_M_IX86) && !defined(_M_X64) 12 #error Sorry, not supported 16 # error Use Visual Studio 2012 or later 19 #ifndef WIN32_LEAN_AND_MEAN 20 # pragma message(__FILE__ ": WIN32_LEAN_AND_MEAN not defined, compile may fail") 21 # define WIN32_LEAN_AND_MEAN 25 # pragma message(__FILE__ ": NOMINMAX not defined, compile may fail") 29 #ifndef _USE_MATH_DEFINES 30 # pragma message(__FILE__ ": _USE_MATH_DEFINES not defined, compile may fail") 31 # define _USE_MATH_DEFINES 40 #pragma intrinsic(_BitScanReverse) 41 #pragma intrinsic(_BitScanForward) 43 # pragma intrinsic(_BitScanReverse64) 44 # pragma intrinsic(_BitScanForward64) 57 #if _MSC_VER == 1800 && WINVER < 0x0603 58 # pragma message(__FILE__ ": Please update your Windows SDK") 61 #if _MSC_VER == 1700 && WINVER < 0x0602 62 # pragma message(__FILE__ ": Please update your Windows SDK") 65 #if (!defined(_M_IX86_FP) || _M_IX86_FP < 2) && !defined(_M_X64) && !defined(_M_AMD64) 66 # error /arch:SSE2 or higher must be set 77 #define NLIB_HAS_STDHEADER_STDINT 79 #if (_MSC_VER >= 1800) 80 # define NLIB_HAS_STDHEADER_INTTYPES 81 # include <inttypes.h> 85 # define __func__ __FUNCTION__ 89 #ifndef NLIB_HAS_STDHEADER_INTTYPES 90 # include "nn/nlib/IntTypes.h" 98 # define va_copy(dest, src) (dest = src) 100 #define NLIB_ALWAYS_INLINE __forceinline 101 #define NLIB_NEVER_INLINE __declspec(noinline) 102 #define NLIB_LIKELY(x) (x) 103 #define NLIB_UNLIKELY(x) (x) 104 #define NLIB_EXPECT(var, exp_value) (var) 105 #define NLIB_CHECK_RESULT 106 #define NLIB_NORETURN 108 #define NLIB_NONNULL_1 109 #define NLIB_NONNULL_2 110 #define NLIB_NONNULL_3 111 #define NLIB_NONNULL_4 112 #define NLIB_NONNULL_5 113 #define NLIB_ATTRIBUTE_MALLOC 114 #define NLIB_ATTRIBUTE_PURE 115 #define NLIB_ATTRIBUTE_CONST 116 #define NLIB_ATTRIBUTE_ALLOC_SIZE1(n) 117 #define NLIB_ATTRIBUTE_ALLOC_SIZE2(n0, n1) 118 #define NLIB_ATTRIBUTE_ALLOC_ALIGN(algn) 119 #define NLIB_ATTRIBUTE_ASSUME_ALIGNED(n) 120 #ifndef NLIB_DEPRECATED 121 #define NLIB_DEPRECATED __declspec(deprecated) 123 #ifndef NLIB_DEPRECATED_MSG 124 #define NLIB_DEPRECATED_MSG(msg) __declspec(deprecated(msg)) 126 #define NLIB_WEAKSYMBOL 127 #define NLIB_VIS_HIDDEN 129 # define NLIB_EXPIMP_TEMPLATE_(x) template class NLIB_VIS_PUBLIC x 130 # define NLIB_WINEXPORT __declspec(dllexport) 131 # define NLIB_WINIMPORT __declspec(dllimport) 132 # define NLIB_VIS_PUBLIC NLIB_WINIMPORT 133 # define NLIB_EXPIMP_TEMPLATE(x) extern NLIB_EXPIMP_TEMPLATE_(x) 135 # define NLIB_VIS_PUBLIC 136 # define NLIB_EXPIMP_TEMPLATE(x) 139 #if defined(n_EXPORTS) 140 # undef NLIB_VIS_PUBLIC 141 # define NLIB_VIS_PUBLIC NLIB_WINEXPORT 142 #elif defined(nx_misc_EXPORTS) 143 # undef NLIB_EXPIMP_TEMPLATE 144 # define NLIB_EXPIMP_TEMPLATE(x) NLIB_EXPIMP_TEMPLATE_(x) 147 #define NLIB_VIS_PUBLIC_ALT 149 #define NLIB_LITTLE_ENDIAN 158 #define NLIB_MEMORY_ORDER_RELEASE \ 159 __pragma(warning(push)) \ 160 __pragma(warning(disable:4127)) \ 161 do { _WriteBarrier(); _mm_sfence(); } while (0) \ 162 __pragma(warning(pop)) 163 #define NLIB_MEMORY_ORDER_ACQUIRE \ 164 __pragma(warning(push)) \ 165 __pragma(warning(disable:4127)) \ 166 do { _ReadBarrier(); _mm_lfence(); } while (0) \ 167 __pragma(warning(pop)) 168 #define NLIB_MEMORY_ORDER_ACQ_REL \ 169 __pragma(warning(push)) \ 170 __pragma(warning(disable:4127)) \ 171 do { _ReadWriteBarrier(); _mm_mfence(); } while (0) \ 172 __pragma(warning(pop)) 173 #define NLIB_MEMORY_ORDER_SEQ_CST NLIB_MEMORY_ORDER_ACQ_REL 177 # define __PRIS_PREFIX "ll" 179 # define __PRIS_PREFIX 181 #define NLIB_WARN__(x) #x 182 #define NLIB_WARN_(x) NLIB_WARN__(x) 183 #define NLIB_WARN(exp) (__FILE__ "(" NLIB_WARN_(__LINE__) ") : WARNING: " exp) 188 #define NLIB_TIMESPEC_HAS_NATIVE 191 #pragma pack(push, 8) 192 typedef struct nlib_mutex_ {
201 #define NLIB_MUTEX_INITIALIZER { 0x6768696AU, 0 } 202 #define NLIB_RECURSIVE_MUTEX_INITIALIZER { 0x6768696AU, 1 } 203 #define NLIB_RECURSIVE_TIMED_MUTEX_INITIALIZER { 0x6768696AU, 2 } 207 typedef struct nlib_cond_ {
208 CONDITION_VARIABLE cond;
211 #define NLIB_COND_INITIALIZER { 0, NLIB_MUTEX_INITIALIZER } 215 #define NLIB_ATTRIBUTE_PRINTF(x, y) 217 #define NLIB_ASSUME(cond) __assume(cond) 219 #define NLIB_RWLOCK_HAS_NATIVE 220 #ifdef NLIB_RWLOCK_HAS_NATIVE 222 #define NLIB_RWLOCK_INITIALIZER SRWLOCK_INIT 227 #define NLIB_LIBC_nlib_memcmp 228 #define NLIB_LIBC_nlib_strlen 229 #define NLIB_LIBC_nlib_strnlen 230 #define NLIB_LIBC_nlib_wcslen 231 #define NLIB_LIBC_nlib_wcsnlen 232 #define NLIB_LIBC_nlib_strcpy 233 #define NLIB_LIBC_nlib_strncpy 234 #define NLIB_LIBC_nlib_wcscpy 235 #define NLIB_LIBC_nlib_wcsncpy 236 #define NLIB_LIBC_nlib_strchr 237 #define NLIB_LIBC_nlib_strrchr 239 #if !defined(__INTELLISENSE__) 240 #define NLIB_ATOMIC_RELAXED (0) 241 #define NLIB_ATOMIC_ACQUIRE (1) 242 #define NLIB_ATOMIC_RELEASE (2) 243 #define NLIB_ATOMIC_ACQ_REL (3) 244 #define NLIB_ATOMIC_SEQ_CST (7) 269 _InterlockedExchange((
volatile long*)ptr, val);
279 result = (int32_t)_InterlockedExchange((
volatile long*)ptr, val);
285 int32_t desired,
int weak,
286 int success_memorder,
int failure_memorder) {
289 result = _InterlockedCompareExchange((
volatile long*)ptr, desired, *expected);
292 (void)success_memorder;
293 (void)failure_memorder;
294 if (result == *expected) {
307 result = _InterlockedExchangeAdd((
volatile long*)ptr, val) + val;
317 result = _InterlockedExchangeAdd((
volatile long*)ptr, -val) - val;
327 result = _InterlockedAnd((
volatile long*)ptr, val) & val;
337 result = _InterlockedXor((
volatile long*)ptr, val) ^ val;
347 result = _InterlockedOr((
volatile long*)ptr, val) | val;
357 result = _InterlockedExchangeAdd((
volatile long*)ptr, val);
367 result = _InterlockedExchangeAdd((
volatile long*)ptr, -val);
377 result = _InterlockedAnd((
volatile long*)ptr, val);
387 result = _InterlockedXor((
volatile long*)ptr, val);
397 result = _InterlockedOr((
volatile long*)ptr, val);
421 InterlockedExchange64((
volatile long long*)ptr, val);
423 _InterlockedExchange64((
volatile long long*)ptr, val);
435 result = (int64_t)InterlockedExchange64((
volatile long long*)ptr, val);
437 result = (int64_t)_InterlockedExchange64((
volatile long long*)ptr, val);
444 int64_t desired,
int weak,
445 int success_memorder,
int failure_memorder) {
449 result = InterlockedCompareExchange64((
volatile long long*)ptr, desired, *expected);
451 result = _InterlockedCompareExchange64((
volatile long long*)ptr, desired, *expected);
455 (void)success_memorder;
456 (void)failure_memorder;
457 if (result == *expected) {
471 result = InterlockedExchangeAdd64((
volatile long long*)ptr, val) + val;
473 result = _InterlockedExchangeAdd64((
volatile long long*)ptr, val) + val;
485 result = InterlockedExchangeAdd64((
volatile long long*)ptr, -val) - val;
487 result = _InterlockedExchangeAdd64((
volatile long long*)ptr, -val) - val;
499 result = InterlockedAnd64((
volatile long long*)ptr, val) & val;
501 result = _InterlockedAnd64((
volatile long long*)ptr, val) & val;
513 result = InterlockedXor64((
volatile long long*)ptr, val) ^ val;
515 result = _InterlockedXor64((
volatile long long*)ptr, val) ^ val;
527 result = InterlockedOr64((
volatile long long*)ptr, val) | val;
529 result = _InterlockedOr64((
volatile long long*)ptr, val) | val;
541 result = InterlockedExchangeAdd64((
volatile long long*)ptr, val);
543 result = _InterlockedExchangeAdd64((
volatile long long*)ptr, val);
555 result = InterlockedExchangeAdd64((
volatile long long*)ptr, -val);
557 result = _InterlockedExchangeAdd64((
volatile long long*)ptr, -val);
569 result = InterlockedAnd64((
volatile long long*)ptr, val);
571 result = _InterlockedAnd64((
volatile long long*)ptr, val);
583 result = InterlockedXor64((
volatile long long*)ptr, val);
585 result = _InterlockedXor64((
volatile long long*)ptr, val);
597 result = InterlockedOr64((
volatile long long*)ptr, val);
599 result = _InterlockedOr64((
volatile long long*)ptr, val);
623 #if _MSC_VER < 1800 || (_MSC_VER == 1800 && !defined(NLIB_64BIT)) 624 InterlockedExchangePointer((
void*
volatile*)ptr, val);
626 _InterlockedExchangePointer((
void*
volatile*)ptr, val);
633 void* desired,
int weak,
634 int success_memorder,
int failure_memorder) {
638 result = InterlockedCompareExchangePointer((
void*
volatile *)ptr, desired, *expected);
640 result = _InterlockedCompareExchangePointer((
void*
volatile *)ptr, desired, *expected);
644 (void)success_memorder;
645 (void)failure_memorder;
646 if (result == *expected) {
676 # pragma comment(linker, "/alternatename:_nlib_malloc=_malloc") 677 # pragma comment(linker, "/alternatename:_nlib_free=_free") 678 # pragma comment(linker, "/alternatename:_nlib_calloc=_calloc") 679 # pragma comment(linker, "/alternatename:_nlib_realloc=_realloc") 680 # pragma comment(linker, "/alternatename:_nlib_free_size=_nlib_free_size_") 682 # pragma comment(linker, "/alternatename:nlib_malloc=malloc") 683 # pragma comment(linker, "/alternatename:nlib_free=free") 684 # pragma comment(linker, "/alternatename:nlib_calloc=calloc") 685 # pragma comment(linker, "/alternatename:nlib_realloc=realloc") 686 # pragma comment(linker, "/alternatename:nlib_free_size=nlib_free_size_") 689 #if defined(NLIB_SIMD) 691 # ifndef NLIB_LIBC_nlib_strlen 692 # pragma comment(linker, "/alternatename:_nlib_strlen=_nlib_strlen_simd") 694 # ifndef NLIB_LIBC_nlib_strlen 695 # pragma comment(linker, "/alternatename:_nlib_strnlen=_nlib_strnlen_simd") 697 # pragma comment(linker, "/alternatename:_nlib_utf16len_=_nlib_utf16len_simd") 698 # pragma comment(linker, "/alternatename:_nlib_utf16nlen_=_nlib_utf16nlen_simd") 699 # pragma comment(linker, "/alternatename:_nlib_utf32len_=_nlib_utf32len_generic") 700 # pragma comment(linker, "/alternatename:_nlib_utf32nlen_=_nlib_utf32nlen_generic") 701 # pragma comment(linker, "/alternatename:_nlib_utf16cplen_ex_=_nlib_utf16cplen_ex_simd") 702 # pragma comment(linker, "/alternatename:_nlib_strchr=_nlib_strchr_simd") 703 # pragma comment(linker, "/alternatename:_nlib_strrchr=_strrchr") 704 # pragma comment(linker, "/alternatename:_nlib_strchr_mb=_nlib_strchr_mb_simd") 705 # pragma comment(linker, "/alternatename:_nlib_memcmp=_nlib_memcmp_simd") 706 # pragma comment(linker, "/alternatename:_nlib_memchr=_nlib_memchr_simd") 707 # pragma comment(linker, "/alternatename:_nlib_memrchr=_nlib_memrchr_simd") 708 # pragma comment(linker, "/alternatename:_nlib_memchr_not=_nlib_memchr_not_simd") 709 # pragma comment(linker, "/alternatename:_nlib_memchr_range_not=_nlib_memchr_range_not_simd") 710 # pragma comment(linker, "/alternatename:_nlib_memchr_lt=_nlib_memchr_lt_simd") 711 # pragma comment(linker, "/alternatename:_nlib_memchr_gt=_nlib_memchr_gt_simd") 712 # pragma comment(linker, "/alternatename:_nlib_memchr_mb=_nlib_memchr_mb_simd") 713 # pragma comment(linker, "/alternatename:_nlib_skipws=_nlib_skipws_simd") 714 # pragma comment(linker, "/alternatename:_nlib_swapendian_16=_nlib_swapendian_16_simd") 715 # pragma comment(linker, "/alternatename:_nlib_swapendian_32=_nlib_swapendian_32_simd") 716 # pragma comment(linker, "/alternatename:_nlib_swapendian_64=_nlib_swapendian_64_simd") 717 # pragma comment(linker, "/alternatename:_nlib_strcplen_ex=_nlib_strcplen_ex") 718 # pragma comment(linker, "/alternatename:_nlib_popcnt=_nlib_popcnt_simd") 719 # pragma comment(linker, "/alternatename:_nlib_popcnt64=_nlib_popcnt64_simd") 721 # ifndef NLIB_LIBC_nlib_strlen 722 # pragma comment(linker, "/alternatename:nlib_strlen=nlib_strlen_simd") 724 # ifndef NLIB_LIBC_nlib_strlen 725 # pragma comment(linker, "/alternatename:nlib_strnlen=nlib_strnlen_simd") 727 # pragma comment(linker, "/alternatename:nlib_utf16len_=nlib_utf16len_simd") 728 # pragma comment(linker, "/alternatename:nlib_utf16nlen_=nlib_utf16nlen_simd") 729 # pragma comment(linker, "/alternatename:nlib_utf32len_=nlib_utf32len_generic") 730 # pragma comment(linker, "/alternatename:nlib_utf32nlen_=nlib_utf32nlen_generic") 731 # pragma comment(linker, "/alternatename:nlib_utf16cplen_ex_=nlib_utf16cplen_ex_simd") 732 # pragma comment(linker, "/alternatename:nlib_strchr=nlib_strchr_simd") 733 # pragma comment(linker, "/alternatename:nlib_strrchr=strrchr") 734 # pragma comment(linker, "/alternatename:nlib_strchr_mb=nlib_strchr_mb_simd") 735 # pragma comment(linker, "/alternatename:nlib_memcmp=nlib_memcmp_simd") 736 # pragma comment(linker, "/alternatename:nlib_memchr=nlib_memchr_simd") 737 # pragma comment(linker, "/alternatename:nlib_memrchr=nlib_memrchr_simd") 738 # pragma comment(linker, "/alternatename:nlib_memchr_not=nlib_memchr_not_simd") 739 # pragma comment(linker, "/alternatename:nlib_memchr_range_not=nlib_memchr_range_not_simd") 740 # pragma comment(linker, "/alternatename:nlib_memchr_lt=nlib_memchr_lt_simd") 741 # pragma comment(linker, "/alternatename:nlib_memchr_gt=nlib_memchr_gt_simd") 742 # pragma comment(linker, "/alternatename:nlib_memchr_mb=nlib_memchr_mb_simd") 743 # pragma comment(linker, "/alternatename:nlib_skipws=nlib_skipws_simd") 744 # pragma comment(linker, "/alternatename:nlib_swapendian_16=nlib_swapendian_16_simd") 745 # pragma comment(linker, "/alternatename:nlib_swapendian_32=nlib_swapendian_32_simd") 746 # pragma comment(linker, "/alternatename:nlib_swapendian_64=nlib_swapendian_64_simd") 747 # pragma comment(linker, "/alternatename:nlib_strcplen_ex=nlib_strcplen_ex") 748 # pragma comment(linker, "/alternatename:nlib_popcnt=nlib_popcnt_simd") 749 # pragma comment(linker, "/alternatename:nlib_popcnt64=nlib_popcnt64_simd") 753 # ifndef NLIB_LIBC_nlib_strlen 754 # pragma comment(linker, "/alternatename:_nlib_strlen=_nlib_strlen_generic") 756 # ifndef NLIB_LIBC_nlib_strlen 757 # pragma comment(linker, "/alternatename:_nlib_strnlen=_nlib_strnlen_generic") 759 # pragma comment(linker, "/alternatename:_nlib_utf16len_=_nlib_utf16len_generic") 760 # pragma comment(linker, "/alternatename:_nlib_utf16nlen_=_nlib_utf16nlen_generic") 761 # pragma comment(linker, "/alternatename:_nlib_utf32len_=_nlib_utf32len_generic") 762 # pragma comment(linker, "/alternatename:_nlib_utf32nlen_=_nlib_utf32nlen_generic") 763 # pragma comment(linker, "/alternatename:_nlib_utf16cplen_ex_=_nlib_utf16cplen_ex_generic") 764 # pragma comment(linker, "/alternatename:_nlib_strchr=_nlib_strchr_generic") 765 # pragma comment(linker, "/alternatename:_nlib_strrchr=_nlib_strrchr_generic") 766 # pragma comment(linker, "/alternatename:_nlib_strchr_mb=_nlib_strchr_mb_generic") 767 # pragma comment(linker, "/alternatename:_nlib_memcmp=_nlib_memcmp_generic") 768 # pragma comment(linker, "/alternatename:_nlib_memchr=_nlib_memchr_generic") 769 # pragma comment(linker, "/alternatename:_nlib_memrchr=_nlib_memrchr_generic") 770 # pragma comment(linker, "/alternatename:_nlib_memchr_not=_nlib_memchr_not_generic") 771 # pragma comment(linker, "/alternatename:_nlib_memchr_range_not=_nlib_memchr_range_not_generic") 772 # pragma comment(linker, "/alternatename:_nlib_memchr_lt=_nlib_memchr_lt_generic") 773 # pragma comment(linker, "/alternatename:_nlib_memchr_gt=_nlib_memchr_gt_generic") 774 # pragma comment(linker, "/alternatename:_nlib_memchr_mb=_nlib_memchr_mb_generic") 775 # pragma comment(linker, "/alternatename:_nlib_skipws=_nlib_skipws_generic") 776 # pragma comment(linker, "/alternatename:_nlib_swapendian_16=_nlib_swapendian_16_generic") 777 # pragma comment(linker, "/alternatename:_nlib_swapendian_32=_nlib_swapendian_32_generic") 778 # pragma comment(linker, "/alternatename:_nlib_swapendian_64=_nlib_swapendian_64_generic") 779 # pragma comment(linker, "/alternatename:_nlib_strcplen_ex=_nlib_strcplen_ex") 780 # pragma comment(linker, "/alternatename:_nlib_popcnt=_nlib_popcnt_generic") 781 # pragma comment(linker, "/alternatename:_nlib_popcnt64=_nlib_popcnt64_generic") 783 # ifndef NLIB_LIBC_nlib_strlen 784 # pragma comment(linker, "/alternatename:nlib_strlen=nlib_strlen_generic") 786 # ifndef NLIB_LIBC_nlib_strlen 787 # pragma comment(linker, "/alternatename:nlib_strnlen=nlib_strnlen_generic") 789 # pragma comment(linker, "/alternatename:nlib_utf16len_=nlib_utf16len_generic") 790 # pragma comment(linker, "/alternatename:nlib_utf16nlen_=nlib_utf16nlen_generic") 791 # pragma comment(linker, "/alternatename:nlib_utf32len_=nlib_utf32len_generic") 792 # pragma comment(linker, "/alternatename:nlib_utf32nlen_=nlib_utf32nlen_generic") 793 # pragma comment(linker, "/alternatename:nlib_utf16cplen_ex_=nlib_utf16cplen_ex_generic") 794 # pragma comment(linker, "/alternatename:nlib_strchr=nlib_strchr_generic") 795 # pragma comment(linker, "/alternatename:nlib_strrchr=nlib_strrchr_generic") 796 # pragma comment(linker, "/alternatename:nlib_strchr_mb=nlib_strchr_mb_generic") 797 # pragma comment(linker, "/alternatename:nlib_memcmp=nlib_memcmp_generic") 798 # pragma comment(linker, "/alternatename:nlib_memchr=nlib_memchr_generic") 799 # pragma comment(linker, "/alternatename:nlib_memrchr=nlib_memrchr_generic") 800 # pragma comment(linker, "/alternatename:nlib_memchr_not=nlib_memchr_not_generic") 801 # pragma comment(linker, "/alternatename:nlib_memchr_range_not=nlib_memchr_range_not_generic") 802 # pragma comment(linker, "/alternatename:nlib_memchr_lt=nlib_memchr_lt_generic") 803 # pragma comment(linker, "/alternatename:nlib_memchr_gt=nlib_memchr_gt_generic") 804 # pragma comment(linker, "/alternatename:nlib_memchr_mb=nlib_memchr_mb_generic") 805 # pragma comment(linker, "/alternatename:nlib_skipws=nlib_skipws_generic") 806 # pragma comment(linker, "/alternatename:nlib_swapendian_16=nlib_swapendian_16_generic") 807 # pragma comment(linker, "/alternatename:nlib_swapendian_32=nlib_swapendian_32_generic") 808 # pragma comment(linker, "/alternatename:nlib_swapendian_64=nlib_swapendian_64_generic") 809 # pragma comment(linker, "/alternatename:nlib_strcplen_ex=nlib_strcplen_ex") 810 # pragma comment(linker, "/alternatename:nlib_popcnt=nlib_popcnt_generic") 811 # pragma comment(linker, "/alternatename:nlib_popcnt64=nlib_popcnt64_generic") 816 #endif // INCLUDE_NN_NLIB_PLATFORM_WIN32_H_