11b3afd1cab9087ca3c4e585d3da77d374d65c082mstarzinger@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 4cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 5cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org#ifndef V8_DOUBLE_H_ 6cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org#define V8_DOUBLE_H_ 7cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/diy-fp.h" 9cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 10cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgnamespace v8 { 11cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgnamespace internal { 12cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 13cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org// We assume that doubles and uint64_t have the same endianness. 14e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orginline uint64_t double_to_uint64(double d) { return bit_cast<uint64_t>(d); } 15e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orginline double uint64_to_double(uint64_t d64) { return bit_cast<double>(d64); } 16cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 17cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org// Helper functions for doubles. 18cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.orgclass Double { 19cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org public: 20cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org static const uint64_t kSignMask = V8_2PART_UINT64_C(0x80000000, 00000000); 21cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org static const uint64_t kExponentMask = V8_2PART_UINT64_C(0x7FF00000, 00000000); 22cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org static const uint64_t kSignificandMask = 23cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org V8_2PART_UINT64_C(0x000FFFFF, FFFFFFFF); 24cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org static const uint64_t kHiddenBit = V8_2PART_UINT64_C(0x00100000, 00000000); 25303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static const int kPhysicalSignificandSize = 52; // Excludes the hidden bit. 26303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static const int kSignificandSize = 53; 27cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 28cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org Double() : d64_(0) {} 29cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org explicit Double(double d) : d64_(double_to_uint64(d)) {} 30cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org explicit Double(uint64_t d64) : d64_(d64) {} 31303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org explicit Double(DiyFp diy_fp) 32303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org : d64_(DiyFpToUint64(diy_fp)) {} 33cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 3401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // The value encoded by this Double must be greater or equal to +0.0. 3501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // It must not be special (infinity, or NaN). 36cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org DiyFp AsDiyFp() const { 37e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Sign() > 0); 38e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(!IsSpecial()); 39cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return DiyFp(Significand(), Exponent()); 40cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 41cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 4201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // The value encoded by this Double must be strictly greater than 0. 43cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org DiyFp AsNormalizedDiyFp() const { 44e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value() > 0.0); 45cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t f = Significand(); 46cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org int e = Exponent(); 47cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 48cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // The current double could be a denormal. 49cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org while ((f & kHiddenBit) == 0) { 50cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org f <<= 1; 51cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org e--; 52cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 53303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org // Do the final shifts in one go. 54303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org f <<= DiyFp::kSignificandSize - kSignificandSize; 55303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org e -= DiyFp::kSignificandSize - kSignificandSize; 56cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return DiyFp(f, e); 57cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 58cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 59cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // Returns the double's bit as uint64. 60cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t AsUint64() const { 61cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return d64_; 62cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 63cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 6401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Returns the next greater double. Returns +infinity on input +infinity. 6501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org double NextDouble() const { 6601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (d64_ == kInfinity) return Double(kInfinity).value(); 6701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (Sign() < 0 && Significand() == 0) { 6801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // -0.0 6901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return 0.0; 7001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 7101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (Sign() < 0) { 7201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return Double(d64_ - 1).value(); 7301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } else { 7401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return Double(d64_ + 1).value(); 7501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 7601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 7701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 78cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org int Exponent() const { 79cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org if (IsDenormal()) return kDenormalExponent; 80cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 81cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t d64 = AsUint64(); 82303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org int biased_e = 83303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize); 84cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return biased_e - kExponentBias; 85cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 86cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 87cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t Significand() const { 88cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t d64 = AsUint64(); 89cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t significand = d64 & kSignificandMask; 90cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org if (!IsDenormal()) { 91cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return significand + kHiddenBit; 92cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } else { 93cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return significand; 94cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 95cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 96cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 97cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // Returns true if the double is a denormal. 98cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org bool IsDenormal() const { 99cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t d64 = AsUint64(); 100cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return (d64 & kExponentMask) == 0; 101cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 102cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 103cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // We consider denormals not to be special. 104cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // Hence only Infinity and NaN are special. 105cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org bool IsSpecial() const { 106cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t d64 = AsUint64(); 107cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return (d64 & kExponentMask) == kExponentMask; 108cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 109cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 110cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org bool IsInfinite() const { 111cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t d64 = AsUint64(); 112cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return ((d64 & kExponentMask) == kExponentMask) && 113cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org ((d64 & kSignificandMask) == 0); 114cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 115cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 116cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org int Sign() const { 117cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org uint64_t d64 = AsUint64(); 118cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org return (d64 & kSignMask) == 0? 1: -1; 119cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 120cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 12101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Precondition: the value encoded by this Double must be greater or equal 12201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // than +0.0. 12301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org DiyFp UpperBoundary() const { 124e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(Sign() > 0); 12501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return DiyFp(Significand() * 2 + 1, Exponent() - 1); 12601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 127cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 128cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // Returns the two boundaries of this. 129cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // The bigger boundary (m_plus) is normalized. The lower boundary has the same 130cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // exponent as m_plus. 13101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Precondition: the value encoded by this Double must be greater than 0. 132cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { 133e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(value() > 0.0); 134cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org DiyFp v = this->AsDiyFp(); 135cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org bool significand_is_zero = (v.f() == kHiddenBit); 136cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); 137cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org DiyFp m_minus; 138cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org if (significand_is_zero && v.e() != kDenormalExponent) { 139cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // The boundary is closer. Think of v = 1000e10 and v- = 9999e9. 140cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but 141cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // at a distance of 1e8. 142cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // The only exception is for the smallest normal: the largest denormal is 143cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // at the same distance as its successor. 144cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org // Note: denormals have the same exponent as the smallest normals. 145cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2); 146cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } else { 147cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1); 148cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 149cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e())); 150cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org m_minus.set_e(m_plus.e()); 151cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org *out_m_plus = m_plus; 152cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org *out_m_minus = m_minus; 153cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org } 154cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 155cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org double value() const { return uint64_to_double(d64_); } 156cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 157303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org // Returns the significand size for a given order of magnitude. 158303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org // If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude. 159303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org // This function returns the number of significant binary digits v will have 160303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org // once its encoded into a double. In almost all cases this is equal to 161303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org // kSignificandSize. The only exception are denormals. They start with leading 162303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org // zeroes and their effective significand-size is hence smaller. 163303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static int SignificandSizeForOrderOfMagnitude(int order) { 164303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (order >= (kDenormalExponent + kSignificandSize)) { 165303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return kSignificandSize; 166303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 167303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (order <= kDenormalExponent) return 0; 168303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return order - kDenormalExponent; 169303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 170303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 171cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org private: 172303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static const int kExponentBias = 0x3FF + kPhysicalSignificandSize; 173cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org static const int kDenormalExponent = -kExponentBias + 1; 174303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static const int kMaxExponent = 0x7FF - kExponentBias; 175303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static const uint64_t kInfinity = V8_2PART_UINT64_C(0x7FF00000, 00000000); 176cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 177303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org const uint64_t d64_; 178303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 179303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org static uint64_t DiyFpToUint64(DiyFp diy_fp) { 180303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org uint64_t significand = diy_fp.f(); 181303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org int exponent = diy_fp.e(); 182303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org while (significand > kHiddenBit + kSignificandMask) { 183303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org significand >>= 1; 184303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org exponent++; 185303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 186303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (exponent >= kMaxExponent) { 187303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return kInfinity; 188303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 189303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (exponent < kDenormalExponent) { 190303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return 0; 191303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 192303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) { 193303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org significand <<= 1; 194303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org exponent--; 195303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 196303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org uint64_t biased_exponent; 197303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) { 198303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org biased_exponent = 0; 199303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } else { 200303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org biased_exponent = static_cast<uint64_t>(exponent + kExponentBias); 201303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 202303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org return (significand & kSignificandMask) | 203303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org (biased_exponent << kPhysicalSignificandSize); 204303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org } 205cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org}; 206cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 207cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org} } // namespace v8::internal 208cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org 209cec079d8ed1f0920a0ea3dc9a3e81966013287c1whesse@chromium.org#endif // V8_DOUBLE_H_ 210