Chromium Code Reviews| Index: src/code-stub-assembler.cc |
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
| index e0963145ff0198c2698e63a55e6f59097eba8623..6bb4ce1946cddd59e20ee068f96483e4a4ba58bb 100644 |
| --- a/src/code-stub-assembler.cc |
| +++ b/src/code-stub-assembler.cc |
| @@ -243,6 +243,12 @@ Node* CodeStubAssembler::SmiFromWord32(Node* value) { |
| } |
| Node* CodeStubAssembler::SmiTag(Node* value) { |
| + int32_t constant_value; |
| + if (ToInt32Constant(value, constant_value)) { |
| + DCHECK(constant_value >= Smi::kMinValue && |
| + constant_value <= Smi::kMaxValue); |
|
Michael Starzinger
2016/05/19 11:19:17
nit: DCHECK(Smi::IsValid(constant_value))
danno
2016/05/19 14:25:49
Done.
|
| + return SmiConstant(Smi::FromInt(constant_value)); |
| + } |
| return WordShl(value, SmiShiftBitsConstant()); |
| } |
| @@ -523,13 +529,13 @@ Node* CodeStubAssembler::AllocateUninitializedFixedArray(Node* length) { |
| return result; |
| } |
| -Node* CodeStubAssembler::LoadFixedArrayElementInt32Index( |
| - Node* object, Node* index, int additional_offset) { |
| - Node* header_size = IntPtrConstant(additional_offset + |
| - FixedArray::kHeaderSize - kHeapObjectTag); |
| - index = ChangeInt32ToIntPtr(index); |
| - Node* scaled_index = WordShl(index, IntPtrConstant(kPointerSizeLog2)); |
| - Node* offset = IntPtrAdd(scaled_index, header_size); |
| +Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node, |
| + int additional_offset, |
| + ParameterMode parameter_mode) { |
| + int32_t header_size = |
| + FixedArray::kHeaderSize + additional_offset - kHeapObjectTag; |
| + Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS, |
| + parameter_mode, header_size); |
| return Load(MachineType::AnyTagged(), object, offset); |
| } |
| @@ -538,37 +544,15 @@ Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { |
| IntPtrConstant(Map::kInstanceSizeOffset - kHeapObjectTag)); |
| } |
| -Node* CodeStubAssembler::LoadFixedArrayElementSmiIndex(Node* object, |
| - Node* smi_index, |
| - int additional_offset) { |
| - int const kSmiShiftBits = kSmiShiftSize + kSmiTagSize; |
| - Node* header_size = IntPtrConstant(additional_offset + |
| - FixedArray::kHeaderSize - kHeapObjectTag); |
| - Node* scaled_index = |
| - (kSmiShiftBits > kPointerSizeLog2) |
| - ? WordSar(smi_index, IntPtrConstant(kSmiShiftBits - kPointerSizeLog2)) |
| - : WordShl(smi_index, |
| - IntPtrConstant(kPointerSizeLog2 - kSmiShiftBits)); |
| - Node* offset = IntPtrAdd(scaled_index, header_size); |
| - return Load(MachineType::AnyTagged(), object, offset); |
| -} |
| - |
| -Node* CodeStubAssembler::LoadFixedArrayElementConstantIndex(Node* object, |
| - int index) { |
| - Node* offset = IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag + |
| - index * kPointerSize); |
| - return Load(MachineType::AnyTagged(), object, offset); |
| -} |
| - |
| Node* CodeStubAssembler::LoadNativeContext(Node* context) { |
| - return LoadFixedArrayElementConstantIndex(context, |
| - Context::NATIVE_CONTEXT_INDEX); |
| + return LoadFixedArrayElement(context, |
| + Int32Constant(Context::NATIVE_CONTEXT_INDEX)); |
| } |
| Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, |
| Node* native_context) { |
| - return LoadFixedArrayElementConstantIndex(native_context, |
| - Context::ArrayMapIndex(kind)); |
| + return LoadFixedArrayElement(native_context, |
| + Int32Constant(Context::ArrayMapIndex(kind))); |
| } |
| Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { |
| @@ -595,62 +579,30 @@ Node* CodeStubAssembler::StoreMapNoWriteBarrier(Node* object, Node* map) { |
| IntPtrConstant(HeapNumber::kMapOffset - kHeapObjectTag), map); |
| } |
| -Node* CodeStubAssembler::StoreFixedArrayElementNoWriteBarrier(Node* object, |
| - Node* index, |
| - Node* value) { |
| - index = ChangeInt32ToIntPtr(index); |
| +Node* CodeStubAssembler::StoreFixedArrayElement(Node* object, Node* index_node, |
| + Node* value, |
| + WriteBarrierMode barrier_mode, |
| + ParameterMode parameter_mode) { |
| + DCHECK(barrier_mode == SKIP_WRITE_BARRIER || |
| + barrier_mode == UPDATE_WRITE_BARRIER); |
| Node* offset = |
| - IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)), |
| - IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag)); |
| - return StoreNoWriteBarrier(MachineRepresentation::kTagged, object, offset, |
| - value); |
| -} |
| - |
| -Node* CodeStubAssembler::StoreFixedArrayElementInt32Index(Node* object, |
| - Node* index, |
| - Node* value) { |
| - index = ChangeInt32ToIntPtr(index); |
| - Node* offset = |
| - IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)), |
| - IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag)); |
| - return Store(MachineRepresentation::kTagged, object, offset, value); |
| + ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS, parameter_mode, |
| + FixedArray::kHeaderSize - kHeapObjectTag); |
| + MachineRepresentation rep = MachineRepresentation::kTagged; |
| + if (barrier_mode == SKIP_WRITE_BARRIER) { |
| + return StoreNoWriteBarrier(rep, object, offset, value); |
| + } else { |
| + return Store(rep, object, offset, value); |
| + } |
| } |
| -Node* CodeStubAssembler::StoreFixedDoubleArrayElementInt32Index(Node* object, |
| - Node* index, |
| - Node* value) { |
| - index = ChangeInt32ToIntPtr(index); |
| +Node* CodeStubAssembler::StoreFixedDoubleArrayElement( |
| + Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) { |
| Node* offset = |
| - IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)), |
| - IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag)); |
| - return StoreNoWriteBarrier(MachineRepresentation::kFloat64, object, offset, |
| - value); |
| -} |
| - |
| -Node* CodeStubAssembler::StoreFixedArrayElementInt32Index(Node* object, |
| - int index, |
| - Node* value) { |
| - Node* offset = IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag + |
| - index * kPointerSize); |
| - return Store(MachineRepresentation::kTagged, object, offset, value); |
| -} |
| - |
| -Node* CodeStubAssembler::StoreFixedArrayElementNoWriteBarrier(Node* object, |
| - int index, |
| - Node* value) { |
| - Node* offset = IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag + |
| - index * kPointerSize); |
| - return StoreNoWriteBarrier(MachineRepresentation::kTagged, object, offset, |
| - value); |
| -} |
| - |
| -Node* CodeStubAssembler::StoreFixedDoubleArrayElementInt32Index(Node* object, |
| - int index, |
| - Node* value) { |
| - Node* offset = IntPtrConstant(FixedDoubleArray::kHeaderSize - kHeapObjectTag + |
| - index * kDoubleSize); |
| - return StoreNoWriteBarrier(MachineRepresentation::kFloat64, object, offset, |
| - value); |
| + ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode, |
| + FixedArray::kHeaderSize - kHeapObjectTag); |
| + MachineRepresentation rep = MachineRepresentation::kFloat64; |
| + return StoreNoWriteBarrier(rep, object, offset, value); |
| } |
| Node* CodeStubAssembler::AllocateHeapNumber() { |
| @@ -686,19 +638,23 @@ Node* CodeStubAssembler::AllocateSeqTwoByteString(int length) { |
| } |
| Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map, |
| - int capacity, int length, |
| - compiler::Node* allocation_site) { |
| + Node* capacity_node, Node* length_node, |
| + compiler::Node* allocation_site, |
| + ParameterMode mode) { |
| bool is_double = IsFastDoubleElementsKind(kind); |
| - int element_size = is_double ? kDoubleSize : kPointerSize; |
| - int total_size = |
| - JSArray::kSize + FixedArray::kHeaderSize + element_size * capacity; |
| + int base_size = JSArray::kSize + FixedArray::kHeaderSize; |
| int elements_offset = JSArray::kSize; |
| if (allocation_site != nullptr) { |
| - total_size += AllocationMemento::kSize; |
| + base_size += AllocationMemento::kSize; |
| elements_offset += AllocationMemento::kSize; |
| } |
| + int32_t capacity; |
| + bool constant_capacity = ToInt32Constant(capacity_node, capacity); |
| + Node* total_size = |
| + ElementOffsetFromIndex(capacity_node, kind, mode, base_size); |
| + |
| // Allocate both array and elements object, and initialize the JSArray. |
| Heap* heap = isolate()->heap(); |
| Node* array = Allocate(total_size); |
| @@ -707,8 +663,9 @@ Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map, |
| HeapConstant(Handle<HeapObject>(heap->empty_fixed_array())); |
| StoreObjectFieldNoWriteBarrier(array, JSArray::kPropertiesOffset, |
| empty_properties); |
| - StoreObjectFieldNoWriteBarrier(array, JSArray::kLengthOffset, |
| - SmiConstant(Smi::FromInt(length))); |
| + StoreObjectFieldNoWriteBarrier( |
| + array, JSArray::kLengthOffset, |
| + mode == SMI_PARAMETERS ? length_node : SmiTag(length_node)); |
| if (allocation_site != nullptr) { |
| InitializeAllocationMemento(array, JSArray::kSize, allocation_site); |
| @@ -720,17 +677,19 @@ Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map, |
| Handle<Map> elements_map(is_double ? heap->fixed_double_array_map() |
| : heap->fixed_array_map()); |
| StoreMapNoWriteBarrier(elements, HeapConstant(elements_map)); |
| - StoreObjectFieldNoWriteBarrier(elements, FixedArray::kLengthOffset, |
| - SmiConstant(Smi::FromInt(capacity))); |
| + StoreObjectFieldNoWriteBarrier( |
| + elements, FixedArray::kLengthOffset, |
| + mode == SMI_PARAMETERS ? capacity_node : SmiTag(capacity_node)); |
| Node* double_hole = Float64Constant(bit_cast<double>(kHoleNanInt64)); |
| Node* hole = HeapConstant(Handle<HeapObject>(heap->the_hole_value())); |
| - if (capacity <= kElementLoopUnrollThreshold) { |
| + if (constant_capacity && capacity <= kElementLoopUnrollThreshold) { |
| for (int i = 0; i < capacity; ++i) { |
| if (is_double) { |
| - StoreFixedDoubleArrayElementInt32Index(elements, i, double_hole); |
| + StoreFixedDoubleArrayElement(elements, Int32Constant(i), double_hole); |
| } else { |
| - StoreFixedArrayElementNoWriteBarrier(elements, i, hole); |
| + StoreFixedArrayElement(elements, Int32Constant(i), hole, |
| + SKIP_WRITE_BARRIER); |
| } |
| } |
| } else { |
| @@ -1231,7 +1190,7 @@ Node* CodeStubAssembler::StringFromCharCode(Node* code) { |
| // cache already. |
| Label if_entryisundefined(this, Label::kDeferred), |
| if_entryisnotundefined(this); |
| - Node* entry = LoadFixedArrayElementInt32Index(cache, code); |
| + Node* entry = LoadFixedArrayElement(cache, code); |
| Branch(WordEqual(entry, UndefinedConstant()), &if_entryisundefined, |
| &if_entryisnotundefined); |
| @@ -1242,7 +1201,7 @@ Node* CodeStubAssembler::StringFromCharCode(Node* code) { |
| StoreNoWriteBarrier( |
| MachineRepresentation::kWord8, result, |
| IntPtrConstant(SeqOneByteString::kHeaderSize - kHeapObjectTag), code); |
| - StoreFixedArrayElementInt32Index(cache, code, result); |
| + StoreFixedArrayElement(cache, code, result); |
| var_result.Bind(result); |
| Goto(&if_done); |
| } |
| @@ -1369,7 +1328,7 @@ void CodeStubAssembler::TryLookupProperty(Node* object, Node* map, |
| Bind(&if_notdone); |
| { |
| Node* array_index = Int32Add(offset, Int32Mul(index, factor)); |
| - Node* current = LoadFixedArrayElementInt32Index(descriptors, array_index); |
| + Node* current = LoadFixedArrayElement(descriptors, array_index); |
| Label if_unequal(this); |
| Branch(WordEqual(current, name), if_found, &if_unequal); |
| Bind(&if_unequal); |
| @@ -1410,7 +1369,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map, |
| if_not_found); |
| Bind(&if_iskeyinrange); |
| - Node* element = LoadFixedArrayElementInt32Index(elements, index); |
| + Node* element = LoadFixedArrayElement(elements, index); |
| Node* the_hole = LoadRoot(Heap::kTheHoleValueRootIndex); |
| Branch(WordEqual(element, the_hole), if_not_found, if_found); |
| } |
| @@ -1552,5 +1511,38 @@ Node* CodeStubAssembler::OrdinaryHasInstance(Node* context, Node* callable, |
| return var_result.value(); |
| } |
| +compiler::Node* CodeStubAssembler::ElementOffsetFromIndex(Node* index_node, |
| + ElementsKind kind, |
| + ParameterMode mode, |
| + int base_size) { |
| + bool is_double = IsFastDoubleElementsKind(kind); |
| + int element_size_shift = is_double ? kDoubleSizeLog2 : kPointerSizeLog2; |
| + int element_size = 1 << element_size_shift; |
| + int const kSmiShiftBits = kSmiShiftSize + kSmiTagSize; |
| + int32_t index = 0; |
| + bool constant_index = false; |
| + if (mode == SMI_PARAMETERS) { |
| + element_size_shift -= kSmiShiftBits; |
| + intptr_t temp; |
|
Michael Starzinger
2016/05/19 11:19:17
nit: Better initialize "temp" here, because it is
danno
2016/05/19 14:25:49
Done.
|
| + constant_index = ToIntPtrConstant(index_node, temp); |
| + index = temp >> kSmiShiftBits; |
| + } else { |
| + constant_index = ToInt32Constant(index_node, index); |
| + } |
| + if (constant_index) { |
| + return IntPtrConstant(base_size + element_size * index); |
| + } |
| + if (base_size == 0) { |
| + return (element_size_shift >= 0) |
| + ? WordShl(index_node, IntPtrConstant(element_size_shift)) |
| + : WordShr(index_node, IntPtrConstant(-element_size_shift)); |
| + } |
| + return IntPtrAdd( |
| + Int32Constant(base_size), |
| + (element_size_shift >= 0) |
| + ? WordShl(index_node, IntPtrConstant(element_size_shift)) |
| + : WordShr(index_node, IntPtrConstant(-element_size_shift))); |
| +} |
| + |
| } // namespace internal |
| } // namespace v8 |