Jacek Caban : winnt.h: Add BitScanForward and BitScanReverse implementation.
Module: wine Branch: master Commit: 2618162e898e414d930535516c3d1cd5e6152cf4 URL: https://source.winehq.org/git/wine.git/?a=commit;h=2618162e898e414d930535516... Author: Jacek Caban <jacek(a)codeweavers.com> Date: Mon Jun 8 18:08:00 2020 +0200 winnt.h: Add BitScanForward and BitScanReverse implementation. Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)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
participants (1)
-
Alexandre Julliard