Index: src/code-stub-assembler.cc |
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc |
index 796bd880d00eaae510b61d1e3037376552b1e7de..b03007755e5ee12c68c7a7747f02f13d67c197b1 100644 |
--- a/src/code-stub-assembler.cc |
+++ b/src/code-stub-assembler.cc |
@@ -1336,14 +1336,12 @@ |
Node* CodeStubAssembler::StoreFixedArrayElement(Node* object, Node* index_node, |
Node* value, |
WriteBarrierMode barrier_mode, |
- int additional_offset, |
ParameterMode parameter_mode) { |
DCHECK(barrier_mode == SKIP_WRITE_BARRIER || |
barrier_mode == UPDATE_WRITE_BARRIER); |
- int header_size = |
- FixedArray::kHeaderSize + additional_offset - kHeapObjectTag; |
- Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_ELEMENTS, |
- parameter_mode, header_size); |
+ Node* offset = |
+ 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); |
@@ -4038,55 +4036,19 @@ |
MachineType::PointerRepresentation()); |
} |
-template <class Dictionary> |
-Node* CodeStubAssembler::GetNumberOfElements(Node* dictionary) { |
- return LoadFixedArrayElement( |
- dictionary, IntPtrConstant(Dictionary::kNumberOfElementsIndex), 0, |
- INTPTR_PARAMETERS); |
-} |
- |
-template <class Dictionary> |
-void CodeStubAssembler::SetNumberOfElements(Node* dictionary, |
- Node* num_elements_smi) { |
- StoreFixedArrayElement(dictionary, Dictionary::kNumberOfElementsIndex, |
- num_elements_smi, SKIP_WRITE_BARRIER); |
-} |
- |
-template <class Dictionary> |
-Node* CodeStubAssembler::GetCapacity(Node* dictionary) { |
- return LoadFixedArrayElement(dictionary, |
- IntPtrConstant(Dictionary::kCapacityIndex), 0, |
- INTPTR_PARAMETERS); |
-} |
- |
-template <class Dictionary> |
-Node* CodeStubAssembler::GetNextEnumerationIndex(Node* dictionary) { |
- return LoadFixedArrayElement( |
- dictionary, IntPtrConstant(Dictionary::kNextEnumerationIndexIndex), 0, |
- INTPTR_PARAMETERS); |
-} |
- |
-template <class Dictionary> |
-void CodeStubAssembler::SetNextEnumerationIndex(Node* dictionary, |
- Node* next_enum_index_smi) { |
- StoreFixedArrayElement(dictionary, Dictionary::kNextEnumerationIndexIndex, |
- next_enum_index_smi, SKIP_WRITE_BARRIER); |
-} |
- |
template <typename Dictionary> |
void CodeStubAssembler::NameDictionaryLookup(Node* dictionary, |
Node* unique_name, Label* if_found, |
Variable* var_name_index, |
Label* if_not_found, |
- int inlined_probes, |
- LookupMode mode) { |
+ int inlined_probes) { |
CSA_ASSERT(this, IsDictionary(dictionary)); |
DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); |
- DCHECK_IMPLIES(mode == kFindInsertionIndex, |
- inlined_probes == 0 && if_found == nullptr); |
Comment("NameDictionaryLookup"); |
- Node* capacity = SmiUntag(GetCapacity<Dictionary>(dictionary)); |
+ Node* capacity = SmiUntag(LoadFixedArrayElement( |
+ dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, |
+ INTPTR_PARAMETERS)); |
Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); |
Node* hash = ChangeUint32ToWord(LoadNameHash(unique_name)); |
@@ -4106,13 +4068,8 @@ |
count = IntPtrConstant(i + 1); |
entry = WordAnd(IntPtrAdd(entry, count), mask); |
} |
- if (mode == kFindInsertionIndex) { |
- // Appease the variable merging algorithm for "Goto(&loop)" below. |
- var_name_index->Bind(IntPtrConstant(0)); |
- } |
Node* undefined = UndefinedConstant(); |
- Node* the_hole = mode == kFindExisting ? nullptr : TheHoleConstant(); |
Variable var_count(this, MachineType::PointerRepresentation()); |
Variable var_entry(this, MachineType::PointerRepresentation()); |
@@ -4132,12 +4089,7 @@ |
Node* current = |
LoadFixedArrayElement(dictionary, index, 0, INTPTR_PARAMETERS); |
GotoIf(WordEqual(current, undefined), if_not_found); |
- if (mode == kFindExisting) { |
- GotoIf(WordEqual(current, unique_name), if_found); |
- } else { |
- DCHECK_EQ(kFindInsertionIndex, mode); |
- GotoIf(WordEqual(current, the_hole), if_not_found); |
- } |
+ GotoIf(WordEqual(current, unique_name), if_found); |
// See Dictionary::NextProbe(). |
count = IntPtrAdd(count, IntPtrConstant(1)); |
@@ -4151,9 +4103,9 @@ |
// Instantiate template methods to workaround GCC compilation issue. |
template void CodeStubAssembler::NameDictionaryLookup<NameDictionary>( |
- Node*, Node*, Label*, Variable*, Label*, int, LookupMode); |
+ Node*, Node*, Label*, Variable*, Label*, int); |
template void CodeStubAssembler::NameDictionaryLookup<GlobalDictionary>( |
- Node*, Node*, Label*, Variable*, Label*, int, LookupMode); |
+ Node*, Node*, Label*, Variable*, Label*, int); |
Node* CodeStubAssembler::ComputeIntegerHash(Node* key, Node* seed) { |
// See v8::internal::ComputeIntegerHash() |
@@ -4179,7 +4131,9 @@ |
DCHECK_EQ(MachineType::PointerRepresentation(), var_entry->rep()); |
Comment("NumberDictionaryLookup"); |
- Node* capacity = SmiUntag(GetCapacity<Dictionary>(dictionary)); |
+ Node* capacity = SmiUntag(LoadFixedArrayElement( |
+ dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, |
+ INTPTR_PARAMETERS)); |
Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); |
Node* int32_seed; |
@@ -4242,118 +4196,6 @@ |
Goto(&loop); |
} |
} |
- |
-template <class Dictionary> |
-void CodeStubAssembler::FindInsertionEntry(Node* dictionary, Node* key, |
- Variable* var_key_index) { |
- UNREACHABLE(); |
-} |
- |
-template <> |
-void CodeStubAssembler::FindInsertionEntry<NameDictionary>( |
- Node* dictionary, Node* key, Variable* var_key_index) { |
- Label done(this); |
- NameDictionaryLookup<NameDictionary>(dictionary, key, nullptr, var_key_index, |
- &done, 0, kFindInsertionIndex); |
- Bind(&done); |
-} |
- |
-template <class Dictionary> |
-void CodeStubAssembler::InsertEntry(Node* dictionary, Node* key, Node* value, |
- Node* index, Node* enum_index) { |
- UNREACHABLE(); // Use specializations instead. |
-} |
- |
-template <> |
-void CodeStubAssembler::InsertEntry<NameDictionary>(Node* dictionary, |
- Node* name, Node* value, |
- Node* index, |
- Node* enum_index) { |
- // Store name and value. |
- StoreFixedArrayElement(dictionary, index, name, UPDATE_WRITE_BARRIER, 0, |
- INTPTR_PARAMETERS); |
- const int kNameToValueOffset = |
- (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * |
- kPointerSize; |
- StoreFixedArrayElement(dictionary, index, value, UPDATE_WRITE_BARRIER, |
- kNameToValueOffset, INTPTR_PARAMETERS); |
- |
- // Prepare details of the new property. |
- Variable var_details(this, MachineRepresentation::kTaggedSigned); |
- const int kInitialIndex = 0; |
- PropertyDetails d(NONE, DATA, kInitialIndex, PropertyCellType::kNoCell); |
- enum_index = |
- WordShl(enum_index, PropertyDetails::DictionaryStorageField::kShift); |
- STATIC_ASSERT(kInitialIndex == 0); |
- var_details.Bind(WordOr(SmiConstant(d.AsSmi()), enum_index)); |
- |
- // Private names must be marked non-enumerable. |
- Label not_private(this, &var_details); |
- GotoUnless(IsSymbolMap(LoadMap(name)), ¬_private); |
- Node* flags = SmiToWord32(LoadObjectField(name, Symbol::kFlagsOffset)); |
- const int kPrivateMask = 1 << Symbol::kPrivateBit; |
- GotoUnless(IsSetWord32(flags, kPrivateMask), ¬_private); |
- Node* dont_enum = |
- WordShl(SmiConstant(DONT_ENUM), PropertyDetails::AttributesField::kShift); |
- var_details.Bind(WordOr(var_details.value(), dont_enum)); |
- Goto(¬_private); |
- Bind(¬_private); |
- |
- // Finally, store the details. |
- const int kNameToDetailsOffset = |
- (NameDictionary::kEntryDetailsIndex - NameDictionary::kEntryKeyIndex) * |
- kPointerSize; |
- StoreFixedArrayElement(dictionary, index, var_details.value(), |
- SKIP_WRITE_BARRIER, kNameToDetailsOffset, |
- INTPTR_PARAMETERS); |
-} |
- |
-template <> |
-void CodeStubAssembler::InsertEntry<GlobalDictionary>(Node* dictionary, |
- Node* key, Node* value, |
- Node* index, |
- Node* enum_index) { |
- UNIMPLEMENTED(); |
-} |
- |
-template <class Dictionary> |
-void CodeStubAssembler::Add(Node* dictionary, Node* key, Node* value, |
- Label* bailout) { |
- Node* capacity = GetCapacity<Dictionary>(dictionary); |
- Node* nof = GetNumberOfElements<Dictionary>(dictionary); |
- Node* new_nof = SmiAdd(nof, SmiConstant(1)); |
- // Require 33% to still be free after adding additional_elements. |
- // This is a simplification of the C++ implementation's behavior, which |
- // also rehashes the dictionary when there are too many deleted elements. |
- // Computing "x + (x >> 1)" on a Smi x does not return a valid Smi! |
- // But that's OK here because it's only used for a comparison. |
- Node* required_capacity_pseudo_smi = SmiAdd(new_nof, WordShr(new_nof, 1)); |
- GotoIf(UintPtrLessThan(capacity, required_capacity_pseudo_smi), bailout); |
- Node* enum_index = nullptr; |
- if (Dictionary::kIsEnumerable) { |
- enum_index = GetNextEnumerationIndex<Dictionary>(dictionary); |
- Node* new_enum_index = SmiAdd(enum_index, SmiConstant(1)); |
- Node* max_enum_index = |
- SmiConstant(PropertyDetails::DictionaryStorageField::kMax); |
- GotoIf(UintPtrGreaterThan(new_enum_index, max_enum_index), bailout); |
- |
- // No more bailouts after this point. |
- // Operations from here on can have side effects. |
- |
- SetNextEnumerationIndex<Dictionary>(dictionary, new_enum_index); |
- } else { |
- USE(enum_index); |
- } |
- SetNumberOfElements<Dictionary>(dictionary, new_nof); |
- |
- Variable var_key_index(this, MachineType::PointerRepresentation()); |
- FindInsertionEntry<Dictionary>(dictionary, key, &var_key_index); |
- InsertEntry<Dictionary>(dictionary, key, value, var_key_index.value(), |
- enum_index); |
-} |
- |
-template void CodeStubAssembler::Add<NameDictionary>(Node*, Node*, Node*, |
- Label*); |
void CodeStubAssembler::DescriptorLookupLinear(Node* unique_name, |
Node* descriptors, Node* nof, |
@@ -5352,7 +5194,7 @@ |
var_result.Bind(result); |
} else { |
StoreFixedArrayElement(the_context, mapped_index, value, |
- UPDATE_WRITE_BARRIER, 0, INTPTR_PARAMETERS); |
+ UPDATE_WRITE_BARRIER, INTPTR_PARAMETERS); |
} |
Goto(&end); |
} |
@@ -5375,7 +5217,7 @@ |
GotoIf(WordEqual(result, TheHoleConstant()), bailout); |
var_result.Bind(result); |
} else { |
- StoreFixedArrayElement(backing_store, key, value, UPDATE_WRITE_BARRIER, 0, |
+ StoreFixedArrayElement(backing_store, key, value, UPDATE_WRITE_BARRIER, |
INTPTR_PARAMETERS); |
} |
Goto(&end); |
@@ -5458,7 +5300,7 @@ |
value = Float64SilenceNaN(value); |
StoreFixedDoubleArrayElement(elements, index, value, mode); |
} else { |
- StoreFixedArrayElement(elements, index, value, barrier_mode, 0, mode); |
+ StoreFixedArrayElement(elements, index, value, barrier_mode, mode); |
} |
} |
@@ -5850,7 +5692,7 @@ |
StoreObjectField(site, AllocationSite::kWeakNextOffset, next_site); |
StoreNoWriteBarrier(MachineRepresentation::kTagged, site_list, site); |
- StoreFixedArrayElement(feedback_vector, slot, site, UPDATE_WRITE_BARRIER, 0, |
+ StoreFixedArrayElement(feedback_vector, slot, site, UPDATE_WRITE_BARRIER, |
CodeStubAssembler::SMI_PARAMETERS); |
return site; |
} |
@@ -5868,7 +5710,7 @@ |
Heap::kTheHoleValueRootIndex); |
// Store the WeakCell in the feedback vector. |
- StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, 0, |
+ StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, |
CodeStubAssembler::SMI_PARAMETERS); |
return cell; |
} |