| OLD | NEW |
| 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/code-stub-assembler.h" | 5 #include "src/code-stub-assembler.h" |
| 6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
| 7 #include "src/frames-inl.h" | 7 #include "src/frames-inl.h" |
| 8 #include "src/frames.h" | 8 #include "src/frames.h" |
| 9 #include "src/ic/handler-configuration.h" | 9 #include "src/ic/handler-configuration.h" |
| 10 #include "src/ic/stub-cache.h" | 10 #include "src/ic/stub-cache.h" |
| (...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 960 } | 960 } |
| 961 | 961 |
| 962 Node* CodeStubAssembler::LoadMapBitField3(Node* map) { | 962 Node* CodeStubAssembler::LoadMapBitField3(Node* map) { |
| 963 return LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32()); | 963 return LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32()); |
| 964 } | 964 } |
| 965 | 965 |
| 966 Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { | 966 Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { |
| 967 return LoadObjectField(map, Map::kInstanceTypeOffset, MachineType::Uint8()); | 967 return LoadObjectField(map, Map::kInstanceTypeOffset, MachineType::Uint8()); |
| 968 } | 968 } |
| 969 | 969 |
| 970 Node* CodeStubAssembler::LoadMapElementsKind(Node* map) { |
| 971 Node* bit_field2 = LoadMapBitField2(map); |
| 972 return BitFieldDecode<Map::ElementsKindBits>(bit_field2); |
| 973 } |
| 974 |
| 970 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { | 975 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { |
| 971 return LoadObjectField(map, Map::kDescriptorsOffset); | 976 return LoadObjectField(map, Map::kDescriptorsOffset); |
| 972 } | 977 } |
| 973 | 978 |
| 974 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { | 979 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { |
| 975 return LoadObjectField(map, Map::kPrototypeOffset); | 980 return LoadObjectField(map, Map::kPrototypeOffset); |
| 976 } | 981 } |
| 977 | 982 |
| 978 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { | 983 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { |
| 979 return ChangeUint32ToWord( | 984 return ChangeUint32ToWord( |
| (...skipping 2721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3701 void CodeStubAssembler::TryLookupElement(Node* object, Node* map, | 3706 void CodeStubAssembler::TryLookupElement(Node* object, Node* map, |
| 3702 Node* instance_type, | 3707 Node* instance_type, |
| 3703 Node* intptr_index, Label* if_found, | 3708 Node* intptr_index, Label* if_found, |
| 3704 Label* if_not_found, | 3709 Label* if_not_found, |
| 3705 Label* if_bailout) { | 3710 Label* if_bailout) { |
| 3706 // Handle special objects in runtime. | 3711 // Handle special objects in runtime. |
| 3707 GotoIf(Int32LessThanOrEqual(instance_type, | 3712 GotoIf(Int32LessThanOrEqual(instance_type, |
| 3708 Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)), | 3713 Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)), |
| 3709 if_bailout); | 3714 if_bailout); |
| 3710 | 3715 |
| 3711 Node* bit_field2 = LoadMapBitField2(map); | 3716 Node* elements_kind = LoadMapElementsKind(map); |
| 3712 Node* elements_kind = BitFieldDecode<Map::ElementsKindBits>(bit_field2); | |
| 3713 | 3717 |
| 3714 // TODO(verwaest): Support other elements kinds as well. | 3718 // TODO(verwaest): Support other elements kinds as well. |
| 3715 Label if_isobjectorsmi(this), if_isdouble(this), if_isdictionary(this), | 3719 Label if_isobjectorsmi(this), if_isdouble(this), if_isdictionary(this), |
| 3716 if_isfaststringwrapper(this), if_isslowstringwrapper(this), if_oob(this); | 3720 if_isfaststringwrapper(this), if_isslowstringwrapper(this), if_oob(this); |
| 3717 // clang-format off | 3721 // clang-format off |
| 3718 int32_t values[] = { | 3722 int32_t values[] = { |
| 3719 // Handled by {if_isobjectorsmi}. | 3723 // Handled by {if_isobjectorsmi}. |
| 3720 FAST_SMI_ELEMENTS, FAST_HOLEY_SMI_ELEMENTS, FAST_ELEMENTS, | 3724 FAST_SMI_ELEMENTS, FAST_HOLEY_SMI_ELEMENTS, FAST_ELEMENTS, |
| 3721 FAST_HOLEY_ELEMENTS, | 3725 FAST_HOLEY_ELEMENTS, |
| 3722 // Handled by {if_isdouble}. | 3726 // Handled by {if_isdouble}. |
| (...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4812 &slow); | 4816 &slow); |
| 4813 | 4817 |
| 4814 Node* key = p->name; | 4818 Node* key = p->name; |
| 4815 TryToName(key, &if_index, &var_index, &if_unique_name, &slow); | 4819 TryToName(key, &if_index, &var_index, &if_unique_name, &slow); |
| 4816 | 4820 |
| 4817 Bind(&if_index); | 4821 Bind(&if_index); |
| 4818 { | 4822 { |
| 4819 Comment("integer index"); | 4823 Comment("integer index"); |
| 4820 Node* index = var_index.value(); | 4824 Node* index = var_index.value(); |
| 4821 Node* elements = LoadElements(receiver); | 4825 Node* elements = LoadElements(receiver); |
| 4822 Node* bitfield2 = LoadMapBitField2(receiver_map); | 4826 Node* elements_kind = LoadMapElementsKind(receiver_map); |
| 4823 Node* elements_kind = BitFieldDecode<Map::ElementsKindBits>(bitfield2); | |
| 4824 Node* is_jsarray_condition = | 4827 Node* is_jsarray_condition = |
| 4825 Word32Equal(instance_type, Int32Constant(JS_ARRAY_TYPE)); | 4828 Word32Equal(instance_type, Int32Constant(JS_ARRAY_TYPE)); |
| 4826 Variable var_double_value(this, MachineRepresentation::kFloat64); | 4829 Variable var_double_value(this, MachineRepresentation::kFloat64); |
| 4827 Label rebox_double(this, &var_double_value); | 4830 Label rebox_double(this, &var_double_value); |
| 4828 | 4831 |
| 4829 // Unimplemented elements kinds fall back to a runtime call. | 4832 // Unimplemented elements kinds fall back to a runtime call. |
| 4830 Label* unimplemented_elements_kind = &slow; | 4833 Label* unimplemented_elements_kind = &slow; |
| 4831 IncrementCounter(isolate()->counters()->ic_keyed_load_generic_smi(), 1); | 4834 IncrementCounter(isolate()->counters()->ic_keyed_load_generic_smi(), 1); |
| 4832 EmitElementLoad(receiver, elements, elements_kind, index, | 4835 EmitElementLoad(receiver, elements, elements_kind, index, |
| 4833 is_jsarray_condition, &if_element_hole, &rebox_double, | 4836 is_jsarray_condition, &if_element_hole, &rebox_double, |
| (...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5722 Heap::kTheHoleValueRootIndex); | 5725 Heap::kTheHoleValueRootIndex); |
| 5723 | 5726 |
| 5724 // Store the WeakCell in the feedback vector. | 5727 // Store the WeakCell in the feedback vector. |
| 5725 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, | 5728 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, |
| 5726 CodeStubAssembler::SMI_PARAMETERS); | 5729 CodeStubAssembler::SMI_PARAMETERS); |
| 5727 return cell; | 5730 return cell; |
| 5728 } | 5731 } |
| 5729 | 5732 |
| 5730 } // namespace internal | 5733 } // namespace internal |
| 5731 } // namespace v8 | 5734 } // namespace v8 |
| OLD | NEW |