[PATCH] bitset(9): Add some operations
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri May 19 13:00:36 UTC 2017
Add BIT_OR2(), BIT_AND2(), BIT_NAND2(), BIT_XOR() and BIT_XOR2().
---
share/man/man9/bitset.9 | 91 +++++++++++++++++++++++++++++++++++++++++++++++++
sys/sys/bitset.h | 30 ++++++++++++++++
2 files changed, 121 insertions(+)
diff --git a/share/man/man9/bitset.9 b/share/man/man9/bitset.9
index ef55115..4842225 100644
--- a/share/man/man9/bitset.9
+++ b/share/man/man9/bitset.9
@@ -48,8 +48,13 @@
.Nm BIT_OVERLAP ,
.Nm BIT_CMP ,
.Nm BIT_OR ,
+.Nm BIT_OR2 ,
.Nm BIT_AND ,
+.Nm BIT_AND2 ,
.Nm BIT_NAND ,
+.Nm BIT_NAND2 ,
+.Nm BIT_XOR ,
+.Nm BIT_XOR2 ,
.Nm BIT_CLR_ATOMIC ,
.Nm BIT_SET_ATOMIC ,
.Nm BIT_SET_ATOMIC_ACQ ,
@@ -95,8 +100,13 @@
.Fa "const SETSIZE" "struct STRUCTNAME *bitset1" "struct STRUCTNAME *bitset2"
.Fc
.Fn BIT_OR "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
+.Fn BIT_OR2 "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src1" "struct STRUCTNAME *src2"
.Fn BIT_AND "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
+.Fn BIT_AND2 "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src1" "struct STRUCTNAME *src2"
.Fn BIT_NAND "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
+.Fn BIT_NAND2 "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src1" "struct STRUCTNAME *src2"
+.Fn BIT_XOR "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
+.Fn BIT_XOR2 "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src1" "struct STRUCTNAME *src2"
.\"
.Fn BIT_CLR_ATOMIC "const SETSIZE" "size_t bit" "struct STRUCTNAME *bitset"
.Fn BIT_SET_ATOMIC "const SETSIZE" "size_t bit" "struct STRUCTNAME *bitset"
@@ -312,6 +322,23 @@ is composed of multiple machine words,
performs multiple individually atomic operations.)
.Pp
The
+.Fn BIT_OR2
+macro computes
+.Fa src1
+bitwise or
+.Fa src2
+and assigns the result to
+.Fa dst .
+(It is the
+.Nm
+equivalent of the scalar:
+.Fa dst
+=
+.Fa src1
+|
+.Fa src2 . )
+.Pp
+The
.Fn BIT_AND
macro clears bits absent from
.Fa src
@@ -328,6 +355,23 @@ is similar, with the same atomic semantics as
.Fn BIT_OR_ATOMIC .
.Pp
The
+.Fn BIT_AND2
+macro computes
+.Fa src1
+bitwise and
+.Fa src2
+and assigns the result to
+.Fa dst .
+(It is the
+.Nm
+equivalent of the scalar:
+.Fa dst
+=
+.Fa src1
+&
+.Fa src2 . )
+.Pp
+The
.Fn BIT_NAND
macro clears bits set in
.Fa src
@@ -339,6 +383,53 @@ equivalent of the scalar:
.Fa dst
&=
.Fa ~ src . )
+.Pp
+The
+.Fn BIT_NAND2
+macro computes
+.Fa src1
+bitwise and not
+.Fa src2
+and assigns the result to
+.Fa dst .
+(It is the
+.Nm
+equivalent of the scalar:
+.Fa dst
+=
+.Fa src1
+& ~
+.Fa src2 . )
+.Pp
+The
+.Fn BIT_XOR
+macro toggles bits set in
+.Fa src
+in
+.Fa dst .
+(It is the
+.Nm
+equivalent of the scalar:
+.Fa dst
+^=
+.Fa src . )
+.Pp
+The
+.Fn BIT_XOR2
+macro computes
+.Fa src1
+bitwise exclusive or
+.Fa src2
+and assigns the result to
+.Fa dst .
+(It is the
+.Nm
+equivalent of the scalar:
+.Fa dst
+=
+.Fa src1
+^
+.Fa src2 . )
.Sh BITSET_T_INITIALIZER EXAMPLE
.Bd -literal
BITSET_DEFINE(_myset, MYSETSIZE);
diff --git a/sys/sys/bitset.h b/sys/sys/bitset.h
index 723c39b..8bc9e3d 100644
--- a/sys/sys/bitset.h
+++ b/sys/sys/bitset.h
@@ -122,18 +122,48 @@
(d)->__bits[__i] |= (s)->__bits[__i]; \
} while (0)
+#define BIT_OR2(_s, d, s1, s2) do { \
+ __size_t __i; \
+ for (__i = 0; __i < __bitset_words((_s)); __i++) \
+ (d)->__bits[__i] = (s1)->__bits[__i] | (s2)->__bits[__i];\
+} while (0)
+
#define BIT_AND(_s, d, s) do { \
__size_t __i; \
for (__i = 0; __i < __bitset_words((_s)); __i++) \
(d)->__bits[__i] &= (s)->__bits[__i]; \
} while (0)
+#define BIT_AND2(_s, d, s1, s2) do { \
+ __size_t __i; \
+ for (__i = 0; __i < __bitset_words((_s)); __i++) \
+ (d)->__bits[__i] = (s1)->__bits[__i] & (s2)->__bits[__i];\
+} while (0)
+
#define BIT_NAND(_s, d, s) do { \
__size_t __i; \
for (__i = 0; __i < __bitset_words((_s)); __i++) \
(d)->__bits[__i] &= ~(s)->__bits[__i]; \
} while (0)
+#define BIT_NAND2(_s, d, s1, s2) do { \
+ __size_t __i; \
+ for (__i = 0; __i < __bitset_words((_s)); __i++) \
+ (d)->__bits[__i] = (s1)->__bits[__i] & ~(s2)->__bits[__i];\
+} while (0)
+
+#define BIT_XOR(_s, d, s) do { \
+ __size_t __i; \
+ for (__i = 0; __i < __bitset_words((_s)); __i++) \
+ (d)->__bits[__i] ^= (s)->__bits[__i]; \
+} while (0)
+
+#define BIT_XOR2(_s, d, s1, s2) do { \
+ __size_t __i; \
+ for (__i = 0; __i < __bitset_words((_s)); __i++) \
+ (d)->__bits[__i] = (s1)->__bits[__i] ^ (s2)->__bits[__i];\
+} while (0)
+
#define BIT_CLR_ATOMIC(_s, n, p) \
atomic_clear_long(&(p)->__bits[__bitset_word(_s, n)], \
__bitset_mask((_s), n))
--
1.8.4.5
More information about the freebsd-hackers
mailing list