// Copyright 2010 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#include "config.h"

#include "bignum.h"
#include "utils.h"
#include <wtf/ASCIICType.h>

namespace WTF {

namespace double_conversion {
    
    Bignum::Bignum()
    : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) {
        for (int i = 0; i < kBigitCapacity; ++i) {
            bigits_[i] = 0;
        }
    }
    
    
    template<typename S>
    static int BitSize(S value) {
        return 8 * sizeof(value);
    }
    
    // Guaranteed to lie in one Bigit.
    void Bignum::AssignUInt16(uint16_t value) {
        ASSERT(kBigitSize >= BitSize(value));
        Zero();
        if (value == 0) return;
        
        EnsureCapacity(1);
        bigits_[0] = value;
        used_digits_ = 1;
    }
    
    
    void Bignum::AssignUInt64(uint64_t value) {
        const int kUInt64Size = 64;
        
        Zero();
        if (value == 0) return;
        
        int needed_bigits = kUInt64Size / kBigitSize + 1;
        EnsureCapacity(needed_bigits);
        for (int i = 0; i < needed_bigits; ++i) {
            bigits_[i] = static_cast<Chunk>(value & kBigitMask);
            value = value >> kBigitSize;
        }
        used_digits_ = needed_bigits;
        Clamp();
    }
    
    
    void Bignum::AssignBignum(const Bignum& other) {
        exponent_ = other.exponent_;
        for (int i = 0; i < other.used_digits_; ++i) {
            bigits_[i] = other.bigits_[i];
        }
        // Clear the excess digits (if there were any).
        for (int i = other.used_digits_; i < used_digits_; ++i) {
            bigits_[i] = 0;
        }
        used_digits_ = other.used_digits_;
    }
    
    
    static uint64_t ReadUInt64(BufferReference<const char> buffer,
                               int from,
                               int digits_to_read) {
        uint64_t result = 0;
        for (int i = 0; i < digits_to_read; ++i) {
            int digit = buffer[from + i] - '0';
            ASSERT(0 <= digit && digit <= 9);
            result = result * 10 + digit;
        }
        return result;
    }
    
    
    void Bignum::AssignDecimalString(BufferReference<const char> value) {
        // 2^64 = 18446744073709551616 > 10^19
        const int kMaxUint64DecimalDigits = 19;
        Zero();
        int length = value.length();
        int pos = 0;
        // Let's just say that each digit needs 4 bits.
        while (length >= kMaxUint64DecimalDigits) {
            uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
            pos += kMaxUint64DecimalDigits;
            length -= kMaxUint64DecimalDigits;
            MultiplyByPowerOfTen(kMaxUint64DecimalDigits);
            AddUInt64(digits);
        }
        uint64_t digits = ReadUInt64(value, pos, length);
        MultiplyByPowerOfTen(length);
        AddUInt64(digits);
        Clamp();
    }
    
    
    void Bignum::AssignHexString(BufferReference<const char> value) {
        Zero();
        int length = value.length();
        
        int needed_bigits = length * 4 / kBigitSize + 1;
        EnsureCapacity(needed_bigits);
        int string_index = length - 1;
        for (int i = 0; i < needed_bigits - 1; ++i) {
            // These bigits are guaranteed to be "full".
            Chunk current_bigit = 0;
            for (int j = 0; j < kBigitSize / 4; j++) {
                current_bigit += toASCIIHexValue(value[string_index--]) << (j * 4);
            }
            bigits_[i] = current_bigit;
        }
        used_digits_ = needed_bigits - 1;
        
        Chunk most_significant_bigit = 0;  // Could be = 0;
        for (int j = 0; j <= string_index; ++j) {
            most_significant_bigit <<= 4;
            most_significant_bigit += toASCIIHexValue(value[j]);
        }
        if (most_significant_bigit != 0) {
            bigits_[used_digits_] = most_significant_bigit;
            used_digits_++;
        }
        Clamp();
    }
    
    
    void Bignum::AddUInt64(uint64_t operand) {
        if (operand == 0) return;
        Bignum other;
        other.AssignUInt64(operand);
        AddBignum(other);
    }
    
    
    void Bignum::AddBignum(const Bignum& other) {
        ASSERT(IsClamped());
        ASSERT(other.IsClamped());
        
        // If this has a greater exponent than other append zero-bigits to this.
        // After this call exponent_ <= other.exponent_.
        Align(other);
        
        // There are two possibilities:
        //   aaaaaaaaaaa 0000  (where the 0s represent a's exponent)
        //     bbbbb 00000000
        //   ----------------
        //   ccccccccccc 0000
        // or
        //    aaaaaaaaaa 0000
        //  bbbbbbbbb 0000000
        //  -----------------
        //  cccccccccccc 0000
        // In both cases we might need a carry bigit.
        
        EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_);
        Chunk carry = 0;
        int bigit_pos = other.exponent_ - exponent_;
        ASSERT(bigit_pos >= 0);
        for (int i = 0; i < other.used_digits_; ++i) {
            Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry;
            bigits_[bigit_pos] = sum & kBigitMask;
            carry = sum >> kBigitSize;
            bigit_pos++;
        }
        
