All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields
@ 2012-07-06 14:48 Peter Maydell
  2012-07-07  9:22 ` Blue Swirl
  2012-07-08  9:55 ` Lluís Vilanova
  0 siblings, 2 replies; 6+ messages in thread
From: Peter Maydell @ 2012-07-06 14:48 UTC (permalink / raw)
  To: qemu-devel
  Cc: Jia Liu, patches, Blue Swirl, Avi Kivity, Eric Blake,
	Andreas Färber

Add functions deposit32(), deposit64(), extract32() and extract64()
to extract and deposit bitfields in 32 and 64 bit words. Based on
ideas by Jia Liu and Avi Kivity.

Suggested-by: Jia Liu <proljc@gmail.com>
Suggested-by: Avi Kivity <avi@redhat.com>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Andreas Färber <afaerber@suse.de>
---
Changes:
 v1->v2: added missing brackets
 v2->v3: renamed field32,field64 to extract32,extract64
         added deposit32,deposit64 at Avi's suggestion
         fixed assertion as per Jay Foad's suggestion
 v3->v4: fixed gtk-doc comment formats, expanded doc comments slightly

I took the liberty of leaving Eric and Andreas' Reviewed-by: tags
on since there are no code changes in v4, only doc comments.

 bitops.h |   90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 90 insertions(+), 0 deletions(-)

diff --git a/bitops.h b/bitops.h
index 07d1a06..b967ef3 100644
--- a/bitops.h
+++ b/bitops.h
@@ -269,4 +269,94 @@ static inline unsigned long hweight_long(unsigned long w)
     return count;
 }
 
