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 |