        while (carry != 0) {
            Chunk sum = bigits_[bigit_pos] + carry;
            bigits_[bigit_pos] = sum & kBigitMask;
            carry = sum >> kBigitSize;
            bigit_pos++;
        }
        used_digits_ = Max(bigit_pos, used_digits_);
        ASSERT(IsClamped());
    }
    
    
    void Bignum::SubtractBignum(const Bignum& other) {
        ASSERT(IsClamped());
        ASSERT(other.IsClamped());
        // We require this to be bigger than other.
        ASSERT(LessEqual(other, *this));
        
        Align(other);
        
        int offset = other.exponent_ - exponent_;
        Chunk borrow = 0;
        int i;
        for (i = 0; i < other.used_digits_; ++i) {
            ASSERT((borrow == 0) || (borrow == 1));
            Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow;
            bigits_[i + offset] = difference & kBigitMask;
            borrow = difference >> (kChunkSize - 1);
        }
        while (borrow != 0) {
            Chunk difference = bigits_[i + offset] - borrow;
            bigits_[i + offset] = difference & kBigitMask;
            borrow = difference >> (kChunkSize - 1);
            ++i;
        }
        Clamp();
    }
    
    
    void Bignum::ShiftLeft(int shift_amount) {
        if (used_digits_ == 0) return;
        exponent_ += shift_amount / kBigitSize;
        int local_shift = shift_amount % kBigitSize;
        EnsureCapacity(used_digits_ + 1);
        BigitsShiftLeft(local_shift);
    }
    
    
    void Bignum::MultiplyByUInt32(uint32_t factor) {
        if (factor == 1) return;
        if (factor == 0) {
            Zero();
            return;
        }
        if (used_digits_ == 0) return;
        
        // The product of a bigit with the factor is of size kBigitSize + 32.
        // Assert that this number + 1 (for the carry) fits into double chunk.
        ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
        DoubleChunk carry = 0;
        for (int i = 0; i < used_digits_; ++i) {
            DoubleChunk product = static_cast<DoubleChunk>(factor) * bigits_[i] + carry;
            bigits_[i] = static_cast<Chunk>(product & kBigitMask);
            carry = (product >> kBigitSize);
        }
        while (carry != 0) {
            EnsureCapacity(used_digits_ + 1);
            bigits_[used_digits_] = static_cast<Chunk>(carry & kBigitMask);
            used_digits_++;
            carry >>= kBigitSize;
        }
    }
    
    
    void Bignum::MultiplyByUInt64(uint64_t factor) {
        if (factor == 1) return;
        if (factor == 0) {
            Zero();
            return;
        }
        ASSERT(kBigitSize < 32);
        uint64_t carry = 0;
        uint64_t low = factor & 0xFFFFFFFF;
        uint64_t high = factor >> 32;
        for (int i = 0; i < used_digits_; ++i) {
            uint64_t product_low = low * bigits_[i];
            uint64_t product_high = high * bigits_[i];
            uint64_t tmp = (carry & kBigitMask) + product_low;
            bigits_[i] = static_cast<Chunk>(tmp & kBigitMask);
            carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
            (product_high << (32 - kBigitSize));
        }
        while (carry != 0) {
            EnsureCapacity(used_digits_ + 1);
            bigits_[used_digits_] = static_cast<Chunk>(carry & kBigitMask);
            used_digits_++;
            carry >>= kBigitSize;
        }
    }
    
    
    void Bignum::MultiplyByPowerOfTen(int exponent) {
        const uint64_t kFive27 = UINT64_2PART_C(0x6765c793, fa10079d);
        const uint16_t kFive1 = 5;
        const uint16_t kFive2 = kFive1 * 5;
        const uint16_t kFive3 = kFive2 * 5;
        const uint16_t kFive4 = kFive3 * 5;
        const uint16_t kFive5 = kFive4 * 5;
        const uint16_t kFive6 = kFive5 * 5;
        const uint32_t kFive7 = kFive6 * 5;
        const uint32_t kFive8 = kFive7 * 5;
        const uint32_t kFive9 = kFive8 * 5;
        const uint32_t kFive10 = kFive9 * 5;
        const uint32_t kFive11 = kFive10 * 5;
        const uint32_t kFive12 = kFive11 * 5;
        const uint32_t kFive13 = kFive12 * 5;
        const uint32_t kFive1_to_12[] =
        { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6,
            kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 };
        
        ASSERT(exponent >= 0);
        if (exponent == 0) return;
        if (used_digits_ == 0) return;
        
        // We shift by exponent at the end just before returning.
        int remaining_exponent = exponent;
        while (remaining_exponent >= 27) {
            MultiplyByUInt64(kFive27);
            remaining_exponent -= 27;
        }
        while (remaining_exponent >= 13) {
            MultiplyByUInt32(kFive13);
            remaining_exponent -= 13;
        }
        if (remaining_exponent > 0) {
            MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]);
        }
        ShiftLeft(exponent);
    }
    
    
    void Bignum::Square() {
        ASSERT(IsClamped());
        int product_length = 2 * used_digits_;
        EnsureCapacity(product_length);
        
        // Comba multiplication: compute each column separately.
        // Example: r = a2a1a0 * b2b1b0.
        //    r =  1    * a0b0 +
        //        10    * (a1b0 + a0b1) +
        //        100   * (a2b0 + a1b1 + a0b2) +
        //        1000  * (a2b1 + a1b2) +
        //        10000 * a2b2
        //
        // In the worst case we have to accumulate nb-digits products of digit*digit.
        //
        // Assert that the additional number of bits in a DoubleChunk are enough to
        // sum up used_digits of Bigit*Bigit.
        if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) {
            UNIMPLEMENTED();
        }
        DoubleChunk accumulator = 0;
        // First shift the digits so we don't overwrite them.
        int copy_offset = used_digits_;
        for (int i = 0; i < used_digits_; ++i) {
            bigits_[copy_offset + i] = bigits_[i];
        }
        // We have two loops to avoid some 'if's in the loop.
        for (int i = 0; i < used_digits_; ++i) {
            // Process temporary digit i with power i.
            // The sum of the two indices must be equal to i.
            int bigit_index1 = i;
            int bigit_index2 = 0;
            // Sum all of the sub-products.
            while (bigit_index1 >= 0) {
                Chunk chunk1 = bigits_[copy_offset + bigit_index1];
                Chunk chunk2 = bigits_[copy_offset + bigit_index2];
                accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
                bigit_index1--;
                bigit_index2++;
            }
            bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
            accumulator >>= kBigitSize;
        }
        for (int i = used_digits_; i < product_length; ++i) {
            int bigit_index1 = used_digits_ - 1;
            int bigit_index2 = i - bigit_index1;
            // Invariant: sum of both indices is again equal to i.
            // Inner loop runs 0 times on last iteration, emptying accumulator.
            while (bigit_index2 < used_digits_) {
                Chunk chunk1 = bigits_[copy_offset + bigit_index1];
                Chunk chunk2 = bigits_[copy_offset + bigit_index2];
                accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
                bigit_index1--;
                bigit_index2++;
            }
            // The overwritten bigits_[i] will never be read in further loop iterations,
            // because bigit_index1 and bigit_index2 are always greater
            // than i - used_digits_.
            bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
            accumulator >>= kBigitSize;
        }
        // Since the result was guaranteed to lie inside the number the
        // accumulator must be 0 now.
        ASSERT(accumulator == 0);
        
        // Don't forget to update the used_digits and the exponent.
        used_digits_ = product_length;
        exponent_ *= 2;
        Clamp();
    }
    
    
    void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
        ASSERT(base != 0);
        ASSERT(power_exponent >= 0);
        if (power_exponent == 0) {
            AssignUInt16(1);
            return;
        }
        Zero();
        int shifts = 0;
        // We expect base to be in range 2-32, and most often to be 10.
        // It does not make much sense to implement different algorithms for counting
        // the bits.
        while ((base & 1) == 0) {
            base >>= 1;
            shifts++;
        }
        int bit_size = 0;
        int tmp_base = base;
        while (tmp_base != 0) {
            tmp_base >>= 1;
            bit_size++;
        }
        int final_size = bit_size * power_exponent;
        // 1 extra bigit for the shifting, and one for rounded final_size.
        EnsureCapacity(final_size / kBigitSize + 2);
        
        // Left to Right exponentiation.
        int mask = 1;
        while (power_exponent >= mask) mask <<= 1;
        
        // The mask is now pointing to the bit above the most significant 1-bit of
        // power_exponent.
        // Get rid of first 1-bit;
        mask >>= 2;
        uint64_t this_value = base;
        
        bool delayed_multipliciation = false;
        const uint64_t max_32bits = 0xFFFFFFFF;
        while (mask != 0 && this_value <= max_32bits) {
            this_value = this_value * this_value;
            // Verify that there is enough space in this_value to perform the
            // multiplication.  The first bit_size bits must be 0.
            if ((power_exponent & mask) != 0) {
                uint64_t base_bits_mask =
                ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
                bool high_bits_zero = (this_value & base_bits_mask) == 0;
                if (high_bits_zero) {
                    this_value *= base;
                } else {
                    delayed_multipliciation = true;
                }
            }
            mask >>= 1;
        }
        AssignUInt64(this_value);
        if (delayed_multipliciation) {
            MultiplyByUInt32(base);
        }
        
        // Now do the same thing as a bignum.
        while (mask != 0) {
            Square();
            if ((power_exponent & mask) != 0) {
                MultiplyByUInt32(base);
            }
            mask >>= 1;
        }
        
        // And finally add the saved shifts.
        ShiftLeft(shifts * power_exponent);
    }
    
    
    // Precondition: this/other < 16bit.
    uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
        ASSERT(IsClamped());
        ASSERT(other.IsClamped());
        ASSERT(other.used_digits_ > 0);
        
        // Easy case: if we have less digits than the divisor than the result is 0.
        // Note: this handles the case where this == 0, too.
        if (BigitLength() < other.BigitLength()) {
            return 0;
        }
        
        Align(other);
        
        uint16_t result = 0;
        
        // Start by removing multiples of 'other' until both numbers have the same
        // number of digits.
        while (BigitLength() > other.BigitLength()) {
            // This naive approach is extremely inefficient if the this divided other
            // might be big. This function is implemented for doubleToString where
            // the result should be small (less than 10).
            ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16));
            // Remove the multiples of the first digit.
            // Example this = 23 and other equals 9. -> Remove 2 multiples.
            result += bigits_[used_digits_ - 1];
            SubtractTimes(other, bigits_[used_digits_ - 1]);
        }
        
        ASSERT(BigitLength() == other.BigitLength());
        
        // Both bignums are at the same length now.
        // Since other has more than 0 digits we know that the access to
        // bigits_[used_digits_ - 1] is safe.
        Chunk this_bigit = bigits_[used_digits_ - 1];
        Chunk other_bigit = other.bigits_[other.used_digits_ - 1];
        
        if (other.used_digits_ == 1) {
            // Shortcut for easy (and common) case.
            int quotient = this_bigit / other_bigit;
            bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient;
            result += quotient;
            Clamp();
            return result;
        }
        
        int division_estimate = this_bigit / (other_bigit + 1);
        result += division_estimate;
        SubtractTimes(other, division_estimate);
        
        if (other_bigit * (division_estimate + 1) > this_bigit) {
            // No need to even try to subtract. Even if other's remaining digits were 0
            // another subtraction would be too much.
            return result;
        }
        
        while (LessEqual(other, *this)) {
            SubtractBignum(other);
            result++;
        }
        return result;
    }
    
    
    template<typename S>
    static int SizeInHexChars(S number) {
        ASSERT(number > 0);
        int result = 0;
        while (number != 0) {
            number >>= 4;
            result++;
        }
        return result;
    }
    
    
    static char HexCharOfValue(int value) {
        ASSERT(0 <= value && value <= 16);
        if (value < 10) return value + '0';
        return value - 10 + 'A';
    }
    
    
    bool Bignum::ToHexString(char* buffer, int buffer_size) const {
        ASSERT(IsClamped());
        // Each bigit must be printable as separate hex-character.
        ASSERT(kBigitSize % 4 == 0);
        const int kHexCharsPerBigit = kBigitSize / 4;
        
        if (used_digits_ == 0) {
            if (buffer_size < 2) return false;
            buffer[0] = '0';
            buffer[1] = '\0';
            return true;
        }
        // We add 1 for the terminating '\0' character.
        int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit +
        SizeInHexChars(bigits_[used_digits_ - 1]) + 1;
        if (needed_chars > buffer_size) return false;
        int string_index = needed_chars - 1;
        buffer[string_index--] = '\0';
        for (int i = 0; i < exponent_; ++i) {
            for (int j = 0; j < kHexCharsPerBigit; ++j) {
                buffer[string_index--] = '0';
            }
        }
        for (int i = 0; i < used_digits_ - 1; ++i) {
            Chunk current_bigit = bigits_[i];
            for (int j = 0; j < kHexCharsPerBigit; ++j) {
                buffer[string_index--] = HexCharOfValue(current_bigit & 0xF);
                current_bigit >>= 4;
            }
        }
        // And finally the last bigit.
        Chunk most_significant_bigit = bigits_[used_digits_ - 1];
        while (most_significant_bigit != 0) {
            buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF);
            most_significant_bigit >>= 4;
        }
        return true;
    }
    
    
    Bignum::Chunk Bignum::BigitAt(int index) const {
        if (index >= BigitLength()) return 0;
        if (index < exponent_) return 0;
        return bigits_[index - exponent_];
    }
    
    
    int Bignum::Compare(const Bignum& a, const Bignum& b) {
        ASSERT(a.IsClamped());
        ASSERT(b.IsClamped());
        int bigit_length_a = a.BigitLength();
        int bigit_length_b = b.BigitLength();
        if (bigit_length_a < bigit_length_b) return -1;
        if (bigit_length_a > bigit_length_b) return +1;
        for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) {
            Chunk bigit_a = a.BigitAt(i);
            Chunk bigit_b = b.BigitAt(i);
            if (bigit_a < bigit_b) return -1;
            if (bigit_a > bigit_b) return +1;
            // Otherwise they are equal up to this digit. Try the next digit.
        }
        return 0;
    }
    
    
    int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
        ASSERT(a.IsClamped());
        ASSERT(b.IsClamped());
        ASSERT(c.IsClamped());
        if (a.BigitLength() < b.BigitLength()) {
            return PlusCompare(b, a, c);
        }
        if (a.BigitLength() + 1 < c.BigitLength()) return -1;
        if (a.BigitLength() > c.BigitLength()) return +1;
        // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than
        // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one
        // of 'a'.
        if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) {
            return -1;
        }
        
        Chunk borrow = 0;
        // Starting at min_exponent all digits are == 0. So no need to compare them.
        int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_);
        for (int i = c.BigitLength() - 1; i >= min_exponent; --i) {
            Chunk chunk_a = a.BigitAt(i);
            Chunk chunk_b = b.BigitAt(i);
            Chunk chunk_c = c.BigitAt(i);
            Chunk sum = chunk_a + chunk_b;
            if (sum > chunk_c + borrow) {
                return +1;
            } else {
                borrow = chunk_c + borrow - sum;
                if (borrow > 1) return -1;
                borrow <<= kBigitSize;
            }
        }
        if (borrow == 0) return 0;
        return -1;
    }
    
    
    void Bignum::Clamp() {
        while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) {
            used_digits_--;
        }
        if (used_digits_ == 0) {
            // Zero.
            exponent_ = 0;
        }
    }
    
    
    bool Bignum::IsClamped() const {
        return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0;
    }
    
    
    void Bignum::Zero() {
        for (int i = 0; i < used_digits_; ++i) {
            bigits_[i] = 0;
        }
        used_digits_ = 0;
        exponent_ = 0;
    }
    
    
    void Bignum::Align(const Bignum& other) {
        if (exponent_ > other.exponent_) {
            // If "X" represents a "hidden" digit (by the exponent) then we are in the
            // following case (a == this, b == other):
            // a:  aaaaaaXXXX   or a:   aaaaaXXX
            // b:     bbbbbbX      b: bbbbbbbbXX
            // We replace some of the hidden digits (X) of a with 0 digits.
            // a:  aaaaaa000X   or a:   aaaaa0XX
            int zero_digits = exponent_ - other.exponent_;
            EnsureCapacity(used_digits_ + zero_digits);
            for (int i = used_digits_ - 1; i >= 0; --i) {
                bigits_[i + zero_digits] = bigits_[i];
            }
            for (int i = 0; i < zero_digits; ++i) {
                bigits_[i] = 0;
            }
            used_digits_ += zero_digits;
            exponent_ -= zero_digits;
            ASSERT(used_digits_ >= 0);
            ASSERT(exponent_ >= 0);
        }
    }
    
    
    void Bignum::BigitsShiftLeft(int shift_amount) {
        ASSERT(shift_amount < kBigitSize);
        ASSERT(shift_amount >= 0);
        Chunk carry = 0;
        for (int i = 0; i < used_digits_; ++i) {
            Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount);
            bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask;
            carry = new_carry;
        }
        if (carry != 0) {
            bigits_[used_digits_] = carry;
            used_digits_++;
        }
    }
    
    
    void Bignum::SubtractTimes(const Bignum& other, int factor) {
#ifndef NDEBUG
        Bignum a, b;
        a.AssignBignum(*this);
        b.AssignBignum(other);
        b.MultiplyByUInt32(factor);
        a.SubtractBignum(b);
#endif
        ASSERT(exponent_ <= other.exponent_);
        if (factor < 3) {
            for (int i = 0; i < factor; ++i) {
                SubtractBignum(other);
            }
            return;
        }
        Chunk borrow = 0;
        int exponent_diff = other.exponent_ - exponent_;
        for (int i = 0; i < other.used_digits_; ++i) {
            DoubleChunk product = static_cast<DoubleChunk>(factor) * other.bigits_[i];
            DoubleChunk remove = borrow + product;
            Chunk difference =
                bigits_[i + exponent_diff] - static_cast<Chunk>(remove & kBigitMask);
            bigits_[i + exponent_diff] = difference & kBigitMask;
            borrow = static_cast<Chunk>((difference >> (kChunkSize - 1)) +
                                        (remove >> kBigitSize));
        }
        for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) {
            if (borrow == 0) return;
            Chunk difference = bigits_[i] - borrow;
            bigits_[i] = difference & kBigitMask;
            borrow = difference >> (kChunkSize - 1);
        }
        Clamp();
        ASSERT(Bignum::Equal(a, *this));
    }
    
    
}  // namespace double_conversion

} // namespace WTF
