| Index: src/code-stub-assembler.cc
|
| diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
|
| index 151a13f86467677376034827f1b084f2c5adf1a9..8615c2b9c8ecf329b578dc62f679e8edf22bcc3e 100644
|
| --- a/src/code-stub-assembler.cc
|
| +++ b/src/code-stub-assembler.cc
|
| @@ -1073,7 +1073,7 @@ Node* CodeStubAssembler::LoadNameHashField(Node* name) {
|
| Node* CodeStubAssembler::LoadNameHash(Node* name, Label* if_hash_not_computed) {
|
| Node* hash_field = LoadNameHashField(name);
|
| if (if_hash_not_computed != nullptr) {
|
| - GotoIf(WordEqual(
|
| + GotoIf(Word32Equal(
|
| Word32And(hash_field, Int32Constant(Name::kHashNotComputedMask)),
|
| Int32Constant(0)),
|
| if_hash_not_computed);
|
| @@ -2298,9 +2298,9 @@ void CodeStubAssembler::TryToName(Node* key, Label* if_keyisindex,
|
|
|
| template <typename Dictionary>
|
| Node* CodeStubAssembler::EntryToIndex(Node* entry, int field_index) {
|
| - Node* entry_index = Int32Mul(entry, Int32Constant(Dictionary::kEntrySize));
|
| - return Int32Add(entry_index,
|
| - Int32Constant(Dictionary::kElementsStartIndex + field_index));
|
| + Node* entry_index = IntPtrMul(entry, IntPtrConstant(Dictionary::kEntrySize));
|
| + return IntPtrAdd(entry_index, IntPtrConstant(Dictionary::kElementsStartIndex +
|
| + field_index));
|
| }
|
|
|
| template <typename Dictionary>
|
| @@ -2309,34 +2309,36 @@ void CodeStubAssembler::NameDictionaryLookup(Node* dictionary,
|
| Variable* var_name_index,
|
| Label* if_not_found,
|
| int inlined_probes) {
|
| - DCHECK_EQ(MachineRepresentation::kWord32, var_name_index->rep());
|
| + DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep());
|
| Comment("NameDictionaryLookup");
|
|
|
| - Node* capacity = LoadAndUntagToWord32FixedArrayElement(
|
| - dictionary, Int32Constant(Dictionary::kCapacityIndex));
|
| - Node* mask = Int32Sub(capacity, Int32Constant(1));
|
| - Node* hash = LoadNameHash(unique_name);
|
| + Node* capacity = SmiUntag(LoadFixedArrayElement(
|
| + dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0,
|
| + INTPTR_PARAMETERS));
|
| + Node* mask = IntPtrSub(capacity, IntPtrConstant(1));
|
| + Node* hash = ChangeUint32ToWord(LoadNameHash(unique_name));
|
|
|
| // See Dictionary::FirstProbe().
|
| - Node* count = Int32Constant(0);
|
| - Node* entry = Word32And(hash, mask);
|
| + Node* count = IntPtrConstant(0);
|
| + Node* entry = WordAnd(hash, mask);
|
|
|
| for (int i = 0; i < inlined_probes; i++) {
|
| Node* index = EntryToIndex<Dictionary>(entry);
|
| var_name_index->Bind(index);
|
|
|
| - Node* current = LoadFixedArrayElement(dictionary, index);
|
| + Node* current =
|
| + LoadFixedArrayElement(dictionary, index, 0, INTPTR_PARAMETERS);
|
| GotoIf(WordEqual(current, unique_name), if_found);
|
|
|
| // See Dictionary::NextProbe().
|
| - count = Int32Constant(i + 1);
|
| - entry = Word32And(Int32Add(entry, count), mask);
|
| + count = IntPtrConstant(i + 1);
|
| + entry = WordAnd(IntPtrAdd(entry, count), mask);
|
| }
|
|
|
| Node* undefined = UndefinedConstant();
|
|
|
| - Variable var_count(this, MachineRepresentation::kWord32);
|
| - Variable var_entry(this, MachineRepresentation::kWord32);
|
| + Variable var_count(this, MachineType::PointerRepresentation());
|
| + Variable var_entry(this, MachineType::PointerRepresentation());
|
| Variable* loop_vars[] = {&var_count, &var_entry, var_name_index};
|
| Label loop(this, 3, loop_vars);
|
| var_count.Bind(count);
|
| @@ -2350,13 +2352,14 @@ void CodeStubAssembler::NameDictionaryLookup(Node* dictionary,
|
| Node* index = EntryToIndex<Dictionary>(entry);
|
| var_name_index->Bind(index);
|
|
|
| - Node* current = LoadFixedArrayElement(dictionary, index);
|
| + Node* current =
|
| + LoadFixedArrayElement(dictionary, index, 0, INTPTR_PARAMETERS);
|
| GotoIf(WordEqual(current, undefined), if_not_found);
|
| GotoIf(WordEqual(current, unique_name), if_found);
|
|
|
| // See Dictionary::NextProbe().
|
| - count = Int32Add(count, Int32Constant(1));
|
| - entry = Word32And(Int32Add(entry, count), mask);
|
| + count = IntPtrAdd(count, IntPtrConstant(1));
|
| + entry = WordAnd(IntPtrAdd(entry, count), mask);
|
|
|
| var_count.Bind(count);
|
| var_entry.Bind(entry);
|
| @@ -2390,30 +2393,31 @@ void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary,
|
| Label* if_found,
|
| Variable* var_entry,
|
| Label* if_not_found) {
|
| - DCHECK_EQ(MachineRepresentation::kWord32, var_entry->rep());
|
| + DCHECK_EQ(MachineType::PointerRepresentation(), var_entry->rep());
|
| Comment("NumberDictionaryLookup");
|
|
|
| - Node* capacity = LoadAndUntagToWord32FixedArrayElement(
|
| - dictionary, Int32Constant(Dictionary::kCapacityIndex));
|
| - Node* mask = Int32Sub(capacity, Int32Constant(1));
|
| + Node* capacity = SmiUntag(LoadFixedArrayElement(
|
| + dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0,
|
| + INTPTR_PARAMETERS));
|
| + Node* mask = IntPtrSub(capacity, IntPtrConstant(1));
|
|
|
| - Node* seed;
|
| + Node* int32_seed;
|
| if (Dictionary::ShapeT::UsesSeed) {
|
| - seed = HashSeed();
|
| + int32_seed = HashSeed();
|
| } else {
|
| - seed = Int32Constant(kZeroHashSeed);
|
| + int32_seed = Int32Constant(kZeroHashSeed);
|
| }
|
| - Node* hash = ComputeIntegerHash(intptr_index, seed);
|
| + Node* hash = ChangeUint32ToWord(ComputeIntegerHash(intptr_index, int32_seed));
|
| Node* key_as_float64 = RoundIntPtrToFloat64(intptr_index);
|
|
|
| // See Dictionary::FirstProbe().
|
| - Node* count = Int32Constant(0);
|
| - Node* entry = Word32And(hash, mask);
|
| + Node* count = IntPtrConstant(0);
|
| + Node* entry = WordAnd(hash, mask);
|
|
|
| Node* undefined = UndefinedConstant();
|
| Node* the_hole = TheHoleConstant();
|
|
|
| - Variable var_count(this, MachineRepresentation::kWord32);
|
| + Variable var_count(this, MachineType::PointerRepresentation());
|
| Variable* loop_vars[] = {&var_count, var_entry};
|
| Label loop(this, 2, loop_vars);
|
| var_count.Bind(count);
|
| @@ -2425,7 +2429,8 @@ void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary,
|
| Node* entry = var_entry->value();
|
|
|
| Node* index = EntryToIndex<Dictionary>(entry);
|
| - Node* current = LoadFixedArrayElement(dictionary, index);
|
| + Node* current =
|
| + LoadFixedArrayElement(dictionary, index, 0, INTPTR_PARAMETERS);
|
| GotoIf(WordEqual(current, undefined), if_not_found);
|
| Label next_probe(this);
|
| {
|
| @@ -2448,8 +2453,8 @@ void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary,
|
|
|
| Bind(&next_probe);
|
| // See Dictionary::NextProbe().
|
| - count = Int32Add(count, Int32Constant(1));
|
| - entry = Word32And(Int32Add(entry, count), mask);
|
| + count = IntPtrAdd(count, IntPtrConstant(1));
|
| + entry = WordAnd(IntPtrAdd(entry, count), mask);
|
|
|
| var_count.Bind(count);
|
| var_entry->Bind(entry);
|
| @@ -2463,7 +2468,7 @@ void CodeStubAssembler::TryLookupProperty(
|
| Variable* var_meta_storage, Variable* var_name_index, Label* if_not_found,
|
| Label* if_bailout) {
|
| DCHECK_EQ(MachineRepresentation::kTagged, var_meta_storage->rep());
|
| - DCHECK_EQ(MachineRepresentation::kWord32, var_name_index->rep());
|
| + DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep());
|
|
|
| Label if_objectisspecial(this);
|
| STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE);
|
| @@ -2483,34 +2488,35 @@ void CodeStubAssembler::TryLookupProperty(
|
| Bind(&if_isfastmap);
|
| {
|
| Comment("DescriptorArrayLookup");
|
| - Node* nof = BitFieldDecode<Map::NumberOfOwnDescriptorsBits>(bit_field3);
|
| + Node* nof = BitFieldDecodeWord<Map::NumberOfOwnDescriptorsBits>(bit_field3);
|
| // Bail out to the runtime for large numbers of own descriptors. The stub
|
| // only does linear search, which becomes too expensive in that case.
|
| {
|
| static const int32_t kMaxLinear = 210;
|
| - GotoIf(Int32GreaterThan(nof, Int32Constant(kMaxLinear)), if_bailout);
|
| + GotoIf(UintPtrGreaterThan(nof, IntPtrConstant(kMaxLinear)), if_bailout);
|
| }
|
| Node* descriptors = LoadMapDescriptors(map);
|
| var_meta_storage->Bind(descriptors);
|
|
|
| - Variable var_descriptor(this, MachineRepresentation::kWord32);
|
| + Variable var_descriptor(this, MachineType::PointerRepresentation());
|
| Label loop(this, &var_descriptor);
|
| - var_descriptor.Bind(Int32Constant(0));
|
| + var_descriptor.Bind(IntPtrConstant(0));
|
| Goto(&loop);
|
| Bind(&loop);
|
| {
|
| Node* index = var_descriptor.value();
|
| - Node* name_offset = Int32Constant(DescriptorArray::ToKeyIndex(0));
|
| - Node* factor = Int32Constant(DescriptorArray::kDescriptorSize);
|
| - GotoIf(Word32Equal(index, nof), if_not_found);
|
| + Node* name_offset = IntPtrConstant(DescriptorArray::ToKeyIndex(0));
|
| + Node* factor = IntPtrConstant(DescriptorArray::kDescriptorSize);
|
| + GotoIf(WordEqual(index, nof), if_not_found);
|
|
|
| - Node* name_index = Int32Add(name_offset, Int32Mul(index, factor));
|
| - Node* name = LoadFixedArrayElement(descriptors, name_index);
|
| + Node* name_index = IntPtrAdd(name_offset, IntPtrMul(index, factor));
|
| + Node* name =
|
| + LoadFixedArrayElement(descriptors, name_index, 0, INTPTR_PARAMETERS);
|
|
|
| var_name_index->Bind(name_index);
|
| GotoIf(WordEqual(name, unique_name), if_found_fast);
|
|
|
| - var_descriptor.Bind(Int32Add(index, Int32Constant(1)));
|
| + var_descriptor.Bind(IntPtrAdd(index, IntPtrConstant(1)));
|
| Goto(&loop);
|
| }
|
| }
|
| @@ -2551,7 +2557,7 @@ void CodeStubAssembler::TryHasOwnProperty(compiler::Node* object,
|
| Label* if_bailout) {
|
| Comment("TryHasOwnProperty");
|
| Variable var_meta_storage(this, MachineRepresentation::kTagged);
|
| - Variable var_name_index(this, MachineRepresentation::kWord32);
|
| + Variable var_name_index(this, MachineType::PointerRepresentation());
|
|
|
| Label if_found_global(this);
|
| TryLookupProperty(object, map, instance_type, unique_name, if_found, if_found,
|
| @@ -2736,7 +2742,7 @@ void CodeStubAssembler::TryGetOwnProperty(
|
| Comment("TryGetOwnProperty");
|
|
|
| Variable var_meta_storage(this, MachineRepresentation::kTagged);
|
| - Variable var_entry(this, MachineRepresentation::kWord32);
|
| + Variable var_entry(this, MachineType::PointerRepresentation());
|
|
|
| Label if_found_fast(this), if_found_dict(this), if_found_global(this);
|
|
|
| @@ -2892,7 +2898,7 @@ void CodeStubAssembler::TryLookupElement(Node* object, Node* map,
|
| }
|
| Bind(&if_isdictionary);
|
| {
|
| - Variable var_entry(this, MachineRepresentation::kWord32);
|
| + Variable var_entry(this, MachineType::PointerRepresentation());
|
| Node* elements = LoadElements(object);
|
| NumberDictionaryLookup<SeededNumberDictionary>(
|
| elements, intptr_index, if_found, &var_entry, if_not_found);
|
| @@ -3312,13 +3318,13 @@ void CodeStubAssembler::HandlePolymorphicCase(
|
|
|
| for (int i = 0; i < unroll_count; i++) {
|
| Label next_entry(this);
|
| - Node* cached_map = LoadWeakCellValue(
|
| - LoadFixedArrayElement(feedback, Int32Constant(i * kEntrySize)));
|
| + Node* cached_map = LoadWeakCellValue(LoadFixedArrayElement(
|
| + feedback, IntPtrConstant(i * kEntrySize), 0, INTPTR_PARAMETERS));
|
| GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry);
|
|
|
| // Found, now call handler.
|
| - Node* handler =
|
| - LoadFixedArrayElement(feedback, Int32Constant(i * kEntrySize + 1));
|
| + Node* handler = LoadFixedArrayElement(
|
| + feedback, IntPtrConstant(i * kEntrySize + 1), 0, INTPTR_PARAMETERS);
|
| var_handler->Bind(handler);
|
| Goto(if_handler);
|
|
|
| @@ -3327,28 +3333,29 @@ void CodeStubAssembler::HandlePolymorphicCase(
|
| Node* length = LoadAndUntagFixedArrayBaseLength(feedback);
|
|
|
| // Loop from {unroll_count}*kEntrySize to {length}.
|
| - Variable var_index(this, MachineRepresentation::kWord32);
|
| + Variable var_index(this, MachineType::PointerRepresentation());
|
| Label loop(this, &var_index);
|
| - var_index.Bind(Int32Constant(unroll_count * kEntrySize));
|
| + var_index.Bind(IntPtrConstant(unroll_count * kEntrySize));
|
| Goto(&loop);
|
| Bind(&loop);
|
| {
|
| Node* index = var_index.value();
|
| - GotoIf(Int32GreaterThanOrEqual(index, length), if_miss);
|
| + GotoIf(UintPtrGreaterThanOrEqual(index, length), if_miss);
|
|
|
| - Node* cached_map =
|
| - LoadWeakCellValue(LoadFixedArrayElement(feedback, index));
|
| + Node* cached_map = LoadWeakCellValue(
|
| + LoadFixedArrayElement(feedback, index, 0, INTPTR_PARAMETERS));
|
|
|
| Label next_entry(this);
|
| GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry);
|
|
|
| // Found, now call handler.
|
| - Node* handler = LoadFixedArrayElement(feedback, index, kPointerSize);
|
| + Node* handler =
|
| + LoadFixedArrayElement(feedback, index, kPointerSize, INTPTR_PARAMETERS);
|
| var_handler->Bind(handler);
|
| Goto(if_handler);
|
|
|
| Bind(&next_entry);
|
| - var_index.Bind(Int32Add(index, Int32Constant(kEntrySize)));
|
| + var_index.Bind(IntPtrAdd(index, IntPtrConstant(kEntrySize)));
|
| Goto(&loop);
|
| }
|
| }
|
| @@ -3359,7 +3366,7 @@ compiler::Node* CodeStubAssembler::StubCachePrimaryOffset(compiler::Node* name,
|
| STATIC_ASSERT(StubCache::kCacheIndexShift == Name::kHashShift);
|
| // Compute the hash of the name (use entire hash field).
|
| Node* hash_field = LoadNameHashField(name);
|
| - Assert(WordEqual(
|
| + Assert(Word32Equal(
|
| Word32And(hash_field, Int32Constant(Name::kHashNotComputedMask)),
|
| Int32Constant(0)));
|
|
|
| @@ -3371,7 +3378,7 @@ compiler::Node* CodeStubAssembler::StubCachePrimaryOffset(compiler::Node* name,
|
| hash = Word32Xor(hash, Int32Constant(StubCache::kPrimaryMagic));
|
| uint32_t mask = (StubCache::kPrimaryTableSize - 1)
|
| << StubCache::kCacheIndexShift;
|
| - return Word32And(hash, Int32Constant(mask));
|
| + return ChangeUint32ToWord(Word32And(hash, Int32Constant(mask)));
|
| }
|
|
|
| compiler::Node* CodeStubAssembler::StubCacheSecondaryOffset(
|
| @@ -3383,7 +3390,7 @@ compiler::Node* CodeStubAssembler::StubCacheSecondaryOffset(
|
| hash = Int32Add(hash, Int32Constant(StubCache::kSecondaryMagic));
|
| int32_t mask = (StubCache::kSecondaryTableSize - 1)
|
| << StubCache::kCacheIndexShift;
|
| - return Word32And(hash, Int32Constant(mask));
|
| + return ChangeUint32ToWord(Word32And(hash, Int32Constant(mask)));
|
| }
|
|
|
| enum CodeStubAssembler::StubCacheTable : int {
|
| @@ -3408,7 +3415,7 @@ void CodeStubAssembler::TryProbeStubCacheTable(
|
| // The {table_offset} holds the entry offset times four (due to masking
|
| // and shifting optimizations).
|
| const int kMultiplier = sizeof(StubCache::Entry) >> Name::kHashShift;
|
| - entry_offset = Int32Mul(entry_offset, Int32Constant(kMultiplier));
|
| + entry_offset = IntPtrMul(entry_offset, IntPtrConstant(kMultiplier));
|
|
|
| // Check that the key in the entry matches the name.
|
| Node* key_base =
|
| @@ -3421,13 +3428,13 @@ void CodeStubAssembler::TryProbeStubCacheTable(
|
| stub_cache->key_reference(table).address());
|
| Node* entry_map =
|
| Load(MachineType::Pointer(), key_base,
|
| - Int32Add(entry_offset, Int32Constant(kPointerSize * 2)));
|
| + IntPtrAdd(entry_offset, IntPtrConstant(kPointerSize * 2)));
|
| GotoIf(WordNotEqual(map, entry_map), if_miss);
|
|
|
| DCHECK_EQ(kPointerSize, stub_cache->value_reference(table).address() -
|
| stub_cache->key_reference(table).address());
|
| Node* code = Load(MachineType::Pointer(), key_base,
|
| - Int32Add(entry_offset, Int32Constant(kPointerSize)));
|
| + IntPtrAdd(entry_offset, IntPtrConstant(kPointerSize)));
|
|
|
| // We found the handler.
|
| var_handler->Bind(code);
|
| @@ -3496,7 +3503,7 @@ void CodeStubAssembler::EmitFastElementsBoundsCheck(Node* object,
|
| Node* intptr_index,
|
| Node* is_jsarray_condition,
|
| Label* miss) {
|
| - Variable var_length(this, MachineRepresentation::kTagged);
|
| + Variable var_length(this, MachineType::PointerRepresentation());
|
| Label if_array(this), length_loaded(this, &var_length);
|
| GotoIf(is_jsarray_condition, &if_array);
|
| {
|
| @@ -3606,7 +3613,7 @@ void CodeStubAssembler::EmitElementLoad(Node* object, Node* elements,
|
| {
|
| Comment("dictionary elements");
|
| GotoIf(IntPtrLessThan(intptr_index, IntPtrConstant(0)), out_of_bounds);
|
| - Variable var_entry(this, MachineRepresentation::kWord32);
|
| + Variable var_entry(this, MachineType::PointerRepresentation());
|
| Label if_found(this);
|
| NumberDictionaryLookup<SeededNumberDictionary>(
|
| elements, intptr_index, &if_found, &var_entry, if_hole);
|
| @@ -3614,14 +3621,15 @@ void CodeStubAssembler::EmitElementLoad(Node* object, Node* elements,
|
| // Check that the value is a data property.
|
| Node* details_index = EntryToIndex<SeededNumberDictionary>(
|
| var_entry.value(), SeededNumberDictionary::kEntryDetailsIndex);
|
| - Node* details = SmiToWord32(LoadFixedArrayElement(elements, details_index));
|
| + Node* details = SmiToWord32(
|
| + LoadFixedArrayElement(elements, details_index, 0, INTPTR_PARAMETERS));
|
| Node* kind = BitFieldDecode<PropertyDetails::KindField>(details);
|
| // TODO(jkummerow): Support accessors without missing?
|
| GotoUnless(Word32Equal(kind, Int32Constant(kData)), miss);
|
| // Finally, load the value.
|
| Node* value_index = EntryToIndex<SeededNumberDictionary>(
|
| var_entry.value(), SeededNumberDictionary::kEntryValueIndex);
|
| - Return(LoadFixedArrayElement(elements, value_index));
|
| + Return(LoadFixedArrayElement(elements, value_index, 0, INTPTR_PARAMETERS));
|
| }
|
|
|
| Bind(&if_typed_array);
|
| @@ -4037,7 +4045,7 @@ void CodeStubAssembler::KeyedLoadICGeneric(const LoadICParameters* p) {
|
| // We checked for LAST_CUSTOM_ELEMENTS_RECEIVER before, which rules out
|
| // seeing global objects here (which would need special handling).
|
|
|
| - Variable var_name_index(this, MachineRepresentation::kWord32);
|
| + Variable var_name_index(this, MachineType::PointerRepresentation());
|
| Label dictionary_found(this, &var_name_index);
|
| NameDictionaryLookup<NameDictionary>(properties, key, &dictionary_found,
|
| &var_name_index, &slow);
|
|
|