qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-block] [PATCH v2 6/6] Make pow2ceil() and pow2floor() inline


From: Paolo Bonzini
Subject: Re: [Qemu-block] [PATCH v2 6/6] Make pow2ceil() and pow2floor() inline
Date: Sat, 15 Aug 2015 01:42:44 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0


On 24/07/2015 14:33, Peter Maydell wrote:
> Since the pow2floor() function is now used in a hot code path,
> make it inline; for consistency, provide pow2ceil() as an inline
> function too.
> 
> Because these functions use ctz64() we have to put the inline
> versions into host-utils.h, so they have access to ctz64(),
> and move the inline is_power_of_2() along with them.
> 
> We then need to include host-utils.h from qemu-common.h so that
> the files which use these functions via qemu-common.h still have
> access to them.
> 
> Signed-off-by: Peter Maydell <address@hidden>
> ---
>  include/qemu-common.h     | 16 +---------------
>  include/qemu/host-utils.h | 33 +++++++++++++++++++++++++++++++++
>  util/cutils.c             | 23 -----------------------
>  3 files changed, 34 insertions(+), 38 deletions(-)
> 
> diff --git a/include/qemu-common.h b/include/qemu-common.h
> index bc6f8f8..3d4279c 100644
> --- a/include/qemu-common.h
> +++ b/include/qemu-common.h
> @@ -43,6 +43,7 @@
>  #include <signal.h>
>  #include "glib-compat.h"
>  #include "qemu/option.h"
> +#include "qemu/host-utils.h"
>  
>  #ifdef _WIN32
>  #include "sysemu/os-win32.h"
> @@ -405,21 +406,6 @@ static inline uint64_t muldiv64(uint64_t a, uint32_t b, 
> uint32_t c)
>  /* Round number up to multiple */
>  #define QEMU_ALIGN_UP(n, m) QEMU_ALIGN_DOWN((n) + (m) - 1, (m))
>  
> -static inline bool is_power_of_2(uint64_t value)
> -{
> -    if (!value) {
> -        return 0;
> -    }
> -
> -    return !(value & (value - 1));
> -}
> -
> -/* round down to the nearest power of 2*/
> -int64_t pow2floor(int64_t value);
> -
> -/* round up to the nearest power of 2 (0 if overflow) */
> -uint64_t pow2ceil(uint64_t value);
> -
>  #include "qemu/module.h"
>  
>  /*
> diff --git a/include/qemu/host-utils.h b/include/qemu/host-utils.h
> index d4f21c9..9ed5cdd 100644
> --- a/include/qemu/host-utils.h
> +++ b/include/qemu/host-utils.h
> @@ -27,6 +27,7 @@
>  
>  #include "qemu/compiler.h"   /* QEMU_GNUC_PREREQ */
>  #include <limits.h>
> +#include <stdbool.h>
>  
>  #ifdef CONFIG_INT128
>  static inline void mulu64(uint64_t *plow, uint64_t *phigh,
> @@ -379,4 +380,36 @@ static inline int ctpop64(uint64_t val)
>  # error Unknown sizeof long
>  #endif
>  
> +static inline bool is_power_of_2(uint64_t value)
> +{
> +    if (!value) {
> +        return 0;
> +    }
> +
> +    return !(value & (value - 1));
> +}
> +
> +/* round down to the nearest power of 2*/
> +static inline int64_t pow2floor(int64_t value)
> +{
> +    if (!is_power_of_2(value)) {
> +        value = 0x8000000000000000ULL >> clz64(value);
> +    }
> +    return value;
> +}
> +
> +/* round up to the nearest power of 2 (0 if overflow) */
> +static inline uint64_t pow2ceil(uint64_t value)
> +{
> +    uint8_t nlz = clz64(value);
> +
> +    if (is_power_of_2(value)) {
> +        return value;
> +    }
> +    if (!nlz) {
> +        return 0;
> +    }
> +    return 1ULL << (64 - nlz);
> +}
> +
>  #endif
> diff --git a/util/cutils.c b/util/cutils.c
> index 43aafde..9234452 100644
> --- a/util/cutils.c
> +++ b/util/cutils.c
> @@ -469,29 +469,6 @@ int qemu_parse_fd(const char *param)
>      return fd;
>  }
>  
> -/* round down to the nearest power of 2*/
> -int64_t pow2floor(int64_t value)
> -{
> -    if (!is_power_of_2(value)) {
> -        value = 0x8000000000000000ULL >> clz64(value);
> -    }
> -    return value;
> -}
> -
> -/* round up to the nearest power of 2 (0 if overflow) */
> -uint64_t pow2ceil(uint64_t value)
> -{
> -    uint8_t nlz = clz64(value);
> -
> -    if (is_power_of_2(value)) {
> -        return value;
> -    }
> -    if (!nlz) {
> -        return 0;
> -    }
> -    return 1ULL << (64 - nlz);
> -}
> -
>  /*
>   * Implementation of  ULEB128 (http://en.wikipedia.org/wiki/LEB128)
>   * Input is limited to 14-bit numbers
> 

Reviewed-by: Paolo Bonzini <address@hidden>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]