|
@@ -277,9 +277,16 @@ static inline int constant_fls(int x)
|
|
|
* the clz instruction for much better code efficiency.
|
|
|
*/
|
|
|
|
|
|
-#define fls(x) \
|
|
|
+#define __fls(x) \
|
|
|
( __builtin_constant_p(x) ? constant_fls(x) : \
|
|
|
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
|
|
|
+
|
|
|
+/* Implement fls() in C so that 64-bit args are suitably truncated */
|
|
|
+static inline int fls(int x)
|
|
|
+{
|
|
|
+ return __fls(x);
|
|
|
+}
|
|
|
+
|
|
|
#define ffs(x) ({ unsigned long __t = (x); fls(__t & -__t); })
|
|
|
#define __ffs(x) (ffs(x) - 1)
|
|
|
#define ffz(x) __ffs( ~(x) )
|