diff options
Diffstat (limited to 'include/llvm/Support/MathExtras.h')
-rw-r--r-- | include/llvm/Support/MathExtras.h | 50 |
1 files changed, 29 insertions, 21 deletions
diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index fa12416..9c5f32c 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -32,35 +32,43 @@ inline uint32_t Lo_32(uint64_t Value) { return static_cast<uint32_t>(Value); } -/// is?Type - these functions produce optimal testing for integer data types. -inline bool isInt8 (int64_t Value) { - return static_cast<int8_t>(Value) == Value; -} -inline bool isUInt8 (int64_t Value) { - return static_cast<uint8_t>(Value) == Value; -} -inline bool isInt16 (int64_t Value) { - return static_cast<int16_t>(Value) == Value; -} -inline bool isUInt16(int64_t Value) { - return static_cast<uint16_t>(Value) == Value; -} -inline bool isInt32 (int64_t Value) { - return static_cast<int32_t>(Value) == Value; -} -inline bool isUInt32(int64_t Value) { - return static_cast<uint32_t>(Value) == Value; -} - +/// isInt - Checks if an integer fits into the given bit width. template<unsigned N> inline bool isInt(int64_t x) { return N >= 64 || (-(INT64_C(1)<<(N-1)) <= x && x < (INT64_C(1)<<(N-1))); } +// Template specializations to get better code for common cases. +template<> +inline bool isInt<8>(int64_t x) { + return static_cast<int8_t>(x) == x; +} +template<> +inline bool isInt<16>(int64_t x) { + return static_cast<int16_t>(x) == x; +} +template<> +inline bool isInt<32>(int64_t x) { + return static_cast<int32_t>(x) == x; +} +/// isUInt - Checks if an unsigned integer fits into the given bit width. template<unsigned N> -inline bool isUint(uint64_t x) { +inline bool isUInt(uint64_t x) { return N >= 64 || x < (UINT64_C(1)<<N); } +// Template specializations to get better code for common cases. +template<> +inline bool isUInt<8>(uint64_t x) { + return static_cast<uint8_t>(x) == x; +} +template<> +inline bool isUInt<16>(uint64_t x) { + return static_cast<uint16_t>(x) == x; +} +template<> +inline bool isUInt<32>(uint64_t x) { + return static_cast<uint32_t>(x) == x; +} /// isMask_32 - This function returns true if the argument is a sequence of ones /// starting at the least significant bit with the remainder zero (32 bit |