Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index 6adec9aff6fd100da4efb4b4baa942b281566f2f..7c8fe49aa7f8652f974a9bfdbf22c995e18f98eb 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -1041,6 +1041,44 @@ Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node, |
return Load(MachineType::AnyTagged(), object, offset); |
} |
+Node* CodeStubAssembler::LoadFixedTypedArrayElement( |
+ Node* data_pointer, Node* index_node, ElementsKind elements_kind, |
+ ParameterMode parameter_mode) { |
+ Node* offset = |
+ ElementOffsetFromIndex(index_node, elements_kind, parameter_mode, 0); |
+ MachineType type; |
+ switch (elements_kind) { |
+ case UINT8_ELEMENTS: /* fall through */ |
+ case UINT8_CLAMPED_ELEMENTS: |
+ type = MachineType::Uint8(); |
+ break; |
+ case INT8_ELEMENTS: |
+ type = MachineType::Int8(); |
+ break; |
+ case UINT16_ELEMENTS: |
+ type = MachineType::Uint16(); |
+ break; |
+ case INT16_ELEMENTS: |
+ type = MachineType::Int16(); |
+ break; |
+ case UINT32_ELEMENTS: |
+ type = MachineType::Uint32(); |
+ break; |
+ case INT32_ELEMENTS: |
+ type = MachineType::Int32(); |
+ break; |
+ case FLOAT32_ELEMENTS: |
+ type = MachineType::Float32(); |
+ break; |
+ case FLOAT64_ELEMENTS: |
+ type = MachineType::Float64(); |
+ break; |
+ default: |
+ UNREACHABLE(); |
+ } |
+ return Load(type, data_pointer, offset); |
+} |
+ |
Node* CodeStubAssembler::LoadAndUntagToWord32FixedArrayElement( |
Node* object, Node* index_node, int additional_offset, |
ParameterMode parameter_mode) { |
@@ -7242,5 +7280,56 @@ compiler::Node* CodeStubAssembler::InstanceOf(compiler::Node* object, |
return result.value(); |
} |
+compiler::Node* CodeStubAssembler::NumberInc(compiler::Node* value) { |
+ Variable var_result(this, MachineRepresentation::kTagged), |
+ var_finc_value(this, MachineRepresentation::kFloat64); |
+ Label if_issmi(this), if_isnotsmi(this), do_finc(this), end(this); |
+ Branch(TaggedIsSmi(value), &if_issmi, &if_isnotsmi); |
+ |
+ Bind(&if_issmi); |
+ { |
+ // Try fast Smi addition first. |
+ Node* one = SmiConstant(Smi::FromInt(1)); |
+ Node* pair = SmiAddWithOverflow(value, one); |
+ Node* overflow = Projection(1, pair); |
+ |
+ // Check if the Smi addition overflowed. |
+ Label if_overflow(this), if_notoverflow(this); |
+ Branch(overflow, &if_overflow, &if_notoverflow); |
+ |
+ Bind(&if_notoverflow); |
+ var_result.Bind(Projection(0, pair)); |
+ Goto(&end); |
+ |
+ Bind(&if_overflow); |
+ { |
+ var_finc_value.Bind(SmiToFloat64(value)); |
+ Goto(&do_finc); |
+ } |
+ } |
+ |
+ Bind(&if_isnotsmi); |
+ { |
+ // Check if the value is a HeapNumber. |
+ Assert(IsHeapNumberMap(LoadMap(value))); |
+ |
+ // Load the HeapNumber value. |
+ var_finc_value.Bind(LoadHeapNumberValue(value)); |
+ Goto(&do_finc); |
+ } |
+ |
+ Bind(&do_finc); |
+ { |
+ Node* finc_value = var_finc_value.value(); |
+ Node* one = Float64Constant(1.0); |
+ Node* finc_result = Float64Add(finc_value, one); |
+ var_result.Bind(ChangeFloat64ToTagged(finc_result)); |
+ Goto(&end); |
+ } |
+ |
+ Bind(&end); |
+ return var_result.value(); |
+} |
+ |
} // namespace internal |
} // namespace v8 |