| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index 95818bda1837339c71b4fc2807e3345b63046149..7773266d4eeb11ea987571572260038aa4256123 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -238,9 +238,7 @@ Node* CodeStubAssembler::Float64Trunc(Node* x) {
|
| }
|
|
|
| Node* CodeStubAssembler::SmiFromWord32(Node* value) {
|
| - if (Is64()) {
|
| - value = ChangeInt32ToInt64(value);
|
| - }
|
| + value = ChangeInt32ToIntPtr(value);
|
| return WordShl(value, SmiShiftBitsConstant());
|
| }
|
|
|
| @@ -520,9 +518,7 @@ Node* CodeStubAssembler::LoadFixedArrayElementInt32Index(
|
| Node* object, Node* index, int additional_offset) {
|
| Node* header_size = IntPtrConstant(additional_offset +
|
| FixedArray::kHeaderSize - kHeapObjectTag);
|
| - if (Is64()) {
|
| - index = ChangeInt32ToInt64(index);
|
| - }
|
| + index = ChangeInt32ToIntPtr(index);
|
| Node* scaled_index = WordShl(index, IntPtrConstant(kPointerSizeLog2));
|
| Node* offset = IntPtrAdd(scaled_index, header_size);
|
| return Load(MachineType::AnyTagged(), object, offset);
|
| @@ -555,6 +551,11 @@ Node* CodeStubAssembler::LoadFixedArrayElementConstantIndex(Node* object,
|
| return Load(MachineType::AnyTagged(), object, offset);
|
| }
|
|
|
| +Node* CodeStubAssembler::LoadNativeContext(Node* context) {
|
| + return LoadFixedArrayElementConstantIndex(context,
|
| + Context::NATIVE_CONTEXT_INDEX);
|
| +}
|
| +
|
| Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) {
|
| return StoreNoWriteBarrier(
|
| MachineRepresentation::kFloat64, object,
|
| @@ -582,6 +583,7 @@ Node* CodeStubAssembler::StoreMapNoWriteBarrier(Node* object, Node* map) {
|
| Node* CodeStubAssembler::StoreFixedArrayElementNoWriteBarrier(Node* object,
|
| Node* index,
|
| Node* value) {
|
| + index = ChangeInt32ToIntPtr(index);
|
| Node* offset =
|
| IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)),
|
| IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag));
|
| @@ -592,15 +594,50 @@ Node* CodeStubAssembler::StoreFixedArrayElementNoWriteBarrier(Node* object,
|
| Node* CodeStubAssembler::StoreFixedArrayElementInt32Index(Node* object,
|
| Node* index,
|
| Node* value) {
|
| - if (Is64()) {
|
| - index = ChangeInt32ToInt64(index);
|
| - }
|
| + index = ChangeInt32ToIntPtr(index);
|
| Node* offset =
|
| IntPtrAdd(WordShl(index, IntPtrConstant(kPointerSizeLog2)),
|
| IntPtrConstant(FixedArray::kHeaderSize - kHeapObjectTag));
|
| return Store(MachineRepresentation::kTagged, object, offset, value);
|
| }
|
|
|
| +Node* CodeStubAssembler::StoreFixedDoubleArrayElementInt32Index(Node* object,
|
| + Node* index,
|
| + Node* value) {
|
| + index = ChangeInt32ToIntPtr(index);
|
| + 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);
|
| +}
|
| +
|
| Node* CodeStubAssembler::AllocateHeapNumber() {
|
| Node* result = Allocate(HeapNumber::kSize, kNone);
|
| StoreMapNoWriteBarrier(result, HeapNumberMapConstant());
|
| @@ -633,6 +670,85 @@ Node* CodeStubAssembler::AllocateSeqTwoByteString(int length) {
|
| return result;
|
| }
|
|
|
| +Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind,
|
| + Node* native_context, int capacity,
|
| + int length,
|
| + compiler::Node* allocation_site) {
|
| + bool is_double = IsFastDoubleElementsKind(kind);
|
| + int element_size = is_double ? kDoubleSize : kPointerSize;
|
| + int total_size =
|
| + JSArray::kSize + FixedArray::kHeaderSize + element_size * capacity;
|
| + int elements_offset = JSArray::kSize;
|
| +
|
| + if (allocation_site != nullptr) {
|
| + total_size += AllocationMemento::kSize;
|
| + elements_offset += AllocationMemento::kSize;
|
| + }
|
| +
|
| + // Allocate both array and elements object, and initialize the JSArray.
|
| + Heap* heap = isolate()->heap();
|
| + Node* array = Allocate(total_size);
|
| + Node* array_map = LoadFixedArrayElementConstantIndex(
|
| + native_context, Context::ArrayMapIndex(kind));
|
| + StoreMapNoWriteBarrier(array, array_map);
|
| + Node* empty_properties =
|
| + HeapConstant(Handle<HeapObject>(heap->empty_fixed_array()));
|
| + StoreObjectFieldNoWriteBarrier(array, JSArray::kPropertiesOffset,
|
| + empty_properties);
|
| + StoreObjectFieldNoWriteBarrier(array, JSArray::kLengthOffset,
|
| + SmiConstant(Smi::FromInt(length)));
|
| +
|
| + if (allocation_site != nullptr) {
|
| + InitializeAllocationMemento(array, JSArray::kSize, allocation_site);
|
| + }
|
| +
|
| + // Setup elements object.
|
| + Node* elements = InnerAllocate(array, elements_offset);
|
| + StoreObjectFieldNoWriteBarrier(array, JSArray::kElementsOffset, elements);
|
| + 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)));
|
| +
|
| + Node* double_hole = Float64Constant(bit_cast<double>(kHoleNanInt64));
|
| + Node* hole = HeapConstant(Handle<HeapObject>(heap->the_hole_value()));
|
| + if (capacity <= kElementLoopUnrollThreshold) {
|
| + for (int i = 0; i < capacity; ++i) {
|
| + if (is_double) {
|
| + StoreFixedDoubleArrayElementInt32Index(elements, i, double_hole);
|
| + } else {
|
| + StoreFixedArrayElementNoWriteBarrier(elements, i, hole);
|
| + }
|
| + }
|
| + } else {
|
| + // TODO(danno): Add a loop for initialization
|
| + UNIMPLEMENTED();
|
| + }
|
| +
|
| + return array;
|
| +}
|
| +
|
| +void CodeStubAssembler::InitializeAllocationMemento(
|
| + compiler::Node* base_allocation, int base_allocation_size,
|
| + compiler::Node* allocation_site) {
|
| + StoreObjectFieldNoWriteBarrier(
|
| + base_allocation, AllocationMemento::kMapOffset + base_allocation_size,
|
| + HeapConstant(Handle<Map>(isolate()->heap()->allocation_memento_map())));
|
| + StoreObjectFieldNoWriteBarrier(
|
| + base_allocation,
|
| + AllocationMemento::kAllocationSiteOffset + base_allocation_size,
|
| + allocation_site);
|
| + if (FLAG_allocation_site_pretenuring) {
|
| + Node* count = LoadObjectField(allocation_site,
|
| + AllocationSite::kPretenureCreateCountOffset);
|
| + Node* incremented_count = IntPtrAdd(count, SmiConstant(Smi::FromInt(1)));
|
| + StoreObjectFieldNoWriteBarrier(allocation_site,
|
| + AllocationSite::kPretenureCreateCountOffset,
|
| + incremented_count);
|
| + }
|
| +}
|
| +
|
| Node* CodeStubAssembler::TruncateTaggedToFloat64(Node* context, Node* value) {
|
| // We might need to loop once due to ToNumber conversion.
|
| Variable var_value(this, MachineRepresentation::kTagged),
|
|
|