Chromium Code Reviews| Index: src/ic/accessor-assembler.cc |
| diff --git a/src/ic/accessor-assembler.cc b/src/ic/accessor-assembler.cc |
| index 70538981cdbb5c39c0741a561001dd601bf3aa8c..0e20cdf3f17cf4b70e4c21a55e9c12efe9887941 100644 |
| --- a/src/ic/accessor-assembler.cc |
| +++ b/src/ic/accessor-assembler.cc |
| @@ -803,8 +803,8 @@ void AccessorAssemblerImpl::EmitElementLoad( |
| &if_fast_double, |
| // FAST_HOLEY_DOUBLE_ELEMENTS |
| &if_fast_holey_double}; |
| - Switch(elements_kind, unimplemented_elements_kind, kinds, labels, |
| - arraysize(kinds)); |
| + Switch(TruncateWordToWord32(elements_kind), unimplemented_elements_kind, |
| + kinds, labels, arraysize(kinds)); |
| Bind(&if_fast_packed); |
| { |
| @@ -881,9 +881,7 @@ void AccessorAssemblerImpl::EmitElementLoad( |
| Node* buffer = LoadObjectField(object, JSArrayBufferView::kBufferOffset); |
| Node* bitfield = LoadObjectField(buffer, JSArrayBuffer::kBitFieldOffset, |
| MachineType::Uint32()); |
| - Node* neutered_bit = |
| - Word32And(bitfield, Int32Constant(JSArrayBuffer::WasNeutered::kMask)); |
| - GotoUnless(Word32Equal(neutered_bit, Int32Constant(0)), miss); |
| + GotoIf(IsSetWord32<JSArrayBuffer::WasNeutered>(bitfield), miss); |
|
Igor Sheludko
2016/12/07 10:20:42
Drive-by cleanup.
|
| // Bounds check. |
| Node* length = |
| @@ -895,7 +893,8 @@ void AccessorAssemblerImpl::EmitElementLoad( |
| LoadObjectField(elements, FixedTypedArrayBase::kExternalPointerOffset, |
| MachineType::Pointer()); |
| Node* base_pointer = |
| - LoadObjectField(elements, FixedTypedArrayBase::kBasePointerOffset); |
| + LoadObjectField(elements, FixedTypedArrayBase::kBasePointerOffset, |
| + MachineType::Pointer()); |
| Node* backing_store = IntPtrAdd(external_pointer, base_pointer); |
| Label uint8_elements(this), int8_elements(this), uint16_elements(this), |
| @@ -914,29 +913,33 @@ void AccessorAssemblerImpl::EmitElementLoad( |
| FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND + 1; |
| DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kinds)); |
| DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kind_labels)); |
| - Switch(elements_kind, miss, elements_kinds, elements_kind_labels, |
| - kTypedElementsKindCount); |
| + Switch(TruncateWordToWord32(elements_kind), miss, elements_kinds, |
| + elements_kind_labels, kTypedElementsKindCount); |
| Bind(&uint8_elements); |
| { |
| Comment("UINT8_ELEMENTS"); // Handles UINT8_CLAMPED_ELEMENTS too. |
| - Return(SmiTag(Load(MachineType::Uint8(), backing_store, intptr_index))); |
| + Node* element = Load(MachineType::Uint8(), backing_store, intptr_index); |
| + Return(SmiFromWord32(element)); |
| } |
| Bind(&int8_elements); |
| { |
| Comment("INT8_ELEMENTS"); |
| - Return(SmiTag(Load(MachineType::Int8(), backing_store, intptr_index))); |
| + Node* element = Load(MachineType::Int8(), backing_store, intptr_index); |
| + Return(SmiFromWord32(element)); |
| } |
| Bind(&uint16_elements); |
| { |
| Comment("UINT16_ELEMENTS"); |
| Node* index = WordShl(intptr_index, IntPtrConstant(1)); |
| - Return(SmiTag(Load(MachineType::Uint16(), backing_store, index))); |
| + Node* element = Load(MachineType::Uint16(), backing_store, index); |
| + Return(SmiFromWord32(element)); |
| } |
| Bind(&int16_elements); |
| { |
| Comment("INT16_ELEMENTS"); |
| Node* index = WordShl(intptr_index, IntPtrConstant(1)); |
| - Return(SmiTag(Load(MachineType::Int16(), backing_store, index))); |
| + Node* element = Load(MachineType::Int16(), backing_store, index); |
| + Return(SmiFromWord32(element)); |
| } |
| Bind(&uint32_elements); |
| { |
| @@ -1034,7 +1037,8 @@ Node* AccessorAssemblerImpl::StubCachePrimaryOffset(Node* name, Node* map) { |
| // Using only the low bits in 64-bit mode is unlikely to increase the |
| // risk of collision even if the heap is spread over an area larger than |
| // 4Gb (and not at all if it isn't). |
| - Node* hash = Int32Add(hash_field, map); |
| + Node* map32 = TruncateWordToWord32(BitcastTaggedToWord(map)); |
| + Node* hash = Int32Add(hash_field, map32); |
| // Base the offset on a simple combination of name and map. |
| hash = Word32Xor(hash, Int32Constant(StubCache::kPrimaryMagic)); |
| uint32_t mask = (StubCache::kPrimaryTableSize - 1) |
| @@ -1046,7 +1050,8 @@ Node* AccessorAssemblerImpl::StubCacheSecondaryOffset(Node* name, Node* seed) { |
| // See v8::internal::StubCache::SecondaryOffset(). |
| // Use the seed from the primary cache in the secondary cache. |
| - Node* hash = Int32Sub(seed, name); |
| + Node* name32 = TruncateWordToWord32(BitcastTaggedToWord(name)); |
| + Node* hash = Int32Sub(TruncateWordToWord32(seed), name32); |
| hash = Int32Add(hash, Int32Constant(StubCache::kSecondaryMagic)); |
| int32_t mask = (StubCache::kSecondaryTableSize - 1) |
| << StubCache::kCacheIndexShift; |
| @@ -1512,103 +1517,105 @@ void AccessorAssemblerImpl::StoreIC(const StoreICParameters* p) { |
| void AccessorAssemblerImpl::KeyedStoreIC(const StoreICParameters* p, |
| LanguageMode language_mode) { |
| - Variable var_handler(this, MachineRepresentation::kTagged); |
| - // This is to make |miss| label see the var_handler bound on all paths. |
| - var_handler.Bind(IntPtrConstant(0)); |
|
Igor Sheludko
2016/12/07 10:20:42
I moved |miss| label to outer scope to avoid this
|
| - |
| // TODO(ishell): defer blocks when it works. |
| - Label if_handler(this, &var_handler), try_polymorphic(this), |
| - try_megamorphic(this /*, Label::kDeferred*/), |
| - try_polymorphic_name(this /*, Label::kDeferred*/), |
| - miss(this /*, Label::kDeferred*/); |
| - |
| - Node* receiver_map = LoadReceiverMap(p->receiver); |
| - |
| - // Check monomorphic case. |
| - Node* feedback = |
| - TryMonomorphicCase(p->slot, p->vector, receiver_map, &if_handler, |
| - &var_handler, &try_polymorphic); |
| - Bind(&if_handler); |
| + Label miss(this /*, Label::kDeferred*/); |
| { |
| - Comment("KeyedStoreIC_if_handler"); |
| - HandleStoreICHandlerCase(p, var_handler.value(), &miss, kSupportElements); |
| - } |
| + Variable var_handler(this, MachineRepresentation::kTagged); |
| - Bind(&try_polymorphic); |
| - { |
| - // CheckPolymorphic case. |
| - Comment("KeyedStoreIC_try_polymorphic"); |
| - GotoUnless( |
| - WordEqual(LoadMap(feedback), LoadRoot(Heap::kFixedArrayMapRootIndex)), |
| - &try_megamorphic); |
| - Label if_transition_handler(this); |
| - Variable var_transition_map_cell(this, MachineRepresentation::kTagged); |
| - HandleKeyedStorePolymorphicCase(receiver_map, feedback, &if_handler, |
| - &var_handler, &if_transition_handler, |
| - &var_transition_map_cell, &miss); |
| - Bind(&if_transition_handler); |
| - Comment("KeyedStoreIC_polymorphic_transition"); |
| - { |
| - Node* handler = var_handler.value(); |
| - |
| - Label call_handler(this); |
| - Variable var_code_handler(this, MachineRepresentation::kTagged); |
| - var_code_handler.Bind(handler); |
| - GotoUnless(IsTuple2Map(LoadMap(handler)), &call_handler); |
| - { |
| - CSA_ASSERT(this, IsTuple2Map(LoadMap(handler))); |
| + // TODO(ishell): defer blocks when it works. |
| + Label if_handler(this, &var_handler), try_polymorphic(this), |
| + try_megamorphic(this /*, Label::kDeferred*/), |
| + try_polymorphic_name(this /*, Label::kDeferred*/); |
| - // Check validity cell. |
| - Node* validity_cell = LoadObjectField(handler, Tuple2::kValue1Offset); |
| - Node* cell_value = LoadObjectField(validity_cell, Cell::kValueOffset); |
| - GotoIf(WordNotEqual(cell_value, SmiConstant(Map::kPrototypeChainValid)), |
| - &miss); |
| + Node* receiver_map = LoadReceiverMap(p->receiver); |
| - var_code_handler.Bind(LoadObjectField(handler, Tuple2::kValue2Offset)); |
| - Goto(&call_handler); |
| - } |
| + // Check monomorphic case. |
| + Node* feedback = |
| + TryMonomorphicCase(p->slot, p->vector, receiver_map, &if_handler, |
| + &var_handler, &try_polymorphic); |
| + Bind(&if_handler); |
| + { |
| + Comment("KeyedStoreIC_if_handler"); |
| + HandleStoreICHandlerCase(p, var_handler.value(), &miss, kSupportElements); |
| + } |
| - Bind(&call_handler); |
| + Bind(&try_polymorphic); |
| + { |
| + // CheckPolymorphic case. |
| + Comment("KeyedStoreIC_try_polymorphic"); |
| + GotoUnless( |
| + WordEqual(LoadMap(feedback), LoadRoot(Heap::kFixedArrayMapRootIndex)), |
| + &try_megamorphic); |
| + Label if_transition_handler(this); |
| + Variable var_transition_map_cell(this, MachineRepresentation::kTagged); |
| + HandleKeyedStorePolymorphicCase(receiver_map, feedback, &if_handler, |
| + &var_handler, &if_transition_handler, |
| + &var_transition_map_cell, &miss); |
| + Bind(&if_transition_handler); |
| + Comment("KeyedStoreIC_polymorphic_transition"); |
| { |
| - Node* code_handler = var_code_handler.value(); |
| - CSA_ASSERT(this, IsCodeMap(LoadMap(code_handler))); |
| - |
| - Node* transition_map = |
| - LoadWeakCellValue(var_transition_map_cell.value(), &miss); |
| - StoreTransitionDescriptor descriptor(isolate()); |
| - TailCallStub(descriptor, code_handler, p->context, p->receiver, p->name, |
| - transition_map, p->value, p->slot, p->vector); |
| + Node* handler = var_handler.value(); |
| + |
| + Label call_handler(this); |
| + Variable var_code_handler(this, MachineRepresentation::kTagged); |
| + var_code_handler.Bind(handler); |
| + GotoUnless(IsTuple2Map(LoadMap(handler)), &call_handler); |
| + { |
| + CSA_ASSERT(this, IsTuple2Map(LoadMap(handler))); |
| + |
| + // Check validity cell. |
| + Node* validity_cell = LoadObjectField(handler, Tuple2::kValue1Offset); |
| + Node* cell_value = LoadObjectField(validity_cell, Cell::kValueOffset); |
| + GotoIf( |
| + WordNotEqual(cell_value, SmiConstant(Map::kPrototypeChainValid)), |
| + &miss); |
| + |
| + var_code_handler.Bind( |
| + LoadObjectField(handler, Tuple2::kValue2Offset)); |
| + Goto(&call_handler); |
| + } |
| + |
| + Bind(&call_handler); |
| + { |
| + Node* code_handler = var_code_handler.value(); |
| + CSA_ASSERT(this, IsCodeMap(LoadMap(code_handler))); |
| + |
| + Node* transition_map = |
| + LoadWeakCellValue(var_transition_map_cell.value(), &miss); |
| + StoreTransitionDescriptor descriptor(isolate()); |
| + TailCallStub(descriptor, code_handler, p->context, p->receiver, |
| + p->name, transition_map, p->value, p->slot, p->vector); |
| + } |
| } |
| } |
| - } |
| - Bind(&try_megamorphic); |
| - { |
| - // Check megamorphic case. |
| - Comment("KeyedStoreIC_try_megamorphic"); |
| - GotoUnless( |
| - WordEqual(feedback, LoadRoot(Heap::kmegamorphic_symbolRootIndex)), |
| - &try_polymorphic_name); |
| - TailCallStub( |
| - CodeFactory::KeyedStoreIC_Megamorphic(isolate(), language_mode), |
| - p->context, p->receiver, p->name, p->value, p->slot, p->vector); |
| - } |
| + Bind(&try_megamorphic); |
| + { |
| + // Check megamorphic case. |
| + Comment("KeyedStoreIC_try_megamorphic"); |
| + GotoUnless( |
| + WordEqual(feedback, LoadRoot(Heap::kmegamorphic_symbolRootIndex)), |
| + &try_polymorphic_name); |
| + TailCallStub( |
| + CodeFactory::KeyedStoreIC_Megamorphic(isolate(), language_mode), |
| + p->context, p->receiver, p->name, p->value, p->slot, p->vector); |
| + } |
| - Bind(&try_polymorphic_name); |
| - { |
| - // We might have a name in feedback, and a fixed array in the next slot. |
| - Comment("KeyedStoreIC_try_polymorphic_name"); |
| - GotoUnless(WordEqual(feedback, p->name), &miss); |
| - // If the name comparison succeeded, we know we have a FixedArray with |
| - // at least one map/handler pair. |
| - Node* offset = ElementOffsetFromIndex( |
| - p->slot, FAST_HOLEY_ELEMENTS, SMI_PARAMETERS, |
| - FixedArray::kHeaderSize + kPointerSize - kHeapObjectTag); |
| - Node* array = Load(MachineType::AnyTagged(), p->vector, offset); |
| - HandlePolymorphicCase(receiver_map, array, &if_handler, &var_handler, &miss, |
| - 1); |
| + Bind(&try_polymorphic_name); |
| + { |
| + // We might have a name in feedback, and a fixed array in the next slot. |
| + Comment("KeyedStoreIC_try_polymorphic_name"); |
| + GotoUnless(WordEqual(feedback, p->name), &miss); |
| + // If the name comparison succeeded, we know we have a FixedArray with |
| + // at least one map/handler pair. |
| + Node* offset = ElementOffsetFromIndex( |
| + p->slot, FAST_HOLEY_ELEMENTS, SMI_PARAMETERS, |
| + FixedArray::kHeaderSize + kPointerSize - kHeapObjectTag); |
| + Node* array = Load(MachineType::AnyTagged(), p->vector, offset); |
| + HandlePolymorphicCase(receiver_map, array, &if_handler, &var_handler, |
| + &miss, 1); |
| + } |
| } |
| - |
| Bind(&miss); |
| { |
| Comment("KeyedStoreIC_miss"); |