mesa: Add a _mesa_fls() function to find the last bit set in a word.
authorKenneth Graunke <kenneth@whitecape.org>
Wed, 12 Sep 2012 05:14:58 +0000 (22:14 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 13 Sep 2012 05:13:05 +0000 (22:13 -0700)
ffs() finds the least significant bit set; _mesa_fls() finds the /most/
significant bit.

v2: Make it an inline function in imports.h, per Brian's suggestion.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
src/mesa/main/imports.h

index abf216c99ac0704e6ac21b417a6f4487e58be348..81da51047174d0a6a8c1081591399fec41c32890 100644 (file)
@@ -520,6 +520,28 @@ extern unsigned int
 _mesa_bitcount_64(uint64_t n);
 #endif
 
+/**
+ * Find the last (most significant) bit set in a word.
+ *
+ * Essentially ffs() in the reverse direction.
+ */
+static inline unsigned int
+_mesa_fls(unsigned int n)
+{
+#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304)
+   return n == 0 ? 0 : 32 - __builtin_clz(n);
+#else
+   unsigned int v = 1;
+
+   if (n == 0)
+      return 0;
+
+   while (n >>= 1)
+       v++;
+
+   return v;
+#endif
+}
 
 extern GLhalfARB
 _mesa_float_to_half(float f);