| Index: src/builtins/builtins-array.cc
|
| diff --git a/src/builtins/builtins-array.cc b/src/builtins/builtins-array.cc
|
| index 5111f966b170addf9f1b0c11399cdddc4755a615..a82a1a98a646675ba0cc242633607cbee81d063f 100644
|
| --- a/src/builtins/builtins-array.cc
|
| +++ b/src/builtins/builtins-array.cc
|
| @@ -1808,8 +1808,9 @@
|
| Variable search_num(&assembler, MachineRepresentation::kFloat64);
|
| Label ident_loop(&assembler, &index_var),
|
| heap_num_loop(&assembler, &search_num),
|
| - string_loop(&assembler, &index_var), undef_loop(&assembler, &index_var),
|
| - not_smi(&assembler), not_heap_num(&assembler);
|
| + string_loop(&assembler, &index_var), simd_loop(&assembler),
|
| + undef_loop(&assembler, &index_var), not_smi(&assembler),
|
| + not_heap_num(&assembler);
|
|
|
| assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi);
|
| search_num.Bind(assembler.SmiToFloat64(search_element));
|
| @@ -1826,6 +1827,10 @@
|
| assembler.Bind(¬_heap_num);
|
| Node* search_type = assembler.LoadMapInstanceType(map);
|
| assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop);
|
| + assembler.GotoIf(
|
| + assembler.Word32Equal(search_type,
|
| + assembler.Int32Constant(SIMD128_VALUE_TYPE)),
|
| + &simd_loop);
|
| assembler.Goto(&ident_loop);
|
|
|
| assembler.Bind(&ident_loop);
|
| @@ -1937,6 +1942,31 @@
|
| index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| assembler.Goto(&string_loop);
|
| }
|
| +
|
| + assembler.Bind(&simd_loop);
|
| + {
|
| + Label continue_loop(&assembler, &index_var),
|
| + loop_body(&assembler, &index_var);
|
| + Node* map = assembler.LoadMap(search_element);
|
| +
|
| + assembler.Goto(&loop_body);
|
| + assembler.Bind(&loop_body);
|
| + assembler.GotoUnless(
|
| + assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| + &return_false);
|
| +
|
| + Node* element_k =
|
| + assembler.LoadFixedArrayElement(elements, index_var.value());
|
| + assembler.GotoIf(assembler.TaggedIsSmi(element_k), &continue_loop);
|
| +
|
| + Node* map_k = assembler.LoadMap(element_k);
|
| + assembler.BranchIfSimd128Equal(search_element, map, element_k, map_k,
|
| + &return_true, &continue_loop);
|
| +
|
| + assembler.Bind(&continue_loop);
|
| + index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| + assembler.Goto(&loop_body);
|
| + }
|
| }
|
|
|
| assembler.Bind(&if_packed_doubles);
|
| @@ -2215,8 +2245,9 @@
|
| Variable search_num(&assembler, MachineRepresentation::kFloat64);
|
| Label ident_loop(&assembler, &index_var),
|
| heap_num_loop(&assembler, &search_num),
|
| - string_loop(&assembler, &index_var), undef_loop(&assembler, &index_var),
|
| - not_smi(&assembler), not_heap_num(&assembler);
|
| + string_loop(&assembler, &index_var), simd_loop(&assembler),
|
| + undef_loop(&assembler, &index_var), not_smi(&assembler),
|
| + not_heap_num(&assembler);
|
|
|
| assembler.GotoUnless(assembler.TaggedIsSmi(search_element), ¬_smi);
|
| search_num.Bind(assembler.SmiToFloat64(search_element));
|
| @@ -2233,6 +2264,10 @@
|
| assembler.Bind(¬_heap_num);
|
| Node* search_type = assembler.LoadMapInstanceType(map);
|
| assembler.GotoIf(assembler.IsStringInstanceType(search_type), &string_loop);
|
| + assembler.GotoIf(
|
| + assembler.Word32Equal(search_type,
|
| + assembler.Int32Constant(SIMD128_VALUE_TYPE)),
|
| + &simd_loop);
|
| assembler.Goto(&ident_loop);
|
|
|
| assembler.Bind(&ident_loop);
|
| @@ -2322,6 +2357,31 @@
|
| assembler.Bind(&continue_loop);
|
| index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| assembler.Goto(&string_loop);
|
| + }
|
| +
|
| + assembler.Bind(&simd_loop);
|
| + {
|
| + Label continue_loop(&assembler, &index_var),
|
| + loop_body(&assembler, &index_var);
|
| + Node* map = assembler.LoadMap(search_element);
|
| +
|
| + assembler.Goto(&loop_body);
|
| + assembler.Bind(&loop_body);
|
| + assembler.GotoUnless(
|
| + assembler.UintPtrLessThan(index_var.value(), len_var.value()),
|
| + &return_not_found);
|
| +
|
| + Node* element_k =
|
| + assembler.LoadFixedArrayElement(elements, index_var.value());
|
| + assembler.GotoIf(assembler.TaggedIsSmi(element_k), &continue_loop);
|
| +
|
| + Node* map_k = assembler.LoadMap(element_k);
|
| + assembler.BranchIfSimd128Equal(search_element, map, element_k, map_k,
|
| + &return_found, &continue_loop);
|
| +
|
| + assembler.Bind(&continue_loop);
|
| + index_var.Bind(assembler.IntPtrAdd(index_var.value(), intptr_one));
|
| + assembler.Goto(&loop_body);
|
| }
|
| }
|
|
|
|
|