Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Unified Diff: src/code-stubs.cc

Issue 1901083002: [Interpreter] Introduce IncStub and DecStub. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address review comments Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/code-stubs.h ('k') | src/interface-descriptors.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/code-stubs.cc
diff --git a/src/code-stubs.cc b/src/code-stubs.cc
index 84d8d98c8eace1582719037fc752c9338b2dd7e6..3d5c0eb7b86ce18c7103572ca1d98dd1f8310315 100644
--- a/src/code-stubs.cc
+++ b/src/code-stubs.cc
@@ -1608,6 +1608,160 @@ void BitwiseXorStub::GenerateAssembly(CodeStubAssembler* assembler) const {
assembler->Return(result);
}
+void IncStub::GenerateAssembly(CodeStubAssembler* assembler) const {
+ typedef CodeStubAssembler::Label Label;
+ typedef compiler::Node Node;
+ typedef 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
epertoso 2016/04/19 15:48:23 Where does this conversion happen?
rmcilroy 2016/04/19 15:50:03 In BytecodeGenerator::VisitCountOperation. The val
+ // 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->LoadMap(value);
+
+ 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(CodeStubAssembler* assembler) const {
+ typedef CodeStubAssembler::Label Label;
+ typedef compiler::Node Node;
+ typedef 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->LoadMap(value);
+
+ 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 {
« no previous file with comments | « src/code-stubs.h ('k') | src/interface-descriptors.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698