Signed-off-by: Martin Storsjö <[email protected]>
---
Avoid calling the ctz/clz builtins if the mask is zero, since that's
undefined behaviour.
---
 mingw-w64-headers/include/psdk_inc/intrin-impl.h | 91 ++++++++++++++++++++++++
 mingw-w64-headers/include/winnt.h                |  2 +
 2 files changed, 93 insertions(+)

diff --git a/mingw-w64-headers/include/psdk_inc/intrin-impl.h 
b/mingw-w64-headers/include/psdk_inc/intrin-impl.h
index 88af804..64ccca7 100644
--- a/mingw-w64-headers/include/psdk_inc/intrin-impl.h
+++ b/mingw-w64-headers/include/psdk_inc/intrin-impl.h
@@ -1084,6 +1084,36 @@ __buildbittesti(InterlockedBitTestAndComplement, 
__LONG32, "eor", /* unused para
 #define __INTRINSIC_DEFINED_InterlockedBitTestAndComplement
 #endif /* __INTRINSIC_PROLOG */
 
+#if __INTRINSIC_PROLOG(_BitScanForward)
+__MINGW_EXTENSION unsigned char _BitScanForward(unsigned __LONG32 *Index, 
unsigned __LONG32 Mask);
+#if !__has_builtin(_BitScanForward)
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+unsigned char _BitScanForward(unsigned __LONG32 *Index, unsigned __LONG32 Mask)
+{
+    if (Mask == 0)
+        return 0;
+    *Index = __builtin_ctz(Mask);
+    return 1;
+}
+#endif
+#define __INTRINSIC_DEFINED__BitScanForward
+#endif /* __INTRINSIC_PROLOG */
+
+#if __INTRINSIC_PROLOG(_BitScanReverse)
+__MINGW_EXTENSION unsigned char _BitScanReverse(unsigned __LONG32 *Index, 
unsigned __LONG32 Mask);
+#if !__has_builtin(_BitScanReverse)
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+unsigned char _BitScanReverse(unsigned __LONG32 *Index, unsigned __LONG32 Mask)
+{
+    if (Mask == 0)
+        return 0;
+    *Index = 31 - __builtin_clz(Mask);
+    return 1;
+}
+#endif
+#define __INTRINSIC_DEFINED__BitScanReverse
+#endif /* __INTRINSIC_PROLOG */
+
 #endif /* defined(__arm__) || defined(_ARM_) */
 
 #if defined(__aarch64__) || defined(_ARM64_)
@@ -1212,6 +1242,67 @@ __int64 _InterlockedExchangeAdd64(__int64 volatile 
*Addend, __int64 Value) {
 #endif
 #define __INTRINSIC_DEFINED__InterlockedExchangeAdd64
 #endif /* __INTRINSIC_PROLOG */
+
+#if __INTRINSIC_PROLOG(_BitScanForward)
+__MINGW_EXTENSION unsigned char _BitScanForward(unsigned __LONG32 *Index, 
unsigned __LONG32 Mask);
+#if !__has_builtin(_BitScanForward)
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+unsigned char _BitScanForward(unsigned __LONG32 *Index, unsigned __LONG32 Mask)
+{
+    if (Mask == 0)
+        return 0;
+    *Index = __builtin_ctz(Mask);
+    return 1;
+}
+#endif
+#define __INTRINSIC_DEFINED__BitScanForward
+#endif /* __INTRINSIC_PROLOG */
+
+#if __INTRINSIC_PROLOG(_BitScanReverse)
+__MINGW_EXTENSION unsigned char _BitScanReverse(unsigned __LONG32 *Index, 
unsigned __LONG32 Mask);
+#if !__has_builtin(_BitScanReverse)
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+unsigned char _BitScanReverse(unsigned __LONG32 *Index, unsigned __LONG32 Mask)
+{
+    if (Mask == 0)
+        return 0;
+    *Index = 31 - __builtin_clz(Mask);
+    return 1;
+}
+#endif
+#define __INTRINSIC_DEFINED__BitScanReverse
+#endif /* __INTRINSIC_PROLOG */
+
+#if __INTRINSIC_PROLOG(_BitScanForward64)
+__MINGW_EXTENSION unsigned char _BitScanForward64(unsigned __LONG32 *Index, 
unsigned __int64 Mask);
+#if !__has_builtin(_BitScanForward64)
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+unsigned char _BitScanForward64(unsigned __LONG32 *Index, unsigned __int64 
Mask)
+{
+    if (Mask == 0)
+        return 0;
+    *Index = __builtin_ctzll(Mask);
+    return 1;
+}
+#endif
+#define __INTRINSIC_DEFINED__BitScanForward64
+#endif /* __INTRINSIC_PROLOG */
+
+#if __INTRINSIC_PROLOG(_BitScanReverse64)
+__MINGW_EXTENSION unsigned char _BitScanReverse64(unsigned __LONG32 *Index, 
unsigned __int64 Mask);
+#if !__has_builtin(_BitScanReverse64)
+__MINGW_EXTENSION __INTRINSICS_USEINLINE
+unsigned char _BitScanReverse64(unsigned __LONG32 *Index, unsigned __int64 
Mask)
+{
+    if (Mask == 0)
+        return 0;
+    *Index = 63 - __builtin_clzll(Mask);
+    return 1;
+}
+#endif
+#define __INTRINSIC_DEFINED__BitScanReverse64
+#endif /* __INTRINSIC_PROLOG */
+
 #endif /* defined(__aarch64__) || define(_ARM64_) */
 /* ***************************************************** */
 
diff --git a/mingw-w64-headers/include/winnt.h 
b/mingw-w64-headers/include/winnt.h
index 45718c3..cd28588 100644
--- a/mingw-w64-headers/include/winnt.h
+++ b/mingw-w64-headers/include/winnt.h
@@ -1991,6 +1991,8 @@ extern "C" {
 
 #define BitScanForward _BitScanForward
 #define BitScanReverse _BitScanReverse
+#define BitScanForward64 _BitScanForward64
+#define BitScanReverse64 _BitScanReverse64
 
 #define InterlockedIncrement16 _InterlockedIncrement16
 #define InterlockedDecrement16 _InterlockedDecrement16
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to