Chromium Code Reviews| Index: src/IceUtils.h |
| diff --git a/src/IceUtils.h b/src/IceUtils.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e4abda9b3b0db6756cdab84aa57ab6e8dd2668bd |
| --- /dev/null |
| +++ b/src/IceUtils.h |
| @@ -0,0 +1,57 @@ |
| +//===- subzero/src/IceUtils.h - Utility functions ---------------*- C++ -*-===// |
| +// |
| +// The Subzero Code Generator |
| +// |
| +// This file is distributed under the University of Illinois Open Source |
| +// License. See LICENSE.TXT for details. |
| +// |
| +//===----------------------------------------------------------------------===// |
| +// |
| +// This file declares some utility functions |
| +// |
| +//===----------------------------------------------------------------------===// |
| + |
| +#ifndef SUBZERO_SRC_ICEUTILS_H |
| +#define SUBZERO_SRC_ICEUTILS_H |
| + |
| +#include <climits> |
| + |
| +namespace Ice { |
| + |
| +// TODO(jvoung): why are labels offset by this? |
| +const uint32_t kWordSize = sizeof(intptr_t); |
|
Jim Stichnoth
2014/09/09 14:58:41
It's hard to search the patchsets for uses of kWor
jvoung (off chromium)
2014/09/15 17:19:15
I moved this to the one place it's being used, whi
|
| + |
| +// Similar to bit_cast, but allows copying from types of unrelated |
| +// sizes. This method was introduced to enable the strict aliasing |
| +// optimizations of GCC 4.4. Basically, GCC mindlessly relies on |
| +// obscure details in the C++ standard that make reinterpret_cast |
| +// virtually useless. |
| +template <class D, class S> inline D bit_copy(const S &source) { |
| + D destination; |
| + // This use of memcpy is safe: source and destination cannot overlap. |
| + memcpy(&destination, reinterpret_cast<const void *>(&source), |
| + sizeof(destination)); |
| + return destination; |
| +} |
| + |
| +class Utils { |
| +public: |
| + // Check whether an N-bit two's-complement representation can hold value. |
| + template <typename T> static inline bool IsInt(int N, T value) { |
| + assert((0 < N) && |
| + (static_cast<unsigned int>(N) < (CHAR_BIT * sizeof(value)))); |
|
Jim Stichnoth
2014/09/09 14:58:42
Same comment as above - is this CHAR_BIT, or the t
jvoung (off chromium)
2014/09/15 17:19:15
I think this is plain CHAR_BIT, since it's used al
|
| + T limit = static_cast<T>(1) << (N - 1); |
| + return (-limit <= value) && (value < limit); |
| + } |
| + |
| + template <typename T> static inline bool IsUint(int N, T value) { |
| + assert((0 < N) && |
| + (static_cast<unsigned int>(N) < (CHAR_BIT * sizeof(value)))); |
| + T limit = static_cast<T>(1) << N; |
| + return (0 <= value) && (value < limit); |
| + } |
| +}; |
| + |
| +} // end of namespace Ice |
| + |
| +#endif // SUBZERO_SRC_ICEUTILS_H |