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 <[email protected]>
  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;                                                    \
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to