Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index b99806eedfe7106c1519e16a9f7960a58de8a441..d2d641560754a8ce56da283c5cf81a4f8556b441 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -2007,6 +2007,63 @@ BUILTIN(MathAtan) { |
return *isolate->factory()->NewHeapNumber(std::atan(x->Number())); |
} |
+// ES6 section 20.2.2.16 Math.floor ( x ) |
+void Builtins::Generate_MathFloor(compiler::CodeStubAssembler* assembler) { |
+ typedef compiler::CodeStubAssembler::Label Label; |
+ typedef compiler::Node Node; |
+ typedef compiler::CodeStubAssembler::Variable Variable; |
+ |
+ Node* context = assembler->Parameter(4); |
+ |
+ // We might need to loop once for ToNumber conversion. |
+ Variable var_x(assembler, MachineRepresentation::kTagged); |
+ Label loop(assembler, &var_x); |
+ var_x.Bind(assembler->Parameter(1)); |
+ assembler->Goto(&loop); |
+ assembler->Bind(&loop); |
+ { |
+ // Load the current {x} value. |
+ Node* x = var_x.value(); |
+ |
+ // Check if {x} is a Smi or a HeapObject. |
+ Label if_xissmi(assembler), if_xisnotsmi(assembler); |
+ assembler->Branch(assembler->WordIsSmi(x), &if_xissmi, &if_xisnotsmi); |
+ |
+ assembler->Bind(&if_xissmi); |
+ { |
+ // Nothing to do when {x} is a Smi. |
+ assembler->Return(x); |
+ } |
+ |
+ assembler->Bind(&if_xisnotsmi); |
+ { |
+ // Check if {x} is a HeapNumber. |
+ Label if_xisheapnumber(assembler), |
+ if_xisnotheapnumber(assembler, Label::kDeferred); |
+ assembler->Branch( |
+ assembler->WordEqual(assembler->LoadMap(x), |
+ assembler->HeapNumberMapConstant()), |
+ &if_xisheapnumber, &if_xisnotheapnumber); |
+ |
+ assembler->Bind(&if_xisheapnumber); |
+ { |
+ Node* x_value = assembler->LoadHeapNumberValue(x); |
+ Node* value = assembler->Float64Floor(x_value); |
+ Node* result = assembler->ChangeFloat64ToTagged(value); |
+ assembler->Return(result); |
+ } |
+ |
+ assembler->Bind(&if_xisnotheapnumber); |
+ { |
+ // Need to convert {x} to a Number first. |
+ Callable callable = |
+ CodeFactory::NonNumberToNumber(assembler->isolate()); |
+ var_x.Bind(assembler->CallStub(callable, context, x)); |
+ assembler->Goto(&loop); |
+ } |
+ } |
+ } |
+} |
// ES6 section 20.2.2.17 Math.fround ( x ) |
BUILTIN(MathFround) { |
@@ -2018,7 +2075,6 @@ BUILTIN(MathFround) { |
return *isolate->factory()->NewNumber(x32); |
} |
- |
// ES6 section 20.2.2.19 Math.imul ( x, y ) |
BUILTIN(MathImul) { |
HandleScope scope(isolate); |
@@ -2039,7 +2095,7 @@ void Builtins::Generate_MathSqrt(compiler::CodeStubAssembler* assembler) { |
Node* context = assembler->Parameter(4); |
Node* x_value = assembler->TruncateTaggedToFloat64(context, x); |
Node* value = assembler->Float64Sqrt(x_value); |
- Node* result = assembler->AllocateHeapNumberWithValue(value); |
+ Node* result = assembler->ChangeFloat64ToTagged(value); |
assembler->Return(result); |
} |