5
5
#include "static_assert.h"
6
6
7
7
#if defined(__x86_64__ ) && defined(HAVE_X86INTRIN_H )
8
- # include <x86intrin.h> /* for _lzcnt_u64 */
9
- #elif defined(_MSC_VER ) && _MSC_VER >= 1310
8
+ # include <x86intrin.h> /* for _lzcnt_u64, etc. */
9
+ #elif defined(_MSC_VER ) && defined( HAVE_INTRIN_H )
10
10
# include <intrin.h> /* for the following intrinsics */
11
11
#endif
12
12
@@ -48,17 +48,17 @@ static inline unsigned nlz_int128(uint128_t x);
48
48
static inline unsigned int
49
49
nlz_int32 (uint32_t x )
50
50
{
51
- #if defined(_MSC_VER ) && defined(__AVX2__ )
51
+ #if defined(_MSC_VER ) && defined(__AVX2__ ) && defined( HAVE___LZCNT )
52
52
/* Note: It seems there is no such thing like __LZCNT__ predefined in MSVC.
53
53
* AMD CPUs have had this instruction for decades (since K10) but for
54
54
* Intel, Haswell is the oldest one. We need to use __AVX2__ for maximum
55
55
* safety. */
56
56
return (unsigned int )__lzcnt (x );
57
57
58
- #elif defined(__x86_64__ ) && defined(__LZCNT__ ) /* && ! defined(MJIT_HEADER) */
58
+ #elif defined(__x86_64__ ) && defined(HAVE__LZCNT_U32 )
59
59
return (unsigned int )_lzcnt_u32 (x );
60
60
61
- #elif defined(_MSC_VER ) && _MSC_VER >= 1400 /* &&! defined(__AVX2__) */
61
+ #elif defined(_MSC_VER ) && defined(HAVE__BITSCANREVERSE )
62
62
unsigned long r ;
63
63
return _BitScanReverse (& r , x ) ? (31 - (int )r ) : 32 ;
64
64
@@ -81,17 +81,17 @@ nlz_int32(uint32_t x)
81
81
static inline unsigned int
82
82
nlz_int64 (uint64_t x )
83
83
{
84
- #if defined(_MSC_VER ) && defined(__AVX2__ )
84
+ #if defined(_MSC_VER ) && defined(__AVX2__ ) && defined( HAVE___LZCNT64 )
85
85
return (unsigned int )__lzcnt64 (x );
86
86
87
- #elif defined(__x86_64__ ) && defined(__LZCNT__ ) /* && ! defined(MJIT_HEADER) */
87
+ #elif defined(__x86_64__ ) && defined(HAVE__LZCNT_U64 )
88
88
return (unsigned int )_lzcnt_u64 (x );
89
89
90
- #elif defined(_WIN64 ) && defined(_MSC_VER ) && _MSC_VER >= 1400 /* &&! defined(__AVX2__) */
90
+ #elif defined(_WIN64 ) && defined(_MSC_VER ) && defined(HAVE__BITSCANREVERSE64 )
91
91
unsigned long r ;
92
92
return _BitScanReverse64 (& r , x ) ? (63u - (unsigned int )r ) : 64 ;
93
93
94
- #elif __has_builtin (__builtin_clzl ) && !(defined(__sun ) && defined(__sparc ))
94
+ #elif __has_builtin (__builtin_clzl ) && __has_builtin ( __builtin_clzll ) && !(defined(__sun ) && defined(__sparc ))
95
95
if (x == 0 ) {
96
96
return 64 ;
97
97
}
0 commit comments