ref: e2d329fbeb0084432041782902a82f9cea884cbe
parent: d262a6ae9a36aea61daf5af03f246287a30c45dd
author: Steve Lhomme <robux4@ycbcr.xyz>
date: Thu Sep 27 09:55:39 EDT 2018
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.
--- a/include/common/attributes.h
+++ b/include/common/attributes.h
@@ -51,7 +51,28 @@
#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 clzll(const unsigned long long mask) {
return __builtin_clzll(mask);
}
+#endif /* !_MSC_VER */
#endif /* __DAV1D_COMMON_ATTRIBUTES_H__ */