svn commit: r320755 - in head: share/man/man9 sys/sys
Konstantin Belousov
kib at FreeBSD.org
Thu Jul 6 21:47:19 UTC 2017
Author: kib
Date: Thu Jul 6 21:47:17 2017
New Revision: 320755
URL: https://svnweb.freebsd.org/changeset/base/320755
Log:
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 at embedded-brains.de>
MFC after: 1 week
Modified:
head/share/man/man9/bitset.9
head/sys/sys/bitset.h
Modified: head/share/man/man9/bitset.9
==============================================================================
--- head/share/man/man9/bitset.9 Thu Jul 6 19:53:30 2017 (r320754)
+++ head/share/man/man9/bitset.9 Thu Jul 6 21:47:17 2017 (r320755)
@@ -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
@@ -275,6 +278,23 @@ Like with
.Xr ffs 3 ,
to use the non-zero result of
.Fn BIT_FFS
+as a
+.Fa bit
+index parameter to any other
+.Nm
+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
Modified: head/sys/sys/bitset.h
==============================================================================
--- head/sys/sys/bitset.h Thu Jul 6 19:53:30 2017 (r320754)
+++ head/sys/sys/bitset.h Thu Jul 6 21:47:17 2017 (r320755)
@@ -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; \
More information about the svn-src-head
mailing list