diff options
-rw-r--r-- | src/compiler-support.h | 1 | ||||
-rw-r--r-- | src/support/bits.cpp | 25 | ||||
-rw-r--r-- | src/support/bits.h | 2 |
3 files changed, 28 insertions, 0 deletions
diff --git a/src/compiler-support.h b/src/compiler-support.h index 54dd61bc8..9e298b278 100644 --- a/src/compiler-support.h +++ b/src/compiler-support.h @@ -32,6 +32,7 @@ #elif defined(_MSC_VER) # define WASM_UNREACHABLE() __assume(false) #else +# include <stdlib.h> # define WASM_UNREACHABLE() abort() #endif diff --git a/src/support/bits.cpp b/src/support/bits.cpp index c1de4da8b..3d03b100c 100644 --- a/src/support/bits.cpp +++ b/src/support/bits.cpp @@ -15,6 +15,7 @@ */ #define wasm_support_bits_definitions +#include "../compiler-support.h" #include "support/bits.h" namespace wasm { @@ -99,4 +100,28 @@ int CountLeadingZeroes<uint64_t>(uint64_t v) { : 32 + CountLeadingZeroes((uint32_t)v); } +uint32_t Log2(uint32_t v) { + switch (v) { + default: WASM_UNREACHABLE(); + case 1: return 0; + case 2: return 1; + case 4: return 2; + case 8: return 3; + case 16: return 4; + case 32: return 5; + } +} + +uint32_t Pow2(uint32_t v) { + switch (v) { + default: WASM_UNREACHABLE(); + case 0: return 1; + case 1: return 2; + case 2: return 4; + case 3: return 8; + case 4: return 16; + case 5: return 32; + } +} + } // namespace wasm diff --git a/src/support/bits.h b/src/support/bits.h index 6c9fbad94..5d3502b81 100644 --- a/src/support/bits.h +++ b/src/support/bits.h @@ -79,6 +79,8 @@ inline static T RotateRight(T val, T count) { return (val >> count) | (val << (-count & mask)); } +extern uint32_t Log2(uint32_t v); +extern uint32_t Pow2(uint32_t v); } // namespace wasm |