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), undef_loop(&assembler, &index_var), | 1811 string_loop(&assembler, &index_var), simd_loop(&assembler), |
1812 not_smi(&assembler), not_heap_num(&assembler); | 1812 undef_loop(&assembler, &index_var), not_smi(&assembler), |
| 1813 not_heap_num(&assembler); |
1813 | 1814 |
1814 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); | 1815 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); |
1815 search_num.Bind(assembler.SmiToFloat64(search_element)); | 1816 search_num.Bind(assembler.SmiToFloat64(search_element)); |
1816 assembler.Goto(&heap_num_loop); | 1817 assembler.Goto(&heap_num_loop); |
1817 | 1818 |
1818 assembler.Bind(¬_smi); | 1819 assembler.Bind(¬_smi); |
1819 assembler.GotoIf(assembler.WordEqual(search_element, undefined), | 1820 assembler.GotoIf(assembler.WordEqual(search_element, undefined), |
1820 &undef_loop); | 1821 &undef_loop); |
1821 Node* map = assembler.LoadMap(search_element); | 1822 Node* map = assembler.LoadMap(search_element); |
1822 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); | 1823 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); |
1823 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); | 1824 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); |
1824 assembler.Goto(&heap_num_loop); | 1825 assembler.Goto(&heap_num_loop); |
1825 | 1826 |
1826 assembler.Bind(¬_heap_num); | 1827 assembler.Bind(¬_heap_num); |
1827 Node* search_type = assembler.LoadMapInstanceType(map); | 1828 Node* search_type = assembler.LoadMapInstanceType(map); |
1828 assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop); | 1829 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); |
1829 assembler.Goto(&ident_loop); | 1834 assembler.Goto(&ident_loop); |
1830 | 1835 |
1831 assembler.Bind(&ident_loop); | 1836 assembler.Bind(&ident_loop); |
1832 { | 1837 { |
1833 assembler.GotoUnless( | 1838 assembler.GotoUnless( |
1834 assembler.UintPtrLessThan(index_var.value(), len_var.value()), | 1839 assembler.UintPtrLessThan(index_var.value(), len_var.value()), |
1835 &return_false); | 1840 &return_false); |
1836 Node* element_k = | 1841 Node* element_k = |
1837 assembler.LoadFixedArrayElement(elements, index_var.value()); | 1842 assembler.LoadFixedArrayElement(elements, index_var.value()); |
1838 assembler.GotoIf(assembler.WordEqual(element_k, search_element), | 1843 assembler.GotoIf(assembler.WordEqual(element_k, search_element), |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1930 Node* result = | 1935 Node* result = |
1931 assembler.CallStub(callable, context, search_element, element_k); | 1936 assembler.CallStub(callable, context, search_element, element_k); |
1932 assembler.Branch( | 1937 assembler.Branch( |
1933 assembler.WordEqual(assembler.BooleanConstant(true), result), | 1938 assembler.WordEqual(assembler.BooleanConstant(true), result), |
1934 &return_true, &continue_loop); | 1939 &return_true, &continue_loop); |
1935 | 1940 |
1936 assembler.Bind(&continue_loop); | 1941 assembler.Bind(&continue_loop); |
1937 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); | 1942 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); |
1938 assembler.Goto(&string_loop); | 1943 assembler.Goto(&string_loop); |
1939 } | 1944 } |
| 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 } |
1940 } | 1970 } |
1941 | 1971 |
1942 assembler.Bind(&if_packed_doubles); | 1972 assembler.Bind(&if_packed_doubles); |
1943 { | 1973 { |
1944 Label nan_loop(&assembler, &index_var), | 1974 Label nan_loop(&assembler, &index_var), |
1945 not_nan_loop(&assembler, &index_var), hole_loop(&assembler, &index_var), | 1975 not_nan_loop(&assembler, &index_var), hole_loop(&assembler, &index_var), |
1946 search_notnan(&assembler); | 1976 search_notnan(&assembler); |
1947 Variable search_num(&assembler, MachineRepresentation::kFloat64); | 1977 Variable search_num(&assembler, MachineRepresentation::kFloat64); |
1948 | 1978 |
1949 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); | 1979 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2208 Node* elements_kind = assembler.LoadMapElementsKind(map); | 2238 Node* elements_kind = assembler.LoadMapElementsKind(map); |
2209 Node* elements = assembler.LoadElements(array); | 2239 Node* elements = assembler.LoadElements(array); |
2210 assembler.Switch(elements_kind, &return_not_found, kElementsKind, | 2240 assembler.Switch(elements_kind, &return_not_found, kElementsKind, |
2211 element_kind_handlers, arraysize(kElementsKind)); | 2241 element_kind_handlers, arraysize(kElementsKind)); |
2212 | 2242 |
2213 assembler.Bind(&if_smiorobjects); | 2243 assembler.Bind(&if_smiorobjects); |
2214 { | 2244 { |
2215 Variable search_num(&assembler, MachineRepresentation::kFloat64); | 2245 Variable search_num(&assembler, MachineRepresentation::kFloat64); |
2216 Label ident_loop(&assembler, &index_var), | 2246 Label ident_loop(&assembler, &index_var), |
2217 heap_num_loop(&assembler, &search_num), | 2247 heap_num_loop(&assembler, &search_num), |
2218 string_loop(&assembler, &index_var), undef_loop(&assembler, &index_var), | 2248 string_loop(&assembler, &index_var), simd_loop(&assembler), |
2219 not_smi(&assembler), not_heap_num(&assembler); | 2249 undef_loop(&assembler, &index_var), not_smi(&assembler), |
| 2250 not_heap_num(&assembler); |
2220 | 2251 |
2221 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); | 2252 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi); |
2222 search_num.Bind(assembler.SmiToFloat64(search_element)); | 2253 search_num.Bind(assembler.SmiToFloat64(search_element)); |
2223 assembler.Goto(&heap_num_loop); | 2254 assembler.Goto(&heap_num_loop); |
2224 | 2255 |
2225 assembler.Bind(¬_smi); | 2256 assembler.Bind(¬_smi); |
2226 assembler.GotoIf(assembler.WordEqual(search_element, undefined), | 2257 assembler.GotoIf(assembler.WordEqual(search_element, undefined), |
2227 &undef_loop); | 2258 &undef_loop); |
2228 Node* map = assembler.LoadMap(search_element); | 2259 Node* map = assembler.LoadMap(search_element); |
2229 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); | 2260 assembler.GotoUnless(assembler.IsHeapNumberMap(map), ¬_heap_num); |
2230 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); | 2261 search_num.Bind(assembler.LoadHeapNumberValue(search_element)); |
2231 assembler.Goto(&heap_num_loop); | 2262 assembler.Goto(&heap_num_loop); |
2232 | 2263 |
2233 assembler.Bind(¬_heap_num); | 2264 assembler.Bind(¬_heap_num); |
2234 Node* search_type = assembler.LoadMapInstanceType(map); | 2265 Node* search_type = assembler.LoadMapInstanceType(map); |
2235 assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop); | 2266 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); |
2236 assembler.Goto(&ident_loop); | 2271 assembler.Goto(&ident_loop); |
2237 | 2272 |
2238 assembler.Bind(&ident_loop); | 2273 assembler.Bind(&ident_loop); |
2239 { | 2274 { |
2240 assembler.GotoUnless( | 2275 assembler.GotoUnless( |
2241 assembler.UintPtrLessThan(index_var.value(), len_var.value()), | 2276 assembler.UintPtrLessThan(index_var.value(), len_var.value()), |
2242 &return_not_found); | 2277 &return_not_found); |
2243 Node* element_k = | 2278 Node* element_k = |
2244 assembler.LoadFixedArrayElement(elements, index_var.value()); | 2279 assembler.LoadFixedArrayElement(elements, index_var.value()); |
2245 assembler.GotoIf(assembler.WordEqual(element_k, search_element), | 2280 assembler.GotoIf(assembler.WordEqual(element_k, search_element), |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2316 Node* result = | 2351 Node* result = |
2317 assembler.CallStub(callable, context, search_element, element_k); | 2352 assembler.CallStub(callable, context, search_element, element_k); |
2318 assembler.Branch( | 2353 assembler.Branch( |
2319 assembler.WordEqual(assembler.BooleanConstant(true), result), | 2354 assembler.WordEqual(assembler.BooleanConstant(true), result), |
2320 &return_found, &continue_loop); | 2355 &return_found, &continue_loop); |
2321 | 2356 |
2322 assembler.Bind(&continue_loop); | 2357 assembler.Bind(&continue_loop); |
2323 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); | 2358 index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one)); |
2324 assembler.Goto(&string_loop); | 2359 assembler.Goto(&string_loop); |
2325 } | 2360 } |
| 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 } |
2326 } | 2386 } |
2327 | 2387 |
2328 assembler.Bind(&if_packed_doubles); | 2388 assembler.Bind(&if_packed_doubles); |
2329 { | 2389 { |
2330 Label not_nan_loop(&assembler, &index_var), search_notnan(&assembler); | 2390 Label not_nan_loop(&assembler, &index_var), search_notnan(&assembler); |
2331 Variable search_num(&assembler, MachineRepresentation::kFloat64); | 2391 Variable search_num(&assembler, MachineRepresentation::kFloat64); |
2332 | 2392 |
2333 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); | 2393 assembler.GotoUnless(assembler.TaggedIsSmi(search_element), &search_notnan); |
2334 search_num.Bind(assembler.SmiToFloat64(search_element)); | 2394 search_num.Bind(assembler.SmiToFloat64(search_element)); |
2335 assembler.Goto(¬_nan_loop); | 2395 assembler.Goto(¬_nan_loop); |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2948 Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation); | 3008 Node* message = assembler.SmiConstant(MessageTemplate::kDetachedOperation); |
2949 Node* result = | 3009 Node* result = |
2950 assembler.CallRuntime(Runtime::kThrowTypeError, context, message, | 3010 assembler.CallRuntime(Runtime::kThrowTypeError, context, message, |
2951 assembler.HeapConstant(operation)); | 3011 assembler.HeapConstant(operation)); |
2952 assembler.Return(result); | 3012 assembler.Return(result); |
2953 } | 3013 } |
2954 } | 3014 } |
2955 | 3015 |
2956 } // namespace internal | 3016 } // namespace internal |
2957 } // namespace v8 | 3017 } // namespace v8 |
OLD | NEW |