Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(57)

Side by Side Diff: src/code-stub-assembler.cc

Issue 2436423003: [stubs] Fine-tune monomorphic IC dispatcher performance (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 #include "src/code-stub-assembler.h" 4 #include "src/code-stub-assembler.h"
5 #include "src/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/frames-inl.h" 6 #include "src/frames-inl.h"
7 #include "src/frames.h" 7 #include "src/frames.h"
8 #include "src/ic/handler-configuration.h" 8 #include "src/ic/handler-configuration.h"
9 #include "src/ic/stub-cache.h" 9 #include "src/ic/stub-cache.h"
10 10
(...skipping 4766 matching lines...) Expand 10 before | Expand all | Expand 10 after
4777 // the tagging completely. 4777 // the tagging completely.
4778 Node* previous_feedback = 4778 Node* previous_feedback =
4779 LoadFixedArrayElement(type_feedback_vector, slot_id); 4779 LoadFixedArrayElement(type_feedback_vector, slot_id);
4780 Node* combined_feedback = SmiOr(previous_feedback, SmiFromWord32(feedback)); 4780 Node* combined_feedback = SmiOr(previous_feedback, SmiFromWord32(feedback));
4781 StoreFixedArrayElement(type_feedback_vector, slot_id, combined_feedback, 4781 StoreFixedArrayElement(type_feedback_vector, slot_id, combined_feedback,
4782 SKIP_WRITE_BARRIER); 4782 SKIP_WRITE_BARRIER);
4783 } 4783 }
4784 4784
4785 compiler::Node* CodeStubAssembler::LoadReceiverMap(compiler::Node* receiver) { 4785 compiler::Node* CodeStubAssembler::LoadReceiverMap(compiler::Node* receiver) {
4786 Variable var_receiver_map(this, MachineRepresentation::kTagged); 4786 Variable var_receiver_map(this, MachineRepresentation::kTagged);
4787 // TODO(ishell): defer blocks when it works. 4787 Label load_smi_map(this, Label::kDeferred), load_receiver_map(this),
4788 Label load_smi_map(this /*, Label::kDeferred*/), load_receiver_map(this),
4789 if_result(this); 4788 if_result(this);
4790 4789
4791 Branch(TaggedIsSmi(receiver), &load_smi_map, &load_receiver_map); 4790 Branch(TaggedIsSmi(receiver), &load_smi_map, &load_receiver_map);
4792 Bind(&load_smi_map); 4791 Bind(&load_smi_map);
4793 { 4792 {
4794 var_receiver_map.Bind(LoadRoot(Heap::kHeapNumberMapRootIndex)); 4793 var_receiver_map.Bind(LoadRoot(Heap::kHeapNumberMapRootIndex));
4795 Goto(&if_result); 4794 Goto(&if_result);
4796 } 4795 }
4797 Bind(&load_receiver_map); 4796 Bind(&load_receiver_map);
4798 { 4797 {
4799 var_receiver_map.Bind(LoadMap(receiver)); 4798 var_receiver_map.Bind(LoadMap(receiver));
4800 Goto(&if_result); 4799 Goto(&if_result);
4801 } 4800 }
4802 Bind(&if_result); 4801 Bind(&if_result);
4803 return var_receiver_map.value(); 4802 return var_receiver_map.value();
4804 } 4803 }
4805 4804
4806 compiler::Node* CodeStubAssembler::TryMonomorphicCase( 4805 compiler::Node* CodeStubAssembler::TryMonomorphicCase(
4807 compiler::Node* slot, compiler::Node* vector, compiler::Node* receiver_map, 4806 compiler::Node* slot, compiler::Node* vector, compiler::Node* receiver_map,
4808 Label* if_handler, Variable* var_handler, Label* if_miss) { 4807 Label* if_handler, Variable* var_handler, Label* if_miss) {
4809 DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); 4808 DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep());
4810 4809
4811 // TODO(ishell): add helper class that hides offset computations for a series 4810 // TODO(ishell): add helper class that hides offset computations for a series
4812 // of loads. 4811 // of loads.
4813 int32_t header_size = FixedArray::kHeaderSize - kHeapObjectTag; 4812 int32_t header_size = FixedArray::kHeaderSize - kHeapObjectTag;
4814 Node* offset = ElementOffsetFromIndex(slot, FAST_HOLEY_ELEMENTS, 4813 // Adding |header_size| with a separate IntPtrAdd rather than passing it
4815 SMI_PARAMETERS, header_size); 4814 // into ElementOffsetFromIndex() allows it to be folded into a single
4816 Node* feedback = Load(MachineType::AnyTagged(), vector, offset); 4815 // [base, index, offset] indirect memory access on x64.
4816 Node* offset =
4817 ElementOffsetFromIndex(slot, FAST_HOLEY_ELEMENTS, SMI_PARAMETERS);
4818 Node* feedback = Load(MachineType::AnyTagged(), vector,
4819 IntPtrAdd(offset, IntPtrConstant(header_size)));
4817 4820
4818 // Try to quickly handle the monomorphic case without knowing for sure 4821 // Try to quickly handle the monomorphic case without knowing for sure
4819 // if we have a weak cell in feedback. We do know it's safe to look 4822 // if we have a weak cell in feedback. We do know it's safe to look
4820 // at WeakCell::kValueOffset. 4823 // at WeakCell::kValueOffset.
4821 GotoUnless(WordEqual(receiver_map, LoadWeakCellValue(feedback)), if_miss); 4824 GotoIf(WordNotEqual(receiver_map, LoadWeakCellValue(feedback)), if_miss);
4822 4825
4823 Node* handler = Load(MachineType::AnyTagged(), vector, 4826 Node* handler =
4824 IntPtrAdd(offset, IntPtrConstant(kPointerSize))); 4827 Load(MachineType::AnyTagged(), vector,
4828 IntPtrAdd(offset, IntPtrConstant(header_size + kPointerSize)));
4825 4829
4826 var_handler->Bind(handler); 4830 var_handler->Bind(handler);
4827 Goto(if_handler); 4831 Goto(if_handler);
4828 return feedback; 4832 return feedback;
4829 } 4833 }
4830 4834
4831 void CodeStubAssembler::HandlePolymorphicCase( 4835 void CodeStubAssembler::HandlePolymorphicCase(
4832 compiler::Node* receiver_map, compiler::Node* feedback, Label* if_handler, 4836 compiler::Node* receiver_map, compiler::Node* feedback, Label* if_handler,
4833 Variable* var_handler, Label* if_miss, int unroll_count) { 4837 Variable* var_handler, Label* if_miss, int unroll_count) {
4834 DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); 4838 DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep());
(...skipping 3498 matching lines...) Expand 10 before | Expand all | Expand 10 after
8333 Node* buffer_bit_field = LoadObjectField( 8337 Node* buffer_bit_field = LoadObjectField(
8334 buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32()); 8338 buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32());
8335 Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask); 8339 Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask);
8336 8340
8337 return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask), 8341 return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask),
8338 Int32Constant(0)); 8342 Int32Constant(0));
8339 } 8343 }
8340 8344
8341 } // namespace internal 8345 } // namespace internal
8342 } // namespace v8 8346 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698