utils.h revision a2e18e1e77fc25c8260aad5daa267ababfcb65f6
1a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro// Copyright 2011 Google Inc. All Rights Reserved. 2a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 3a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#ifndef ART_SRC_UTILS_H_ 4a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#define ART_SRC_UTILS_H_ 5a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 6a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#include "src/globals.h" 7a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 86b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapironamespace art { 9a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 10a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirotemplate<typename T> 11a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirostatic inline bool IsPowerOfTwo(T x) { 12a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro return (x & (x - 1)) == 0; 13a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro} 14a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 15a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 16a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirotemplate<typename T> 17a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirostatic inline bool IsAligned(T x, int n) { 18a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro CHECK(IsPowerOfTwo(n)); 19a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro return (x & (n - 1)) == 0; 20a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro} 21a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 22a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 23a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirotemplate<typename T> 24a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirostatic inline bool IsAligned(T* x, int n) { 25a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro return IsAligned(reinterpret_cast<uintptr_t>(x), n); 26a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro} 27a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 28a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro// Check whether an N-bit two's-complement representation can hold value. 29a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirostatic inline bool IsInt(int N, word value) { 30a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(0, N); 31a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(N, kBitsPerWord); 32a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro word limit = static_cast<word>(1) << (N - 1); 33a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return (-limit <= value) && (value < limit); 34a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 35a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 36a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 37a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirostatic inline bool IsUint(int N, word value) { 38a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(0, N); 39a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro CHECK_LT(N, kBitsPerWord); 40a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro word limit = static_cast<word>(1) << N; 41a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return (0 <= value) && (value < limit); 42a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 43a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 44a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 45a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirostatic inline bool IsAbsoluteUint(int N, word value) { 46a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro CHECK_LT(0, N); 47a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro CHECK_LT(N, kBitsPerWord); 48a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro if (value < 0) value = -value; 49a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro return IsUint(N, value); 50a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro} 51a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 52a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 53a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirostatic inline int32_t Low32Bits(int64_t value) { 54a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<int32_t>(value); 55a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 56a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 57a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 58a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapirostatic inline int32_t High32Bits(int64_t value) { 59a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro return static_cast<int32_t>(value >> 32); 60a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro} 61a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 62a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro// Implementation is from "Hacker's Delight" by Henry S. Warren, Jr., 63a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro// figure 5-2, page 66, where the function is called pop. 64a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapirostatic inline int CountOneBits(uint32_t x) { 65a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro x = x - ((x >> 1) & 0x55555555); 66a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro x = (x & 0x33333333) + ((x >> 2) & 0x33333333); 67a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro x = (x + (x >> 4)) & 0x0F0F0F0F; 68a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro x = x + (x >> 8); 69a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro x = x + (x >> 16); 70a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro return static_cast<int>(x & 0x0000003F); 71a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro} 72a2e18e1e77fc25c8260aad5daa267ababfcb65f6Carl Shapiro 736b6b5f0e67ce03f38223a525612955663bc1799bCarl Shapiro} // namespace art 74a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro 75a5d5cfda6239d8876937e75eba43222f639d2447Carl Shapiro#endif // ART_SRC_UTILS_H_ 76