Jacek Caban : winnt.h: Add BitScanForward and BitScanReverse implementation.
Alexandre Julliard
julliard at winehq.org
Tue Jun 9 15:27:46 CDT 2020
Module: wine
Branch: master
Commit: 2618162e898e414d930535516c3d1cd5e6152cf4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=2618162e898e414d930535516c3d1cd5e6152cf4
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Jun 8 18:08:00 2020 +0200
winnt.h: Add BitScanForward and BitScanReverse implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
include/winnt.h | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 52 insertions(+)
diff --git a/include/winnt.h b/include/winnt.h
index aa4daaa55f..863b19eae5 100644
--- a/include/winnt.h
+++ b/include/winnt.h
@@ -6717,6 +6717,58 @@ typedef enum _PROCESS_MITIGATION_POLICY
MaxProcessMitigationPolicy
} PROCESS_MITIGATION_POLICY, *PPROCESS_MITIGATION_POLICY;
+#ifdef _MSC_VER
+
+BOOLEAN _BitScanForward(unsigned long*,unsigned long);
+BOOLEAN _BitScanReverse(unsigned long*,unsigned long);
+
+#pragma intrinsic(_BitScanForward)
+#pragma intrinsic(_BitScanReverse)
+
+static inline BOOLEAN BitScanForward(DWORD *index, DWORD mask)
+{
+ return _BitScanForward((unsigned long*)index, mask);
+}
+
+static inline BOOLEAN BitScanReverse(DWORD *index, DWORD mask)
+{
+ return _BitScanReverse((unsigned long*)index, mask);
+}
+
+#elif defined(__GNUC__) && ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))
+
+static inline BOOLEAN BitScanForward(DWORD *index, DWORD mask)
+{
+ *index = __builtin_ctz(mask);
+ return mask != 0;
+}
+
+static inline BOOLEAN BitScanReverse(DWORD *index, DWORD mask)
+{
+ *index = 31 - __builtin_clz(mask);
+ return mask != 0;
+}
+
+#else
+
+static inline BOOLEAN BitScanForward(DWORD *index, DWORD mask)
+{
+ unsigned int r = 0;
+ while (r < 31 && !(mask & (1 << r))) r++;
+ *index = r;
+ return mask != 0;
+}
+
+static inline BOOLEAN BitScanReverse(DWORD *index, DWORD mask)
+{
+ unsigned int r = 31;
+ while (r > 0 && !(mask & (1 << r))) r--;
+ *index = r;
+ return mask != 0;
+}
+
+#endif
+
#ifdef __cplusplus
}
#endif
More information about the wine-cvs
mailing list