diff options
Diffstat (limited to 'deps/v8/src/builtins/builtins-internal-gen.cc')
-rw-r--r-- | deps/v8/src/builtins/builtins-internal-gen.cc | 176 |
1 files changed, 110 insertions, 66 deletions
diff --git a/deps/v8/src/builtins/builtins-internal-gen.cc b/deps/v8/src/builtins/builtins-internal-gen.cc index 445c8c9517..0625b8affc 100644 --- a/deps/v8/src/builtins/builtins-internal-gen.cc +++ b/deps/v8/src/builtins/builtins-internal-gen.cc @@ -18,9 +18,6 @@ namespace v8 { namespace internal { -template <typename T> -using TNode = compiler::TNode<T>; - // ----------------------------------------------------------------------------- // Stack checks. @@ -32,12 +29,14 @@ void Builtins::Generate_StackCheck(MacroAssembler* masm) { // TurboFan support builtins. TF_BUILTIN(CopyFastSmiOrObjectElements, CodeStubAssembler) { - Node* object = Parameter(Descriptor::kObject); + TNode<JSObject> js_object = CAST(Parameter(Descriptor::kObject)); // Load the {object}s elements. - TNode<Object> source = LoadObjectField(object, JSObject::kElementsOffset); - Node* target = CloneFixedArray(source, ExtractFixedArrayFlag::kFixedArrays); - StoreObjectField(object, JSObject::kElementsOffset, target); + TNode<FixedArrayBase> source = + CAST(LoadObjectField(js_object, JSObject::kElementsOffset)); + TNode<FixedArrayBase> target = + CloneFixedArray(source, ExtractFixedArrayFlag::kFixedArrays); + StoreObjectField(js_object, JSObject::kElementsOffset, target); Return(target); } @@ -47,7 +46,7 @@ TF_BUILTIN(GrowFastDoubleElements, CodeStubAssembler) { Node* context = Parameter(Descriptor::kContext); Label runtime(this, Label::kDeferred); - Node* elements = LoadElements(object); + TNode<FixedArrayBase> elements = LoadElements(object); elements = TryGrowElementsCapacity(object, elements, PACKED_DOUBLE_ELEMENTS, key, &runtime); Return(elements); @@ -62,7 +61,7 @@ TF_BUILTIN(GrowFastSmiOrObjectElements, CodeStubAssembler) { Node* context = Parameter(Descriptor::kContext); Label runtime(this, Label::kDeferred); - Node* elements = LoadElements(object); + TNode<FixedArrayBase> elements = LoadElements(object); elements = TryGrowElementsCapacity(object, elements, PACKED_ELEMENTS, key, &runtime); Return(elements); @@ -274,25 +273,24 @@ class RecordWriteCodeStubAssembler : public CodeStubAssembler { return TaggedEqual(remembered_set, SmiConstant(EMIT_REMEMBERED_SET)); } - void CallCFunction1WithCallerSavedRegistersMode(MachineType return_type, - MachineType arg0_type, - Node* function, Node* arg0, - Node* mode, Label* next) { + void CallCFunction2WithCallerSavedRegistersMode( + MachineType return_type, MachineType arg0_type, MachineType arg1_type, + Node* function, Node* arg0, Node* arg1, Node* mode, Label* next) { Label dont_save_fp(this), save_fp(this); Branch(ShouldSkipFPRegs(mode), &dont_save_fp, &save_fp); BIND(&dont_save_fp); { - CallCFunctionWithCallerSavedRegisters(function, return_type, - kDontSaveFPRegs, - std::make_pair(arg0_type, arg0)); + CallCFunctionWithCallerSavedRegisters( + function, return_type, kDontSaveFPRegs, + std::make_pair(arg0_type, arg0), std::make_pair(arg1_type, arg1)); Goto(next); } BIND(&save_fp); { - CallCFunctionWithCallerSavedRegisters(function, return_type, - kSaveFPRegs, - std::make_pair(arg0_type, arg0)); + CallCFunctionWithCallerSavedRegisters(function, return_type, kSaveFPRegs, + std::make_pair(arg0_type, arg0), + std::make_pair(arg1_type, arg1)); Goto(next); } } @@ -321,34 +319,82 @@ class RecordWriteCodeStubAssembler : public CodeStubAssembler { } } - void InsertToStoreBufferAndGoto(Node* isolate, Node* slot, Node* mode, - Label* next) { - TNode<ExternalReference> store_buffer_top_addr = - ExternalConstant(ExternalReference::store_buffer_top(this->isolate())); - Node* store_buffer_top = - Load(MachineType::Pointer(), store_buffer_top_addr); - StoreNoWriteBarrier(MachineType::PointerRepresentation(), store_buffer_top, - slot); - TNode<WordT> new_store_buffer_top = - IntPtrAdd(store_buffer_top, IntPtrConstant(kSystemPointerSize)); - StoreNoWriteBarrier(MachineType::PointerRepresentation(), - store_buffer_top_addr, new_store_buffer_top); - - TNode<WordT> test = - WordAnd(new_store_buffer_top, - IntPtrConstant(Heap::store_buffer_mask_constant())); - - Label overflow(this); - Branch(IntPtrEqual(test, IntPtrConstant(0)), &overflow, next); - - BIND(&overflow); - { - TNode<ExternalReference> function = - ExternalConstant(ExternalReference::store_buffer_overflow_function()); - CallCFunction1WithCallerSavedRegistersMode(MachineType::Int32(), - MachineType::Pointer(), - function, isolate, mode, next); - } + void InsertIntoRememberedSetAndGotoSlow(Node* isolate, TNode<IntPtrT> object, + TNode<IntPtrT> slot, Node* mode, + Label* next) { + TNode<IntPtrT> page = PageFromAddress(object); + TNode<ExternalReference> function = + ExternalConstant(ExternalReference::insert_remembered_set_function()); + CallCFunction2WithCallerSavedRegistersMode( + MachineType::Int32(), MachineType::Pointer(), MachineType::Pointer(), + function, page, slot, mode, next); + } + + void InsertIntoRememberedSetAndGoto(Node* isolate, TNode<IntPtrT> object, + TNode<IntPtrT> slot, Node* mode, + Label* next) { + Label slow_path(this); + TNode<IntPtrT> page = PageFromAddress(object); + + // Load address of SlotSet + TNode<IntPtrT> slot_set_array = LoadSlotSetArray(page, &slow_path); + TNode<IntPtrT> slot_offset = IntPtrSub(slot, page); + + // Load bucket + TNode<IntPtrT> bucket = LoadBucket(slot_set_array, slot_offset, &slow_path); + + // Update cell + SetBitInCell(bucket, slot_offset); + + Goto(next); + + BIND(&slow_path); + InsertIntoRememberedSetAndGotoSlow(isolate, object, slot, mode, next); + } + + TNode<IntPtrT> LoadSlotSetArray(TNode<IntPtrT> page, Label* slow_path) { + TNode<IntPtrT> slot_set_array = UncheckedCast<IntPtrT>( + Load(MachineType::Pointer(), page, + IntPtrConstant(MemoryChunk::kOldToNewSlotSetOffset))); + GotoIf(WordEqual(slot_set_array, IntPtrConstant(0)), slow_path); + + return slot_set_array; + } + + TNode<IntPtrT> LoadBucket(TNode<IntPtrT> slot_set_array, + TNode<WordT> slot_offset, Label* slow_path) { + // Assume here that SlotSet only contains of buckets + DCHECK_EQ(SlotSet::kSize, SlotSet::kBuckets * sizeof(SlotSet::Bucket)); + TNode<WordT> bucket_index = + WordShr(slot_offset, SlotSet::kBitsPerBucketLog2 + kTaggedSizeLog2); + TNode<IntPtrT> bucket = UncheckedCast<IntPtrT>( + Load(MachineType::Pointer(), slot_set_array, + WordShl(bucket_index, kSystemPointerSizeLog2))); + GotoIf(WordEqual(bucket, IntPtrConstant(0)), slow_path); + return bucket; + } + + void SetBitInCell(TNode<IntPtrT> bucket, TNode<WordT> slot_offset) { + // Load cell value + TNode<WordT> cell_offset = WordAnd( + WordShr(slot_offset, SlotSet::kBitsPerCellLog2 + kTaggedSizeLog2 - + SlotSet::kCellSizeBytesLog2), + IntPtrConstant((SlotSet::kCellsPerBucket - 1) + << SlotSet::kCellSizeBytesLog2)); + TNode<IntPtrT> cell_address = + UncheckedCast<IntPtrT>(IntPtrAdd(bucket, cell_offset)); + TNode<IntPtrT> old_cell_value = + ChangeInt32ToIntPtr(Load<Int32T>(cell_address)); + + // Calculate new cell value + TNode<WordT> bit_index = WordAnd(WordShr(slot_offset, kTaggedSizeLog2), + IntPtrConstant(SlotSet::kBitsPerCell - 1)); + TNode<IntPtrT> new_cell_value = UncheckedCast<IntPtrT>( + WordOr(old_cell_value, WordShl(IntPtrConstant(1), bit_index))); + + // Update cell value + StoreNoWriteBarrier(MachineRepresentation::kWord32, cell_address, + TruncateIntPtrToInt32(new_cell_value)); } }; @@ -399,7 +445,10 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { TNode<ExternalReference> isolate_constant = ExternalConstant(ExternalReference::isolate_address(isolate())); Node* fp_mode = Parameter(Descriptor::kFPMode); - InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode, &exit); + TNode<IntPtrT> object = + BitcastTaggedToWord(Parameter(Descriptor::kObject)); + InsertIntoRememberedSetAndGoto(isolate_constant, object, slot, fp_mode, + &exit); } BIND(&store_buffer_incremental_wb); @@ -407,8 +456,10 @@ TF_BUILTIN(RecordWrite, RecordWriteCodeStubAssembler) { TNode<ExternalReference> isolate_constant = ExternalConstant(ExternalReference::isolate_address(isolate())); Node* fp_mode = Parameter(Descriptor::kFPMode); - InsertToStoreBufferAndGoto(isolate_constant, slot, fp_mode, - &incremental_wb); + TNode<IntPtrT> object = + BitcastTaggedToWord(Parameter(Descriptor::kObject)); + InsertIntoRememberedSetAndGoto(isolate_constant, object, slot, fp_mode, + &incremental_wb); } } @@ -532,8 +583,8 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { TNode<Smi> language_mode = CAST(Parameter(Descriptor::kLanguageMode)); TNode<Context> context = CAST(Parameter(Descriptor::kContext)); - VARIABLE(var_index, MachineType::PointerRepresentation()); - VARIABLE(var_unique, MachineRepresentation::kTagged, key); + TVARIABLE(IntPtrT, var_index); + TVARIABLE(Name, var_unique); Label if_index(this), if_unique_name(this), if_notunique(this), if_notfound(this), slow(this), if_proxy(this); @@ -554,8 +605,7 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { BIND(&if_unique_name); { Comment("key is unique name"); - TNode<Name> unique = CAST(var_unique.value()); - CheckForAssociatedProtector(unique, &slow); + CheckForAssociatedProtector(var_unique.value(), &slow); Label dictionary(this), dont_delete(this); GotoIf(IsDictionaryMap(receiver_map), &dictionary); @@ -570,8 +620,8 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { TNode<NameDictionary> properties = CAST(LoadSlowProperties(CAST(receiver))); - DeleteDictionaryProperty(receiver, properties, unique, context, - &dont_delete, &if_notfound); + DeleteDictionaryProperty(receiver, properties, var_unique.value(), + context, &dont_delete, &if_notfound); } BIND(&dont_delete); @@ -587,7 +637,7 @@ TF_BUILTIN(DeleteProperty, DeletePropertyBaseAssembler) { { // If the string was not found in the string table, then no object can // have a property with that name. - TryInternalizeString(key, &if_index, &var_index, &if_unique_name, + TryInternalizeString(CAST(key), &if_index, &var_index, &if_unique_name, &var_unique, &if_notfound, &slow); } @@ -719,11 +769,11 @@ TF_BUILTIN(SetDataProperties, SetOrCopyDataPropertiesAssembler) { } TF_BUILTIN(ForInEnumerate, CodeStubAssembler) { - Node* receiver = Parameter(Descriptor::kReceiver); - Node* context = Parameter(Descriptor::kContext); + TNode<HeapObject> receiver = CAST(Parameter(Descriptor::kReceiver)); + TNode<Context> context = CAST(Parameter(Descriptor::kContext)); Label if_empty(this), if_runtime(this, Label::kDeferred); - Node* receiver_map = CheckEnumCache(receiver, &if_empty, &if_runtime); + TNode<Map> receiver_map = CheckEnumCache(receiver, &if_empty, &if_runtime); Return(receiver_map); BIND(&if_empty); @@ -934,12 +984,6 @@ void Builtins::Generate_MemCopyUint8Uint8(MacroAssembler* masm) { } #endif // !defined(V8_TARGET_ARCH_ARM) && !defined(V8_TARGET_ARCH_MIPS) -#ifndef V8_TARGET_ARCH_ARM -void Builtins::Generate_MemCopyUint16Uint8(MacroAssembler* masm) { - masm->Call(BUILTIN_CODE(masm->isolate(), Illegal), RelocInfo::CODE_TARGET); -} -#endif // V8_TARGET_ARCH_ARM - #ifndef V8_TARGET_ARCH_IA32 void Builtins::Generate_MemMove(MacroAssembler* masm) { masm->Call(BUILTIN_CODE(masm->isolate(), Illegal), RelocInfo::CODE_TARGET); |