Index: src/code-stubs.cc |
diff --git a/src/code-stubs.cc b/src/code-stubs.cc |
index bfa5294b04e2cf7375f4deff2225c97ab2d937ef..f47bdff149aaae975bf3b60ae03d5020ebf1793d 100644 |
--- a/src/code-stubs.cc |
+++ b/src/code-stubs.cc |
@@ -1512,150 +1512,6 @@ compiler::Node* ModulusWithFeedbackStub::Generate( |
return var_result.value(); |
} |
-#define UNARY_OP_STUB(Name) \ |
- void Name::GenerateAssembly(compiler::CodeAssemblerState* state) const { \ |
- CodeStubAssembler assembler(state); \ |
- assembler.Return(Generate(&assembler, assembler.Parameter(0), \ |
- assembler.Parameter(1), assembler.Parameter(2), \ |
- assembler.Parameter(3))); \ |
- } |
-UNARY_OP_STUB(IncStub) |
-UNARY_OP_STUB(DecStub) |
-#undef UNARY_OP_STUB |
- |
-// static |
-compiler::Node* IncStub::Generate(CodeStubAssembler* assembler, |
- compiler::Node* value, |
- compiler::Node* context, |
- compiler::Node* type_feedback_vector, |
- compiler::Node* slot_id) { |
- typedef CodeStubAssembler::Label Label; |
- typedef compiler::Node Node; |
- typedef CodeStubAssembler::Variable Variable; |
- |
- // Shared entry for floating point increment. |
- Label do_finc(assembler), end(assembler); |
- Variable var_finc_value(assembler, MachineRepresentation::kFloat64); |
- |
- // We might need to try again due to ToNumber conversion. |
- Variable value_var(assembler, MachineRepresentation::kTagged); |
- Variable result_var(assembler, MachineRepresentation::kTagged); |
- Variable var_type_feedback(assembler, MachineRepresentation::kWord32); |
- Variable* loop_vars[] = {&value_var, &var_type_feedback}; |
- Label start(assembler, 2, loop_vars); |
- value_var.Bind(value); |
- var_type_feedback.Bind( |
- assembler->Int32Constant(BinaryOperationFeedback::kNone)); |
- assembler->Goto(&start); |
- assembler->Bind(&start); |
- { |
- value = value_var.value(); |
- |
- Label if_issmi(assembler), if_isnotsmi(assembler); |
- assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi); |
- |
- assembler->Bind(&if_issmi); |
- { |
- // Try fast Smi addition first. |
- Node* one = assembler->SmiConstant(Smi::FromInt(1)); |
- Node* pair = assembler->IntPtrAddWithOverflow( |
- assembler->BitcastTaggedToWord(value), |
- assembler->BitcastTaggedToWord(one)); |
- Node* overflow = assembler->Projection(1, pair); |
- |
- // Check if the Smi addition overflowed. |
- Label if_overflow(assembler), if_notoverflow(assembler); |
- assembler->Branch(overflow, &if_overflow, &if_notoverflow); |
- |
- assembler->Bind(&if_notoverflow); |
- var_type_feedback.Bind(assembler->Word32Or( |
- var_type_feedback.value(), |
- assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall))); |
- result_var.Bind( |
- assembler->BitcastWordToTaggedSigned(assembler->Projection(0, pair))); |
- assembler->Goto(&end); |
- |
- assembler->Bind(&if_overflow); |
- { |
- var_finc_value.Bind(assembler->SmiToFloat64(value)); |
- assembler->Goto(&do_finc); |
- } |
- } |
- |
- assembler->Bind(&if_isnotsmi); |
- { |
- // Check if the value is a HeapNumber. |
- Label if_valueisnumber(assembler), |
- if_valuenotnumber(assembler, Label::kDeferred); |
- Node* value_map = assembler->LoadMap(value); |
- assembler->Branch(assembler->IsHeapNumberMap(value_map), |
- &if_valueisnumber, &if_valuenotnumber); |
- |
- assembler->Bind(&if_valueisnumber); |
- { |
- // Load the HeapNumber value. |
- var_finc_value.Bind(assembler->LoadHeapNumberValue(value)); |
- assembler->Goto(&do_finc); |
- } |
- |
- assembler->Bind(&if_valuenotnumber); |
- { |
- // We do not require an Or with earlier feedback here because once we |
- // convert the value to a number, we cannot reach this path. We can |
- // only reach this path on the first pass when the feedback is kNone. |
- CSA_ASSERT(assembler, |
- assembler->Word32Equal(var_type_feedback.value(), |
- assembler->Int32Constant( |
- BinaryOperationFeedback::kNone))); |
- |
- Label if_valueisoddball(assembler), if_valuenotoddball(assembler); |
- Node* instance_type = assembler->LoadMapInstanceType(value_map); |
- Node* is_oddball = assembler->Word32Equal( |
- instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
- assembler->Branch(is_oddball, &if_valueisoddball, &if_valuenotoddball); |
- |
- assembler->Bind(&if_valueisoddball); |
- { |
- // Convert Oddball to Number and check again. |
- value_var.Bind( |
- assembler->LoadObjectField(value, Oddball::kToNumberOffset)); |
- var_type_feedback.Bind(assembler->Int32Constant( |
- BinaryOperationFeedback::kNumberOrOddball)); |
- assembler->Goto(&start); |
- } |
- |
- assembler->Bind(&if_valuenotoddball); |
- { |
- // Convert to a Number first and try again. |
- Callable callable = |
- CodeFactory::NonNumberToNumber(assembler->isolate()); |
- var_type_feedback.Bind( |
- assembler->Int32Constant(BinaryOperationFeedback::kAny)); |
- value_var.Bind(assembler->CallStub(callable, context, value)); |
- assembler->Goto(&start); |
- } |
- } |
- } |
- } |
- |
- 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); |
- var_type_feedback.Bind(assembler->Word32Or( |
- var_type_feedback.value(), |
- assembler->Int32Constant(BinaryOperationFeedback::kNumber))); |
- result_var.Bind(assembler->AllocateHeapNumberWithValue(finc_result)); |
- assembler->Goto(&end); |
- } |
- |
- assembler->Bind(&end); |
- assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
- slot_id); |
- return result_var.value(); |
-} |
- |
void NumberToStringStub::GenerateAssembly( |
compiler::CodeAssemblerState* state) const { |
typedef compiler::Node Node; |
@@ -1665,139 +1521,6 @@ void NumberToStringStub::GenerateAssembly( |
assembler.Return(assembler.NumberToString(context, argument)); |
} |
-// static |
-compiler::Node* DecStub::Generate(CodeStubAssembler* assembler, |
- compiler::Node* value, |
- compiler::Node* context, |
- compiler::Node* type_feedback_vector, |
- compiler::Node* slot_id) { |
- typedef CodeStubAssembler::Label Label; |
- typedef compiler::Node Node; |
- typedef CodeStubAssembler::Variable Variable; |
- |
- // Shared entry for floating point decrement. |
- Label do_fdec(assembler), end(assembler); |
- Variable var_fdec_value(assembler, MachineRepresentation::kFloat64); |
- |
- // We might need to try again due to ToNumber conversion. |
- Variable value_var(assembler, MachineRepresentation::kTagged); |
- Variable result_var(assembler, MachineRepresentation::kTagged); |
- Variable var_type_feedback(assembler, MachineRepresentation::kWord32); |
- Variable* loop_vars[] = {&value_var, &var_type_feedback}; |
- Label start(assembler, 2, loop_vars); |
- var_type_feedback.Bind( |
- assembler->Int32Constant(BinaryOperationFeedback::kNone)); |
- value_var.Bind(value); |
- assembler->Goto(&start); |
- assembler->Bind(&start); |
- { |
- value = value_var.value(); |
- |
- Label if_issmi(assembler), if_isnotsmi(assembler); |
- assembler->Branch(assembler->TaggedIsSmi(value), &if_issmi, &if_isnotsmi); |
- |
- assembler->Bind(&if_issmi); |
- { |
- // Try fast Smi subtraction first. |
- Node* one = assembler->SmiConstant(Smi::FromInt(1)); |
- Node* pair = assembler->IntPtrSubWithOverflow( |
- assembler->BitcastTaggedToWord(value), |
- assembler->BitcastTaggedToWord(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); |
- var_type_feedback.Bind(assembler->Word32Or( |
- var_type_feedback.value(), |
- assembler->Int32Constant(BinaryOperationFeedback::kSignedSmall))); |
- result_var.Bind( |
- assembler->BitcastWordToTaggedSigned(assembler->Projection(0, pair))); |
- assembler->Goto(&end); |
- |
- assembler->Bind(&if_overflow); |
- { |
- var_fdec_value.Bind(assembler->SmiToFloat64(value)); |
- assembler->Goto(&do_fdec); |
- } |
- } |
- |
- assembler->Bind(&if_isnotsmi); |
- { |
- // Check if the value is a HeapNumber. |
- Label if_valueisnumber(assembler), |
- if_valuenotnumber(assembler, Label::kDeferred); |
- Node* value_map = assembler->LoadMap(value); |
- assembler->Branch(assembler->IsHeapNumberMap(value_map), |
- &if_valueisnumber, &if_valuenotnumber); |
- |
- assembler->Bind(&if_valueisnumber); |
- { |
- // Load the HeapNumber value. |
- var_fdec_value.Bind(assembler->LoadHeapNumberValue(value)); |
- assembler->Goto(&do_fdec); |
- } |
- |
- assembler->Bind(&if_valuenotnumber); |
- { |
- // We do not require an Or with earlier feedback here because once we |
- // convert the value to a number, we cannot reach this path. We can |
- // only reach this path on the first pass when the feedback is kNone. |
- CSA_ASSERT(assembler, |
- assembler->Word32Equal(var_type_feedback.value(), |
- assembler->Int32Constant( |
- BinaryOperationFeedback::kNone))); |
- |
- Label if_valueisoddball(assembler), if_valuenotoddball(assembler); |
- Node* instance_type = assembler->LoadMapInstanceType(value_map); |
- Node* is_oddball = assembler->Word32Equal( |
- instance_type, assembler->Int32Constant(ODDBALL_TYPE)); |
- assembler->Branch(is_oddball, &if_valueisoddball, &if_valuenotoddball); |
- |
- assembler->Bind(&if_valueisoddball); |
- { |
- // Convert Oddball to Number and check again. |
- value_var.Bind( |
- assembler->LoadObjectField(value, Oddball::kToNumberOffset)); |
- var_type_feedback.Bind(assembler->Int32Constant( |
- BinaryOperationFeedback::kNumberOrOddball)); |
- assembler->Goto(&start); |
- } |
- |
- assembler->Bind(&if_valuenotoddball); |
- { |
- // Convert to a Number first and try again. |
- Callable callable = |
- CodeFactory::NonNumberToNumber(assembler->isolate()); |
- var_type_feedback.Bind( |
- assembler->Int32Constant(BinaryOperationFeedback::kAny)); |
- value_var.Bind(assembler->CallStub(callable, context, value)); |
- assembler->Goto(&start); |
- } |
- } |
- } |
- } |
- |
- 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); |
- var_type_feedback.Bind(assembler->Word32Or( |
- var_type_feedback.value(), |
- assembler->Int32Constant(BinaryOperationFeedback::kNumber))); |
- result_var.Bind(assembler->AllocateHeapNumberWithValue(fdec_result)); |
- assembler->Goto(&end); |
- } |
- |
- assembler->Bind(&end); |
- assembler->UpdateFeedback(var_type_feedback.value(), type_feedback_vector, |
- slot_id); |
- return result_var.value(); |
-} |
- |
// ES6 section 21.1.3.19 String.prototype.substring ( start, end ) |
compiler::Node* SubStringStub::Generate(CodeStubAssembler* assembler, |
compiler::Node* string, |