Commit 8f1ed5f5 authored by Peter Maydell's avatar Peter Maydell
Browse files

Make pow2ceil() and pow2floor() inline



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: default avatarPeter Maydell <peter.maydell@linaro.org>
Reviewed-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Message-id: 1437741192-20955-7-git-send-email-peter.maydell@linaro.org
parent 10944a19
Loading
Loading
Loading
Loading
+1 −15
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@

#include "glib-compat.h"
#include "qemu/option.h"
#include "qemu/host-utils.h"

/* HOST_LONG_BITS is the size of a native pointer in bits. */
#if UINTPTR_MAX == UINT32_MAX
@@ -416,21 +417,6 @@ static inline uint8_t from_bcd(uint8_t val)
/* 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"

/*
+33 −0
Original line number Diff line number Diff line
@@ -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,
@@ -408,4 +409,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
+0 −23
Original line number Diff line number Diff line
@@ -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