Index: src/compiler/code-stub-assembler.cc |
diff --git a/src/compiler/code-stub-assembler.cc b/src/compiler/code-stub-assembler.cc |
index f0ee4e58b957e4857b8426a57274603c70571870..2df4a910ae4b938890f302f60dd01067fd9f1bba 100644 |
--- a/src/compiler/code-stub-assembler.cc |
+++ b/src/compiler/code-stub-assembler.cc |
@@ -161,7 +161,7 @@ Node* CodeStubAssembler::SmiUntag(Node* value) { |
return raw_assembler_->WordSar(value, SmiShiftBitsConstant()); |
} |
-Node* CodeStubAssembler::SmiToInt32(Node* value) { |
+Node* CodeStubAssembler::SmiToWord32(Node* value) { |
Node* result = raw_assembler_->WordSar(value, SmiShiftBitsConstant()); |
if (raw_assembler_->machine()->Is64()) { |
result = raw_assembler_->TruncateInt64ToInt32(result); |
@@ -259,7 +259,7 @@ Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { |
IntPtrConstant(HeapNumber::kValueOffset - kHeapObjectTag), value); |
} |
-Node* CodeStubAssembler::TruncateHeapNumberValueToInt32(Node* object) { |
+Node* CodeStubAssembler::TruncateHeapNumberValueToWord32(Node* object) { |
Node* value = LoadHeapNumberValue(object); |
return raw_assembler_->TruncateFloat64ToInt32(TruncationMode::kJavaScript, |
value); |
@@ -537,6 +537,108 @@ Node* CodeStubAssembler::ChangeInt32ToTagged(Node* value) { |
return var_result.value(); |
} |
+Node* CodeStubAssembler::TruncateTaggedToFloat64(Node* context, Node* value) { |
+ // We might need to loop once due to ToNumber conversion. |
+ Variable var_value(this, MachineRepresentation::kTagged), |
+ var_result(this, MachineRepresentation::kFloat64); |
+ Label loop(this, &var_value), done_loop(this, &var_result); |
+ var_value.Bind(value); |
+ Goto(&loop); |
+ Bind(&loop); |
+ { |
+ // Load the current {value}. |
+ value = var_value.value(); |
+ |
+ // Check if the {value} is a Smi or a HeapObject. |
+ Label if_valueissmi(this), if_valueisnotsmi(this); |
+ Branch(WordIsSmi(value), &if_valueissmi, &if_valueisnotsmi); |
+ |
+ Bind(&if_valueissmi); |
+ { |
+ // Convert the Smi {value}. |
+ var_result.Bind(SmiToFloat64(value)); |
+ Goto(&done_loop); |
+ } |
+ |
+ Bind(&if_valueisnotsmi); |
+ { |
+ // Check if {value} is a HeapNumber. |
+ Label if_valueisheapnumber(this), |
+ if_valueisnotheapnumber(this, Label::kDeferred); |
+ Branch(WordEqual(LoadMap(value), HeapNumberMapConstant()), |
+ &if_valueisheapnumber, &if_valueisnotheapnumber); |
+ |
+ Bind(&if_valueisheapnumber); |
+ { |
+ // Load the floating point value. |
+ var_result.Bind(LoadHeapNumberValue(value)); |
+ Goto(&done_loop); |
+ } |
+ |
+ Bind(&if_valueisnotheapnumber); |
+ { |
+ // Convert the {value} to a Number first. |
+ Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
+ var_value.Bind(CallStub(callable, context, value)); |
+ Goto(&loop); |
+ } |
+ } |
+ } |
+ Bind(&done_loop); |
+ return var_result.value(); |
+} |
+ |
+Node* CodeStubAssembler::TruncateTaggedToWord32(Node* context, Node* value) { |
+ // We might need to loop once due to ToNumber conversion. |
+ Variable var_value(this, MachineRepresentation::kTagged), |
+ var_result(this, MachineRepresentation::kWord32); |
+ Label loop(this, &var_value), done_loop(this, &var_result); |
+ var_value.Bind(value); |
+ Goto(&loop); |
+ Bind(&loop); |
+ { |
+ // Load the current {value}. |
+ value = var_value.value(); |
+ |
+ // Check if the {value} is a Smi or a HeapObject. |
+ Label if_valueissmi(this), if_valueisnotsmi(this); |
+ Branch(WordIsSmi(value), &if_valueissmi, &if_valueisnotsmi); |
+ |
+ Bind(&if_valueissmi); |
+ { |
+ // Convert the Smi {value}. |
+ var_result.Bind(SmiToWord32(value)); |
+ Goto(&done_loop); |
+ } |
+ |
+ Bind(&if_valueisnotsmi); |
+ { |
+ // Check if {value} is a HeapNumber. |
+ Label if_valueisheapnumber(this), |
+ if_valueisnotheapnumber(this, Label::kDeferred); |
+ Branch(WordEqual(LoadMap(value), HeapNumberMapConstant()), |
+ &if_valueisheapnumber, &if_valueisnotheapnumber); |
+ |
+ Bind(&if_valueisheapnumber); |
+ { |
+ // Truncate the floating point value. |
+ var_result.Bind(TruncateHeapNumberValueToWord32(value)); |
+ Goto(&done_loop); |
+ } |
+ |
+ Bind(&if_valueisnotheapnumber); |
+ { |
+ // Convert the {value} to a Number first. |
+ Callable callable = CodeFactory::NonNumberToNumber(isolate()); |
+ var_value.Bind(CallStub(callable, context, value)); |
+ Goto(&loop); |
+ } |
+ } |
+ } |
+ Bind(&done_loop); |
+ return var_result.value(); |
+} |
+ |
void CodeStubAssembler::BranchIf(Node* condition, Label* if_true, |
Label* if_false) { |
Label if_condition_is_true(this), if_condition_is_false(this); |