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

Side by Side Diff: src/ic/accessor-assembler.cc

Issue 2568713002: [stubs] Fixing issues found by machine graph verifier in code stubs. (Closed)
Patch Set: Addressing nits Created 4 years 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 | « src/code-stubs.cc ('k') | src/ic/keyed-store-generic.cc » ('j') | 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 4
5 #include "src/ic/accessor-assembler.h" 5 #include "src/ic/accessor-assembler.h"
6 #include "src/ic/accessor-assembler-impl.h" 6 #include "src/ic/accessor-assembler-impl.h"
7 7
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/ic/handler-configuration.h" 10 #include "src/ic/handler-configuration.h"
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 GotoUnless( 190 GotoUnless(
191 WordEqual(handler_kind, IntPtrConstant(LoadHandler::kForElements)), 191 WordEqual(handler_kind, IntPtrConstant(LoadHandler::kForElements)),
192 &property); 192 &property);
193 193
194 Comment("element_load"); 194 Comment("element_load");
195 Node* intptr_index = TryToIntptr(p->name, miss); 195 Node* intptr_index = TryToIntptr(p->name, miss);
196 Node* elements = LoadElements(holder); 196 Node* elements = LoadElements(holder);
197 Node* is_jsarray_condition = 197 Node* is_jsarray_condition =
198 IsSetWord<LoadHandler::IsJsArrayBits>(handler_word); 198 IsSetWord<LoadHandler::IsJsArrayBits>(handler_word);
199 Node* elements_kind = 199 Node* elements_kind =
200 DecodeWord<LoadHandler::ElementsKindBits>(handler_word); 200 DecodeWord32FromWord<LoadHandler::ElementsKindBits>(handler_word);
201 Label if_hole(this), unimplemented_elements_kind(this); 201 Label if_hole(this), unimplemented_elements_kind(this);
202 Label* out_of_bounds = miss; 202 Label* out_of_bounds = miss;
203 EmitElementLoad(holder, elements, elements_kind, intptr_index, 203 EmitElementLoad(holder, elements, elements_kind, intptr_index,
204 is_jsarray_condition, &if_hole, &rebox_double, 204 is_jsarray_condition, &if_hole, &rebox_double,
205 &var_double_value, &unimplemented_elements_kind, 205 &var_double_value, &unimplemented_elements_kind,
206 out_of_bounds, miss); 206 out_of_bounds, miss);
207 207
208 Bind(&unimplemented_elements_kind); 208 Bind(&unimplemented_elements_kind);
209 { 209 {
210 // Smi handlers should only be installed for supported elements kinds. 210 // Smi handlers should only be installed for supported elements kinds.
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after
775 775
776 void AccessorAssemblerImpl::EmitElementLoad( 776 void AccessorAssemblerImpl::EmitElementLoad(
777 Node* object, Node* elements, Node* elements_kind, Node* intptr_index, 777 Node* object, Node* elements, Node* elements_kind, Node* intptr_index,
778 Node* is_jsarray_condition, Label* if_hole, Label* rebox_double, 778 Node* is_jsarray_condition, Label* if_hole, Label* rebox_double,
779 Variable* var_double_value, Label* unimplemented_elements_kind, 779 Variable* var_double_value, Label* unimplemented_elements_kind,
780 Label* out_of_bounds, Label* miss) { 780 Label* out_of_bounds, Label* miss) {
781 Label if_typed_array(this), if_fast_packed(this), if_fast_holey(this), 781 Label if_typed_array(this), if_fast_packed(this), if_fast_holey(this),
782 if_fast_double(this), if_fast_holey_double(this), if_nonfast(this), 782 if_fast_double(this), if_fast_holey_double(this), if_nonfast(this),
783 if_dictionary(this); 783 if_dictionary(this);
784 GotoIf( 784 GotoIf(
785 IntPtrGreaterThan(elements_kind, IntPtrConstant(LAST_FAST_ELEMENTS_KIND)), 785 Int32GreaterThan(elements_kind, Int32Constant(LAST_FAST_ELEMENTS_KIND)),
786 &if_nonfast); 786 &if_nonfast);
787 787
788 EmitFastElementsBoundsCheck(object, elements, intptr_index, 788 EmitFastElementsBoundsCheck(object, elements, intptr_index,
789 is_jsarray_condition, out_of_bounds); 789 is_jsarray_condition, out_of_bounds);
790 int32_t kinds[] = {// Handled by if_fast_packed. 790 int32_t kinds[] = {// Handled by if_fast_packed.
791 FAST_SMI_ELEMENTS, FAST_ELEMENTS, 791 FAST_SMI_ELEMENTS, FAST_ELEMENTS,
792 // Handled by if_fast_holey. 792 // Handled by if_fast_holey.
793 FAST_HOLEY_SMI_ELEMENTS, FAST_HOLEY_ELEMENTS, 793 FAST_HOLEY_SMI_ELEMENTS, FAST_HOLEY_ELEMENTS,
794 // Handled by if_fast_double. 794 // Handled by if_fast_double.
795 FAST_DOUBLE_ELEMENTS, 795 FAST_DOUBLE_ELEMENTS,
796 // Handled by if_fast_holey_double. 796 // Handled by if_fast_holey_double.
797 FAST_HOLEY_DOUBLE_ELEMENTS}; 797 FAST_HOLEY_DOUBLE_ELEMENTS};
798 Label* labels[] = {// FAST_{SMI,}_ELEMENTS 798 Label* labels[] = {// FAST_{SMI,}_ELEMENTS
799 &if_fast_packed, &if_fast_packed, 799 &if_fast_packed, &if_fast_packed,
800 // FAST_HOLEY_{SMI,}_ELEMENTS 800 // FAST_HOLEY_{SMI,}_ELEMENTS
801 &if_fast_holey, &if_fast_holey, 801 &if_fast_holey, &if_fast_holey,
802 // FAST_DOUBLE_ELEMENTS 802 // FAST_DOUBLE_ELEMENTS
803 &if_fast_double, 803 &if_fast_double,
804 // FAST_HOLEY_DOUBLE_ELEMENTS 804 // FAST_HOLEY_DOUBLE_ELEMENTS
805 &if_fast_holey_double}; 805 &if_fast_holey_double};
806 Switch(TruncateWordToWord32(elements_kind), unimplemented_elements_kind, 806 Switch(elements_kind, unimplemented_elements_kind, kinds, labels,
807 kinds, labels, arraysize(kinds)); 807 arraysize(kinds));
808 808
809 Bind(&if_fast_packed); 809 Bind(&if_fast_packed);
810 { 810 {
811 Comment("fast packed elements"); 811 Comment("fast packed elements");
812 Return(LoadFixedArrayElement(elements, intptr_index, 0, INTPTR_PARAMETERS)); 812 Return(LoadFixedArrayElement(elements, intptr_index, 0, INTPTR_PARAMETERS));
813 } 813 }
814 814
815 Bind(&if_fast_holey); 815 Bind(&if_fast_holey);
816 { 816 {
817 Comment("fast holey elements"); 817 Comment("fast holey elements");
(...skipping 17 matching lines...) Expand all
835 Node* value = LoadFixedDoubleArrayElement(elements, intptr_index, 835 Node* value = LoadFixedDoubleArrayElement(elements, intptr_index,
836 MachineType::Float64(), 0, 836 MachineType::Float64(), 0,
837 INTPTR_PARAMETERS, if_hole); 837 INTPTR_PARAMETERS, if_hole);
838 var_double_value->Bind(value); 838 var_double_value->Bind(value);
839 Goto(rebox_double); 839 Goto(rebox_double);
840 } 840 }
841 841
842 Bind(&if_nonfast); 842 Bind(&if_nonfast);
843 { 843 {
844 STATIC_ASSERT(LAST_ELEMENTS_KIND == LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND); 844 STATIC_ASSERT(LAST_ELEMENTS_KIND == LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND);
845 GotoIf(IntPtrGreaterThanOrEqual( 845 GotoIf(Int32GreaterThanOrEqual(
846 elements_kind, 846 elements_kind,
847 IntPtrConstant(FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND)), 847 Int32Constant(FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND)),
848 &if_typed_array); 848 &if_typed_array);
849 GotoIf(IntPtrEqual(elements_kind, IntPtrConstant(DICTIONARY_ELEMENTS)), 849 GotoIf(Word32Equal(elements_kind, Int32Constant(DICTIONARY_ELEMENTS)),
850 &if_dictionary); 850 &if_dictionary);
851 Goto(unimplemented_elements_kind); 851 Goto(unimplemented_elements_kind);
852 } 852 }
853 853
854 Bind(&if_dictionary); 854 Bind(&if_dictionary);
855 { 855 {
856 Comment("dictionary elements"); 856 Comment("dictionary elements");
857 GotoIf(IntPtrLessThan(intptr_index, IntPtrConstant(0)), out_of_bounds); 857 GotoIf(IntPtrLessThan(intptr_index, IntPtrConstant(0)), out_of_bounds);
858 Variable var_entry(this, MachineType::PointerRepresentation()); 858 Variable var_entry(this, MachineType::PointerRepresentation());
859 Label if_found(this); 859 Label if_found(this);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
906 &int32_elements, &float32_elements, &float64_elements}; 906 &int32_elements, &float32_elements, &float64_elements};
907 int32_t elements_kinds[] = { 907 int32_t elements_kinds[] = {
908 UINT8_ELEMENTS, UINT8_CLAMPED_ELEMENTS, INT8_ELEMENTS, 908 UINT8_ELEMENTS, UINT8_CLAMPED_ELEMENTS, INT8_ELEMENTS,
909 UINT16_ELEMENTS, INT16_ELEMENTS, UINT32_ELEMENTS, 909 UINT16_ELEMENTS, INT16_ELEMENTS, UINT32_ELEMENTS,
910 INT32_ELEMENTS, FLOAT32_ELEMENTS, FLOAT64_ELEMENTS}; 910 INT32_ELEMENTS, FLOAT32_ELEMENTS, FLOAT64_ELEMENTS};
911 const size_t kTypedElementsKindCount = 911 const size_t kTypedElementsKindCount =
912 LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND - 912 LAST_FIXED_TYPED_ARRAY_ELEMENTS_KIND -
913 FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND + 1; 913 FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND + 1;
914 DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kinds)); 914 DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kinds));
915 DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kind_labels)); 915 DCHECK_EQ(kTypedElementsKindCount, arraysize(elements_kind_labels));
916 Switch(TruncateWordToWord32(elements_kind), miss, elements_kinds, 916 Switch(elements_kind, miss, elements_kinds, elements_kind_labels,
917 elements_kind_labels, kTypedElementsKindCount); 917 kTypedElementsKindCount);
918 Bind(&uint8_elements); 918 Bind(&uint8_elements);
919 { 919 {
920 Comment("UINT8_ELEMENTS"); // Handles UINT8_CLAMPED_ELEMENTS too. 920 Comment("UINT8_ELEMENTS"); // Handles UINT8_CLAMPED_ELEMENTS too.
921 Node* element = Load(MachineType::Uint8(), backing_store, intptr_index); 921 Node* element = Load(MachineType::Uint8(), backing_store, intptr_index);
922 Return(SmiFromWord32(element)); 922 Return(SmiFromWord32(element));
923 } 923 }
924 Bind(&int8_elements); 924 Bind(&int8_elements);
925 { 925 {
926 Comment("INT8_ELEMENTS"); 926 Comment("INT8_ELEMENTS");
927 Node* element = Load(MachineType::Int8(), backing_store, intptr_index); 927 Node* element = Load(MachineType::Int8(), backing_store, intptr_index);
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
1390 // Try looking up the property on the receiver; if unsuccessful, look 1390 // Try looking up the property on the receiver; if unsuccessful, look
1391 // for a handler in the stub cache. 1391 // for a handler in the stub cache.
1392 Comment("DescriptorArray lookup"); 1392 Comment("DescriptorArray lookup");
1393 1393
1394 // Skip linear search if there are too many descriptors. 1394 // Skip linear search if there are too many descriptors.
1395 // TODO(jkummerow): Consider implementing binary search. 1395 // TODO(jkummerow): Consider implementing binary search.
1396 // See also TryLookupProperty() which has the same limitation. 1396 // See also TryLookupProperty() which has the same limitation.
1397 const int32_t kMaxLinear = 210; 1397 const int32_t kMaxLinear = 210;
1398 Label stub_cache(this); 1398 Label stub_cache(this);
1399 Node* bitfield3 = LoadMapBitField3(receiver_map); 1399 Node* bitfield3 = LoadMapBitField3(receiver_map);
1400 Node* nof = DecodeWord32<Map::NumberOfOwnDescriptorsBits>(bitfield3); 1400 Node* nof =
1401 GotoIf(Uint32LessThan(Int32Constant(kMaxLinear), nof), &stub_cache); 1401 DecodeWordFromWord32<Map::NumberOfOwnDescriptorsBits>(bitfield3);
1402 GotoIf(UintPtrLessThan(IntPtrConstant(kMaxLinear), nof), &stub_cache);
1402 Node* descriptors = LoadMapDescriptors(receiver_map); 1403 Node* descriptors = LoadMapDescriptors(receiver_map);
1403 Variable var_name_index(this, MachineType::PointerRepresentation()); 1404 Variable var_name_index(this, MachineType::PointerRepresentation());
1404 Label if_descriptor_found(this); 1405 Label if_descriptor_found(this);
1405 DescriptorLookupLinear(key, descriptors, nof, &if_descriptor_found, 1406 DescriptorLookupLinear(key, descriptors, nof, &if_descriptor_found,
1406 &var_name_index, &stub_cache); 1407 &var_name_index, &stub_cache);
1407 1408
1408 Bind(&if_descriptor_found); 1409 Bind(&if_descriptor_found);
1409 { 1410 {
1410 LoadPropertyFromFastObject(receiver, receiver_map, descriptors, 1411 LoadPropertyFromFastObject(receiver, receiver_map, descriptors,
1411 var_name_index.value(), &var_details, 1412 var_name_index.value(), &var_details,
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
1826 void AccessorAssembler::GenerateKeyedStoreICTrampolineTF( 1827 void AccessorAssembler::GenerateKeyedStoreICTrampolineTF(
1827 CodeAssemblerState* state, LanguageMode language_mode) { 1828 CodeAssemblerState* state, LanguageMode language_mode) {
1828 AccessorAssemblerImpl assembler(state); 1829 AccessorAssemblerImpl assembler(state);
1829 assembler.GenerateKeyedStoreICTrampolineTF(language_mode); 1830 assembler.GenerateKeyedStoreICTrampolineTF(language_mode);
1830 } 1831 }
1831 1832
1832 #undef ACCESSOR_ASSEMBLER_PUBLIC_INTERFACE 1833 #undef ACCESSOR_ASSEMBLER_PUBLIC_INTERFACE
1833 1834
1834 } // namespace internal 1835 } // namespace internal
1835 } // namespace v8 1836 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stubs.cc ('k') | src/ic/keyed-store-generic.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698