Commit e2d329fb authored by Steve Lhomme's avatar Steve Lhomme

define builtin clz/ctz calls MSVC equivalents

__builtin_ctz:
Returns the number of trailing 0-bits in x, starting at the least significant
bit position. If x is 0, the result is undefined.

_BitScanForward:
Search the mask data from least significant bit (LSB) to the most significant
bit (MSB) for a set bit (1). If a set bit is found, the bit position of the
first set bit found is returned in the first parameter. If no set bit is found,
0 is returned; otherwise, 1 is returned.

__builtin_clz:
Returns the number of leading 0-bits in x, starting at the most significant
bit position. If x is 0, the result is undefined.

_BitScanReverse:
Search the mask data from most significant bit (MSB) to least significant bit
(LSB) for a set bit (1). Returns Nonzero if Index was set, or 0 if no set bits
were found. Index is loaded with the bit position of the first set bit (1) found.
parent d262a6ae
......@@ -51,6 +51,27 @@
#define ALIGN_STK_16(type, var, sz1d, sznd) \
ALIGN(type var[sz1d]sznd, 16)
#ifdef _MSC_VER
#include <intrin.h>
static inline int ctz(const unsigned int mask) {
unsigned long idx;
_BitScanForward(&idx, mask);
return idx;
}
static inline int clz(const unsigned int mask) {
unsigned long leading_zero = 0;
_BitScanReverse(&leading_zero, mask);
return (31 - leading_zero);
}
static inline int clzll(const unsigned long long mask) {
unsigned long leading_zero = 0;
_BitScanReverse64(&leading_zero, mask);
return (63 - leading_zero);
}
#else /* !_MSC_VER */
static inline int ctz(const unsigned int mask) {
return __builtin_ctz(mask);
}
......@@ -62,5 +83,6 @@ static inline int clz(const unsigned int mask) {
static inline int clzll(const unsigned long long mask) {
return __builtin_clzll(mask);
}
#endif /* !_MSC_VER */
#endif /* __DAV1D_COMMON_ATTRIBUTES_H__ */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment