[PATCH] bitset(9): Add some operations
Alfred Perlstein
alfred at freebsd.org
Sun May 28 04:45:30 UTC 2017
Would you consider using "3" instead of "2" as that would match what
machine opcodes typically are named. ex: OR3 instead of OR2.
Search for addl3 vs addl2 in this paper:
http://minnie.tuhs.org/CompArch/Resources/webext3.pdf
-Alfred
On 5/19/17 6:00 AM, Sebastian Huber wrote:
> 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))
More information about the freebsd-hackers
mailing list