summaryrefslogtreecommitdiff
path: root/deps/v8/src/base/bits.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/base/bits.cc')
-rw-r--r--deps/v8/src/base/bits.cc36
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
}