Skip to content

Commit 727ab8a

Browse files
author
Albert Gutowski
committed
Add some MS aliases for existing intrinsics
Reviewers: thakis, compnerd, majnemer, rsmith, rnk Subscribers: alexshap, cfe-commits Differential Revision: https://reviews.llvm.org/D24330 llvm-svn: 281540
1 parent ecdab09 commit 727ab8a

File tree

14 files changed

+221
-112
lines changed

14 files changed

+221
-112
lines changed

clang/include/clang/Basic/Builtins.def

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
// f -> this is a libc/libm function without the '__builtin_' prefix. It can
7575
// be followed by ':headername:' to state which header this function
7676
// comes from.
77+
// h -> this function requires a specific header or an explicit declaration.
7778
// i -> this is a runtime library implemented function without the
7879
// '__builtin_' prefix. It will be implemented in compiler-rt or libgcc.
7980
// p:N: -> this is a printf-like function whose Nth argument is the format
@@ -708,6 +709,9 @@ BUILTIN(__builtin_rindex, "c*cC*i", "Fn")
708709
// Microsoft builtins. These are only active with -fms-extensions.
709710
LANGBUILTIN(_alloca, "v*z", "n", ALL_MS_LANGUAGES)
710711
LANGBUILTIN(__assume, "vb", "n", ALL_MS_LANGUAGES)
712+
LIBBUILTIN(_byteswap_ushort, "UsUs", "fnc", "stdlib.h", ALL_MS_LANGUAGES)
713+
LIBBUILTIN(_byteswap_ulong, "ULiULi", "fnc", "stdlib.h", ALL_MS_LANGUAGES)
714+
LIBBUILTIN(_byteswap_uint64, "ULLiULLi", "fnc", "stdlib.h", ALL_MS_LANGUAGES)
711715
LANGBUILTIN(__debugbreak, "v", "n", ALL_MS_LANGUAGES)
712716
LANGBUILTIN(__exception_code, "ULi", "n", ALL_MS_LANGUAGES)
713717
LANGBUILTIN(_exception_code, "ULi", "n", ALL_MS_LANGUAGES)
@@ -745,6 +749,9 @@ LANGBUILTIN(_InterlockedXor8, "ccD*c", "n", ALL_MS_LANGUAGES)
745749
LANGBUILTIN(_InterlockedXor16, "ssD*s", "n", ALL_MS_LANGUAGES)
746750
LANGBUILTIN(_InterlockedXor, "LiLiD*Li", "n", ALL_MS_LANGUAGES)
747751
LANGBUILTIN(__noop, "i.", "n", ALL_MS_LANGUAGES)
752+
LANGBUILTIN(__popcnt16, "UsUs", "nc", ALL_MS_LANGUAGES)
753+
LANGBUILTIN(__popcnt, "UiUi", "nc", ALL_MS_LANGUAGES)
754+
LANGBUILTIN(__popcnt64, "ULLiULLi", "nc", ALL_MS_LANGUAGES)
748755
LANGBUILTIN(__readfsdword, "ULiULi", "n", ALL_MS_LANGUAGES)
749756
LANGBUILTIN(_rotl8, "UcUcUc", "n", ALL_MS_LANGUAGES)
750757
LANGBUILTIN(_rotl16, "UsUsUc", "n", ALL_MS_LANGUAGES)

clang/include/clang/Basic/Builtins.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,13 @@ class Context {
139139
return strchr(getRecord(ID).Attributes, 'f') != nullptr;
140140
}
141141

142+
/// \brief Returns true if this builtin requires appropriate header in other
143+
/// compilers. In Clang it will work even without including it, but we can emit
144+
/// a warning about missing header.
145+
bool isHeaderDependentFunction(unsigned ID) const {
146+
return strchr(getRecord(ID).Attributes, 'h') != nullptr;
147+
}
148+
142149
/// \brief Determines whether this builtin is a predefined compiler-rt/libgcc
143150
/// function, such as "__clear_cache", where we know the signature a
144151
/// priori.

