Chromium Code Reviews| Index: src/builtins/builtins-math.cc |
| diff --git a/src/builtins/builtins-math.cc b/src/builtins/builtins-math.cc |
| index f5249138c7a51f75955879e5a9b035e105910189..19dc52bd427f1dedf5369188d9c636515c191c4c 100644 |
| --- a/src/builtins/builtins-math.cc |
| +++ b/src/builtins/builtins-math.cc |
| @@ -2,6 +2,8 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +#include <limits> |
| + |
| #include "src/builtins/builtins-utils.h" |
| #include "src/builtins/builtins.h" |
| #include "src/code-factory.h" |
| @@ -494,8 +496,37 @@ TF_BUILTIN(MathTrunc, MathBuiltinsAssembler) { |
| MathRoundingOperation(&CodeStubAssembler::Float64Trunc); |
| } |
| -void Builtins::Generate_MathMax(MacroAssembler* masm) { |
| - Generate_MathMaxMin(masm, MathMaxMinKind::kMax); |
| +// ES6 section 20.2.2.24 Math.max ( value1, value2 , ...values ) |
| +TF_BUILTIN(MathMax, MathBuiltinsAssembler) { |
| + Label return_result(this), return_nan(this); |
| + |
| + Node* argc = Parameter(BuiltinDescriptor::kArgumentsCount); |
| + Node* context = Parameter(BuiltinDescriptor::kContext); |
| + |
| + CodeStubArguments arguments(this, ChangeInt32ToIntPtr(argc)); |
| + // From now on use word-size argc value. |
| + argc = arguments.GetLength(); |
| + |
| + // If no arguments are given, the result is -infinity. |
| + Variable result(this, MachineRepresentation::kFloat64); |
| + result.Bind(Float64Constant(-1.0 * V8_INFINITY)); |
| + GotoIf(IntPtrEqual(argc, IntPtrConstant(0)), &return_result); |
| + |
| + Node* nan = Float64Constant(std::numeric_limits<double>::quiet_NaN()); |
| + CodeStubAssembler::VariableList vars({&result}, zone()); |
| + arguments.ForEach(vars, |
| + [this, context, nan, &result, &return_nan](Node* arg) { |
| + Node* float_value = TruncateTaggedToFloat64(context, arg); |
| + GotoIf(Float64Equal(float_value, nan), &return_nan); |
|
vabr (Chromium)
2017/03/03 10:39:14
Interestingly, when I remove this jump, the perfor
|
| + result.Bind(Float64Max(result.value(), float_value)); |
| + }); |
| + |
| + Goto(&return_result); |
| + Bind(&return_result); |
| + { arguments.PopAndReturn(AllocateHeapNumberWithValue(result.value())); } |
| + |
| + Bind(&return_nan); |
| + { arguments.PopAndReturn(AllocateHeapNumberWithValue(nan)); } |
| } |
| void Builtins::Generate_MathMin(MacroAssembler* masm) { |