| Index: src/runtime.cc
|
| diff --git a/src/runtime.cc b/src/runtime.cc
|
| index 5fe69c26b3e0a44af6761a6ff3f5c60ae86b00eb..c0c87a457d3ad870d701f6747d23a13e644fd741 100644
|
| --- a/src/runtime.cc
|
| +++ b/src/runtime.cc
|
| @@ -7665,6 +7665,35 @@ RUNTIME_UNARY_MATH(log)
|
| #undef RUNTIME_UNARY_MATH
|
|
|
|
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_DoubleHi) {
|
| + SealHandleScope shs(isolate);
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| + uint64_t integer = double_to_uint64(x);
|
| + integer = (integer >> 32) & 0xFFFFFFFFu;
|
| + return isolate->heap()->NumberFromDouble(static_cast<int32_t>(integer));
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_DoubleLo) {
|
| + SealHandleScope shs(isolate);
|
| + ASSERT(args.length() == 1);
|
| + CONVERT_DOUBLE_ARG_CHECKED(x, 0);
|
| + return isolate->heap()->NumberFromDouble(
|
| + static_cast<int32_t>(double_to_uint64(x) & 0xFFFFFFFFu));
|
| +}
|
| +
|
| +
|
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_ConstructDouble) {
|
| + SealHandleScope shs(isolate);
|
| + ASSERT(args.length() == 2);
|
| + CONVERT_NUMBER_CHECKED(uint32_t, hi, Uint32, args[0]);
|
| + CONVERT_NUMBER_CHECKED(uint32_t, lo, Uint32, args[1]);
|
| + uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo;
|
| + return isolate->heap()->AllocateHeapNumber(uint64_to_double(result));
|
| +}
|
| +
|
| +
|
| // Cube root approximation, refer to: http://metamerist.com/cbrt/cbrt.htm
|
| // Using initial approximation adapted from Kahan's cbrt and 4 iterations
|
| // of Newton's method.
|
|
|