clang/include/clang/Basic/BuiltinsX86.def

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
# define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS)
2424
#endif
2525

26+
#if defined(BUILTIN) && !defined(TARGET_HEADER_BUILTIN)
27+
# define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS)
28+
#endif
29+
2630
// FIXME: Are these nothrow/const?
2731

2832
// Miscellaneous builtin for checking x86 cpu features.
@@ -301,7 +305,9 @@ TARGET_BUILTIN(__builtin_ia32_pabsw128, "V8sV8s", "", "ssse3")
301305
TARGET_BUILTIN(__builtin_ia32_pabsd128, "V4iV4i", "", "ssse3")
302306

303307
TARGET_BUILTIN(__builtin_ia32_ldmxcsr, "vUi", "", "sse")
308+
TARGET_HEADER_BUILTIN(_mm_setcsr, "vUi", "h","xmmintrin.h", ALL_LANGUAGES, "sse")
304309
TARGET_BUILTIN(__builtin_ia32_stmxcsr, "Ui", "", "sse")
310+
TARGET_HEADER_BUILTIN(_mm_getcsr, "Ui", "h", "xmmintrin.h", ALL_LANGUAGES, "sse")
305311
TARGET_BUILTIN(__builtin_ia32_cvtss2si, "iV4f", "", "sse")
306312
TARGET_BUILTIN(__builtin_ia32_cvttss2si, "iV4f", "", "sse")
307313
TARGET_BUILTIN(__builtin_ia32_cvtss2si64, "LLiV4f", "", "sse")
@@ -310,6 +316,7 @@ TARGET_BUILTIN(__builtin_ia32_storehps, "vV2i*V4f", "", "sse")
310316
TARGET_BUILTIN(__builtin_ia32_storelps, "vV2i*V4f", "", "sse")
311317
TARGET_BUILTIN(__builtin_ia32_movmskps, "iV4f", "", "sse")
312318
TARGET_BUILTIN(__builtin_ia32_sfence, "v", "", "sse")
319+
TARGET_HEADER_BUILTIN(_mm_sfence, "v", "h", "xmmintrin.h", ALL_LANGUAGES, "sse")
313320
TARGET_BUILTIN(__builtin_ia32_rcpps, "V4fV4f", "", "sse")
314321
TARGET_BUILTIN(__builtin_ia32_rcpss, "V4fV4f", "", "sse")
315322
TARGET_BUILTIN(__builtin_ia32_rsqrtps, "V4fV4f", "", "sse")
@@ -337,9 +344,13 @@ TARGET_BUILTIN(__builtin_ia32_cvtsd2ss, "V4fV4fV2d", "", "sse2")
337344
TARGET_BUILTIN(__builtin_ia32_cvtps2dq, "V4iV4f", "", "sse2")
338345
TARGET_BUILTIN(__builtin_ia32_cvttps2dq, "V4iV4f", "", "sse2")
339346
TARGET_BUILTIN(__builtin_ia32_clflush, "vvC*", "", "sse2")
347+
TARGET_HEADER_BUILTIN(_mm_clflush, "vvC*", "h", "emmintrin.h", ALL_LANGUAGES, "sse2")
340348
TARGET_BUILTIN(__builtin_ia32_lfence, "v", "", "sse2")
349+
TARGET_HEADER_BUILTIN(_mm_lfence, "v", "h", "emmintrin.h", ALL_LANGUAGES, "sse2")
341350
TARGET_BUILTIN(__builtin_ia32_mfence, "v", "", "sse2")
351+
TARGET_HEADER_BUILTIN(_mm_mfence, "v", "h", "emmintrin.h", ALL_LANGUAGES, "sse2")
342352
TARGET_BUILTIN(__builtin_ia32_pause, "v", "", "sse2")
353+
TARGET_HEADER_BUILTIN(_mm_pause, "v", "h", "emmintrin.h", ALL_LANGUAGES, "sse2")
343354
TARGET_BUILTIN(__builtin_ia32_pmuludq128, "V2LLiV4iV4i", "", "sse2")
344355
TARGET_BUILTIN(__builtin_ia32_psraw128, "V8sV8sV8s", "", "sse2")
345356
TARGET_BUILTIN(__builtin_ia32_psrad128, "V4iV4iV4i", "", "sse2")
@@ -894,6 +905,7 @@ TARGET_BUILTIN(__builtin_ia32_xtest, "i", "", "rtm")
894905

