// Copyright 2016 The Fuchsia Authors
// Copyright (c) 2008-2014 Travis Geiselbrecht
//
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file or at
// https://opensource.org/licenses/MIT

#ifndef ZIRCON_KERNEL_INCLUDE_POW2_H_
#define ZIRCON_KERNEL_INCLUDE_POW2_H_

#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>
#include <zircon/compiler.h>

__BEGIN_CDECLS

/* routines for dealing with power of 2 values for efficiency
 * Considers 0 to be a power of 2 */
__CONSTEXPR static inline __ALWAYS_INLINE bool ispow2(uint val) { return ((val - 1) & val) == 0; }

// Compute log2(|val|), rounded as requested by |ceiling|.  We define
// log2(0) to be 0.
__CONSTEXPR static inline __ALWAYS_INLINE uint _log2_uint(uint val, bool ceiling) {
  if (val == 0)
    return 0;

  uint log2 = (uint)(sizeof(val) * CHAR_BIT) - 1 - __builtin_clz(val);

  if (ceiling && val - (1u << log2) > 0) {
    ++log2;
  }

  return log2;
}

// Compute floor(log2(|val|)), or 0 if |val| is 0
__CONSTEXPR static inline __ALWAYS_INLINE uint log2_uint_floor(uint val) {
  return _log2_uint(val, false);
}

// Compute ceil(log2(|val|)), or 0 if |val| is 0
__CONSTEXPR static inline __ALWAYS_INLINE uint log2_uint_ceil(uint val) {
  return _log2_uint(val, true);
}

// Compute log2(|val|), rounded as requested by |ceiling|.  We define
// log2(0) to be 0.
__CONSTEXPR static inline __ALWAYS_INLINE uint _log2_ulong(ulong val, bool ceiling) {
  if (val == 0)
    return 0;

  uint log2 = (uint)(sizeof(val) * CHAR_BIT) - 1 - __builtin_clzl(val);

  if (ceiling && val - (1ul << log2) > 0) {
    ++log2;
  }

  return log2;
}

// Compute floor(log2(|val|)), or 0 if |val| is 0
__CONSTEXPR static inline __ALWAYS_INLINE uint log2_ulong_floor(ulong val) {
  return _log2_ulong(val, false);
}

// Compute ceil(log2(|val|)), or 0 if |val| is 0
__CONSTEXPR static inline __ALWAYS_INLINE uint log2_ulong_ceil(ulong val) {
  return _log2_ulong(val, true);
}

__CONSTEXPR static inline __ALWAYS_INLINE uint valpow2(uint valp2) { return 1U << valp2; }

__CONSTEXPR static inline __ALWAYS_INLINE uint divpow2(uint val, uint divp2) {
  return val >> divp2;
}

__CONSTEXPR static inline __ALWAYS_INLINE uint modpow2(uint val, uint modp2) {
  return val & ((1U << modp2) - 1);
}

__CONSTEXPR static inline __ALWAYS_INLINE uint64_t modpow2_u64(uint64_t val, uint modp2) {
  return val & ((1U << modp2) - 1);
}

// Cribbed from:
// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
// Returns 0 if given 0 (i.e. considers 0 to be a power of 2 greater than
// 2^31).
__CONSTEXPR static inline __ALWAYS_INLINE uint32_t round_up_pow2_u32(uint32_t v) {
  v--;
  v |= v >> 1;
  v |= v >> 2;
  v |= v >> 4;
  v |= v >> 8;
  v |= v >> 16;
  v++;
  return v;
}

__END_CDECLS

#endif  // ZIRCON_KERNEL_INCLUDE_POW2_H_
