| OLD | NEW |
| (Empty) |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef V8_MISC_INTRINSICS_H_ | |
| 6 #define V8_MISC_INTRINSICS_H_ | |
| 7 | |
| 8 #include "include/v8.h" | |
| 9 #include "src/globals.h" | |
| 10 | |
| 11 namespace v8 { | |
| 12 namespace internal { | |
| 13 | |
| 14 // Returns the index of the leading 1 bit, counting the least significant bit at | |
| 15 // index 0. (1 << IntegerLog2(x)) is a mask for the most significant bit of x. | |
| 16 // Result is undefined if input is zero. | |
| 17 int IntegerLog2(uint32_t value); | |
| 18 | |
| 19 #if defined(__GNUC__) | |
| 20 | |
| 21 inline int IntegerLog2(uint32_t value) { | |
| 22 return 31 - __builtin_clz(value); | |
| 23 } | |
| 24 | |
| 25 #elif defined(_MSC_VER) | |
| 26 | |
| 27 #pragma intrinsic(_BitScanReverse) | |
| 28 | |
| 29 inline int IntegerLog2(uint32_t value) { | |
| 30 unsigned long result; // NOLINT: MSVC intrinsic demands this type. | |
| 31 _BitScanReverse(&result, value); | |
| 32 return result; | |
| 33 } | |
| 34 | |
| 35 #else | |
| 36 | |
| 37 // Default version using regular operations. Code taken from: | |
| 38 // http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog | |
| 39 inline int IntegerLog2(uint32_t value) { | |
| 40 int result, shift; | |
| 41 | |
| 42 shift = (value > 0xFFFF) << 4; | |
| 43 value >>= shift; | |
| 44 result = shift; | |
| 45 | |
| 46 shift = (value > 0xFF) << 3; | |
| 47 value >>= shift; | |
| 48 result |= shift; | |
| 49 | |
| 50 shift = (value > 0xF) << 2; | |
| 51 value >>= shift; | |
| 52 result |= shift; | |
| 53 | |
| 54 shift = (value > 0x3) << 1; | |
| 55 value >>= shift; | |
| 56 result |= shift; | |
| 57 | |
| 58 result |= (value >> 1); | |
| 59 | |
| 60 return result; | |
| 61 } | |
| 62 #endif | |
| 63 | |
| 64 } } // namespace v8::internal | |
| 65 | |
| 66 #endif // V8_MISC_INTRINSICS_H_ | |
| OLD | NEW |