OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_CODE_STUBS_H_ | 5 #ifndef V8_CODE_STUBS_H_ |
6 #define V8_CODE_STUBS_H_ | 6 #define V8_CODE_STUBS_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 V(DoubleToI) \ | 40 V(DoubleToI) \ |
41 V(FunctionPrototype) \ | 41 V(FunctionPrototype) \ |
42 V(InternalArrayConstructor) \ | 42 V(InternalArrayConstructor) \ |
43 V(JSEntry) \ | 43 V(JSEntry) \ |
44 V(LoadIndexedString) \ | 44 V(LoadIndexedString) \ |
45 V(MathPow) \ | 45 V(MathPow) \ |
46 V(ProfileEntryHook) \ | 46 V(ProfileEntryHook) \ |
47 V(RecordWrite) \ | 47 V(RecordWrite) \ |
48 V(RegExpExec) \ | 48 V(RegExpExec) \ |
49 V(StoreBufferOverflow) \ | 49 V(StoreBufferOverflow) \ |
50 V(StoreElement) \ | 50 V(StoreSlowElement) \ |
51 V(SubString) \ | 51 V(SubString) \ |
52 V(FastNewRestParameter) \ | 52 V(FastNewRestParameter) \ |
53 V(FastNewSloppyArguments) \ | 53 V(FastNewSloppyArguments) \ |
54 V(FastNewStrictArguments) \ | 54 V(FastNewStrictArguments) \ |
55 V(NameDictionaryLookup) \ | 55 V(NameDictionaryLookup) \ |
56 /* This can be removed once there are no */ \ | 56 /* This can be removed once there are no */ \ |
57 /* more deopting Hydrogen stubs. */ \ | 57 /* more deopting Hydrogen stubs. */ \ |
58 V(StubFailureTrampoline) \ | 58 V(StubFailureTrampoline) \ |
59 /* These are only called from FCG */ \ | 59 /* These are only called from FCG */ \ |
60 /* They can be removed when only the TF */ \ | 60 /* They can be removed when only the TF */ \ |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 V(KeyedLoadSloppyArguments) \ | 98 V(KeyedLoadSloppyArguments) \ |
99 V(KeyedStoreSloppyArguments) \ | 99 V(KeyedStoreSloppyArguments) \ |
100 V(LoadScriptContextField) \ | 100 V(LoadScriptContextField) \ |
101 V(StoreScriptContextField) \ | 101 V(StoreScriptContextField) \ |
102 V(NumberToString) \ | 102 V(NumberToString) \ |
103 V(StringAdd) \ | 103 V(StringAdd) \ |
104 V(GetProperty) \ | 104 V(GetProperty) \ |
105 V(StoreFastElement) \ | 105 V(StoreFastElement) \ |
106 V(StoreGlobal) \ | 106 V(StoreGlobal) \ |
107 V(StoreInterceptor) \ | 107 V(StoreInterceptor) \ |
108 V(LoadApiGetter) \ | |
109 V(LoadIndexedInterceptor) \ | 108 V(LoadIndexedInterceptor) \ |
110 V(GrowArrayElements) | 109 V(GrowArrayElements) |
111 | 110 |
112 // List of code stubs only used on ARM 32 bits platforms. | 111 // List of code stubs only used on ARM 32 bits platforms. |
113 #if V8_TARGET_ARCH_ARM | 112 #if V8_TARGET_ARCH_ARM |
114 #define CODE_STUB_LIST_ARM(V) V(DirectCEntry) | 113 #define CODE_STUB_LIST_ARM(V) V(DirectCEntry) |
115 | 114 |
116 #else | 115 #else |
117 #define CODE_STUB_LIST_ARM(V) | 116 #define CODE_STUB_LIST_ARM(V) |
118 #endif | 117 #endif |
(...skipping 879 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 } | 997 } |
999 | 998 |
1000 Code::Kind GetCodeKind() const override { return Code::HANDLER; } | 999 Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
1001 ExtraICState GetExtraICState() const override { return Code::STORE_IC; } | 1000 ExtraICState GetExtraICState() const override { return Code::STORE_IC; } |
1002 | 1001 |
1003 protected: | 1002 protected: |
1004 DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreWithVector); | 1003 DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreWithVector); |
1005 DEFINE_TURBOFAN_CODE_STUB(KeyedStoreSloppyArguments, TurboFanCodeStub); | 1004 DEFINE_TURBOFAN_CODE_STUB(KeyedStoreSloppyArguments, TurboFanCodeStub); |
1006 }; | 1005 }; |
1007 | 1006 |
1008 class LoadApiGetterStub : public TurboFanCodeStub { | |
1009 public: | |
1010 LoadApiGetterStub(Isolate* isolate, bool receiver_is_holder, int index) | |
1011 : TurboFanCodeStub(isolate) { | |
1012 // If that's not true, we need to ensure that the receiver is actually a | |
1013 // JSReceiver. http://crbug.com/609134 | |
1014 DCHECK(receiver_is_holder); | |
1015 minor_key_ = IndexBits::encode(index) | | |
1016 ReceiverIsHolderBits::encode(receiver_is_holder); | |
1017 } | |
1018 | |
1019 Code::Kind GetCodeKind() const override { return Code::HANDLER; } | |
1020 ExtraICState GetExtraICState() const override { return Code::LOAD_IC; } | |
1021 | |
1022 int index() const { return IndexBits::decode(minor_key_); } | |
1023 bool receiver_is_holder() const { | |
1024 return ReceiverIsHolderBits::decode(minor_key_); | |
1025 } | |
1026 | |
1027 private: | |
1028 class ReceiverIsHolderBits : public BitField<bool, 0, 1> {}; | |
1029 class IndexBits : public BitField<int, 1, kDescriptorIndexBitCount> {}; | |
1030 | |
1031 DEFINE_CALL_INTERFACE_DESCRIPTOR(Load); | |
1032 DEFINE_TURBOFAN_CODE_STUB(LoadApiGetter, TurboFanCodeStub); | |
1033 }; | |
1034 | |
1035 class StoreGlobalStub : public TurboFanCodeStub { | 1007 class StoreGlobalStub : public TurboFanCodeStub { |
1036 public: | 1008 public: |
1037 StoreGlobalStub(Isolate* isolate, PropertyCellType type, | 1009 StoreGlobalStub(Isolate* isolate, PropertyCellType type, |
1038 Maybe<PropertyCellConstantType> constant_type, | 1010 Maybe<PropertyCellConstantType> constant_type, |
1039 bool check_global) | 1011 bool check_global) |
1040 : TurboFanCodeStub(isolate) { | 1012 : TurboFanCodeStub(isolate) { |
1041 PropertyCellConstantType encoded_constant_type = | 1013 PropertyCellConstantType encoded_constant_type = |
1042 constant_type.FromMaybe(PropertyCellConstantType::kSmi); | 1014 constant_type.FromMaybe(PropertyCellConstantType::kSmi); |
1043 minor_key_ = CellTypeBits::encode(type) | | 1015 minor_key_ = CellTypeBits::encode(type) | |
1044 ConstantTypeBits::encode(encoded_constant_type) | | 1016 ConstantTypeBits::encode(encoded_constant_type) | |
(...skipping 876 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1921 : PlatformCodeStub(isolate) {} | 1893 : PlatformCodeStub(isolate) {} |
1922 | 1894 |
1923 CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { | 1895 CallInterfaceDescriptor GetCallInterfaceDescriptor() const override { |
1924 return ArrayNArgumentsConstructorDescriptor(isolate()); | 1896 return ArrayNArgumentsConstructorDescriptor(isolate()); |
1925 } | 1897 } |
1926 | 1898 |
1927 private: | 1899 private: |
1928 DEFINE_PLATFORM_CODE_STUB(ArrayNArgumentsConstructor, PlatformCodeStub); | 1900 DEFINE_PLATFORM_CODE_STUB(ArrayNArgumentsConstructor, PlatformCodeStub); |
1929 }; | 1901 }; |
1930 | 1902 |
1931 class StoreElementStub : public PlatformCodeStub { | 1903 class StoreSlowElementStub : public TurboFanCodeStub { |
1932 public: | 1904 public: |
1933 StoreElementStub(Isolate* isolate, ElementsKind elements_kind, | 1905 StoreSlowElementStub(Isolate* isolate, KeyedAccessStoreMode mode) |
1934 KeyedAccessStoreMode mode) | 1906 : TurboFanCodeStub(isolate) { |
1935 : PlatformCodeStub(isolate) { | 1907 minor_key_ = CommonStoreModeBits::encode(mode); |
1936 // TODO(jkummerow): Rename this stub to StoreSlowElementStub, | |
1937 // drop elements_kind parameter. | |
1938 DCHECK_EQ(DICTIONARY_ELEMENTS, elements_kind); | |
1939 minor_key_ = ElementsKindBits::encode(elements_kind) | | |
1940 CommonStoreModeBits::encode(mode); | |
1941 } | 1908 } |
1942 | 1909 |
1943 Code::Kind GetCodeKind() const override { return Code::HANDLER; } | 1910 Code::Kind GetCodeKind() const override { return Code::HANDLER; } |
1944 ExtraICState GetExtraICState() const override { return Code::KEYED_STORE_IC; } | 1911 ExtraICState GetExtraICState() const override { return Code::KEYED_STORE_IC; } |
1945 | 1912 |
1946 private: | 1913 private: |
1947 ElementsKind elements_kind() const { | |
1948 return ElementsKindBits::decode(minor_key_); | |
1949 } | |
1950 | |
1951 class ElementsKindBits | |
1952 : public BitField<ElementsKind, CommonStoreModeBits::kNext, 8> {}; | |
1953 | |
1954 DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreWithVector); | 1914 DEFINE_CALL_INTERFACE_DESCRIPTOR(StoreWithVector); |
1955 DEFINE_PLATFORM_CODE_STUB(StoreElement, PlatformCodeStub); | 1915 DEFINE_TURBOFAN_CODE_STUB(StoreSlowElement, TurboFanCodeStub); |
1956 }; | 1916 }; |
1957 | 1917 |
1958 class ToBooleanICStub : public HydrogenCodeStub { | 1918 class ToBooleanICStub : public HydrogenCodeStub { |
1959 public: | 1919 public: |
1960 ToBooleanICStub(Isolate* isolate, ExtraICState state) | 1920 ToBooleanICStub(Isolate* isolate, ExtraICState state) |
1961 : HydrogenCodeStub(isolate) { | 1921 : HydrogenCodeStub(isolate) { |
1962 set_sub_minor_key(HintsBits::encode(static_cast<uint16_t>(state))); | 1922 set_sub_minor_key(HintsBits::encode(static_cast<uint16_t>(state))); |
1963 } | 1923 } |
1964 | 1924 |
1965 bool UpdateStatus(Handle<Object> object); | 1925 bool UpdateStatus(Handle<Object> object); |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2110 #undef DEFINE_PLATFORM_CODE_STUB | 2070 #undef DEFINE_PLATFORM_CODE_STUB |
2111 #undef DEFINE_HANDLER_CODE_STUB | 2071 #undef DEFINE_HANDLER_CODE_STUB |
2112 #undef DEFINE_HYDROGEN_CODE_STUB | 2072 #undef DEFINE_HYDROGEN_CODE_STUB |
2113 #undef DEFINE_CODE_STUB | 2073 #undef DEFINE_CODE_STUB |
2114 #undef DEFINE_CODE_STUB_BASE | 2074 #undef DEFINE_CODE_STUB_BASE |
2115 | 2075 |
2116 } // namespace internal | 2076 } // namespace internal |
2117 } // namespace v8 | 2077 } // namespace v8 |
2118 | 2078 |
2119 #endif // V8_CODE_STUBS_H_ | 2079 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |