// Copyright 2011 Google Inc. All Rights Reserved. #ifndef ART_SRC_UTILS_H_ #define ART_SRC_UTILS_H_ #include "globals.h" namespace art { template static inline bool IsPowerOfTwo(T x) { return (x & (x - 1)) == 0; } template static inline bool IsAligned(T x, int n) { CHECK(IsPowerOfTwo(n)); return (x & (n - 1)) == 0; } template static inline bool IsAligned(T* x, int n) { return IsAligned(reinterpret_cast(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(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(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(value & 0xffff); } static inline int32_t High16Bits(int32_t value) { return static_cast(value >> 16); } static inline int32_t Low32Bits(int64_t value) { return static_cast(value); } static inline int32_t High32Bits(int64_t value) { return static_cast(value >> 32); } template static inline T RoundDown(T x, int n) { CHECK(IsPowerOfTwo(n)); return (x & -n); } template 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(x & 0x0000003F); } } // namespace art #endif // ART_SRC_UTILS_H_