Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/external/bsd/common/include/linux Add find_first_bit, fi...



details:   https://anonhg.NetBSD.org/src/rev/7b21a0fd3817
branches:  trunk
changeset: 992619:7b21a0fd3817
user:      riastradh <riastradh%NetBSD.org@localhost>
date:      Mon Aug 27 07:16:50 2018 +0000

description:
Add find_first_bit, find_next_bit, for_each_set_bit.

diffstat:

 sys/external/bsd/common/include/linux/bitops.h |  45 ++++++++++++++++++++-----
 1 files changed, 35 insertions(+), 10 deletions(-)

diffs (89 lines):

diff -r 717192d0e0b7 -r 7b21a0fd3817 sys/external/bsd/common/include/linux/bitops.h
--- a/sys/external/bsd/common/include/linux/bitops.h    Mon Aug 27 07:16:40 2018 +0000
+++ b/sys/external/bsd/common/include/linux/bitops.h    Mon Aug 27 07:16:50 2018 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: bitops.h,v 1.5 2018/08/27 07:08:37 riastradh Exp $     */
+/*     $NetBSD: bitops.h,v 1.6 2018/08/27 07:16:50 riastradh Exp $     */
 
 /*-
  * Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -177,8 +177,8 @@
 }
 
 static inline unsigned long
-find_next_zero_bit(const unsigned long *ptr, unsigned long nbits,
-    unsigned long startbit)
+__find_next_bit(const unsigned long *ptr, unsigned long nbits,
+    unsigned long startbit, unsigned long toggle)
 {
        const size_t bpl = (CHAR_BIT * sizeof(*ptr));
        const unsigned long *p = ptr + startbit/bpl;
@@ -195,9 +195,9 @@
        /* Do we need to examine a partial starting word?  */
        if (startbit % bpl) {
                /* Are any of the first startbit%bpl bits zero?  */
-               if (~(*p | (~0UL << (startbit % bpl)))) {
-                       /* Invert the bits and convert to 64 bits.  */
-                       word = ~(uint64_t)*p;
+               if ((*p ^ toggle) & ~(~0UL << (startbit % bpl))) {
+                       /* Toggle the bits and convert to 64 bits.  */
+                       word = *p ^ toggle;
 
                        /* Clear the low startbit%bpl bits.  */
                        word &= ~(~0UL << (startbit % bpl));
@@ -210,14 +210,14 @@
                }
        }
 
-       /* Find the first word with zeros in it.  */
+       /* Find the first word matching word.  */
        for (; bpl < nbits; p++, result += bpl) {
-               if (~*p)
+               if (*p ^ toggle)
                        break;
        }
 
-       /* Invert the bits and convert to 64 bits for ffs64.  */
-       word = ~(uint64_t)*p;
+       /* Toggle the bits and convert to 64 bits for ffs64.  */
+       word = *p ^ toggle;
 
        /* Find the first set bit in this word.  */
        result += ffs64(word);
@@ -227,11 +227,36 @@
 }
 
 static inline unsigned long
+find_next_bit(const unsigned long *ptr, unsigned long nbits,
+    unsigned long startbit)
+{
+       return __find_next_bit(ptr, nbits, startbit, 0);
+}
+
+static inline unsigned long
+find_first_bit(const unsigned long *ptr, unsigned long nbits)
+{
+       return find_next_bit(ptr, nbits, 0);
+}
+
+static inline unsigned long
+find_next_zero_bit(const unsigned long *ptr, unsigned long nbits,
+    unsigned long startbit)
+{
+       return __find_next_bit(ptr, nbits, startbit, ~0UL);
+}
+
+static inline unsigned long
 find_first_zero_bit(const unsigned long *ptr, unsigned long nbits)
 {
        return find_next_zero_bit(ptr, nbits, 0);
 }
 
+#define        for_each_set_bit(BIT, PTR, NBITS)                                     \
+       for ((BIT) = find_first_bit((PTR), (NBITS));                          \
+            (BIT) < (NBITS);                                                 \
+            (BIT) = find_next_bit((PTR), (NBITS), (BIT) + 1))
+
 static inline unsigned
 hweight8(unsigned w)
 {



Home | Main Index | Thread Index | Old Index