Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 48 uint32_t part = static_cast<uint32_t>(accumulator & kMask32); | 48 uint32_t part = static_cast<uint32_t>(accumulator & kMask32); |
| 49 accumulator >>= 32; | 49 accumulator >>= 32; |
| 50 accumulator = accumulator + (low_bits_ >> 32) * multiplicand; | 50 accumulator = accumulator + (low_bits_ >> 32) * multiplicand; |
| 51 low_bits_ = (accumulator << 32) + part; | 51 low_bits_ = (accumulator << 32) + part; |
| 52 accumulator >>= 32; | 52 accumulator >>= 32; |
| 53 accumulator = accumulator + (high_bits_ & kMask32) * multiplicand; | 53 accumulator = accumulator + (high_bits_ & kMask32) * multiplicand; |
| 54 part = static_cast<uint32_t>(accumulator & kMask32); | 54 part = static_cast<uint32_t>(accumulator & kMask32); |
| 55 accumulator >>= 32; | 55 accumulator >>= 32; |
| 56 accumulator = accumulator + (high_bits_ >> 32) * multiplicand; | 56 accumulator = accumulator + (high_bits_ >> 32) * multiplicand; |
| 57 high_bits_ = (accumulator << 32) + part; | 57 high_bits_ = (accumulator << 32) + part; |
| 58 ASSERT((accumulator >> 32) == 0); | 58 DCHECK_EQ((accumulator >> 32), 0u); |
| 59 } | 59 } |
| 60 | 60 |
| 61 void Shift(int shift_amount) { | 61 void Shift(int shift_amount) { |
| 62 ASSERT(-64 <= shift_amount && shift_amount <= 64); | 62 DCHECK_LE(-64, shift_amount); |
| 63 DCHECK_LE(shift_amount, 64); | |
| 63 if (shift_amount == 0) { | 64 if (shift_amount == 0) { |
| 64 return; | 65 return; |
| 65 } else if (shift_amount == -64) { | 66 } else if (shift_amount == -64) { |
| 66 high_bits_ = low_bits_; | 67 high_bits_ = low_bits_; |
| 67 low_bits_ = 0; | 68 low_bits_ = 0; |
| 68 } else if (shift_amount == 64) { | 69 } else if (shift_amount == 64) { |
| 69 low_bits_ = high_bits_; | 70 low_bits_ = high_bits_; |
| 70 high_bits_ = 0; | 71 high_bits_ = 0; |
| 71 } else if (shift_amount <= 0) { | 72 } else if (shift_amount <= 0) { |
| 72 high_bits_ <<= -shift_amount; | 73 high_bits_ <<= -shift_amount; |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 225 // 0 <= fractionals * 2^exponent < 1 | 226 // 0 <= fractionals * 2^exponent < 1 |
| 226 // The buffer holds the result. | 227 // The buffer holds the result. |
| 227 // The function will round its result. During the rounding-process digits no t | 228 // The function will round its result. During the rounding-process digits no t |
| 228 // generated by this function might be updated, and the decimal-point variab le | 229 // generated by this function might be updated, and the decimal-point variab le |
| 229 // might be updated. If this function generates the digits 99 and the buffer | 230 // might be updated. If this function generates the digits 99 and the buffer |
| 230 // already contained "199" (thus yielding a buffer of "19999") then a | 231 // already contained "199" (thus yielding a buffer of "19999") then a |
| 231 // rounding-up will change the contents of the buffer to "20000". | 232 // rounding-up will change the contents of the buffer to "20000". |
| 232 static void FillFractionals(uint64_t fractionals, int exponent, | 233 static void FillFractionals(uint64_t fractionals, int exponent, |
| 233 int fractional_count, Vector<char> buffer, | 234 int fractional_count, Vector<char> buffer, |
| 234 int* length, int* decimal_point) { | 235 int* length, int* decimal_point) { |
| 235 ASSERT(-128 <= exponent && exponent <= 0); | 236 DCHECK_LE(-128, exponent); |
| 237 DCHECK_LE(exponent, 0); | |
| 236 // 'fractionals' is a fixed-point number, with binary point at bit | 238 // 'fractionals' is a fixed-point number, with binary point at bit |
| 237 // (-exponent). Inside the function the non-converted remainder of fract ionals | 239 // (-exponent). Inside the function the non-converted remainder of fract ionals |
| 238 // is a fixed-point number, with binary point at bit 'point'. | 240 // is a fixed-point number, with binary point at bit 'point'. |
| 239 if (-exponent <= 64) { | 241 if (-exponent <= 64) { |
| 240 // One 64 bit number is sufficient. | 242 // One 64 bit number is sufficient. |
| 241 ASSERT(fractionals >> 56 == 0); | 243 ASSERT(fractionals >> 56 == 0); |
| 242 int point = -exponent; | 244 int point = -exponent; |
| 243 for (int i = 0; i < fractional_count; ++i) { | 245 for (int i = 0; i < fractional_count; ++i) { |
| 244 if (fractionals == 0) break; | 246 if (fractionals == 0) break; |
| 245 // Instead of multiplying by 10 we multiply by 5 and adjust the point | 247 // Instead of multiplying by 10 we multiply by 5 and adjust the point |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 257 char digit = static_cast<char>(fractionals >> point); | 259 char digit = static_cast<char>(fractionals >> point); |
| 258 buffer[*length] = '0' + digit; | 260 buffer[*length] = '0' + digit; |
| 259 (*length)++; | 261 (*length)++; |
| 260 fractionals -= static_cast<uint64_t>(digit) << point; | 262 fractionals -= static_cast<uint64_t>(digit) << point; |
| 261 } | 263 } |
| 262 // If the first bit after the point is set we have to round up. | 264 // If the first bit after the point is set we have to round up. |
| 263 if (((fractionals >> (point - 1)) & 1) == 1) { | 265 if (((fractionals >> (point - 1)) & 1) == 1) { |
| 264 RoundUp(buffer, length, decimal_point); | 266 RoundUp(buffer, length, decimal_point); |
| 265 } | 267 } |
| 266 } else { // We need 128 bits. | 268 } else { // We need 128 bits. |
| 267 ASSERT(64 < -exponent && -exponent <= 128); | 269 DCHECK_LT(64, -exponent); |
| 270 DCHECK_LE(-exponent, 128); | |
| 268 UInt128 fractionals128 = UInt128(fractionals, 0); | 271 UInt128 fractionals128 = UInt128(fractionals, 0); |
| 269 fractionals128.Shift(-exponent - 64); | 272 fractionals128.Shift(-exponent - 64); |
| 270 int point = 128; | 273 int point = 128; |
| 271 for (int i = 0; i < fractional_count; ++i) { | 274 for (int i = 0; i < fractional_count; ++i) { |
| 272 if (fractionals128.IsZero()) break; | 275 if (fractionals128.IsZero()) break; |
| 273 // As before: instead of multiplying by 10 we multiply by 5 and adjust the | 276 // As before: instead of multiplying by 10 we multiply by 5 and adjust the |
| 274 // point location. | 277 // point location. |
| 275 // This multiplication will not overflow for the same reasons as before. | 278 // This multiplication will not overflow for the same reasons as before. |
| 276 fractionals128.Multiply(5); | 279 fractionals128.Multiply(5); |
| 277 point--; | 280 point--; |
| 278 char digit = static_cast<char>(fractionals128.DivModPowerOf2(poi nt)); | 281 char digit = static_cast<char>(fractionals128.DivModPowerOf2(poi nt)); |
| 279 buffer[*length] = '0' + digit; | 282 buffer[*length] = '0' + digit; |
| 280 (*length)++; | 283 (*length)++; |
| 284 | |
|
tkent
2017/05/08 14:31:04
This change is unnecessary.
Hwanseung Lee
2017/05/08 23:31:13
Done.
| |
| 281 } | 285 } |
| 282 if (fractionals128.BitAt(point - 1) == 1) { | 286 if (fractionals128.BitAt(point - 1) == 1) { |
| 283 RoundUp(buffer, length, decimal_point); | 287 RoundUp(buffer, length, decimal_point); |
| 284 } | 288 } |
| 285 } | 289 } |
| 286 } | 290 } |
| 287 | 291 |
| 288 | 292 |
| 289 // Removes leading and trailing zeros. | 293 // Removes leading and trailing zeros. |
| 290 // If leading zeros are removed then the decimal point position is adjusted. | 294 // If leading zeros are removed then the decimal point position is adjusted. |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 375 FillDigits64(integrals, buffer, length); | 379 FillDigits64(integrals, buffer, length); |
| 376 } else { | 380 } else { |
| 377 FillDigits32(static_cast<uint32_t>(integrals), buffer, length); | 381 FillDigits32(static_cast<uint32_t>(integrals), buffer, length); |
| 378 } | 382 } |
| 379 *decimal_point = *length; | 383 *decimal_point = *length; |
| 380 FillFractionals(fractionals, exponent, fractional_count, | 384 FillFractionals(fractionals, exponent, fractional_count, |
| 381 buffer, length, decimal_point); | 385 buffer, length, decimal_point); |
| 382 } else if (exponent < -128) { | 386 } else if (exponent < -128) { |
| 383 // This configuration (with at most 20 digits) means that all digits must be | 387 // This configuration (with at most 20 digits) means that all digits must be |
| 384 // 0. | 388 // 0. |
| 385 ASSERT(fractional_count <= 20); | 389 DCHECK_LE(fractional_count, 20); |
| 386 buffer[0] = '\0'; | 390 buffer[0] = '\0'; |
| 387 *length = 0; | 391 *length = 0; |
| 388 *decimal_point = -fractional_count; | 392 *decimal_point = -fractional_count; |
| 389 } else { | 393 } else { |
| 390 *decimal_point = 0; | 394 *decimal_point = 0; |
| 391 FillFractionals(significand, exponent, fractional_count, | 395 FillFractionals(significand, exponent, fractional_count, |
| 392 buffer, length, decimal_point); | 396 buffer, length, decimal_point); |
| 393 } | 397 } |
| 394 TrimZeros(buffer, length, decimal_point); | 398 TrimZeros(buffer, length, decimal_point); |
| 395 buffer[*length] = '\0'; | 399 buffer[*length] = '\0'; |
| 396 if ((*length) == 0) { | 400 if ((*length) == 0) { |
| 397 // The string is empty and the decimal_point thus has no importance. Mimick | 401 // The string is empty and the decimal_point thus has no importance. Mimick |
| 398 // Gay's dtoa and and set it to -fractional_count. | 402 // Gay's dtoa and and set it to -fractional_count. |
| 399 *decimal_point = -fractional_count; | 403 *decimal_point = -fractional_count; |
| 400 } | 404 } |
| 401 return true; | 405 return true; |
| 402 } | 406 } |
| 403 | 407 |
| 404 } // namespace double_conversion | 408 } // namespace double_conversion |
| 405 | 409 |
| 406 } // namespace WTF | 410 } // namespace WTF |
| OLD | NEW |