Re-send this to include the original mail-list.

Hi Peter,
I am working on a i3c target model which requires bitops on the uint8_t
registers.
deposit8 can help to check incorrect length or start input for 8 bit value.
You are right that desposit32 should also work if we always pass the
correct arguments, but since the implementation seems trivial enough, I
just go ahead and create the patch.
Thank you.

On Tue, Aug 27, 2024 at 2:23 AM Peter Maydell <peter.mayd...@linaro.org>
wrote:

> On Mon, 26 Aug 2024 at 22:01, Jason Fan <fanja...@google.com> wrote:
> >
> > Signed-off-by: Jason Fan <fanja...@google.com>
> > ---
> >  include/qemu/bitops.h | 26 ++++++++++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> >
> > diff --git a/include/qemu/bitops.h b/include/qemu/bitops.h
> > index 2c0a2fe751..d01c4b42f2 100644
> > --- a/include/qemu/bitops.h
> > +++ b/include/qemu/bitops.h
> > @@ -459,6 +459,32 @@ static inline int64_t sextract64(uint64_t value,
> int start, int length)
> >      return ((int64_t)(value << (64 - length - start))) >> (64 - length);
> >  }
> >
> > +/**
> > + * deposit8:
> > + * @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 8 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 8 bit word.
> > + * It is valid to request that all 8 bits are modified (ie @length
> > + * 8 and @start 0).
> > + *
> > + * Returns: the modified @value.
> > + */
> > +static inline uint8_t deposit8(uint8_t value, int start, int length,
> > +                               uint8_t fieldval)
> > +{
> > +    uint8_t mask = 0xFF;
> > +    assert(start >= 0 && length > 0 && length <= 8 - start);
> > +    mask = (mask >> (8 - length)) << start;
> > +    return (value & ~mask) | ((fieldval << start) & mask);
> > +}
>
> What's the use case for this? Where would you need this
> and not be able to use "deposit32" instead?
>
> thanks
> -- PMM
>

Reply via email to