| // Copyright 2011 Google Inc. All Rights Reserved. |
| |
| #ifndef ART_SRC_UTILS_H_ |
| #define ART_SRC_UTILS_H_ |
| |
| #include "globals.h" |
| |
| namespace art { |
| |
| template<typename T> |
| static inline bool IsPowerOfTwo(T x) { |
| return (x & (x - 1)) == 0; |
| } |
| |
| template<typename T> |
| static inline bool IsAligned(T x, int n) { |
| CHECK(IsPowerOfTwo(n)); |
| return (x & (n - 1)) == 0; |
| } |
| |
| template<typename T> |
| static inline bool IsAligned(T* x, int n) { |
| return IsAligned(reinterpret_cast<uintptr_t>(x), n); |
| } |
| |
| // Check whether an N-bit two's-complement representation can hold value. |
| static inline bool IsInt(int N, word value) { |
| CHECK_LT(0, N); |
| CHECK_LT(N, kBitsPerWord); |
| word limit = static_cast<word>(1) << (N - 1); |
| return (-limit <= value) && (value < limit); |
| } |
| |
| static inline bool IsUint(int N, word value) { |
| CHECK_LT(0, N); |
| CHECK_LT(N, kBitsPerWord); |
| word limit = static_cast<word>(1) << N; |
| return (0 <= value) && (value < limit); |
| } |
| |
| static inline bool IsAbsoluteUint(int N, word value) { |
| CHECK_LT(0, N); |
| CHECK_LT(N, kBitsPerWord); |
| if (value < 0) value = -value; |
| return IsUint(N, value); |
| } |
| |
| static inline int32_t Low16Bits(int32_t value) { |
| return static_cast<int32_t>(value & 0xffff); |
| } |
| |
| static inline int32_t High16Bits(int32_t value) { |
| return static_cast<int32_t>(value >> 16); |
| } |
| |
| static inline int32_t Low32Bits(int64_t value) { |
| return static_cast<int32_t>(value); |
| } |
| |
| static inline int32_t High32Bits(int64_t value) { |
| return static_cast<int32_t>(value >> 32); |
| } |
| |
| template<typename T> |
| static inline T RoundDown(T x, int n) { |
| CHECK(IsPowerOfTwo(n)); |
| return (x & -n); |
| } |
| |
| template<typename T> |
| static inline T RoundUp(T x, int n) { |
| return RoundDown(x + n - 1, n); |
| } |
| |
| // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr., |
| // figure 3-3, page 48, where the function is called clp2. |
| static inline uint32_t RoundUpToPowerOfTwo(uint32_t x) { |
| x = x - 1; |
| x = x | (x >> 1); |
| x = x | (x >> 2); |
| x = x | (x >> 4); |
| x = x | (x >> 8); |
| x = x | (x >> 16); |
| return x + 1; |
| } |
| |
| // Implementation is from "Hacker's Delight" by Henry S. Warren, Jr., |
| // figure 5-2, page 66, where the function is called pop. |
| static inline int CountOneBits(uint32_t x) { |
| x = x - ((x >> 1) & 0x55555555); |
| x = (x & 0x33333333) + ((x >> 2) & 0x33333333); |
| x = (x + (x >> 4)) & 0x0F0F0F0F; |
| x = x + (x >> 8); |
| x = x + (x >> 16); |
| return static_cast<int>(x & 0x0000003F); |
| } |
| |
| } // namespace art |
| |
| #endif // ART_SRC_UTILS_H_ |