diff options
author | Catalin Marinas <catalin.marinas@arm.com> | 2012-09-12 17:00:53 -0400 |
---|---|---|
committer | Catalin Marinas <catalin.marinas@arm.com> | 2012-09-14 12:15:41 -0400 |
commit | 048fa2df92c325cb4425dccd66c8922c8342b507 (patch) | |
tree | a76ddbd3f05752f27e0867906a34e102cb76b4e4 /include/asm-generic/bitops | |
parent | 0753f70f07fbbd23a48d61ffea37028bd0bd6c7d (diff) |
generic: Implement generic ffs/fls using __builtin_* functions
This patch implements ffs, __ffs, fls, __fls using __builtin_* gcc
functions. These header files can be used by other architectures that
rely on the gcc builtins.
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Diffstat (limited to 'include/asm-generic/bitops')
-rw-r--r-- | include/asm-generic/bitops/builtin-__ffs.h | 15 | ||||
-rw-r--r-- | include/asm-generic/bitops/builtin-__fls.h | 15 | ||||
-rw-r--r-- | include/asm-generic/bitops/builtin-ffs.h | 17 | ||||
-rw-r--r-- | include/asm-generic/bitops/builtin-fls.h | 16 |
4 files changed, 63 insertions, 0 deletions
diff --git a/include/asm-generic/bitops/builtin-__ffs.h b/include/asm-generic/bitops/builtin-__ffs.h new file mode 100644 index 000000000000..90041e3a41f0 --- /dev/null +++ b/include/asm-generic/bitops/builtin-__ffs.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_BUILTIN___FFS_H_ | ||
3 | |||
4 | /** | ||
5 | * __ffs - find first bit in word. | ||
6 | * @word: The word to search | ||
7 | * | ||
8 | * Undefined if no bit exists, so code should check against 0 first. | ||
9 | */ | ||
10 | static __always_inline unsigned long __ffs(unsigned long word) | ||
11 | { | ||
12 | return __builtin_ctzl(word); | ||
13 | } | ||
14 | |||
15 | #endif | ||
diff --git a/include/asm-generic/bitops/builtin-__fls.h b/include/asm-generic/bitops/builtin-__fls.h new file mode 100644 index 000000000000..0248f386635f --- /dev/null +++ b/include/asm-generic/bitops/builtin-__fls.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_BUILTIN___FLS_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_BUILTIN___FLS_H_ | ||
3 | |||
4 | /** | ||
5 | * __fls - find last (most-significant) set bit in a long word | ||
6 | * @word: the word to search | ||
7 | * | ||
8 | * Undefined if no set bit exists, so code should check against 0 first. | ||
9 | */ | ||
10 | static __always_inline unsigned long __fls(unsigned long word) | ||
11 | { | ||
12 | return (sizeof(word) * 8) - 1 - __builtin_clzl(word); | ||
13 | } | ||
14 | |||
15 | #endif | ||
diff --git a/include/asm-generic/bitops/builtin-ffs.h b/include/asm-generic/bitops/builtin-ffs.h new file mode 100644 index 000000000000..064825829e1c --- /dev/null +++ b/include/asm-generic/bitops/builtin-ffs.h | |||
@@ -0,0 +1,17 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_BUILTIN_FFS_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_BUILTIN_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 __always_inline int ffs(int x) | ||
13 | { | ||
14 | return __builtin_ffs(x); | ||
15 | } | ||
16 | |||
17 | #endif | ||
diff --git a/include/asm-generic/bitops/builtin-fls.h b/include/asm-generic/bitops/builtin-fls.h new file mode 100644 index 000000000000..eda652d0ac7f --- /dev/null +++ b/include/asm-generic/bitops/builtin-fls.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef _ASM_GENERIC_BITOPS_BUILTIN_FLS_H_ | ||
2 | #define _ASM_GENERIC_BITOPS_BUILTIN_FLS_H_ | ||
3 | |||
4 | /** | ||
5 | * fls - find last (most-significant) bit set | ||
6 | * @x: the word to search | ||
7 | * | ||
8 | * This is defined the same way as ffs. | ||
9 | * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32. | ||
10 | */ | ||
11 | static __always_inline int fls(int x) | ||
12 | { | ||
13 | return x ? sizeof(x) * 8 - __builtin_clz(x) : 0; | ||
14 | } | ||
15 | |||
16 | #endif | ||