22 significand = significand << 1;
23 exponent = exponent - 1;
36 bool need_boundary_deltas,
48 Bignum* numerator, Bignum* denominator,
49 Bignum* delta_minus, Bignum* delta_plus);
53 Bignum* delta_minus, Bignum* delta_plus,
55 Vector<char> buffer,
int* length);
57 static void BignumToFixed(
int requested_digits,
int* decimal_point,
58 Bignum* numerator, Bignum* denominator,
59 Vector<char>(buffer),
int* length);
65 Bignum* numerator, Bignum* denominator,
66 Vector<char>(buffer),
int* length);
74 bool is_even = (significand & 1) == 0;
90 *decimal_point = -requested_digits;
105 &numerator, &denominator,
106 &delta_minus, &delta_plus);
109 &numerator, &denominator,
110 &delta_minus, &delta_plus);
116 &delta_minus, &delta_plus,
117 is_even, buffer, length);
121 &numerator, &denominator,
126 &numerator, &denominator,
132 buffer[*length] =
'\0';
156 delta_plus = delta_minus;
165 buffer[(*length)++] = digit +
'0';
172 bool in_delta_room_minus;
173 bool in_delta_room_plus;
177 in_delta_room_minus =
Bignum::Less(*numerator, *delta_minus);
186 if (!in_delta_room_minus && !in_delta_room_plus) {
193 if (delta_minus != delta_plus) {
196 }
else if (in_delta_room_minus && in_delta_room_plus) {
202 }
else if (compare > 0) {
208 DCHECK(buffer[(*length) - 1] !=
'9');
209 buffer[(*length) - 1]++;
216 if ((buffer[(*length) - 1] -
'0') % 2 == 0) {
219 DCHECK(buffer[(*length) - 1] !=
'9');
220 buffer[(*length) - 1]++;
224 }
else if (in_delta_room_minus) {
233 DCHECK(buffer[(*length) -1] !=
'9');
234 buffer[(*length) - 1]++;
251 for (
int i = 0;
i < count - 1; ++
i) {
257 buffer[
i] = digit +
'0';
267 buffer[count - 1] = digit +
'0';
270 for (
int i = count - 1;
i > 0; --
i) {
271 if (buffer[
i] !=
'0' + 10)
break;
275 if (buffer[0] ==
'0' + 10) {
295 if (-(*decimal_point) > requested_digits) {
301 *decimal_point = -requested_digits;
304 }
else if (-(*decimal_point) == requested_digits) {
307 DCHECK(*decimal_point == -requested_digits);
325 int needed_digits = (*decimal_point) + requested_digits;
327 numerator, denominator,
370 const double k1Log10 = 0.30102999566398114;
373 const int kSignificandSize = 53;
375 std::ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10);
376 return static_cast<int>(estimate);
382 double v,
int estimated_power,
bool need_boundary_deltas,
386 DCHECK(estimated_power >= 0);
396 if (need_boundary_deltas) {
428 double v,
int estimated_power,
bool need_boundary_deltas,
445 if (need_boundary_deltas) {
478 double v,
int estimated_power,
bool need_boundary_deltas,
481 const uint64_t kMinimalNormalizedExponent =
489 Bignum* power_ten = numerator;
492 if (need_boundary_deltas) {
505 DCHECK(numerator == power_ten);
512 if (need_boundary_deltas) {
575 bool need_boundary_deltas,
580 if (
Double(v).Exponent() >= 0) {
582 v, estimated_power, need_boundary_deltas,
583 numerator, denominator, delta_minus, delta_plus);
584 }
else if (estimated_power >= 0) {
586 v, estimated_power, need_boundary_deltas,
587 numerator, denominator, delta_minus, delta_plus);
590 v, estimated_power, need_boundary_deltas,
591 numerator, denominator, delta_minus, delta_plus);
622 *decimal_point = estimated_power + 1;
624 *decimal_point = estimated_power;
void ShiftLeft(int shift_amount)
static const int kMaxSignificantBits
void AssignUInt16(uint16_t value)
void AssignBignum(const Bignum &other)
static bool Equal(const Bignum &a, const Bignum &b)
static bool LessEqual(const Bignum &a, const Bignum &b)
uint16_t DivideModuloIntBignum(const Bignum &other)
void AssignPowerUInt16(uint16_t base, int exponent)
static bool Less(const Bignum &a, const Bignum &b)
void MultiplyByUInt64(uint64_t factor)
void AssignUInt64(uint64_t value)
static int PlusCompare(const Bignum &a, const Bignum &b, const Bignum &c)
uint64_t AsUint64() const
static const uint64_t kSignificandMask
static const uint64_t kExponentMask
static const uint64_t kHiddenBit
uint64_t Significand() const
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long mode(MIPS only)") DEFINE_BOOL(enable_always_align_csp
#define DCHECK(condition)
#define V8_2PART_UINT64_C(a, b)
static void InitialScaledStartValues(double v, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static void BignumToFixed(int requested_digits, int *decimal_point, Bignum *numerator, Bignum *denominator, Vector< char >(buffer), int *length)
static void InitialScaledStartValuesNegativeExponentNegativePower(double v, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static void GenerateCountedDigits(int count, int *decimal_point, Bignum *numerator, Bignum *denominator, Vector< char >(buffer), int *length)
static void GenerateShortestDigits(Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus, bool is_even, Vector< char > buffer, int *length)
static void InitialScaledStartValuesPositiveExponent(double v, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
static int NormalizedExponent(uint64_t significand, int exponent)
static void InitialScaledStartValuesNegativeExponentPositivePower(double v, int estimated_power, bool need_boundary_deltas, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits, Vector< char > buffer, int *length, int *decimal_point)
static int EstimatePower(int exponent)
static void FixupMultiply10(int estimated_power, bool is_even, int *decimal_point, Bignum *numerator, Bignum *denominator, Bignum *delta_minus, Bignum *delta_plus)
Debugger support for the V8 JavaScript engine.