Add BIT_FLS() analogous to BIT_FFS().
The benefit of BIT_FLS() is that ffsl() can be implemented with a count leading zeros instruction which is more widespread available. Submitted by: Sebastian Huber <sebastian.huber@embedded-brains.de> MFC after: 1 week
This commit is contained in:
parent
5d0b504e1b
commit
0b10b7d8fd
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd May 24, 2017
|
||||
.Dd July 6, 2017
|
||||
.Dt BITSET 9
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -43,6 +43,7 @@
|
||||
.Nm BIT_EMPTY ,
|
||||
.Nm BIT_ISFULLSET ,
|
||||
.Nm BIT_FFS ,
|
||||
.Nm BIT_FLS ,
|
||||
.Nm BIT_COUNT ,
|
||||
.Nm BIT_SUBSET ,
|
||||
.Nm BIT_OVERLAP ,
|
||||
@ -85,6 +86,8 @@
|
||||
.Ft int
|
||||
.Fn BIT_FFS "const SETSIZE" "struct STRUCTNAME *bitset"
|
||||
.Ft int
|
||||
.Fn BIT_FLS "const SETSIZE" "struct STRUCTNAME *bitset"
|
||||
.Ft int
|
||||
.Fn BIT_COUNT "const SETSIZE" "struct STRUCTNAME *bitset"
|
||||
.\"
|
||||
.Ft bool
|
||||
@ -282,6 +285,23 @@ index parameter to any other
|
||||
macro, you must subtract one from the result.
|
||||
.Pp
|
||||
The
|
||||
.Fn BIT_FLS
|
||||
macro returns the 1-index of the last (highest) set bit in
|
||||
.Fa bitset ,
|
||||
or zero if
|
||||
.Fa bitset
|
||||
is empty.
|
||||
Like with
|
||||
.Xr fls 3 ,
|
||||
to use the non-zero result of
|
||||
.Fn BIT_FLS
|
||||
as a
|
||||
.Fa bit
|
||||
index parameter to any other
|
||||
.Nm
|
||||
macro, you must subtract one from the result.
|
||||
.Pp
|
||||
The
|
||||
.Fn BIT_COUNT
|
||||
macro returns the total number of set bits in
|
||||
.Fa bitset .
|
||||
|
@ -213,6 +213,21 @@
|
||||
__bit; \
|
||||
})
|
||||
|
||||
#define BIT_FLS(_s, p) __extension__ ({ \
|
||||
__size_t __i; \
|
||||
int __bit; \
|
||||
\
|
||||
__bit = 0; \
|
||||
for (__i = __bitset_words((_s)) - 1; __i >= 0; __i--) { \
|
||||
if ((p)->__bits[__i] != 0) { \
|
||||
__bit = flsl((p)->__bits[__i]); \
|
||||
__bit += __i * _BITSET_BITS; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
__bit; \
|
||||
})
|
||||
|
||||
#define BIT_COUNT(_s, p) __extension__ ({ \
|
||||
__size_t __i; \
|
||||
int __count; \
|
||||
|
Loading…
x
Reference in New Issue
Block a user