diff options
Diffstat (limited to 'deps/v8/src/base/bits.cc')
-rw-r--r-- | deps/v8/src/base/bits.cc | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/deps/v8/src/base/bits.cc b/deps/v8/src/base/bits.cc index 909f9deb8c..049dc4a1b1 100644 --- a/deps/v8/src/base/bits.cc +++ b/deps/v8/src/base/bits.cc @@ -14,14 +14,36 @@ namespace base { namespace bits { uint32_t RoundUpToPowerOfTwo32(uint32_t value) { - DCHECK_LE(value, 0x80000000u); - value = value - 1; - value = value | (value >> 1); - value = value | (value >> 2); - value = value | (value >> 4); - value = value | (value >> 8); - value = value | (value >> 16); + DCHECK_LE(value, uint32_t{1} << 31); + if (value) --value; +// Use computation based on leading zeros if we have compiler support for that. +#if V8_HAS_BUILTIN_CLZ || V8_CC_MSVC + return 1u << (32 - CountLeadingZeros32(value)); +#else + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; return value + 1; +#endif +} + +uint64_t RoundUpToPowerOfTwo64(uint64_t value) { + DCHECK_LE(value, uint64_t{1} << 63); + if (value) --value; +// Use computation based on leading zeros if we have compiler support for that. +#if V8_HAS_BUILTIN_CLZ + return uint64_t{1} << (64 - CountLeadingZeros64(value)); +#else + value |= value >> 1; + value |= value >> 2; + value |= value >> 4; + value |= value >> 8; + value |= value >> 16; + value |= value >> 32; + return value + 1; +#endif } |