+/**
+ * extract32:
+ * @value: the value to extract the bit field from
+ * @start: the lowest bit in the bit field (numbered from 0)
+ * @length: the length of the bit field
+ *
+ * Extract from the 32 bit input @value the bit field specified by the
+ * @start and @length parameters, and return it. The bit field must
+ * lie entirely within the 32 bit word. It is valid to request that
+ * all 32 bits are returned (ie @length 32 and @start 0).
+ *
+ * Returns: the value of the bit field extracted from the input value.
+ */
+static inline uint32_t extract32(uint32_t value, int start, int length)
+{
+    assert(start >= 0 && length > 0 && length <= 32 - start);
+    return (value >> start) & (~0U >> (32 - length));
+}
+
+/**
+ * extract64:
+ * @value: the value to extract the bit field from
+ * @start: the lowest bit in the bit field (numbered from 0)
+ * @length: the length of the bit field
+ *
+ * Extract from the 64 bit input @value the bit field specified by the
+ * @start and @length parameters, and return it. The bit field must
+ * lie entirely within the 64 bit word. It is valid to request that
+ * all 64 bits are returned (ie @length 64 and @start 0).
+ *
+ * Returns: the value of the bit field extracted from the input value.
+ */
+static inline uint64_t extract64(uint64_t value, int start, int length)
+{
+    assert(start >= 0 && length > 0 && length <= 64 - start);
+    return (value >> start) & (~0ULL >> (64 - length));
+}
+
+/**
+ * deposit32:
+ * @value: initial value to insert bit field into
+ * @start: the lowest bit in the bit field (numbered from 0)
+ * @length: the length of the bit field
+ * @fieldval: the value to insert into the bit field
+ *
+ * Deposit @fieldval into the 32 bit @value at the bit field specified
+ * by the @start and @length parameters, and return the modified
+ * @value. Bits of @value outside the bit field are not modified.
+ * Bits of @fieldval above the least significant @length bits are
+ * ignored. The bit field must lie entirely within the 32 bit word.
+ * It is valid to request that all 64 bits are modified (ie @length
+ * 64 and @start 0).
+ *
+ * Returns: the modified @value.
+ */
+static inline uint32_t deposit32(uint32_t value, int start, int length,
+                                 uint32_t fieldval)
+{
+    uint32_t mask;
+    assert(start >= 0 && length > 0 && length <= 32 - start);
+    mask = (~0U >> (32 - length)) << start;
+    return (value & ~mask) | ((fieldval << start) & mask);
+}
+
+/**
+ * deposit32:
+ * @value: initial value to insert bit field into
+ * @start: the lowest bit in the bit field (numbered from 0)
+ * @length: the length of the bit field
+ * @fieldval: the value to insert into the bit field
+ *
+ * Deposit @fieldval into the 64 bit @value at the bit field specified
+ * by the @start and @length parameters, and return the modified
+ * @value. Bits of @value outside the bit field are not modified.
+ * Bits of @fieldval above the least significant @length bits are
+ * ignored. The bit field must lie entirely within the 32 bit word.
+ * It is valid to request that all 64 bits are modified (ie @length
+ * 64 and @start 0).
+ *
+ * Returns: the modified @value.
+ */
+static inline uint64_t deposit64(uint64_t value, int start, int length,
+                                 uint64_t fieldval)
+{
+    uint64_t mask;
+    assert(start >= 0 && length > 0 && length <= 64 - start);
+    mask = (~0ULL >> (64 - length)) << start;
+    return (value & ~mask) | ((fieldval << start) & mask);
+}
+
 #endif
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields
  2012-07-06 14:48 [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields Peter Maydell
@ 2012-07-07  9:22 ` Blue Swirl
  2012-07-08  9:55 ` Lluís Vilanova
  1 sibling, 0 replies; 6+ messages in thread
From: Blue Swirl @ 2012-07-07  9:22 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Jia Liu, patches, qemu-devel, Avi Kivity, Eric Blake,
	Andreas Färber

On Fri, Jul 6, 2012 at 2:48 PM, Peter Maydell <peter.maydell@linaro.org> wrote:
> Add functions deposit32(), deposit64(), extract32() and extract64()
> to extract and deposit bitfields in 32 and 64 bit words. Based on
> ideas by Jia Liu and Avi Kivity.
>
> Suggested-by: Jia Liu <proljc@gmail.com>
> Suggested-by: Avi Kivity <avi@redhat.com>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> Reviewed-by: Eric Blake <eblake@redhat.com>
> Reviewed-by: Andreas Färber <afaerber@suse.de>

Thanks, applied.

> ---
> Changes:
>  v1->v2: added missing brackets
>  v2->v3: renamed field32,field64 to extract32,extract64
>          added deposit32,deposit64 at Avi's suggestion
>          fixed assertion as per Jay Foad's suggestion
>  v3->v4: fixed gtk-doc comment formats, expanded doc comments slightly
>
> I took the liberty of leaving Eric and Andreas' Reviewed-by: tags
> on since there are no code changes in v4, only doc comments.
>
>  bitops.h |   90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 90 insertions(+), 0 deletions(-)
>
> diff --git a/bitops.h b/bitops.h
> index 07d1a06..b967ef3 100644
> --- a/bitops.h
> +++ b/bitops.h
> @@ -269,4 +269,94 @@ static inline unsigned long hweight_long(unsigned long w)
>      return count;
>  }
>
> +/**
> + * extract32:
> + * @value: the value to extract the bit field from
> + * @start: the lowest bit in the bit field (numbered from 0)
> + * @length: the length of the bit field
> + *
> + * Extract from the 32 bit input @value the bit field specified by the
> + * @start and @length parameters, and return it. The bit field must
> + * lie entirely within the 32 bit word. It is valid to request that
> + * all 32 bits are returned (ie @length 32 and @start 0).
> + *
> + * Returns: the value of the bit field extracted from the input value.
> + */
> +static inline uint32_t extract32(uint32_t value, int start, int length)
> +{
> +    assert(start >= 0 && length > 0 && length <= 32 - start);
> +    return (value >> start) & (~0U >> (32 - length));
> +}
> +
> +/**
> + * extract64:
> + * @value: the value to extract the bit field from
> + * @start: the lowest bit in the bit field (numbered from 0)
> + * @length: the length of the bit field
> + *
> + * Extract from the 64 bit input @value the bit field specified by the
> + * @start and @length parameters, and return it. The bit field must
> + * lie entirely within the 64 bit word. It is valid to request that
> + * all 64 bits are returned (ie @length 64 and @start 0).
> + *
> + * Returns: the value of the bit field extracted from the input value.
> + */
> +static inline uint64_t extract64(uint64_t value, int start, int length)
> +{
> +    assert(start >= 0 && length > 0 && length <= 64 - start);
> +    return (value >> start) & (~0ULL >> (64 - length));
> +}
> +
> +/**
> + * deposit32:
> + * @value: initial value to insert bit field into
> + * @start: the lowest bit in the bit field (numbered from 0)
> + * @length: the length of the bit field
> + * @fieldval: the value to insert into the bit field
> + *
> + * Deposit @fieldval into the 32 bit @value at the bit field specified
> + * by the @start and @length parameters, and return the modified
> + * @value. Bits of @value outside the bit field are not modified.
> + * Bits of @fieldval above the least significant @length bits are
> + * ignored. The bit field must lie entirely within the 32 bit word.
> + * It is valid to request that all 64 bits are modified (ie @length
> + * 64 and @start 0).
> + *
> + * Returns: the modified @value.
> + */
> +static inline uint32_t deposit32(uint32_t value, int start, int length,
> +                                 uint32_t fieldval)
> +{
> +    uint32_t mask;
> +    assert(start >= 0 && length > 0 && length <= 32 - start);
> +    mask = (~0U >> (32 - length)) << start;
> +    return (value & ~mask) | ((fieldval << start) & mask);
> +}
> +
> +/**
> + * deposit32:
> + * @value: initial value to insert bit field into
> + * @start: the lowest bit in the bit field (numbered from 0)
> + * @length: the length of the bit field
> + * @fieldval: the value to insert into the bit field
> + *
> + * Deposit @fieldval into the 64 bit @value at the bit field specified
> + * by the @start and @length parameters, and return the modified
> + * @value. Bits of @value outside the bit field are not modified.
> + * Bits of @fieldval above the least significant @length bits are
> + * ignored. The bit field must lie entirely within the 32 bit word.
> + * It is valid to request that all 64 bits are modified (ie @length
> + * 64 and @start 0).
> + *
> + * Returns: the modified @value.
> + */
> +static inline uint64_t deposit64(uint64_t value, int start, int length,
> +                                 uint64_t fieldval)
> +{
> +    uint64_t mask;
> +    assert(start >= 0 && length > 0 && length <= 64 - start);
> +    mask = (~0ULL >> (64 - length)) << start;
> +    return (value & ~mask) | ((fieldval << start) & mask);
> +}
> +
>  #endif
> --
> 1.7.1
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields
  2012-07-06 14:48 [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields Peter Maydell
  2012-07-07  9:22 ` Blue Swirl
@ 2012-07-08  9:55 ` Lluís Vilanova
  2012-07-08 10:01   ` Peter Maydell
  1 sibling, 1 reply; 6+ messages in thread
From: Lluís Vilanova @ 2012-07-08  9:55 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Jia Liu, patches, qemu-devel, Blue Swirl, Avi Kivity, Eric Blake,
	Andreas Färber

Peter Maydell writes:
[...] 
> +/**
> + * extract32:
> + * @value: the value to extract the bit field from
> + * @start: the lowest bit in the bit field (numbered from 0)
> + * @length: the length of the bit field
> + *
> + * Extract from the 32 bit input @value the bit field specified by the
> + * @start and @length parameters, and return it. The bit field must
> + * lie entirely within the 32 bit word. It is valid to request that
> + * all 32 bits are returned (ie @length 32 and @start 0).
> + *
> + * Returns: the value of the bit field extracted from the input value.
> + */
> +static inline uint32_t extract32(uint32_t value, int start, int length)
> +{
> +    assert(start >= 0 && length > 0 && length <= 32 - start);
> +    return (value >> start) & (~0U >> (32 - length));
> +}
[...]

Wouldn't it be better to use "unsigned int" instead on all the "start" and
"length" arguments?


Lluis

-- 
 "And it's much the same thing with knowledge, for whenever you learn
 something new, the whole world becomes that much richer."
 -- The Princess of Pure Reason, as told by Norton Juster in The Phantom
 Tollbooth

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields
  2012-07-08  9:55 ` Lluís Vilanova
@ 2012-07-08 10:01   ` Peter Maydell
  2012-07-08 10:59     ` Stefan Weil
  0 siblings, 1 reply; 6+ messages in thread
From: Peter Maydell @ 2012-07-08 10:01 UTC (permalink / raw)
  To: Lluís Vilanova
  Cc: Jia Liu, patches, qemu-devel, Blue Swirl, Avi Kivity, Eric Blake,
	Andreas Färber

On 8 July 2012 10:55, Lluís Vilanova <vilanova@ac.upc.edu> wrote:
> Wouldn't it be better to use "unsigned int" instead on all the "start" and
> "length" arguments?

See the arguments about this on one of the previous patch series:
http://lists.gnu.org/archive/html/qemu-devel/2012-06/msg04304.html

-- PMM

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields
  2012-07-08 10:01   ` Peter Maydell
@ 2012-07-08 10:59     ` Stefan Weil
  2012-07-08 11:13       ` Peter Maydell
  0 siblings, 1 reply; 6+ messages in thread
From: Stefan Weil @ 2012-07-08 10:59 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Jia Liu, patches, qemu-devel, Andreas Färber, Blue Swirl,
	Avi Kivity, Eric Blake, Lluís Vilanova

Am 08.07.2012 12:01, schrieb Peter Maydell:
> On 8 July 2012 10:55, Lluís Vilanova <vilanova@ac.upc.edu> wrote:
>> Wouldn't it be better to use "unsigned int" instead on all the "start" and
>> "length" arguments?
> See the arguments about this on one of the previous patch series:
> http://lists.gnu.org/archive/html/qemu-devel/2012-06/msg04304.html
>
> -- PMM

I just read that arguments and now agree with Blue and with
Lluís that 'unsigned' would be better.

Cheers,

Stefan W.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields
  2012-07-08 10:59     ` Stefan Weil
@ 2012-07-08 11:13       ` Peter Maydell
  0 siblings, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2012-07-08 11:13 UTC (permalink / raw)
  To: Stefan Weil
  Cc: Jia Liu, patches, qemu-devel, Andreas Färber, Blue Swirl,
	Avi Kivity, Eric Blake, Lluís Vilanova

On 8 July 2012 11:59, Stefan Weil <sw@weilnetz.de> wrote:
> Am 08.07.2012 12:01, schrieb Peter Maydell:
>> On 8 July 2012 10:55, Lluís Vilanova <vilanova@ac.upc.edu> wrote:
>>> Wouldn't it be better to use "unsigned int" instead on all the "start"
>>> and "length" arguments?
>>
>> See the arguments about this on one of the previous patch series:
>> http://lists.gnu.org/archive/html/qemu-devel/2012-06/msg04304.html

> I just read that arguments and now agree with Blue and with
> Lluís that 'unsigned' would be better.

...whereas I still agree with Markus (and with the people who wrote
the Linux kernel bitops functions that we borrowed elsewhere in
bitops.h) that we should be using plain 'int'.

-- PMM

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2012-07-08 11:13 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-07-06 14:48 [Qemu-devel] [PATCH v4] bitops.h: Add functions to extract and deposit bitfields Peter Maydell
2012-07-07  9:22 ` Blue Swirl
2012-07-08  9:55 ` Lluís Vilanova
2012-07-08 10:01   ` Peter Maydell
2012-07-08 10:59     ` Stefan Weil
2012-07-08 11:13       ` Peter Maydell

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.