895906
BUILTIN(__builtin_ia32_rdpmc, "ULLii", "")
896907
BUILTIN(__builtin_ia32_rdtsc, "ULLi", "")
908+
BUILTIN(__rdtsc, "ULLi", "")
897909
BUILTIN(__builtin_ia32_rdtscp, "ULLiUi*", "")
898910
// PKU
899911
TARGET_BUILTIN(__builtin_ia32_rdpkru, "Ui", "", "pku")
@@ -2059,3 +2071,4 @@ TARGET_BUILTIN(__builtin_ia32_mwaitx, "vUiUiUi", "", "mwaitx")
20592071

20602072
#undef BUILTIN
20612073
#undef TARGET_BUILTIN
2074+
#undef TARGET_HEADER_BUILTIN

clang/lib/Basic/Targets.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2303,6 +2303,8 @@ const Builtin::Info BuiltinInfo[] = {
23032303
{ #ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr },
23042304
#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
23052305
{ #ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE },
2306+
#define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANGS, FEATURE) \
2307+
{ #ID, TYPE, ATTRS, HEADER, LANGS, FEATURE },
23062308
#include "clang/Basic/BuiltinsX86.def"
23072309
};
23082310

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,9 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
681681
"cast");
682682
return RValue::get(Result);
683683
}
684+
case Builtin::BI__popcnt16:
685+
case Builtin::BI__popcnt:
686+
case Builtin::BI__popcnt64:
684687
case Builtin::BI__builtin_popcount:
685688
case Builtin::BI__builtin_popcountl:
686689
case Builtin::BI__builtin_popcountll: {
@@ -6954,6 +6957,25 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
69546957
Value *F = CGM.getIntrinsic(Intrinsic::prefetch);
69556958
return Builder.CreateCall(F, {Address, RW, Locality, Data});
69566959
}
6960+
case X86::BI_mm_clflush: {
6961+
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_clflush),
6962+
Ops[0]);
6963+
}
6964+
case X86::BI_mm_lfence: {
6965+
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_lfence));
6966+
}
6967+
case X86::BI_mm_mfence: {
6968+
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_mfence));
6969+
}
6970+
case X86::BI_mm_sfence: {
6971+
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_sfence));
6972+
}
6973+
case X86::BI_mm_pause: {
6974+
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse2_pause));
6975+
}
6976+
case X86::BI__rdtsc: {
6977+
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_rdtsc));
6978+
}
69576979
case X86::BI__builtin_ia32_undef128:
69586980
case X86::BI__builtin_ia32_undef256:
69596981
case X86::BI__builtin_ia32_undef512:
@@ -6966,12 +6988,14 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,
69666988
case X86::BI__builtin_ia32_vec_ext_v2si:
69676989
return Builder.CreateExtractElement(Ops[0],
69686990
llvm::ConstantInt::get(Ops[1]->getType(), 0));
6991+
case X86::BI_mm_setcsr:
69696992
case X86::BI__builtin_ia32_ldmxcsr: {
69706993
Address Tmp = CreateMemTemp(E->getArg(0)->getType());
69716994
Builder.CreateStore(Ops[0], Tmp);
69726995
return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_ldmxcsr),
69736996
Builder.CreateBitCast(Tmp.getPointer(), Int8PtrTy));
69746997
}
6998+
case X86::BI_mm_getcsr:
69756999
case X86::BI__builtin_ia32_stmxcsr: {
69767000
Address Tmp = CreateMemTemp(E->getType());
69777001
Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_sse_stmxcsr),

