Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index 84d8d98c8eace1582719037fc752c9338b2dd7e6..5e9a503d4f4d217919fc9fa99f0bc39d59176a59 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -1608,6 +1608,162 @@ void BitwiseXorStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
assembler->Return(result); |
} |
+void IncStub::GenerateAssembly(compiler::CodeStubAssembler* assembler) const { |
epertoso
2016/04/19 13:08:11
After http://crrev.com/1893383002, you should use
rmcilroy
2016/04/19 14:31:45
Done.
|
+ typedef compiler::CodeStubAssembler::Label Label; |
+ typedef compiler::Node Node; |
+ typedef compiler::CodeStubAssembler::Variable Variable; |
+ |
+ Node* value = assembler->Parameter(0); |
+ Node* context = assembler->Parameter(1); |
+ |
+ // Shared entry for floating point increment. |
+ Label do_finc(assembler); |
+ Variable var_finc_value(assembler, MachineRepresentation::kFloat64); |
+ |
+ // Input has been converted to a number using ToNumber, so it must be a |
+ // Smi or a HeapNumber. |
+ Label if_issmi(assembler), if_isnotsmi(assembler); |
+ assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); |
+ |
+ assembler->Bind(&if_issmi); |
+ { |
+ // Try fast Smi addition first. |
+ Node* one = assembler->SmiConstant(Smi::FromInt(1)); |
+ Node* pair = assembler->SmiAddWithOverflow(value, one); |
+ Node* overflow = assembler->Projection(1, pair); |
+ |
+ // Check if the Smi additon overflowed. |
+ Label if_overflow(assembler), if_notoverflow(assembler); |
+ assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
+ |
+ assembler->Bind(&if_notoverflow); |
+ assembler->Return(assembler->Projection(0, pair)); |
+ |
+ assembler->Bind(&if_overflow); |
+ { |
+ var_finc_value.Bind(assembler->SmiToFloat64(value)); |
+ assembler->Goto(&do_finc); |
+ } |
+ } |
+ |
+ assembler->Bind(&if_isnotsmi); |
+ { |
+ // Value must be a heap number if we reach this point. |
+ if (FLAG_debug_code) { |
+ // Assert that the value is a HeapNumber. |
+ Node* value_map = |
+ assembler->LoadObjectField(value, HeapObject::kMapOffset); |
epertoso
2016/04/19 13:08:10
LoadMap
rmcilroy
2016/04/19 14:31:45
Done.
|
+ |
+ Label if_valueisnumber(assembler), |
+ if_valuenotnumber(assembler, Label::kDeferred); |
+ Node* number_map = assembler->HeapNumberMapConstant(); |
+ assembler->Branch(assembler->WordEqual(value_map, number_map), |
+ &if_valueisnumber, &if_valuenotnumber); |
+ |
+ assembler->Bind(&if_valuenotnumber); |
+ { |
+ Node* abort_id = assembler->SmiConstant( |
+ Smi::FromInt(BailoutReason::kExpectedHeapNumber)); |
+ assembler->CallRuntime(Runtime::kAbort, context, abort_id); |
+ assembler->Goto(&if_valueisnumber); // Won't actually be reached. |
+ } |
+ |
+ assembler->Bind(&if_valueisnumber); |
+ } |
+ |
+ // Load the heap number value |
+ var_finc_value.Bind(assembler->LoadHeapNumberValue(value)); |
+ assembler->Goto(&do_finc); |
+ } |
+ |
+ assembler->Bind(&do_finc); |
+ { |
+ Node* finc_value = var_finc_value.value(); |
+ Node* one = assembler->Float64Constant(1.0); |
+ Node* finc_result = assembler->Float64Add(finc_value, one); |
+ Node* result = assembler->ChangeFloat64ToTagged(finc_result); |
+ assembler->Return(result); |
+ } |
+} |
+ |
+void DecStub::GenerateAssembly(compiler::CodeStubAssembler* assembler) const { |
+ typedef compiler::CodeStubAssembler::Label Label; |
+ typedef compiler::Node Node; |
+ typedef compiler::CodeStubAssembler::Variable Variable; |
+ |
+ Node* value = assembler->Parameter(0); |
+ Node* context = assembler->Parameter(1); |
+ |
+ // Shared entry for floating point increment. |
+ Label do_fdec(assembler); |
+ Variable var_fdec_value(assembler, MachineRepresentation::kFloat64); |
+ |
+ // Input has been converted to a number using ToNumber, so it must be a |
+ // Smi or a HeapNumber. |
+ Label if_issmi(assembler), if_isnotsmi(assembler); |
+ assembler->Branch(assembler->WordIsSmi(value), &if_issmi, &if_isnotsmi); |
+ |
+ assembler->Bind(&if_issmi); |
+ { |
+ // Try fast Smi addition first. |
+ Node* one = assembler->SmiConstant(Smi::FromInt(1)); |
+ Node* pair = assembler->SmiSubWithOverflow(value, one); |
+ Node* overflow = assembler->Projection(1, pair); |
+ |
+ // Check if the Smi subtraction overflowed. |
+ Label if_overflow(assembler), if_notoverflow(assembler); |
+ assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
+ |
+ assembler->Bind(&if_notoverflow); |
+ assembler->Return(assembler->Projection(0, pair)); |
+ |
+ assembler->Bind(&if_overflow); |
+ { |
+ var_fdec_value.Bind(assembler->SmiToFloat64(value)); |
+ assembler->Goto(&do_fdec); |
+ } |
+ } |
+ |
+ assembler->Bind(&if_isnotsmi); |
+ { |
+ // Value must be a heap number if we reach this point. |
+ if (FLAG_debug_code) { |
+ // Assert that the value is a HeapNumber. |
+ Node* value_map = |
+ assembler->LoadObjectField(value, HeapObject::kMapOffset); |
+ |
+ Label if_valueisnumber(assembler), |
+ if_valuenotnumber(assembler, Label::kDeferred); |
+ Node* number_map = assembler->HeapNumberMapConstant(); |
+ assembler->Branch(assembler->WordEqual(value_map, number_map), |
+ &if_valueisnumber, &if_valuenotnumber); |
+ |
+ assembler->Bind(&if_valuenotnumber); |
+ { |
+ Node* abort_id = assembler->SmiConstant( |
+ Smi::FromInt(BailoutReason::kExpectedHeapNumber)); |
+ assembler->CallRuntime(Runtime::kAbort, context, abort_id); |
+ assembler->Goto(&if_valueisnumber); // Won't actually be reached. |
+ } |
+ |
+ assembler->Bind(&if_valueisnumber); |
+ } |
+ |
+ // Load the heap number value |
+ var_fdec_value.Bind(assembler->LoadHeapNumberValue(value)); |
+ assembler->Goto(&do_fdec); |
+ } |
+ |
+ assembler->Bind(&do_fdec); |
+ { |
+ Node* fdec_value = var_fdec_value.value(); |
+ Node* one = assembler->Float64Constant(1.0); |
+ Node* fdec_result = assembler->Float64Sub(fdec_value, one); |
+ Node* result = assembler->ChangeFloat64ToTagged(fdec_result); |
+ assembler->Return(result); |
+ } |
+} |
+ |
namespace { |
enum RelationalComparisonMode { |