From 2618162e898e414d930535516c3d1cd5e6152cf4 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 8 Jun 2020 18:08:00 +0200 Subject: [PATCH] winnt.h: Add BitScanForward and BitScanReverse implementation. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- include/winnt.h | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/include/winnt.h b/include/winnt.h index aa4daaa55f4..863b19eae58 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