6 #ifndef XENIUM_UTILS_HPP
7 #define XENIUM_UTILS_HPP
14 namespace xenium::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) {
30 constexpr T next_power_of_two(T val) {
31 if (is_power_of_two(val)) {
35 return static_cast<T
>(1) << find_last_bit_set(val);
40 T operator()(T a, T b) {
return a % b; }
44 template <u
intptr_t C>
46 static uintptr_t left(uintptr_t v) {
47 static_assert(C > 0,
"should never happen!");
48 return (v >> (64 - C)) | (v << C);
51 static uintptr_t right(uintptr_t v) {
52 static_assert(C > 0,
"should never happen!");
53 return (v >> C) | (v << (64 - C));
59 static uintptr_t left(uintptr_t v) {
return v; }
60 static uintptr_t right(uintptr_t v) {
return v; }
63 #if defined(__sparc__)
64 static inline std::uint64_t getticks() {
66 __asm__(
"rd %%tick, %0" :
"=r"(ret));
69 #elif defined(__x86_64__)
70 static inline std::uint64_t getticks() {
72 __asm__(
"rdtsc" :
"=a"(lo),
"=d"(hi));
73 return (
static_cast<std::uint64_t
>(hi) << 32) |
static_cast<std::uint64_t
>(lo);
75 #elif defined(_M_AMD64)
76 static inline std::uint64_t getticks() {
81 #error "Unsupported compiler"
84 inline std::uint64_t random() {
85 return getticks() >> 4;