// 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"

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] = (uint32_t)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(Vector<const char> buffer,
                               int from,
                               int digits_to_read) {
        uint64_t result = 0;
        for (int i = from; i < from + digits_to_read; ++i) {
            int digit = buffer[i] - '0';
            ASSERT(0 <= digit && digit <= 9);
            result = result * 10 + digit;
        }
        return result;
    }


    void Bignum::AssignDecimalString(Vector<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();
    }


    static int HexCharValue(char c) {
        if ('0' <= c && c <= '9') return c - '0';
        if ('a' <= c && c <= 'f') return 10 + c - 'a';
        if ('A' <= c && c <= 'F') return 10 + c - 'A';
        UNREACHABLE();
        return 0;  // To make compiler happy.
    }


    void Bignum::AssignHexString(Vector<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 += HexCharValue(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 += HexCharValue(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_] = (uint32_t)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] = (uint32_t)tmp & kBigitMask;
            carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
            (product_high << (32 - kBigitSize));
        }
        while (carry != 0) {
            EnsureCapacity(used_digits_ + 1);
            bigits_[used_digits_] = (uint32_t)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) {
        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] - ((uint32_t)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);
            ++i;
        }
        Clamp();
    }


}  // namespace double_conversion

} // namespace WTF
