shithub: dav1d

Download patch

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__ */