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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/field-index.h" | 9 #include "src/field-index.h" |
10 #include "src/hydrogen.h" | 10 #include "src/hydrogen.h" |
(...skipping 1969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1980 HValue* bit_field2, | 1980 HValue* bit_field2, |
1981 ElementsKind kind); | 1981 ElementsKind kind); |
1982 | 1982 |
1983 void BuildFastElementLoad(HGraphBuilder::IfBuilder* if_builder, | 1983 void BuildFastElementLoad(HGraphBuilder::IfBuilder* if_builder, |
1984 HValue* receiver, | 1984 HValue* receiver, |
1985 HValue* key, | 1985 HValue* key, |
1986 HValue* instance_type, | 1986 HValue* instance_type, |
1987 HValue* bit_field2, | 1987 HValue* bit_field2, |
1988 ElementsKind kind); | 1988 ElementsKind kind); |
1989 | 1989 |
1990 void BuildExternalElementLoad(HGraphBuilder::IfBuilder* if_builder, | |
1991 HValue* receiver, | |
1992 HValue* key, | |
1993 HValue* instance_type, | |
1994 HValue* bit_field2, | |
1995 ElementsKind kind); | |
1996 | |
1997 KeyedLoadGenericStub* casted_stub() { | 1990 KeyedLoadGenericStub* casted_stub() { |
1998 return static_cast<KeyedLoadGenericStub*>(stub()); | 1991 return static_cast<KeyedLoadGenericStub*>(stub()); |
1999 } | 1992 } |
2000 }; | 1993 }; |
2001 | 1994 |
2002 | 1995 |
2003 void CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildElementsKindLimitCheck( | 1996 void CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildElementsKindLimitCheck( |
2004 HGraphBuilder::IfBuilder* if_builder, HValue* bit_field2, | 1997 HGraphBuilder::IfBuilder* if_builder, HValue* bit_field2, |
2005 ElementsKind kind) { | 1998 ElementsKind kind) { |
2006 ElementsKind next_kind = static_cast<ElementsKind>(kind + 1); | 1999 ElementsKind next_kind = static_cast<ElementsKind>(kind + 1); |
2007 HValue* kind_limit = Add<HConstant>( | 2000 HValue* kind_limit = Add<HConstant>( |
2008 static_cast<int>(Map::ElementsKindBits::encode(next_kind))); | 2001 static_cast<int>(Map::ElementsKindBits::encode(next_kind))); |
2009 | 2002 |
2010 if_builder->If<HCompareNumericAndBranch>(bit_field2, kind_limit, Token::LT); | 2003 if_builder->If<HCompareNumericAndBranch>(bit_field2, kind_limit, Token::LT); |
2011 if_builder->Then(); | 2004 if_builder->Then(); |
2012 } | 2005 } |
2013 | 2006 |
2014 | 2007 |
2015 void CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildFastElementLoad( | 2008 void CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildFastElementLoad( |
2016 HGraphBuilder::IfBuilder* if_builder, HValue* receiver, HValue* key, | 2009 HGraphBuilder::IfBuilder* if_builder, HValue* receiver, HValue* key, |
2017 HValue* instance_type, HValue* bit_field2, ElementsKind kind) { | 2010 HValue* instance_type, HValue* bit_field2, ElementsKind kind) { |
2018 DCHECK(!IsExternalArrayElementsKind(kind)); | |
2019 | |
2020 BuildElementsKindLimitCheck(if_builder, bit_field2, kind); | 2011 BuildElementsKindLimitCheck(if_builder, bit_field2, kind); |
2021 | 2012 |
2022 IfBuilder js_array_check(this); | 2013 IfBuilder js_array_check(this); |
2023 js_array_check.If<HCompareNumericAndBranch>( | 2014 js_array_check.If<HCompareNumericAndBranch>( |
2024 instance_type, Add<HConstant>(JS_ARRAY_TYPE), Token::EQ); | 2015 instance_type, Add<HConstant>(JS_ARRAY_TYPE), Token::EQ); |
2025 js_array_check.Then(); | 2016 js_array_check.Then(); |
2026 Push(BuildUncheckedMonomorphicElementAccess(receiver, key, NULL, | 2017 Push(BuildUncheckedMonomorphicElementAccess(receiver, key, NULL, |
2027 true, kind, | 2018 true, kind, |
2028 LOAD, NEVER_RETURN_HOLE, | 2019 LOAD, NEVER_RETURN_HOLE, |
2029 STANDARD_STORE)); | 2020 STANDARD_STORE)); |
2030 js_array_check.Else(); | 2021 js_array_check.Else(); |
2031 Push(BuildUncheckedMonomorphicElementAccess(receiver, key, NULL, | 2022 Push(BuildUncheckedMonomorphicElementAccess(receiver, key, NULL, |
2032 false, kind, | 2023 false, kind, |
2033 LOAD, NEVER_RETURN_HOLE, | 2024 LOAD, NEVER_RETURN_HOLE, |
2034 STANDARD_STORE)); | 2025 STANDARD_STORE)); |
2035 js_array_check.End(); | 2026 js_array_check.End(); |
2036 } | 2027 } |
2037 | 2028 |
2038 | 2029 |
2039 void CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildExternalElementLoad( | |
2040 HGraphBuilder::IfBuilder* if_builder, HValue* receiver, HValue* key, | |
2041 HValue* instance_type, HValue* bit_field2, ElementsKind kind) { | |
2042 DCHECK(IsExternalArrayElementsKind(kind)); | |
2043 | |
2044 BuildElementsKindLimitCheck(if_builder, bit_field2, kind); | |
2045 | |
2046 Push(BuildUncheckedMonomorphicElementAccess(receiver, key, NULL, | |
2047 false, kind, | |
2048 LOAD, NEVER_RETURN_HOLE, | |
2049 STANDARD_STORE)); | |
2050 } | |
2051 | |
2052 | |
2053 HValue* CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildCodeStub() { | 2030 HValue* CodeStubGraphBuilder<KeyedLoadGenericStub>::BuildCodeStub() { |
2054 HValue* receiver = GetParameter(LoadDescriptor::kReceiverIndex); | 2031 HValue* receiver = GetParameter(LoadDescriptor::kReceiverIndex); |
2055 HValue* key = GetParameter(LoadDescriptor::kNameIndex); | 2032 HValue* key = GetParameter(LoadDescriptor::kNameIndex); |
2056 // Split into a smi/integer case and unique string case. | 2033 // Split into a smi/integer case and unique string case. |
2057 HIfContinuation index_name_split_continuation(graph()->CreateBasicBlock(), | 2034 HIfContinuation index_name_split_continuation(graph()->CreateBasicBlock(), |
2058 graph()->CreateBasicBlock()); | 2035 graph()->CreateBasicBlock()); |
2059 | 2036 |
2060 BuildKeyedIndexCheck(key, &index_name_split_continuation); | 2037 BuildKeyedIndexCheck(key, &index_name_split_continuation); |
2061 | 2038 |
2062 IfBuilder index_name_split(this, &index_name_split_continuation); | 2039 IfBuilder index_name_split(this, &index_name_split_continuation); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2104 // The SLOW_SLOPPY_ARGUMENTS_ELEMENTS check generates a "kind_if.Then" | 2081 // The SLOW_SLOPPY_ARGUMENTS_ELEMENTS check generates a "kind_if.Then" |
2105 STATIC_ASSERT(FAST_SLOPPY_ARGUMENTS_ELEMENTS < | 2082 STATIC_ASSERT(FAST_SLOPPY_ARGUMENTS_ELEMENTS < |
2106 SLOW_SLOPPY_ARGUMENTS_ELEMENTS); | 2083 SLOW_SLOPPY_ARGUMENTS_ELEMENTS); |
2107 BuildElementsKindLimitCheck(&kind_if, bit_field2, | 2084 BuildElementsKindLimitCheck(&kind_if, bit_field2, |
2108 SLOW_SLOPPY_ARGUMENTS_ELEMENTS); | 2085 SLOW_SLOPPY_ARGUMENTS_ELEMENTS); |
2109 // Non-strict elements are not handled. | 2086 // Non-strict elements are not handled. |
2110 Add<HDeoptimize>(Deoptimizer::kNonStrictElementsInKeyedLoadGenericStub, | 2087 Add<HDeoptimize>(Deoptimizer::kNonStrictElementsInKeyedLoadGenericStub, |
2111 Deoptimizer::EAGER); | 2088 Deoptimizer::EAGER); |
2112 Push(graph()->GetConstant0()); | 2089 Push(graph()->GetConstant0()); |
2113 | 2090 |
2114 kind_if.Else(); | |
2115 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2116 EXTERNAL_INT8_ELEMENTS); | |
2117 | |
2118 kind_if.Else(); | |
2119 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2120 EXTERNAL_UINT8_ELEMENTS); | |
2121 | |
2122 kind_if.Else(); | |
2123 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2124 EXTERNAL_INT16_ELEMENTS); | |
2125 | |
2126 kind_if.Else(); | |
2127 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2128 EXTERNAL_UINT16_ELEMENTS); | |
2129 | |
2130 kind_if.Else(); | |
2131 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2132 EXTERNAL_INT32_ELEMENTS); | |
2133 | |
2134 kind_if.Else(); | |
2135 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2136 EXTERNAL_UINT32_ELEMENTS); | |
2137 | |
2138 kind_if.Else(); | |
2139 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2140 EXTERNAL_FLOAT32_ELEMENTS); | |
2141 | |
2142 kind_if.Else(); | |
2143 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2144 EXTERNAL_FLOAT64_ELEMENTS); | |
2145 | |
2146 kind_if.Else(); | |
2147 BuildExternalElementLoad(&kind_if, receiver, key, instance_type, bit_field2, | |
2148 EXTERNAL_UINT8_CLAMPED_ELEMENTS); | |
2149 | |
2150 kind_if.ElseDeopt( | 2091 kind_if.ElseDeopt( |
2151 Deoptimizer::kElementsKindUnhandledInKeyedLoadGenericStub); | 2092 Deoptimizer::kElementsKindUnhandledInKeyedLoadGenericStub); |
2152 | 2093 |
2153 kind_if.End(); | 2094 kind_if.End(); |
2154 } | 2095 } |
2155 index_name_split.Else(); | 2096 index_name_split.Else(); |
2156 { | 2097 { |
2157 // Key is a unique string. | 2098 // Key is a unique string. |
2158 key = Pop(); | 2099 key = Pop(); |
2159 | 2100 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2227 lookup_if->Then(); | 2168 lookup_if->Then(); |
2228 { | 2169 { |
2229 ExternalReference cache_field_offsets_ref = | 2170 ExternalReference cache_field_offsets_ref = |
2230 ExternalReference::keyed_lookup_cache_field_offsets(isolate()); | 2171 ExternalReference::keyed_lookup_cache_field_offsets(isolate()); |
2231 HValue* cache_field_offsets = | 2172 HValue* cache_field_offsets = |
2232 Add<HConstant>(cache_field_offsets_ref); | 2173 Add<HConstant>(cache_field_offsets_ref); |
2233 HValue* index = AddUncasted<HAdd>(hash, Add<HConstant>(probe)); | 2174 HValue* index = AddUncasted<HAdd>(hash, Add<HConstant>(probe)); |
2234 index->ClearFlag(HValue::kCanOverflow); | 2175 index->ClearFlag(HValue::kCanOverflow); |
2235 HValue* property_index = | 2176 HValue* property_index = |
2236 Add<HLoadKeyed>(cache_field_offsets, index, nullptr, | 2177 Add<HLoadKeyed>(cache_field_offsets, index, nullptr, |
2237 EXTERNAL_INT32_ELEMENTS, NEVER_RETURN_HOLE, 0); | 2178 INT32_ELEMENTS, NEVER_RETURN_HOLE, 0); |
2238 Push(property_index); | 2179 Push(property_index); |
2239 } | 2180 } |
2240 lookup_if->Else(); | 2181 lookup_if->Else(); |
2241 } | 2182 } |
2242 for (int i = 0; i < KeyedLookupCache::kEntriesPerBucket; ++i) { | 2183 for (int i = 0; i < KeyedLookupCache::kEntriesPerBucket; ++i) { |
2243 lookup_ifs[i].JoinContinuation(&inline_or_runtime_continuation); | 2184 lookup_ifs[i].JoinContinuation(&inline_or_runtime_continuation); |
2244 } | 2185 } |
2245 } | 2186 } |
2246 | 2187 |
2247 IfBuilder inline_or_runtime(this, &inline_or_runtime_continuation); | 2188 IfBuilder inline_or_runtime(this, &inline_or_runtime_continuation); |
(...skipping 22 matching lines...) Expand all Loading... |
2270 return Pop(); | 2211 return Pop(); |
2271 } | 2212 } |
2272 | 2213 |
2273 | 2214 |
2274 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2215 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
2275 return DoGenerateCode(this); | 2216 return DoGenerateCode(this); |
2276 } | 2217 } |
2277 | 2218 |
2278 } // namespace internal | 2219 } // namespace internal |
2279 } // namespace v8 | 2220 } // namespace v8 |
OLD | NEW |