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