Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 27 May 2017 21:45:24 -0700
From:      Alfred Perlstein <alfred@freebsd.org>
To:        Sebastian Huber <sebastian.huber@embedded-brains.de>, freebsd-hackers@freebsd.org
Subject:   Re: [PATCH] bitset(9): Add some operations
Message-ID:  <d987232e-4a42-83c5-aab4-ed68ae84dd82@freebsd.org>
In-Reply-To: <1495198830-10573-1-git-send-email-sebastian.huber@embedded-brains.de>
References:  <1495198830-10573-1-git-send-email-sebastian.huber@embedded-brains.de>

next in thread | previous in thread | raw e-mail | index | archive | help
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))




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?d987232e-4a42-83c5-aab4-ed68ae84dd82>