shithub: libvpx

Download patch

ref: 8fcb74e6bb88bc17f1bdc76373b813ea0c45033f
parent: 5be0ed30dcf8ba836da78ee38460d4fa0ddc1b67
parent: ce7ff3b63d5a3259b9a414c67c9f27f89532fc39
author: Alex Converse <aconverse@google.com>
date: Wed Jan 8 09:43:46 EST 2014

Merge "Add a C fallback for get_msb() and change inline to INLINE."

--- a/vp9/common/vp9_systemdependent.h
+++ b/vp9/common/vp9_systemdependent.h
@@ -12,7 +12,6 @@
 #define VP9_COMMON_VP9_SYSTEMDEPENDENT_H_
 
 #ifdef _MSC_VER
-#include <intrin.h>
 #include <math.h>
 #define snprintf _snprintf
 #endif
@@ -35,15 +34,40 @@
 }
 #endif
 
-static const inline int get_msb(int x) {
-#ifdef _MSC_VER
-int r = 0;
-_BitScanReverse(&r, x);
-return r;
+// use GNU builtins where available.
+#if defined(__GNUC__) && \
+    ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ >= 4)
+static INLINE int get_msb(unsigned int n) {
+  return 31 ^ __builtin_clz(n);
+}
+#elif defined(_MSC_VER) && _MSC_VER > 1310 && \
+      (defined(_M_X64) || defined(_M_IX86))
+#include <intrin.h>
+#pragma intrinsic(_BitScanReverse)
+
+static INLINE int get_msb(unsigned int n) {
+  unsigned long first_set_bit;
+  _BitScanReverse(&first_set_bit, n);
+  return first_set_bit;
+}
 #else
-return 31 ^ __builtin_clz(x);
-#endif
+// Returns (int)floor(log2(n)). n must be > 0.
+static INLINE int get_msb(unsigned int n) {
+  int log = 0;
+  unsigned int value = n;
+  int i;
+
+  for (i = 4; i >= 0; --i) {
+    const int shift = (1 << i);
+    const unsigned int x = value >> shift;
+    if (x != 0) {
+      value = x;
+      log += shift;
+    }
+  }
+  return log;
 }
+#endif
 
 struct VP9Common;
 void vp9_machine_specific_config(struct VP9Common *cm);