diff --git a/lib/Support/raw_ostream.cpp b/lib/Support/raw_ostream.cpp index 4c3348d8309..e7e4ad3f906 100644 --- a/lib/Support/raw_ostream.cpp +++ b/lib/Support/raw_ostream.cpp @@ -123,24 +123,19 @@ raw_ostream &raw_ostream::operator<<(long N) { } raw_ostream &raw_ostream::operator<<(unsigned long long N) { - // Handle simple case when value fits in long already. + // Output using 32-bit div/mod when possible. if (N == static_cast(N)) return this->operator<<(static_cast(N)); - // Otherwise divide into at two or three 10**9 chunks and write out using - // long div/mod, this is substantially faster on a 32-bit system. - unsigned long Top = 0, Mid = 0, Bot = N % 1000000000; - N /= 1000000000; - if (N > 1000000000) { - Mid = N % 1000000000; - Top = N / 1000000000; - } else - Mid = N; - - if (Top) - this->operator<<(static_cast(Top)); - this->operator<<(static_cast(Mid)); - return this->operator<<(static_cast(Bot)); + char NumberBuffer[20]; + char *EndPtr = NumberBuffer+sizeof(NumberBuffer); + char *CurPtr = EndPtr; + + while (N) { + *--CurPtr = '0' + char(N % 10); + N /= 10; + } + return write(CurPtr, EndPtr-CurPtr); } raw_ostream &raw_ostream::operator<<(long long N) {