public inbox for newlib-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] bitset(9): Introduce BIT_FOREACH_ISSET and BIT_FOREACH_ISCLR
@ 2022-06-24 5:42 Sebastian Huber
0 siblings, 0 replies; only message in thread
From: Sebastian Huber @ 2022-06-24 5:42 UTC (permalink / raw)
To: newlib-cvs
https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=37a3e59636c01a0246b96e4432670b8afcfb7e80
commit 37a3e59636c01a0246b96e4432670b8afcfb7e80
Author: Mark Johnston <markj@FreeBSD.org>
Date: Tue Sep 21 11:32:23 2021 -0400
bitset(9): Introduce BIT_FOREACH_ISSET and BIT_FOREACH_ISCLR
These allow one to non-destructively iterate over the set or clear bits
in a bitset. The motivation is that we have several code fragments
which iterate over a CPU set like this:
while ((cpu = CPU_FFS(&cpus)) != 0) {
cpu--;
CPU_CLR(cpu, &cpus);
<do something>;
}
This is slow since CPU_FFS begins the search at the beginning of the
bitset each time. On amd64 and arm64, CPU sets have size 256, so there
are four limbs in the bitset and we do a lot of unnecessary scanning.
A second problem is that this is destructive, so code which needs to
preserve the original set has to make a copy. In particular, we have
quite a few functions which take a cpuset_t parameter by value, meaning
that each call has to copy the 32 byte cpuset_t.
The new macros address both problems.
Reviewed by: cem, kib
MFC after: 2 weeks
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D32028
Diff:
---
newlib/libc/sys/rtems/include/sys/bitset.h | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/newlib/libc/sys/rtems/include/sys/bitset.h b/newlib/libc/sys/rtems/include/sys/bitset.h
index 913fa290d..35c21f6ae 100644
--- a/newlib/libc/sys/rtems/include/sys/bitset.h
+++ b/newlib/libc/sys/rtems/include/sys/bitset.h
@@ -274,6 +274,16 @@
__count; \
})
+/* Non-destructively loop over all set or clear bits in the set. */
+#define _BIT_FOREACH(_s, i, p, op) \
+ for (__size_t __i = 0; __i < __bitset_words(_s); __i++) \
+ for (long __j = op((p)->__bits[__i]), __b = ffsl(__j); \
+ (i = (__b - 1) + __i * _BITSET_BITS), __j != 0; \
+ __j &= ~(1l << i), __b = ffsl(__j))
+
+#define BIT_FOREACH_ISSET(_s, i, p) _BIT_FOREACH(_s, i, p, )
+#define BIT_FOREACH_ISCLR(_s, i, p) _BIT_FOREACH(_s, i, p, ~)
+
#define BITSET_T_INITIALIZER(x) \
{ .__bits = { x } }
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2022-06-24 5:42 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-24 5:42 [newlib-cygwin] bitset(9): Introduce BIT_FOREACH_ISSET and BIT_FOREACH_ISCLR Sebastian Huber
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).