RE: [PATCH v3 06/19] range: Introduce range_get_last_bit()
>-Original Message- >From: Cédric Le Goater >Subject: Re: [PATCH v3 06/19] range: Introduce range_get_last_bit() > >On 4/30/24 11:58, Duan, Zhenzhong wrote: >> >> >>> -Original Message- >>> From: Cédric Le Goater >>> Subject: Re: [PATCH v3 06/19] range: Introduce range_get_last_bit() >>> >>> On 4/29/24 08:50, Zhenzhong Duan wrote: >>>> This helper get the highest 1 bit position of the upper bound. >>>> >>>> If the range is empty or upper bound is zero, -1 is returned. >>>> >>>> Suggested-by: Cédric Le Goater >>>> Signed-off-by: Zhenzhong Duan >>>> --- >>>>include/qemu/range.h | 11 +++ >>>>1 file changed, 11 insertions(+) >>>> >>>> diff --git a/include/qemu/range.h b/include/qemu/range.h >>>> index 205e1da76d..8e05bc1d9f 100644 >>>> --- a/include/qemu/range.h >>>> +++ b/include/qemu/range.h >>>> @@ -20,6 +20,8 @@ >>>>#ifndef QEMU_RANGE_H >>>>#define QEMU_RANGE_H >>>> >>>> +#include "qemu/bitops.h" >>>> + >>>>/* >>>> * Operations on 64 bit address ranges. >>>> * Notes: >>>> @@ -217,6 +219,15 @@ static inline int ranges_overlap(uint64_t first1, >>> uint64_t len1, >>>>return !(last2 < first1 || last1 < first2); >>>>} >>>> >>>> +/* Get highest non-zero bit position of a range */ >>>> +static inline int range_get_last_bit(Range *range) >>>> +{ >>>> +if (range_is_empty(range) || !range->upb) { >>>> +return -1; >>>> +} >>>> +return find_last_bit(>upb, sizeof(range->upb)); >>> >>> This breaks builds on 32-bit host systems. >> >> Oh, I missed 32bit build. Thanks, will fix. > >This should provide the same result ? > > return 63 - clz64(range->upb); Yes, I tried 32bit and 64bit, it works. Will use it, thanks for suggestion. BRs. Zhenzhong
Re: [PATCH v3 06/19] range: Introduce range_get_last_bit()
On 4/30/24 11:58, Duan, Zhenzhong wrote: -Original Message- From: Cédric Le Goater Subject: Re: [PATCH v3 06/19] range: Introduce range_get_last_bit() On 4/29/24 08:50, Zhenzhong Duan wrote: This helper get the highest 1 bit position of the upper bound. If the range is empty or upper bound is zero, -1 is returned. Suggested-by: Cédric Le Goater Signed-off-by: Zhenzhong Duan --- include/qemu/range.h | 11 +++ 1 file changed, 11 insertions(+) diff --git a/include/qemu/range.h b/include/qemu/range.h index 205e1da76d..8e05bc1d9f 100644 --- a/include/qemu/range.h +++ b/include/qemu/range.h @@ -20,6 +20,8 @@ #ifndef QEMU_RANGE_H #define QEMU_RANGE_H +#include "qemu/bitops.h" + /* * Operations on 64 bit address ranges. * Notes: @@ -217,6 +219,15 @@ static inline int ranges_overlap(uint64_t first1, uint64_t len1, return !(last2 < first1 || last1 < first2); } +/* Get highest non-zero bit position of a range */ +static inline int range_get_last_bit(Range *range) +{ +if (range_is_empty(range) || !range->upb) { +return -1; +} +return find_last_bit(>upb, sizeof(range->upb)); This breaks builds on 32-bit host systems. Oh, I missed 32bit build. Thanks, will fix. This should provide the same result ? return 63 - clz64(range->upb); Thanks, C.
RE: [PATCH v3 06/19] range: Introduce range_get_last_bit()
>-Original Message- >From: Cédric Le Goater >Subject: Re: [PATCH v3 06/19] range: Introduce range_get_last_bit() > >On 4/29/24 08:50, Zhenzhong Duan wrote: >> This helper get the highest 1 bit position of the upper bound. >> >> If the range is empty or upper bound is zero, -1 is returned. >> >> Suggested-by: Cédric Le Goater >> Signed-off-by: Zhenzhong Duan >> --- >> include/qemu/range.h | 11 +++ >> 1 file changed, 11 insertions(+) >> >> diff --git a/include/qemu/range.h b/include/qemu/range.h >> index 205e1da76d..8e05bc1d9f 100644 >> --- a/include/qemu/range.h >> +++ b/include/qemu/range.h >> @@ -20,6 +20,8 @@ >> #ifndef QEMU_RANGE_H >> #define QEMU_RANGE_H >> >> +#include "qemu/bitops.h" >> + >> /* >>* Operations on 64 bit address ranges. >>* Notes: >> @@ -217,6 +219,15 @@ static inline int ranges_overlap(uint64_t first1, >uint64_t len1, >> return !(last2 < first1 || last1 < first2); >> } >> >> +/* Get highest non-zero bit position of a range */ >> +static inline int range_get_last_bit(Range *range) >> +{ >> +if (range_is_empty(range) || !range->upb) { >> +return -1; >> +} >> +return find_last_bit(>upb, sizeof(range->upb)); > >This breaks builds on 32-bit host systems. Oh, I missed 32bit build. Thanks, will fix. Thanks zhenzhong > > >Thanks, > >C. > > >> +} >> + >> /* >>* Return -1 if @a < @b, 1 @a > @b, and 0 if they touch or overlap. >>* Both @a and @b must not be empty.
Re: [PATCH v3 06/19] range: Introduce range_get_last_bit()
On 4/29/24 08:50, Zhenzhong Duan wrote: This helper get the highest 1 bit position of the upper bound. If the range is empty or upper bound is zero, -1 is returned. Suggested-by: Cédric Le Goater Signed-off-by: Zhenzhong Duan --- include/qemu/range.h | 11 +++ 1 file changed, 11 insertions(+) diff --git a/include/qemu/range.h b/include/qemu/range.h index 205e1da76d..8e05bc1d9f 100644 --- a/include/qemu/range.h +++ b/include/qemu/range.h @@ -20,6 +20,8 @@ #ifndef QEMU_RANGE_H #define QEMU_RANGE_H +#include "qemu/bitops.h" + /* * Operations on 64 bit address ranges. * Notes: @@ -217,6 +219,15 @@ static inline int ranges_overlap(uint64_t first1, uint64_t len1, return !(last2 < first1 || last1 < first2); } +/* Get highest non-zero bit position of a range */ +static inline int range_get_last_bit(Range *range) +{ +if (range_is_empty(range) || !range->upb) { +return -1; +} +return find_last_bit(>upb, sizeof(range->upb)); This breaks builds on 32-bit host systems. Thanks, C. +} + /* * Return -1 if @a < @b, 1 @a > @b, and 0 if they touch or overlap. * Both @a and @b must not be empty.