12 #include "third_party/fdlibm/fdlibm.h"
18 #define RUNTIME_UNARY_MATH(Name, name) \
19 RUNTIME_FUNCTION(Runtime_Math##Name) { \
20 HandleScope scope(isolate); \
21 DCHECK(args.length() == 1); \
22 isolate->counters()->math_##name()->Increment(); \
23 CONVERT_DOUBLE_ARG_CHECKED(x, 0); \
24 return *isolate->factory()->NewHeapNumber(std::name(x)); \
31 #undef RUNTIME_UNARY_MATH
36 DCHECK(args.length() == 1);
39 integer = (integer >> 32) & 0xFFFFFFFFu;
40 return *isolate->factory()->NewNumber(
static_cast<int32_t>(integer));
46 DCHECK(args.length() == 1);
48 return *isolate->factory()->NewNumber(
55 DCHECK(args.length() == 2);
58 uint64_t result = (
static_cast<uint64_t
>(
hi) << 32) |
lo;
65 DCHECK(args.length() == 1);
67 Factory* factory = isolate->factory();
69 int n = fdlibm::rempio2(x,
y);
76 return *factory->NewJSArrayWithElements(array);
85 DCHECK(args.length() == 2);
86 isolate->counters()->math_atan2()->Increment();
91 if (std::isinf(x) && std::isinf(
y)) {
96 int multiplier = (x < 0) ? -1 : 1;
97 if (
y < 0) multiplier *= 3;
100 result = std::atan2(x,
y);
102 return *isolate->factory()->NewNumber(result);
108 DCHECK(args.length() == 1);
109 isolate->counters()->math_exp()->Increment();
113 return *isolate->factory()->NewNumber(
fast_exp(x));
119 DCHECK(args.length() == 1);
120 isolate->counters()->math_floor()->Increment();
123 return *isolate->factory()->NewNumber(
Floor(x));
131 DCHECK(args.length() == 2);
132 isolate->counters()->math_pow()->Increment();
138 if (args[1]->IsSmi()) {
139 int y = args.smi_at(1);
145 if (std::isnan(result))
return isolate->heap()->nan_value();
146 return *isolate->factory()->NewNumber(result);
154 DCHECK(args.length() == 2);
155 isolate->counters()->math_pow()->Increment();
163 if (std::isnan(result))
return isolate->heap()->nan_value();
164 return *isolate->factory()->NewNumber(result);
171 DCHECK(args.length() == 1);
173 isolate->counters()->math_round()->Increment();
175 if (!input->IsHeapNumber()) {
182 double value = number->value();
183 int exponent = number->get_exponent();
184 int sign = number->get_sign();
188 if (
sign)
return isolate->heap()->minus_zero_value();
201 if (exponent >= 52) {
205 if (
sign && value >= -0.5)
return isolate->heap()->minus_zero_value();
208 return *isolate->factory()->NewNumber(
Floor(value + 0.5));
214 DCHECK(args.length() == 1);
215 isolate->counters()->math_sqrt()->Increment();
218 return *isolate->factory()->NewNumber(
fast_sqrt(x));
224 DCHECK(args.length() == 1);
228 return *isolate->factory()->NewNumber(xf);
233 SealHandleScope shs(isolate);
234 return __RT_impl_Runtime_MathPowSlow(args, isolate);
239 SealHandleScope shs(isolate);
240 DCHECK(args.length() == 1);
242 if (!obj->IsHeapNumber())
return isolate->heap()->false_value();
A JavaScript value representing a 32-bit unsigned integer.
static Handle< T > cast(Handle< S > that)
static Smi * FromInt(int value)
#define DCHECK(condition)
double fast_exp(double input)
double power_double_int(double x, int y)
double fast_sqrt(double input)
double power_helper(double x, double y)
void lazily_initialize_fast_exp()
double power_double_double(double x, double y)
float DoubleToFloat32(double x)
static bool IsMinusZero(double value)
static const double kPiDividedBy4
double uint64_to_double(uint64_t d64)
uint64_t double_to_uint64(double d)
Debugger support for the V8 JavaScript engine.
#define RUNTIME_UNARY_MATH(Name, name)
#define CONVERT_ARG_CHECKED(Type, name, index)
#define CONVERT_NUMBER_CHECKED(type, name, Type, obj)
#define CONVERT_DOUBLE_ARG_CHECKED(name, index)
#define CONVERT_NUMBER_ARG_HANDLE_CHECKED(name, index)