diff options
author | Jeff Cohen <jeffc@jolt-lang.org> | 2007-03-20 20:42:36 +0000 |
---|---|---|
committer | Jeff Cohen <jeffc@jolt-lang.org> | 2007-03-20 20:42:36 +0000 |
commit | e06855e684bd526ece733f27393128c2faee1413 (patch) | |
tree | 8ffaab1997b46b1e6f3edd985c2fa7340e05e585 /llvm/lib/Support | |
parent | b39885d23d4ffac314cad61270982d1695682fc5 (diff) | |
download | bcm5719-llvm-e06855e684bd526ece733f27393128c2faee1413.tar.gz bcm5719-llvm-e06855e684bd526ece733f27393128c2faee1413.zip |
Fix (and simplify) 48-bit byte swap.
Get pos/neg infinity the correct way.
llvm-svn: 35223
Diffstat (limited to 'llvm/lib/Support')
-rw-r--r-- | llvm/lib/Support/APInt.cpp | 17 |
1 files changed, 8 insertions, 9 deletions
diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index 19eade9e5c0..0bfc95bde3f 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -18,6 +18,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/MathExtras.h" #include <math.h> +#include <limits> #include <cstring> #include <cstdlib> #ifndef NDEBUG @@ -762,17 +763,15 @@ uint32_t APInt::countPopulation() const { APInt APInt::byteSwap() const { assert(BitWidth >= 16 && BitWidth % 16 == 0 && "Cannot byteswap!"); if (BitWidth == 16) - return APInt(BitWidth, ByteSwap_16(VAL)); + return APInt(BitWidth, ByteSwap_16(uint16_t(VAL))); else if (BitWidth == 32) - return APInt(BitWidth, ByteSwap_32(VAL)); + return APInt(BitWidth, ByteSwap_32(uint32_t(VAL))); else if (BitWidth == 48) { - uint64_t Tmp1 = ((VAL >> 32) << 16) | (VAL & 0xFFFF); + uint32_t Tmp1 = uint32_t(VAL >> 16); Tmp1 = ByteSwap_32(Tmp1); - uint64_t Tmp2 = (VAL >> 16) & 0xFFFF; + uint16_t Tmp2 = uint16_t(VAL); Tmp2 = ByteSwap_16(Tmp2); - return - APInt(BitWidth, - (Tmp1 & 0xff) | ((Tmp1<<16) & 0xffff00000000ULL) | (Tmp2 << 16)); + return APInt(BitWidth, (uint64_t(Tmp2) << 32) | Tmp1); } else if (BitWidth == 64) return APInt(BitWidth, ByteSwap_64(VAL)); else { @@ -869,9 +868,9 @@ double APInt::roundToDouble(bool isSigned) const { // Return infinity for exponent overflow if (exp > 1023) { if (!isSigned || !isNeg) - return double(1.0E300 * 1.0E300); // positive infinity + return std::numeric_limits<double>::infinity(); else - return double(-1.0E300 * 1.0E300); // negative infinity + return -std::numeric_limits<double>::infinity(); } exp += 1023; // Increment for 1023 bias |