Skip site navigation (1)Skip section navigation (2)
Date:      Thu,  6 Jul 2017 15:24:40 +0200
From:      Sebastian Huber <sebastian.huber@embedded-brains.de>
To:        freebsd-hackers@freebsd.org
Cc:        kib@freebsd.org
Subject:   [PATCH] bitset(9): Add BIT_FLS()
Message-ID:  <20170706132440.18520-1-sebastian.huber@embedded-brains.de>

next in thread | raw e-mail | index | archive | help
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.
---
 share/man/man9/bitset.9 | 22 +++++++++++++++++++++-
 sys/sys/bitset.h        | 15 +++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/share/man/man9/bitset.9 b/share/man/man9/bitset.9
index d4060ace24c..f7f8a502b04 100644
--- a/share/man/man9/bitset.9
+++ b/share/man/man9/bitset.9
@@ -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 .
diff --git a/sys/sys/bitset.h b/sys/sys/bitset.h
index 8bc9e3d87a0..1ed19531b3b 100644
--- a/sys/sys/bitset.h
+++ b/sys/sys/bitset.h
@@ -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;							\
-- 
2.12.3




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20170706132440.18520-1-sebastian.huber>