static inline unsigned int __ffs(unsigned int x) { unsigned int ret; asm("rep bsfl %1,%0" :"=r" (ret) :"rm" (x)); return ret; } #define statically_true(x) (__builtin_constant_p(x) && (x)) static inline unsigned int do_variable_ffs(unsigned int x) { #if __SIZEOF_LONG__ == 4 return __builtin_ffs(x); #else unsigned int ret; asm("rep bsfl %1,%0" :"=r" (ret) :"rm" (x), "0" (-1)); return ret+1; #endif } #define variable_ffs(x) (statically_true((x)!=0) ? __ffs(x)+1 : do_variable_ffs(x)) #define constant_ffs(x) __builtin_ffs(x) #define ffs(x) (__builtin_constant_p(x) ? constant_ffs(x) : variable_ffs(x)) unsigned int myffs(unsigned int x) { return ffs(x); } unsigned int ffs5(void) { return ffs(5); } unsigned int addffs(int x) { unsigned int sum = 0; while (x) { sum += ffs(x); x--; } return sum; }