Commit 09020adb61416c4307de35941a9725a5e33d9beb
Committed by
Linus Torvalds
1 parent
6d29ea23da
[PATCH] bitops: generic ffs()
This patch introduces the C-language equivalent of the function: int ffs(int x); In include/asm-generic/bitops/ffs.h This code largely copied from: include/linux/bitops.h Signed-off-by: Akinobu Mita <mita@miraclelinux.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 1 changed file with 41 additions and 0 deletions Side-by-side Diff
include/asm-generic/bitops/ffs.h
1 | +#ifndef _ASM_GENERIC_BITOPS_FFS_H_ | |
2 | +#define _ASM_GENERIC_BITOPS_FFS_H_ | |
3 | + | |
4 | +/** | |
5 | + * ffs - find first bit set | |
6 | + * @x: the word to search | |
7 | + * | |
8 | + * This is defined the same way as | |
9 | + * the libc and compiler builtin ffs routines, therefore | |
10 | + * differs in spirit from the above ffz (man ffs). | |
11 | + */ | |
12 | +static inline int ffs(int x) | |
13 | +{ | |
14 | + int r = 1; | |
15 | + | |
16 | + if (!x) | |
17 | + return 0; | |
18 | + if (!(x & 0xffff)) { | |
19 | + x >>= 16; | |
20 | + r += 16; | |
21 | + } | |
22 | + if (!(x & 0xff)) { | |
23 | + x >>= 8; | |
24 | + r += 8; | |
25 | + } | |
26 | + if (!(x & 0xf)) { | |
27 | + x >>= 4; | |
28 | + r += 4; | |
29 | + } | |
30 | + if (!(x & 3)) { | |
31 | + x >>= 2; | |
32 | + r += 2; | |
33 | + } | |
34 | + if (!(x & 1)) { | |
35 | + x >>= 1; | |
36 | + r += 1; | |
37 | + } | |
38 | + return r; | |
39 | +} | |
40 | + | |
41 | +#endif /* _ASM_GENERIC_BITOPS_FFS_H_ */ |