diff --git a/src/xenia/base/math.h b/src/xenia/base/math.h index becb8a6a7..116f85b09 100644 --- a/src/xenia/base/math.h +++ b/src/xenia/base/math.h @@ -296,7 +296,7 @@ inline bool bit_scan_forward(uint64_t v, uint32_t* out_first_set_index) { } #else inline bool bit_scan_forward(uint32_t v, uint32_t* out_first_set_index) { - int i = ffs(v); + int i = __builtin_ffs(v); *out_first_set_index = i - 1; return i != 0; } @@ -315,11 +315,19 @@ inline bool bit_scan_forward(int64_t v, uint32_t* out_first_set_index) { template inline T log2_floor(T v) { - return sizeof(T) * 8 - 1 - lzcnt(v); + if constexpr (sizeof(T) <= sizeof(uint32_t)) { + return sizeof(T) * 8 - 1 - lzcnt(static_cast(v)); + } else { + return sizeof(T) * 8 - 1 - lzcnt(static_cast(v)); + } } template inline T log2_ceil(T v) { - return sizeof(T) * 8 - lzcnt(v - 1); + if constexpr (sizeof(T) <= sizeof(uint32_t)) { + return sizeof(T) * 8 - lzcnt(static_cast(v - 1)); + } else { + return sizeof(T) * 8 - lzcnt(static_cast(v - 1)); + } } template