clang/lib/Headers/emmintrin.h

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2447,6 +2447,10 @@ _mm_stream_si64(long long *__p, long long __a)
24472447
}
24482448
#endif
24492449

2450+
#if defined(__cplusplus)
2451+
extern "C" {
2452+
#endif
2453+
24502454
/// \brief The cache line containing __p is flushed and invalidated from all
24512455
/// caches in the coherency domain.
24522456
///
@@ -2457,11 +2461,7 @@ _mm_stream_si64(long long *__p, long long __a)
24572461
/// \param __p
24582462
/// A pointer to the memory location used to identify the cache line to be
24592463
/// flushed.
2460-
static __inline__ void __DEFAULT_FN_ATTRS
2461-
_mm_clflush(void const *__p)
2462-
{
2463-
__builtin_ia32_clflush(__p);
2464-
}
2464+
void _mm_clflush(void const *);
24652465

24662466
/// \brief Forces strong memory ordering (serialization) between load
24672467
/// instructions preceding this instruction and load instructions following
@@ -2472,11 +2472,7 @@ _mm_clflush(void const *__p)
24722472
///
24732473
/// This intrinsic corresponds to the \c LFENCE instruction.
24742474
///
2475-
static __inline__ void __DEFAULT_FN_ATTRS
2476-
_mm_lfence(void)
2477-
{
2478-
__builtin_ia32_lfence();
2479-
}
2475+
void _mm_lfence(void);
24802476

24812477
/// \brief Forces strong memory ordering (serialization) between load and store
24822478
/// instructions preceding this instruction and load and store instructions
@@ -2487,11 +2483,11 @@ _mm_lfence(void)
24872483
///
24882484
/// This intrinsic corresponds to the \c MFENCE instruction.
24892485
///
2490-
static __inline__ void __DEFAULT_FN_ATTRS
2491-
_mm_mfence(void)
2492-
{
2493-
__builtin_ia32_mfence();
2494-
}
2486+
void _mm_mfence(void);
2487+
2488+
#if defined(__cplusplus)
2489+
} // extern "C"
2490+
#endif
24952491

24962492
/// \brief Converts 16-bit signed integers from both 128-bit integer vector
24972493
/// operands into 8-bit signed integers, and packs the results into the
@@ -3213,11 +3209,10 @@ _mm_castsi128_pd(__m128i __a)
32133209
///
32143210
/// This intrinsic corresponds to the \c PAUSE instruction.
32153211
///
3216-
static __inline__ void __DEFAULT_FN_ATTRS
3217-
_mm_pause(void)
3218-
{
3219-
__builtin_ia32_pause();
3220-
}
3212+
#if defined(__cplusplus)
3213+
extern "C"
3214+
#endif
3215+
void _mm_pause(void);
32213216

32223217
#undef __DEFAULT_FN_ATTRS
32233218

clang/lib/Headers/ia32intrin.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,12 +60,6 @@ __rdpmc(int __A) {
6060
return __builtin_ia32_rdpmc(__A);
6161
}
6262

