6 #ifndef XENIUM_UTILS_HPP
7 #define XENIUM_UTILS_HPP
14 namespace xenium {
namespace utils {
16 constexpr
bool is_power_of_two(T val) {
17 return (val & (val - 1)) == 0;
21 constexpr
unsigned find_last_bit_set(T val) {
23 for (; val != 0; val >>= 1)
29 constexpr T next_power_of_two(T val)
31 if (is_power_of_two(val))
34 return static_cast<T
>(1) << find_last_bit_set(val);
39 T operator()(T a, T b) {
return a % b; }
43 template <u
intptr_t C>
45 static uintptr_t left(uintptr_t v) {
46 static_assert(C > 0,
"should never happen!");
47 return (v >> (64 - C)) | (v << C);
50 static uintptr_t right(uintptr_t v) {
51 static_assert(C > 0,
"should never happen!");
52 return (v >> C) | (v << (64 - C));
58 static uintptr_t left(uintptr_t v) {
return v; }
59 static uintptr_t right(uintptr_t v) {
return v; }
62 #if defined(__sparc__)
63 static inline std::uint64_t getticks(
void) {
65 __asm__(
"rd %%tick, %0" :
"=r" (ret));
68 #elif defined(__x86_64__)
69 static inline std::uint64_t getticks(
void) {
71 __asm__ (
"rdtsc" :
"=a"(lo),
"=d"(hi));
72 return (
static_cast<std::uint64_t
>(hi) << 32) |
static_cast<std::uint64_t
>(lo);
74 #elif defined(_M_AMD64)
75 static inline std::uint64_t getticks(
void) {
80 #error "Unsupported compiler"
83 inline std::uint64_t random() {
84 return getticks() >> 4;