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/builtins/builtins.h" | 5 #include "src/builtins/builtins.h" |
6 #include "src/builtins/builtins-utils.h" | 6 #include "src/builtins/builtins-utils.h" |
7 | 7 |
8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
9 #include "src/code-stub-assembler.h" | 9 #include "src/code-stub-assembler.h" |
10 #include "src/contexts.h" | 10 #include "src/contexts.h" |
(...skipping 1790 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1801 Node* elements_kind = assembler.LoadMapElementsKind(map); | 1801 Node* elements_kind = assembler.LoadMapElementsKind(map); |
1802 Node* elements = assembler.LoadElements(array); | 1802 Node* elements = assembler.LoadElements(array); |
1803 assembler.Switch(elements_kind, &return_false, kElementsKind, | 1803 assembler.Switch(elements_kind, &return_false, kElementsKind, |
1804 element_kind_handlers, arraysize(kElementsKind)); | 1804 element_kind_handlers, arraysize(kElementsKind)); |
1805 | 1805 |
1806 assembler.Bind(&if_smiorobjects); | 1806 assembler.Bind(&if_smiorobjects); |
1807 { | 1807 { |
1808 Variable search_num(&assembler, MachineRepresentation::kFloat64); | 1808 Variable search_num(&assembler, MachineRepresentation::kFloat64); |
1809 Label ident_loop(&assembler, &index_var), | 1809 Label ident_loop(&assembler, &index_var), |
1810 heap_num_loop(&assembler, &search_num), | 1810 heap_num_loop(&assembler, &search_num), |
1811 string_loop(&assembler, &index_var), simd_loop(&assembler), | 1811 string_loop(&assembler, &index_var), undef_loop(&assembler, &index_var), |
1812 undef_loop(&assembler, &index_var), not_smi(&assembler), | 1812 not_smi(&assembler), not_heap_num(&assembler); |
1813 not_heap_num(&assembler); | |
1814 | 1813 |
1815 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); | 1814 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); |
1816 search_num.Bind(assembler.SmiToFloat64(search_element)); | 1815 search_num.Bind(assembler.SmiToFloat64(search_element)); |
1817 assembler.Goto(&heap_num_loop); | 1816 assembler.Goto(&heap_num_loop); |
1818 | 1817 |
1819 assembler.Bind(¬_smi); | 1818 assembler.Bind(¬_smi); |
1820 assembler.GotoIf(assembler.WordEqual(search_element, undefined), | 1819 assembler.GotoIf(assembler.WordEqual(search_element, undefined), |
1821 &undef_loop); | 1820 &undef_loop); |
1822 Node* map = assembler.LoadMap(search_element); | 1821 Node* map = assembler.LoadMap(search_element); |
1823 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); | 1822 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); |
1824 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); | 1823 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); |
1825 assembler.Goto(&heap_num_loop); | 1824 assembler.Goto(&heap_num_loop); |
1826 | 1825 |
1827 assembler.Bind(¬_heap_num); | 1826 assembler.Bind(¬_heap_num); |
1828 Node* search_type = assembler.LoadMapInstanceType(map); | 1827 Node* search_type = assembler.LoadMapInstanceType(map); |
1829 assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop); | 1828 assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop); |
1830 assembler.GotoIf( | |
1831 assembler.Word32Equal(search_type, | |
1832 assembler.Int32Constant(SIMD128_VALUE_TYPE)), | |
1833 &simd_loop); | |
1834 assembler.Goto(&ident_loop); | 1829 assembler.Goto(&ident_loop); |
1835 | 1830 |
1836 assembler.Bind(&ident_loop); | 1831 assembler.Bind(&ident_loop); |
1837 { | 1832 { |
1838 assembler.GotoUnless( | 1833 assembler.GotoUnless( |
1839 assembler.UintPtrLessThan(index_var.value(), len_var.value()), | 1834 assembler.UintPtrLessThan(index_var.value(), len_var.value()), |
1840 &return_false); | 1835 &return_false); |
1841 Node* element_k = | 1836 Node* element_k = |
1842 assembler.LoadFixedArrayElement(elements, index_var.value()); | 1837 assembler.LoadFixedArrayElement(elements, index_var.value()); |
1843 assembler.GotoIf(assembler.WordEqual(element_k, search_element), | 1838 assembler.GotoIf(assembler.WordEqual(element_k, search_element), |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1935 Node* result = | 1930 Node* result = |
1936 assembler.CallStub(callable, context, search_element, element_k); | 1931 assembler.CallStub(callable, context, search_element, element_k); |
1937 assembler.Branch( | 1932 assembler.Branch( |
1938 assembler.WordEqual(assembler.BooleanConstant(true), result), | 1933 assembler.WordEqual(assembler.BooleanConstant(true), result), |
1939 &return_true, &continue_loop); | 1934 &return_true, &continue_loop); |
1940 | 1935 |
1941 assembler.Bind(&continue_loop); | 1936 assembler.Bind(&continue_loop); |
1942 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); | 1937 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); |
1943 assembler.Goto(&string_loop); | 1938 assembler.Goto(&string_loop); |
1944 } | 1939 } |
1945 | |
1946 assembler.Bind(&simd_loop); | |
1947 { | |
1948 Label continue_loop(&assembler, &index_var), | |
1949 loop_body(&assembler, &index_var); | |
1950 Node* map = assembler.LoadMap(search_element); | |
1951 | |
1952 assembler.Goto(&loop_body); | |
1953 assembler.Bind(&loop_body); | |
1954 assembler.GotoUnless( | |
1955 assembler.UintPtrLessThan(index_var.value(), len_var.value()), | |
1956 &return_false); | |
1957 | |
1958 Node* element_k = | |
1959 assembler.LoadFixedArrayElement(elements, index_var.value()); | |
1960 assembler.GotoIf(assembler.TaggedIsSmi(element_k), &continue_loop); | |
1961 | |
1962 Node* map_k = assembler.LoadMap(element_k); | |
1963 assembler.BranchIfSimd128Equal(search_element, map, element_k, map_k, | |
1964 &return_true, &continue_loop); | |
1965 | |
1966 assembler.Bind(&continue_loop); | |
1967 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); | |
1968 assembler.Goto(&loop_body); | |
1969 } | |
1970 } | 1940 } |
1971 | 1941 |
1972 assembler.Bind(&if_packed_doubles); | 1942 assembler.Bind(&if_packed_doubles); |
1973 { | 1943 { |
1974 Label nan_loop(&assembler, &index_var), | 1944 Label nan_loop(&assembler, &index_var), |
1975 not_nan_loop(&assembler, &index_var), hole_loop(&assembler, &index_var), | 1945 not_nan_loop(&assembler, &index_var), hole_loop(&assembler, &index_var), |
1976 search_notnan(&assembler); | 1946 search_notnan(&assembler); |
1977 Variable search_num(&assembler, MachineRepresentation::kFloat64); | 1947 Variable search_num(&assembler, MachineRepresentation::kFloat64); |
1978 | 1948 |
1979 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); | 1949 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2238 Node* elements_kind = assembler.LoadMapElementsKind(map); | 2208 Node* elements_kind = assembler.LoadMapElementsKind(map); |
2239 Node* elements = assembler.LoadElements(array); | 2209 Node* elements = assembler.LoadElements(array); |
2240 assembler.Switch(elements_kind, &return_not_found, kElementsKind, | 2210 assembler.Switch(elements_kind, &return_not_found, kElementsKind, |
2241 element_kind_handlers, arraysize(kElementsKind)); | 2211 element_kind_handlers, arraysize(kElementsKind)); |
2242 | 2212 |
2243 assembler.Bind(&if_smiorobjects); | 2213 assembler.Bind(&if_smiorobjects); |
2244 { | 2214 { |
2245 Variable search_num(&assembler, MachineRepresentation::kFloat64); | 2215 Variable search_num(&assembler, MachineRepresentation::kFloat64); |
2246 Label ident_loop(&assembler, &index_var), | 2216 Label ident_loop(&assembler, &index_var), |
2247 heap_num_loop(&assembler, &search_num), | 2217 heap_num_loop(&assembler, &search_num), |
2248 string_loop(&assembler, &index_var), simd_loop(&assembler), | 2218 string_loop(&assembler, &index_var), undef_loop(&assembler, &index_var), |
2249 undef_loop(&assembler, &index_var), not_smi(&assembler), | 2219 not_smi(&assembler), not_heap_num(&assembler); |
2250 not_heap_num(&assembler); | |
2251 | 2220 |
2252 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); | 2221 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); |
2253 search_num.Bind(assembler.SmiToFloat64(search_element)); | 2222 search_num.Bind(assembler.SmiToFloat64(search_element)); |
2254 assembler.Goto(&heap_num_loop); | 2223 assembler.Goto(&heap_num_loop); |
2255 | 2224 |
2256 assembler.Bind(¬_smi); | 2225 assembler.Bind(¬_smi); |
2257 assembler.GotoIf(assembler.WordEqual(search_element, undefined), | 2226 assembler.GotoIf(assembler.WordEqual(search_element, undefined), |
2258 &undef_loop); | 2227 &undef_loop); |
2259 Node* map = assembler.LoadMap(search_element); | 2228 Node* map = assembler.LoadMap(search_element); |
2260 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); | 2229 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); |
2261 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); | 2230 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); |
2262 assembler.Goto(&heap_num_loop); | 2231 assembler.Goto(&heap_num_loop); |
2263 | 2232 |
2264 assembler.Bind(¬_heap_num); | 2233 assembler.Bind(¬_heap_num); |
2265 Node* search_type = assembler.LoadMapInstanceType(map); | 2234 Node* search_type = assembler.LoadMapInstanceType(map); |
2266 assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop); | 2235 assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop); |
2267 assembler.GotoIf( | |
2268 assembler.Word32Equal(search_type, | |
2269 assembler.Int32Constant(SIMD128_VALUE_TYPE)), | |
2270 &simd_loop); | |
2271 assembler.Goto(&ident_loop); | 2236 assembler.Goto(&ident_loop); |
2272 | 2237 |
2273 assembler.Bind(&ident_loop); | 2238 assembler.Bind(&ident_loop); |
2274 { | 2239 { |
2275 assembler.GotoUnless( | 2240 assembler.GotoUnless( |
2276 assembler.UintPtrLessThan(index_var.value(), len_var.value()), | 2241 assembler.UintPtrLessThan(index_var.value(), len_var.value()), |
2277 &return_not_found); | 2242 &return_not_found); |
2278 Node* element_k = | 2243 Node* element_k = |
2279 assembler.LoadFixedArrayElement(elements, index_var.value()); | 2244 assembler.LoadFixedArrayElement(elements, index_var.value()); |
2280 assembler.GotoIf(assembler.WordEqual(element_k, search_element), | 2245 assembler.GotoIf(assembler.WordEqual(element_k, search_element), |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2351 Node* result = | 2316 Node* result = |
2352 assembler.CallStub(callable, context, search_element, element_k); | 2317 assembler.CallStub(callable, context, search_element, element_k); |
2353 assembler.Branch( | 2318 assembler.Branch( |
2354 assembler.WordEqual(assembler.BooleanConstant(true), result), | 2319 assembler.WordEqual(assembler.BooleanConstant(true), result), |
2355 &return_found, &continue_loop); | 2320 &return_found, &continue_loop); |
2356 | 2321 |
2357 assembler.Bind(&continue_loop); | 2322 assembler.Bind(&continue_loop); |
2358 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); | 2323 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); |
2359 assembler.Goto(&string_loop); | 2324 assembler.Goto(&string_loop); |
2360 } | 2325 } |
2361 | |
2362 assembler.Bind(&simd_loop); | |
2363 { | |
2364 Label continue_loop(&assembler, &index_var), | |
2365 loop_body(&assembler, &index_var); | |
2366 Node* map = assembler.LoadMap(search_element); | |
2367 | |
2368 assembler.Goto(&loop_body); | |
2369 assembler.Bind(&loop_body); | |
2370 assembler.GotoUnless( | |
2371 assembler.UintPtrLessThan(index_var.value(), len_var.value()), | |
2372 &return_not_found); | |
2373 | |
2374 Node* element_k = | |
2375 assembler.LoadFixedArrayElement(elements, index_var.value()); | |
2376 assembler.GotoIf(assembler.TaggedIsSmi(element_k), &continue_loop); | |
2377 | |
2378 Node* map_k = assembler.LoadMap(element_k); | |
2379 assembler.BranchIfSimd128Equal(search_element, map, element_k, map_k, | |
2380 &return_found, &continue_loop); | |
2381 | |
2382 assembler.Bind(&continue_loop); | |
2383 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); | |
2384 assembler.Goto(&loop_body); | |
2385 } | |
2386 } | 2326 } |
2387 | 2327 |
2388 assembler.Bind(&if_packed_doubles); | 2328 assembler.Bind(&if_packed_doubles); |
2389 { | 2329 { |
2390 Label not_nan_loop(&assembler, &index_var), search_notnan(&assembler); | 2330 Label not_nan_loop(&assembler, &index_var), search_notnan(&assembler); |
2391 Variable search_num(&assembler, MachineRepresentation::kFloat64); | 2331 Variable search_num(&assembler, MachineRepresentation::kFloat64); |
2392 | 2332 |
2393 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); | 2333 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); |
2394 search_num.Bind(assembler.SmiToFloat64(search_element)); | 2334 search_num.Bind(assembler.SmiToFloat64(search_element)); |
2395 assembler.Goto(¬_nan_loop); | 2335 assembler.Goto(¬_nan_loop); |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3008 Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation); | 2948 Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation); |
3009 Node* result = | 2949 Node* result = |
3010 assembler.CallRuntime(Runtime::kThrowTypeError, context, message, | 2950 assembler.CallRuntime(Runtime::kThrowTypeError, context, message, |
3011 assembler.HeapConstant(operation)); | 2951 assembler.HeapConstant(operation)); |
3012 assembler.Return(result); | 2952 assembler.Return(result); |
3013 } | 2953 } |
3014 } | 2954 } |
3015 | 2955 |
3016 } // namespace internal | 2956 } // namespace internal |
3017 } // namespace v8 | 2957 } // namespace v8 |
OLD | NEW |