diff options
Diffstat (limited to 'src/support')
-rw-r--r-- | src/support/bits.cpp | 8 | ||||
-rw-r--r-- | src/support/bits.h | 6 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/support/bits.cpp b/src/support/bits.cpp index 992b97955..e60f2365b 100644 --- a/src/support/bits.cpp +++ b/src/support/bits.cpp @@ -152,6 +152,14 @@ template<> int CountLeadingZeroes<uint64_t>(uint64_t v) { #endif } +template<> int CeilLog2<uint32_t>(uint32_t v) { + return 32 - CountLeadingZeroes(v - 1); +} + +template<> int CeilLog2<uint64_t>(uint64_t v) { + return 64 - CountLeadingZeroes(v - 1); +} + uint32_t Log2(uint32_t v) { switch (v) { default: diff --git a/src/support/bits.h b/src/support/bits.h index bd91fdec6..a927a2832 100644 --- a/src/support/bits.h +++ b/src/support/bits.h @@ -40,6 +40,7 @@ template<typename T> int PopCount(T); template<typename T> uint32_t BitReverse(T); template<typename T> int CountTrailingZeroes(T); template<typename T> int CountLeadingZeroes(T); +template<typename T> int CeilLog2(T); #ifndef wasm_support_bits_definitions // The template specializations are provided elsewhere. @@ -52,6 +53,8 @@ extern template int CountTrailingZeroes(uint32_t); extern template int CountTrailingZeroes(uint64_t); extern template int CountLeadingZeroes(uint32_t); extern template int CountLeadingZeroes(uint64_t); +extern template int CeilLog2(uint32_t); +extern template int CeilLog2(uint64_t); #endif // Convenience signed -> unsigned. It usually doesn't make much sense to use bit @@ -65,6 +68,9 @@ template<typename T> int CountTrailingZeroes(T v) { template<typename T> int CountLeadingZeroes(T v) { return CountLeadingZeroes(typename std::make_unsigned<T>::type(v)); } +template<typename T> int CeilLog2(T v) { + return CeilLog2(typename std::make_unsigned<T>::type(v)); +} template<typename T> bool IsPowerOf2(T v) { return v != 0 && (v & (v - 1)) == 0; } |