30 accumulator = accumulator + (
low_bits_ >> 32) * multiplicand;
36 accumulator = accumulator + (
high_bits_ >> 32) * multiplicand;
38 DCHECK((accumulator >> 32) == 0);
42 DCHECK(-64 <= shift_amount && shift_amount <= 64);
43 if (shift_amount == 0) {
45 }
else if (shift_amount == -64) {
48 }
else if (shift_amount == 64) {
51 }
else if (shift_amount <= 0) {
66 int result =
static_cast<int>(
high_bits_ >> (power - 64));
67 high_bits_ -=
static_cast<uint64_t
>(result) << (power - 64);
71 uint64_t part_high =
high_bits_ << (64 - power);
72 int result =
static_cast<int>(part_low + part_high);
85 return static_cast<int>(
high_bits_ >> (position - 64)) & 1;
87 return static_cast<int>(
low_bits_ >> position) & 1;
92 static const uint64_t
kMask32 = 0xFFFFFFFF;
104 for (
int i = requested_length - 1;
i >= 0; --
i) {
105 buffer[(*length) +
i] =
'0' + number % 10;
108 *length += requested_length;
113 int number_length = 0;
115 while (number != 0) {
116 int digit = number % 10;
118 buffer[(*length) + number_length] =
'0' + digit;
123 int j = *length + number_length - 1;
125 char tmp = buffer[
i];
126 buffer[
i] = buffer[j];
131 *length += number_length;
162 }
else if (part1 != 0) {
181 buffer[(*length) - 1]++;
182 for (
int i = (*length) - 1;
i > 0; --
i) {
183 if (buffer[
i] !=
'0' + 10) {
194 if (buffer[0] ==
'0' + 10) {
214 int* length,
int* decimal_point) {
215 DCHECK(-128 <= exponent && exponent <= 0);
219 if (-exponent <= 64) {
221 DCHECK(fractionals >> 56 == 0);
222 int point = -exponent;
223 for (
int i = 0;
i < fractional_count; ++
i) {
224 if (fractionals == 0)
break;
237 int digit =
static_cast<int>(fractionals >> point);
238 buffer[*length] =
'0' + digit;
240 fractionals -=
static_cast<uint64_t
>(digit) << point;
243 if (((fractionals >> (point - 1)) & 1) == 1) {
244 RoundUp(buffer, length, decimal_point);
247 DCHECK(64 < -exponent && -exponent <= 128);
249 fractionals128.
Shift(-exponent - 64);
251 for (
int i = 0;
i < fractional_count; ++
i) {
252 if (fractionals128.
IsZero())
break;
259 buffer[*length] =
'0' + digit;
262 if (fractionals128.
BitAt(point - 1) == 1) {
263 RoundUp(buffer, length, decimal_point);
272 while (*length > 0 && buffer[(*length) - 1] ==
'0') {
275 int first_non_zero = 0;
276 while (first_non_zero < *length && buffer[first_non_zero] ==
'0') {
279 if (first_non_zero != 0) {
280 for (
int i = first_non_zero;
i < *length; ++
i) {
281 buffer[
i - first_non_zero] = buffer[
i];
283 *length -= first_non_zero;
284 *decimal_point -= first_non_zero;
290 int fractional_count,
293 int* decimal_point) {
302 if (exponent > 20)
return false;
303 if (fractional_count > 20)
return false;
318 uint64_t divisor = kFive17;
319 int divisor_power = 17;
320 uint64_t dividend = significand;
332 if (exponent > divisor_power) {
334 dividend <<= exponent - divisor_power;
335 quotient =
static_cast<uint32_t>(dividend / divisor);
336 remainder = (dividend % divisor) << divisor_power;
338 divisor <<= divisor_power - exponent;
339 quotient =
static_cast<uint32_t>(dividend / divisor);
340 remainder = (dividend % divisor) << exponent;
344 *decimal_point = *length;
345 }
else if (exponent >= 0) {
347 significand <<= exponent;
349 *decimal_point = *length;
352 uint64_t integrals = significand >> -exponent;
353 uint64_t fractionals = significand - (integrals << -exponent);
359 *decimal_point = *length;
361 buffer, length, decimal_point);
362 }
else if (exponent < -128) {
365 DCHECK(fractional_count <= 20);
368 *decimal_point = -fractional_count;
372 buffer, length, decimal_point);
374 TrimZeros(buffer, length, decimal_point);
375 buffer[*length] =
'\0';
376 if ((*length) == 0) {
379 *decimal_point = -fractional_count;
uint64_t Significand() const
static const uint64_t kMask32
void Multiply(uint32_t multiplicand)
void Shift(int shift_amount)
int DivModPowerOf2(int power)
UInt128(uint64_t high, uint64_t low)
#define DCHECK(condition)
#define V8_2PART_UINT64_C(a, b)
static void FillDigits64(uint64_t number, Vector< char > buffer, int *length)
bool FastFixedDtoa(double v, int fractional_count, Vector< char > buffer, int *length, int *decimal_point)
static void FillDigits64FixedLength(uint64_t number, int requested_length, Vector< char > buffer, int *length)
static void FillDigits32(uint32_t number, Vector< char > buffer, int *length)
static void FillDigits32FixedLength(uint32_t number, int requested_length, Vector< char > buffer, int *length)
static const uint32_t kTen7
static void RoundUp(Vector< char > buffer, int *length, int *decimal_point)
const uint32_t kMaxUInt32
static const int kDoubleSignificandSize
static void FillFractionals(uint64_t fractionals, int exponent, int fractional_count, Vector< char > buffer, int *length, int *decimal_point)
static void TrimZeros(Vector< char > buffer, int *length, int *decimal_point)
Debugger support for the V8 JavaScript engine.