Add BIT_OR2(), BIT_AND2(), BIT_NAND2(), BIT_XOR() and BIT_XOR2().

Submitted by:	Sebastian Huber <sebastian.huber@embedded-brains.de>
MFC after:	2 weeks
This commit is contained in:
Konstantin Belousov 2017-05-24 10:09:54 +00:00
parent a07c3aeb73
commit e058e1c43c
2 changed files with 142 additions and 1 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd July 29, 2016
.Dd May 24, 2017
.Dt BITSET 9
.Os
.Sh NAME
@ -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,33 @@
.Fa "const SETSIZE" "struct STRUCTNAME *bitset1" "struct STRUCTNAME *bitset2"
.Fc
.Fn BIT_OR "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
.Fo BIT_OR2
.Fa "const SETSIZE"
.Fa "struct STRUCTNAME *dst"
.Fa "struct STRUCTNAME *src1"
.Fa "struct STRUCTNAME *src2"
.Fc
.Fn BIT_AND "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
.Fo BIT_AND2
.Fa "const SETSIZE"
.Fa "struct STRUCTNAME *dst"
.Fa "struct STRUCTNAME *src1"
.Fa "struct STRUCTNAME *src2"
.Fc
.Fn BIT_NAND "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
.Fo BIT_NAND2
.Fa "const SETSIZE"
.Fa "struct STRUCTNAME *dst"
.Fa "struct STRUCTNAME *src1"
.Fa "struct STRUCTNAME *src2"
.Fc
.Fn BIT_XOR "const SETSIZE" "struct STRUCTNAME *dst" "struct STRUCTNAME *src"
.Fo BIT_XOR2
.Fa "const SETSIZE"
.Fa "struct STRUCTNAME *dst"
.Fa "struct STRUCTNAME *src1"
.Fa "struct STRUCTNAME *src2"
.Fc
.\"
.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 +342,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 +375,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 +403,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);

View File

@ -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))