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:
Konstantin Belousov 2017-07-06 21:47:17 +00:00
parent 26e1c38fbb
commit 1550c62236
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=320755
2 changed files with 36 additions and 1 deletions

View File

@ -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 .

View File

@ -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; \