5#ifndef V8_NUMBERS_CONVERSIONS_INL_H_
6#define V8_NUMBERS_CONVERSIONS_INL_H_
41 const double k2Pow52 = 4503599627370496.0;
49#ifndef V8_TARGET_BIG_ENDIAN
50 void* mantissa_ptr =
reinterpret_cast<void*
>(&
x);
111 using limits = std::numeric_limits<float>;
112 if (
x > limits::max()) {
119 static const double kRoundingThreshold = 3.4028235677973362e+38;
120 if (
x <= kRoundingThreshold)
return limits::max();
121 return limits::infinity();
123 if (
x < limits::lowest()) {
125 static const double kRoundingThreshold = -3.4028235677973362e+38;
126 if (
x >= kRoundingThreshold)
return limits::lowest();
127 return -limits::infinity();
129 return static_cast<float>(
x);
135 if (std::isnan(
x) ||
x == 0.0)
return 0;
136 if (!std::isfinite(
x))
return x;
138 return ((
x > 0) ? std::floor(
x) : std::ceil(
x)) + 0.0;
143 if ((std::isfinite(
x)) && (
x <= INT_MAX) && (
x >= INT_MIN)) {
145 return static_cast<int32_t
>(
x);
148 int exponent = d.Exponent();
152 bits = d.Significand() >> -exponent;
154 if (exponent > 31)
return 0;
158 bits = (d.Significand() << exponent) & 0xFFFFFFFFul;
160 return static_cast<int32_t
>(d.Sign() *
static_cast<int64_t
>(bits));
169 return static_cast<int64_t
>(
x);
172 int exponent = d.Exponent();
176 bits = d.Significand() >> -exponent;
178 if (exponent > 63)
return 0;
179 bits = (d.Significand() << exponent);
180 int64_t bits_int64 =
static_cast<int64_t
>(bits);
181 if (bits_int64 == std::numeric_limits<int64_t>::min()) {
185 return static_cast<int64_t
>(d.Sign() *
static_cast<int64_t
>(bits));
194 *smi_int_value =
FastD2I(value);
215 const double k2Pow52 = 4503599627370496.0;
216 const uint32_t kValidTopBits = 0x43300000;
217 const uint64_t kBottomBitMask = 0x0000'0000'FFFF'FFFF;
222 double shifted_value = value + k2Pow52;
237 if ((
result >> 32) == kValidTopBits) {
238 *uint32_value =
result & kBottomBitMask;
257 if (value <= 0)
return 0;
262 if (!(value >= 1))
return 0;
263 uint32_t max = std::numeric_limits<uint32_t>::max();
264 if (value < max)
return static_cast<uint32_t
>(
value);
271 if (std::isnan(d))
return 0;
272 if (d >=
static_cast<double>(std::numeric_limits<int64_t>::max())) {
273 return std::numeric_limits<int64_t>::max();
275 if (d <=
static_cast<double>(std::numeric_limits<int64_t>::min())) {
276 return std::numeric_limits<int64_t>::min();
278 return static_cast<int64_t
>(d);
284 if (value <= 0)
return 0;
289 if (!(value >= 1))
return 0;
290 uint64_t max = std::numeric_limits<uint64_t>::max();
291 if (value < max)
return static_cast<uint64_t
>(
value);
301 std::numeric_limits<size_t>::max());
313 double maxSize =
static_cast<double>(std::numeric_limits<size_t>::max());
314 if (value >= 0 && value < maxSize) {
315 size_t size =
static_cast<size_t>(
value);
316#ifdef V8_ENABLE_SANDBOX
317 if (size > kMaxSafeBufferSizeForSandbox) {
static constexpr int kSignificandSize
static constexpr int ToInt(const Tagged< Object > object)
static bool constexpr IsValid(T value)
static constexpr int kMinValue
static constexpr int kMaxValue
ZoneVector< RpoNumber > & result
V8_INLINE Dest bit_cast(Source const &source)
bool IsUint32Double(double value)
uint32_t DoubleToUint32(double x)
constexpr double kMaxSafeInteger
constexpr uint64_t kFP64SignMask
uint32_t PositiveNumberToUint32(Tagged< Object > number)
bool DoubleToUint32IfEqualToSelf(double value, uint32_t *uint32_value)
bool DoubleToSmiInteger(double value, int *smi_int_value)
bool IsSmiDouble(double value)
unsigned int FastD2UI(double x)
int64_t NumberToInt64(Tagged< Object > number)
double DoubleToInteger(double x)
bool IsInt32Double(double value)
V8_INLINE constexpr bool IsSmi(TaggedImpl< kRefType, StorageType > obj)
constexpr int kFP16MantissaBits
constexpr uint64_t kFP64Infinity
constexpr uint64_t kFP16InfinityAndNaNInfimum
uint32_t NumberToUint32(Tagged< Object > number)
int32_t NumberToInt32(Tagged< Object > number)
constexpr uint16_t kFP16Infinity
int32_t DoubleToInt32(double x)
constexpr uint64_t kFP16DenormalThreshold
float DoubleToFloat32(double x)
uint64_t DoubleToWebIDLUint64(double x)
uint16_t DoubleToFloat16(double value)
double FastUI2D(unsigned x)
static bool IsMinusZero(double value)
constexpr int kFP64MantissaBits
uint64_t PositiveNumberToUint64(Tagged< Object > number)
int64_t DoubleToWebIDLInt64(double x)
constexpr double kMinSafeInteger
constexpr uint16_t kFP16qNaN
size_t NumberToSize(Tagged< Object > number)
constexpr uint64_t kFP64To16RebiasExponentAndRound
bool TryNumberToSize(Tagged< Object > number, size_t *result)
constexpr uint32_t kMaxUInt32
constexpr uint64_t kFP64To16DenormalMagic
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK(condition)