These are non-atomic versions corresponding to the existing _interlockedbittest* - therefore they're implemented as plain C instead of assembly. Additionally, there are plain intrinsics "_bittest" and "_bittest64", where there's no corresponding interlocked version.
Signed-off-by: Martin Storsjö <[email protected]> --- Simplified the complement functions as suggested by Liu Hao. --- .../include/psdk_inc/intrin-impl.h | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/mingw-w64-headers/include/psdk_inc/intrin-impl.h b/mingw-w64-headers/include/psdk_inc/intrin-impl.h index d59682c18..3ee404d6a 100644 --- a/mingw-w64-headers/include/psdk_inc/intrin-impl.h +++ b/mingw-w64-headers/include/psdk_inc/intrin-impl.h @@ -1424,6 +1424,123 @@ unsigned char _BitScanReverse64(unsigned __LONG32 *Index, unsigned __int64 Mask) #endif /* __INTRINSIC_PROLOG */ #endif /* defined(__aarch64__) || define(_ARM64_) */ + +#if defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) + +#if __INTRINSIC_PROLOG(_bittest) +unsigned char _bittest(const __LONG32 *__a, __LONG32 __b); +#if !__has_builtin(_bittest) +__INTRINSICS_USEINLINE +unsigned char _bittest(const __LONG32 *__a, __LONG32 __b) +{ + return (*__a >> __b) & 1; +} +#endif +#define __INTRINSIC_DEFINED__bittest +#endif /* __INTRINSIC_PROLOG */ + +#if __INTRINSIC_PROLOG(_bittestandset) +unsigned char _bittestandset(__LONG32 *__a, __LONG32 __b); +#if !__has_builtin(_bittestandset) +__INTRINSICS_USEINLINE +unsigned char _bittestandset(__LONG32 *__a, __LONG32 __b) +{ + unsigned char __v = (*__a >> __b) & 1; + *__a |= 1UL << __b; + return __v; +} +#endif +#define __INTRINSIC_DEFINED__bittestandset +#endif /* __INTRINSIC_PROLOG */ + +#if __INTRINSIC_PROLOG(_bittestandreset) +unsigned char _bittestandreset(__LONG32 *__a, __LONG32 __b); +#if !__has_builtin(_bittestandreset) +__INTRINSICS_USEINLINE +unsigned char _bittestandreset(__LONG32 *__a, __LONG32 __b) +{ + unsigned char __v = (*__a >> __b) & 1; + *__a &= ~(1UL << __b); + return __v; +} +#endif +#define __INTRINSIC_DEFINED__bittestandreset +#endif /* __INTRINSIC_PROLOG */ + +#if __INTRINSIC_PROLOG(_bittestandcomplement) +unsigned char _bittestandcomplement(__LONG32 *a, __LONG32 b); +#if !__has_builtin(_bittestandcomplement) +__INTRINSICS_USEINLINE +unsigned char _bittestandcomplement(__LONG32 *__a, __LONG32 __b) +{ + unsigned char __v = (*__a >> __b) & 1; + *__a ^= 1UL << __b; + return __v; +} +#endif +#define __INTRINSIC_DEFINED__bittestandcomplement +#endif /* __INTRINSIC_PROLOG */ + +#endif /* defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) */ + +#if defined(__aarch64__) || defined(_ARM64_) + +#if __INTRINSIC_PROLOG(_bittest64) +unsigned char _bittest64(const __int64 *__a, __int64 __b); +#if !__has_builtin(_bittest64) +__INTRINSICS_USEINLINE +unsigned char _bittest64(const __int64 *__a, __int64 __b) +{ + return (*__a >> __b) & 1; +} +#endif +#define __INTRINSIC_DEFINED__bittest64 +#endif /* __INTRINSIC_PROLOG */ + +#if __INTRINSIC_PROLOG(_bittestandset64) +unsigned char _bittestandset64(__int64 *__a, __int64 __b); +#if !__has_builtin(_bittestandset64) +__INTRINSICS_USEINLINE +unsigned char _bittestandset64(__int64 *__a, __int64 __b) +{ + unsigned char __v = (*__a >> __b) & 1; + *__a |= 1ULL << __b; + return __v; +} +#endif +#define __INTRINSIC_DEFINED__bittestandset64 +#endif /* __INTRINSIC_PROLOG */ + +#if __INTRINSIC_PROLOG(_bittestandreset64) +unsigned char _bittestandreset64(__int64 *__a, __int64 __b); +#if !__has_builtin(_bittestandreset64) +__INTRINSICS_USEINLINE +unsigned char _bittestandreset64(__int64 *__a, __int64 __b) +{ + unsigned char __v = (*__a >> __b) & 1; + *__a &= ~(1ULL << __b); + return __v; +} +#endif +#define __INTRINSIC_DEFINED__bittestandreset64 +#endif /* __INTRINSIC_PROLOG */ + +#if __INTRINSIC_PROLOG(_bittestandcomplement64) +unsigned char _bittestandcomplement64(__int64 *a, __int64 b); +#if !__has_builtin(_bittestandcomplement64) +__INTRINSICS_USEINLINE +unsigned char _bittestandcomplement64(__int64 *__a, __int64 __b) +{ + unsigned char __v = (*__a >> __b) & 1; + *__a ^= 1ULL << __b; + return __v; +} +#endif +#define __INTRINSIC_DEFINED__bittestandcomplement64 +#endif /* __INTRINSIC_PROLOG */ + +#endif /* defined(__aarch64__) || define(_ARM64_) */ + /* ***************************************************** */ #if defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) -- 2.25.1 _______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