63-
/* __rdtsc */
64-
static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
65-
__rdtsc(void) {
66-
return __builtin_ia32_rdtsc();
67-
}
68-
6963
/* __rdtscp */
7064
static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__))
7165
__rdtscp(unsigned int *__A) {

clang/lib/Headers/intrin.h

Lines changed: 57 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -463,14 +463,6 @@ _BitScanReverse(unsigned long *_Index, unsigned long _Mask) {
463463
*_Index = 31 - __builtin_clzl(_Mask);
464464
return 1;
465465
}
466-
static __inline__ unsigned short __DEFAULT_FN_ATTRS
467-
__popcnt16(unsigned short _Value) {
468-
return __builtin_popcount((int)_Value);
469-
}
470-
static __inline__ unsigned int __DEFAULT_FN_ATTRS
471-
__popcnt(unsigned int _Value) {
472-
return __builtin_popcount(_Value);
473-
}
474466
static __inline__ unsigned char __DEFAULT_FN_ATTRS
475467
_bittest(long const *_BitBase, long _BitPos) {
476468
return (*_BitBase >> _BitPos) & 1;
@@ -513,11 +505,6 @@ _BitScanReverse64(unsigned long *_Index, unsigned __int64 _Mask) {
513505
*_Index = 63 - __builtin_clzll(_Mask);
514506
return 1;
515507
}
516-
static __inline__
517-
unsigned __int64 __DEFAULT_FN_ATTRS
518-
__popcnt64(unsigned __int64 _Value) {
519-
return __builtin_popcountll(_Value);
520-
}
521508
static __inline__ unsigned char __DEFAULT_FN_ATTRS
522509
_bittest64(__int64 const *_BitBase, __int64 _BitPos) {
523510
return (*_BitBase >> _BitPos) & 1;
@@ -546,63 +533,63 @@ _interlockedbittestandset64(__int64 volatile *_BitBase, __int64 _BitPos) {
546533
__atomic_fetch_or(_BitBase, 1ll << _BitPos, __ATOMIC_SEQ_CST);
547534
return (_PrevVal >> _BitPos) & 1;
548535
}
549-
/*----------------------------------------------------------------------------*\
550-
|* Interlocked Exchange Add
551-
\*----------------------------------------------------------------------------*/
552-
static __inline__ __int64 __DEFAULT_FN_ATTRS
553-
_InterlockedExchangeAdd64(__int64 volatile *_Addend, __int64 _Value) {
554-
return __atomic_fetch_add(_Addend, _Value, __ATOMIC_SEQ_CST);
555-
}
556-
/*----------------------------------------------------------------------------*\
557-
|* Interlocked Exchange Sub
558-
\*----------------------------------------------------------------------------*/
559-
static __inline__ __int64 __DEFAULT_FN_ATTRS
560-
_InterlockedExchangeSub64(__int64 volatile *_Subend, __int64 _Value) {
561-
return __atomic_fetch_sub(_Subend, _Value, __ATOMIC_SEQ_CST);
562-
}
563-
/*----------------------------------------------------------------------------*\
564-
|* Interlocked Increment
565-
\*----------------------------------------------------------------------------*/
566-
static __inline__ __int64 __DEFAULT_FN_ATTRS
567-
_InterlockedIncrement64(__int64 volatile *_Value) {
568-
return __atomic_add_fetch(_Value, 1, __ATOMIC_SEQ_CST);
569-
}
570-
/*----------------------------------------------------------------------------*\
571-
|* Interlocked Decrement
572-
\*----------------------------------------------------------------------------*/
573-
static __inline__ __int64 __DEFAULT_FN_ATTRS
574-
_InterlockedDecrement64(__int64 volatile *_Value) {
575-
return __atomic_sub_fetch(_Value, 1, __ATOMIC_SEQ_CST);
576-
}
577-
/*----------------------------------------------------------------------------*\
578-
|* Interlocked And
579-
\*----------------------------------------------------------------------------*/
580-
static __inline__ __int64 __DEFAULT_FN_ATTRS
581-
_InterlockedAnd64(__int64 volatile *_Value, __int64 _Mask) {
582-
return __atomic_fetch_and(_Value, _Mask, __ATOMIC_SEQ_CST);
583-
}
584-
/*----------------------------------------------------------------------------*\
585-
|* Interlocked Or
586-
\*----------------------------------------------------------------------------*/
587-
static __inline__ __int64 __DEFAULT_FN_ATTRS
588-
_InterlockedOr64(__int64 volatile *_Value, __int64 _Mask) {
589-
return __atomic_fetch_or(_Value, _Mask, __ATOMIC_SEQ_CST);
590-
}
591-
/*----------------------------------------------------------------------------*\
592-
|* Interlocked Xor
593-
\*----------------------------------------------------------------------------*/
594-
static __inline__ __int64 __DEFAULT_FN_ATTRS
595-
_InterlockedXor64(__int64 volatile *_Value, __int64 _Mask) {
596-
return __atomic_fetch_xor(_Value, _Mask, __ATOMIC_SEQ_CST);
597-
}
598-
/*----------------------------------------------------------------------------*\
599-
|* Interlocked Exchange
600-
\*----------------------------------------------------------------------------*/
601-
static __inline__ __int64 __DEFAULT_FN_ATTRS
602-
_InterlockedExchange64(__int64 volatile *_Target, __int64 _Value) {
603-
__atomic_exchange(_Target, &_Value, &_Value, __ATOMIC_SEQ_CST);
604-
return _Value;
605-
}
536+
/*----------------------------------------------------------------------------*\
537+
|* Interlocked Exchange Add
538+
\*----------------------------------------------------------------------------*/
539+
static __inline__ __int64 __DEFAULT_FN_ATTRS
540+
_InterlockedExchangeAdd64(__int64 volatile *_Addend, __int64 _Value) {
541+
return __atomic_fetch_add(_Addend, _Value, __ATOMIC_SEQ_CST);
542+
}
543+
/*----------------------------------------------------------------------------*\
544+
|* Interlocked Exchange Sub
545+
\*----------------------------------------------------------------------------*/
546+
static __inline__ __int64 __DEFAULT_FN_ATTRS
547+
_InterlockedExchangeSub64(__int64 volatile *_Subend, __int64 _Value) {
548+
return __atomic_fetch_sub(_Subend, _Value, __ATOMIC_SEQ_CST);
549+
}
550+
/*----------------------------------------------------------------------------*\
551+
|* Interlocked Increment
552+
\*----------------------------------------------------------------------------*/
553+
static __inline__ __int64 __DEFAULT_FN_ATTRS
554+
_InterlockedIncrement64(__int64 volatile *_Value) {
555+
return __atomic_add_fetch(_Value, 1, __ATOMIC_SEQ_CST);
556+
}
557+
/*----------------------------------------------------------------------------*\
558+
|* Interlocked Decrement
559+
\*----------------------------------------------------------------------------*/
560+
static __inline__ __int64 __DEFAULT_FN_ATTRS
561+
_InterlockedDecrement64(__int64 volatile *_Value) {
562+
return __atomic_sub_fetch(_Value, 1, __ATOMIC_SEQ_CST);
563+
}
564+
/*----------------------------------------------------------------------------*\
565+
|* Interlocked And
566+
\*----------------------------------------------------------------------------*/
567+
static __inline__ __int64 __DEFAULT_FN_ATTRS
568+
_InterlockedAnd64(__int64 volatile *_Value, __int64 _Mask) {
569+
return __atomic_fetch_and(_Value, _Mask, __ATOMIC_SEQ_CST);
570+
}
571+
/*----------------------------------------------------------------------------*\
572+
|* Interlocked Or
573+
\*----------------------------------------------------------------------------*/
574+
static __inline__ __int64 __DEFAULT_FN_ATTRS
575+
_InterlockedOr64(__int64 volatile *_Value, __int64 _Mask) {
576+
return __atomic_fetch_or(_Value, _Mask, __ATOMIC_SEQ_CST);
577+
}
578+
/*----------------------------------------------------------------------------*\
579+
|* Interlocked Xor
580+
\*----------------------------------------------------------------------------*/
581+
static __inline__ __int64 __DEFAULT_FN_ATTRS
582+
_InterlockedXor64(__int64 volatile *_Value, __int64 _Mask) {
583+
return __atomic_fetch_xor(_Value, _Mask, __ATOMIC_SEQ_CST);
584+
}
585+
/*----------------------------------------------------------------------------*\
586+
|* Interlocked Exchange
587+
\*----------------------------------------------------------------------------*/
588+
static __inline__ __int64 __DEFAULT_FN_ATTRS
589+
_InterlockedExchange64(__int64 volatile *_Target, __int64 _Value) {
590+
__atomic_exchange(_Target, &_Value, &_Value, __ATOMIC_SEQ_CST);
591+
return _Value;
592+
}
606593
#endif
607594
/*----------------------------------------------------------------------------*\
608595
|* Barriers

0 commit comments

Comments
 (0)