| Index: src/IceUtils.h
|
| diff --git a/src/IceUtils.h b/src/IceUtils.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ffeb792e80617ed7793d4f1d1695b86058fca705
|
| --- /dev/null
|
| +++ b/src/IceUtils.h
|
| @@ -0,0 +1,59 @@
|
| +//===- 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 {
|
| +
|
| +// 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))));
|
| + 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);
|
| + }
|
| +
|
| + template <typename T> static inline bool WouldOverflowAdd(T X, T Y) {
|
| + return ((X > 0 && Y > 0 && (X > std::numeric_limits<T>::max() - Y)) ||
|
| + (X < 0 && Y < 0 && (X < std::numeric_limits<T>::min() - Y)));
|
| + }
|
| +};
|
| +
|
| +} // end of namespace Ice
|
| +
|
| +#endif // SUBZERO_SRC_ICEUTILS_H
|
|
|