diff options
Diffstat (limited to 'fallback_builtins.h')
-rw-r--r-- | fallback_builtins.h | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/fallback_builtins.h b/fallback_builtins.h new file mode 100644 index 0000000..4cdace3 --- /dev/null +++ b/fallback_builtins.h @@ -0,0 +1,25 @@ +#ifndef X86_CTZL_H +#define X86_CTZL_H + +#include <intrin.h> +#ifdef X86_CPUID +# include "arch/x86/x86.h" +#endif + +#if defined(_MSC_VER) && !defined(__clang__) +/* This is not a general purpose replacement for __builtin_ctzl. The function expects that value is != 0 + * Because of that assumption trailing_zero is not initialized and the return value of _BitScanForward is not checked + */ +static __forceinline unsigned long __builtin_ctzl(unsigned long value) +{ +#ifdef X86_CPUID + if (x86_cpu_has_tzcnt) + return _tzcnt_u32(value); +#endif + unsigned long trailing_zero; + _BitScanForward(&trailing_zero, value); + return trailing_zero; +} +#endif + +#endif |