Changes in directory llvm/lib/Support:
APInt.cpp updated: 1.34 -> 1.35 --- Log message: 1. Fix a bug in fromString for the <= 64bits case 2. Fix shl when shiftAmount == BitWidth. --- Diffs of the changes: (+30 -18) APInt.cpp | 48 ++++++++++++++++++++++++++++++------------------ 1 files changed, 30 insertions(+), 18 deletions(-) Index: llvm/lib/Support/APInt.cpp diff -u llvm/lib/Support/APInt.cpp:1.34 llvm/lib/Support/APInt.cpp:1.35 --- llvm/lib/Support/APInt.cpp:1.34 Sat Feb 24 04:01:42 2007 +++ llvm/lib/Support/APInt.cpp Sat Feb 24 14:19:37 2007 @@ -945,24 +945,33 @@ /// Left-shift this APInt by shiftAmt. /// @brief Left-shift function. APInt APInt::shl(uint32_t shiftAmt) const { + assert(shiftAmt <= BitWidth && "Invalid shift amount"); APInt API(*this); - if (API.isSingleWord()) - API.VAL <<= shiftAmt; - else if (shiftAmt >= API.BitWidth) - memset(API.pVal, 0, API.getNumWords() * APINT_WORD_SIZE); - else { - if (uint32_t offset = shiftAmt / APINT_BITS_PER_WORD) { - for (uint32_t i = API.getNumWords() - 1; i > offset - 1; --i) - API.pVal[i] = API.pVal[i-offset]; - memset(API.pVal, 0, offset * APINT_WORD_SIZE); - } - shiftAmt %= APINT_BITS_PER_WORD; - uint32_t i; - for (i = API.getNumWords() - 1; i > 0; --i) - API.pVal[i] = (API.pVal[i] << shiftAmt) | - (API.pVal[i-1] >> (APINT_BITS_PER_WORD - shiftAmt)); - API.pVal[i] <<= shiftAmt; - } + if (API.isSingleWord()) { + if (shiftAmt == BitWidth) + API.VAL = 0; + else + API.VAL <<= shiftAmt; + API.clearUnusedBits(); + return API; + } + + if (shiftAmt == BitWidth) { + memset(API.pVal, 0, getNumWords() * APINT_WORD_SIZE); + return API; + } + + if (uint32_t offset = shiftAmt / APINT_BITS_PER_WORD) { + for (uint32_t i = API.getNumWords() - 1; i > offset - 1; --i) + API.pVal[i] = API.pVal[i-offset]; + memset(API.pVal, 0, offset * APINT_WORD_SIZE); + } + shiftAmt %= APINT_BITS_PER_WORD; + uint32_t i; + for (i = API.getNumWords() - 1; i > 0; --i) + API.pVal[i] = (API.pVal[i] << shiftAmt) | + (API.pVal[i-1] >> (APINT_BITS_PER_WORD - shiftAmt)); + API.pVal[i] <<= shiftAmt; API.clearUnusedBits(); return API; } @@ -1423,7 +1432,10 @@ *this *= apradix; // Add in the digit we just interpreted - apdigit.pVal[0] = digit; + if (apdigit.isSingleWord()) + apdigit.VAL = digit; + else + apdigit.pVal[0] = digit; *this += apdigit; } } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits