Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/asm-generic/bitops/__fls.h
26288 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
#ifndef _ASM_GENERIC_BITOPS___FLS_H_
3
#define _ASM_GENERIC_BITOPS___FLS_H_
4
5
#include <asm/types.h>
6
7
/**
8
* generic___fls - find last (most-significant) set bit in a long word
9
* @word: the word to search
10
*
11
* Undefined if no set bit exists, so code should check against 0 first.
12
*/
13
static __always_inline unsigned int generic___fls(unsigned long word)
14
{
15
unsigned int num = BITS_PER_LONG - 1;
16
17
#if BITS_PER_LONG == 64
18
if (!(word & (~0ul << 32))) {
19
num -= 32;
20
word <<= 32;
21
}
22
#endif
23
if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
24
num -= 16;
25
word <<= 16;
26
}
27
if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
28
num -= 8;
29
word <<= 8;
30
}
31
if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
32
num -= 4;
33
word <<= 4;
34
}
35
if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
36
num -= 2;
37
word <<= 2;
38
}
39
if (!(word & (~0ul << (BITS_PER_LONG-1))))
40
num -= 1;
41
return num;
42
}
43
44
#ifndef __HAVE_ARCH___FLS
45
#define __fls(word) generic___fls(word)
46
#endif
47
48
#endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
49
50