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/elements.h" | 9 #include "src/elements.h" |
10 | 10 |
(...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1229 void Builtins::Generate_ArrayIsArray(CodeStubAssembler* assembler) { | 1229 void Builtins::Generate_ArrayIsArray(CodeStubAssembler* assembler) { |
1230 typedef compiler::Node Node; | 1230 typedef compiler::Node Node; |
1231 typedef CodeStubAssembler::Label Label; | 1231 typedef CodeStubAssembler::Label Label; |
1232 | 1232 |
1233 Node* object = assembler->Parameter(1); | 1233 Node* object = assembler->Parameter(1); |
1234 Node* context = assembler->Parameter(4); | 1234 Node* context = assembler->Parameter(4); |
1235 | 1235 |
1236 Label call_runtime(assembler), return_true(assembler), | 1236 Label call_runtime(assembler), return_true(assembler), |
1237 return_false(assembler); | 1237 return_false(assembler); |
1238 | 1238 |
1239 assembler->GotoIf(assembler->WordIsSmi(object), &return_false); | 1239 assembler->GotoIf(assembler->TaggedIsSmi(object), &return_false); |
1240 Node* instance_type = assembler->LoadInstanceType(object); | 1240 Node* instance_type = assembler->LoadInstanceType(object); |
1241 | 1241 |
1242 assembler->GotoIf(assembler->Word32Equal( | 1242 assembler->GotoIf(assembler->Word32Equal( |
1243 instance_type, assembler->Int32Constant(JS_ARRAY_TYPE)), | 1243 instance_type, assembler->Int32Constant(JS_ARRAY_TYPE)), |
1244 &return_true); | 1244 &return_true); |
1245 | 1245 |
1246 // TODO(verwaest): Handle proxies in-place. | 1246 // TODO(verwaest): Handle proxies in-place. |
1247 assembler->Branch(assembler->Word32Equal( | 1247 assembler->Branch(assembler->Word32Equal( |
1248 instance_type, assembler->Int32Constant(JS_PROXY_TYPE)), | 1248 instance_type, assembler->Int32Constant(JS_PROXY_TYPE)), |
1249 &call_runtime, &return_false); | 1249 &call_runtime, &return_false); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1289 len_var.Bind(intptr_zero); | 1289 len_var.Bind(intptr_zero); |
1290 | 1290 |
1291 // Take slow path if not a JSArray, if retrieving elements requires | 1291 // Take slow path if not a JSArray, if retrieving elements requires |
1292 // traversing prototype, or if access checks are required. | 1292 // traversing prototype, or if access checks are required. |
1293 assembler->BranchIfFastJSArray(array, context, &init_len, &call_runtime); | 1293 assembler->BranchIfFastJSArray(array, context, &init_len, &call_runtime); |
1294 | 1294 |
1295 assembler->Bind(&init_len); | 1295 assembler->Bind(&init_len); |
1296 { | 1296 { |
1297 // Handle case where JSArray length is not an Smi in the runtime | 1297 // Handle case where JSArray length is not an Smi in the runtime |
1298 Node* len = assembler->LoadObjectField(array, JSArray::kLengthOffset); | 1298 Node* len = assembler->LoadObjectField(array, JSArray::kLengthOffset); |
1299 assembler->GotoUnless(assembler->WordIsSmi(len), &call_runtime); | 1299 assembler->GotoUnless(assembler->TaggedIsSmi(len), &call_runtime); |
1300 | 1300 |
1301 len_var.Bind(assembler->SmiToWord(len)); | 1301 len_var.Bind(assembler->SmiToWord(len)); |
1302 assembler->Branch(assembler->WordEqual(len_var.value(), intptr_zero), | 1302 assembler->Branch(assembler->WordEqual(len_var.value(), intptr_zero), |
1303 &return_false, &init_k); | 1303 &return_false, &init_k); |
1304 } | 1304 } |
1305 | 1305 |
1306 assembler->Bind(&init_k); | 1306 assembler->Bind(&init_k); |
1307 { | 1307 { |
1308 Label done(assembler), init_k_smi(assembler), init_k_heap_num(assembler), | 1308 Label done(assembler), init_k_smi(assembler), init_k_heap_num(assembler), |
1309 init_k_zero(assembler), init_k_n(assembler); | 1309 init_k_zero(assembler), init_k_n(assembler); |
1310 Node* tagged_n = assembler->ToInteger(context, start_from); | 1310 Node* tagged_n = assembler->ToInteger(context, start_from); |
1311 | 1311 |
1312 assembler->Branch(assembler->WordIsSmi(tagged_n), &init_k_smi, | 1312 assembler->Branch(assembler->TaggedIsSmi(tagged_n), &init_k_smi, |
1313 &init_k_heap_num); | 1313 &init_k_heap_num); |
1314 | 1314 |
1315 assembler->Bind(&init_k_smi); | 1315 assembler->Bind(&init_k_smi); |
1316 { | 1316 { |
1317 start_from_var.Bind(assembler->SmiUntag(tagged_n)); | 1317 start_from_var.Bind(assembler->SmiUntag(tagged_n)); |
1318 assembler->Goto(&init_k_n); | 1318 assembler->Goto(&init_k_n); |
1319 } | 1319 } |
1320 | 1320 |
1321 assembler->Bind(&init_k_heap_num); | 1321 assembler->Bind(&init_k_heap_num); |
1322 { | 1322 { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1388 | 1388 |
1389 assembler->Bind(&if_smiorobjects); | 1389 assembler->Bind(&if_smiorobjects); |
1390 { | 1390 { |
1391 Variable search_num(assembler, MachineRepresentation::kFloat64); | 1391 Variable search_num(assembler, MachineRepresentation::kFloat64); |
1392 Label ident_loop(assembler, &index_var), | 1392 Label ident_loop(assembler, &index_var), |
1393 heap_num_loop(assembler, &search_num), | 1393 heap_num_loop(assembler, &search_num), |
1394 string_loop(assembler, &index_var), simd_loop(assembler), | 1394 string_loop(assembler, &index_var), simd_loop(assembler), |
1395 undef_loop(assembler, &index_var), not_smi(assembler), | 1395 undef_loop(assembler, &index_var), not_smi(assembler), |
1396 not_heap_num(assembler); | 1396 not_heap_num(assembler); |
1397 | 1397 |
1398 assembler->GotoUnless(assembler->WordIsSmi(search_element), ¬_smi); | 1398 assembler->GotoUnless(assembler->TaggedIsSmi(search_element), ¬_smi); |
1399 search_num.Bind(assembler->SmiToFloat64(search_element)); | 1399 search_num.Bind(assembler->SmiToFloat64(search_element)); |
1400 assembler->Goto(&heap_num_loop); | 1400 assembler->Goto(&heap_num_loop); |
1401 | 1401 |
1402 assembler->Bind(¬_smi); | 1402 assembler->Bind(¬_smi); |
1403 assembler->GotoIf(assembler->WordEqual(search_element, undefined), | 1403 assembler->GotoIf(assembler->WordEqual(search_element, undefined), |
1404 &undef_loop); | 1404 &undef_loop); |
1405 Node* map = assembler->LoadMap(search_element); | 1405 Node* map = assembler->LoadMap(search_element); |
1406 assembler->GotoIf(assembler->WordNotEqual(map, heap_number_map), | 1406 assembler->GotoIf(assembler->WordNotEqual(map, heap_number_map), |
1407 ¬_heap_num); | 1407 ¬_heap_num); |
1408 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1408 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 | 1457 |
1458 assembler->Bind(¬_nan_loop); | 1458 assembler->Bind(¬_nan_loop); |
1459 { | 1459 { |
1460 Label continue_loop(assembler), not_smi(assembler); | 1460 Label continue_loop(assembler), not_smi(assembler); |
1461 assembler->GotoUnless( | 1461 assembler->GotoUnless( |
1462 assembler->UintPtrLessThan(index_var.value(), len_var.value()), | 1462 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
1463 &return_false); | 1463 &return_false); |
1464 Node* element_k = assembler->LoadFixedArrayElement( | 1464 Node* element_k = assembler->LoadFixedArrayElement( |
1465 elements, index_var.value(), 0, | 1465 elements, index_var.value(), 0, |
1466 CodeStubAssembler::INTPTR_PARAMETERS); | 1466 CodeStubAssembler::INTPTR_PARAMETERS); |
1467 assembler->GotoUnless(assembler->WordIsSmi(element_k), ¬_smi); | 1467 assembler->GotoUnless(assembler->TaggedIsSmi(element_k), ¬_smi); |
1468 assembler->Branch( | 1468 assembler->Branch( |
1469 assembler->Float64Equal(search_num.value(), | 1469 assembler->Float64Equal(search_num.value(), |
1470 assembler->SmiToFloat64(element_k)), | 1470 assembler->SmiToFloat64(element_k)), |
1471 &return_true, &continue_loop); | 1471 &return_true, &continue_loop); |
1472 | 1472 |
1473 assembler->Bind(¬_smi); | 1473 assembler->Bind(¬_smi); |
1474 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), | 1474 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), |
1475 heap_number_map), | 1475 heap_number_map), |
1476 &continue_loop); | 1476 &continue_loop); |
1477 assembler->BranchIfFloat64Equal( | 1477 assembler->BranchIfFloat64Equal( |
1478 search_num.value(), assembler->LoadHeapNumberValue(element_k), | 1478 search_num.value(), assembler->LoadHeapNumberValue(element_k), |
1479 &return_true, &continue_loop); | 1479 &return_true, &continue_loop); |
1480 | 1480 |
1481 assembler->Bind(&continue_loop); | 1481 assembler->Bind(&continue_loop); |
1482 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); | 1482 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
1483 assembler->Goto(¬_nan_loop); | 1483 assembler->Goto(¬_nan_loop); |
1484 } | 1484 } |
1485 | 1485 |
1486 assembler->Bind(&nan_loop); | 1486 assembler->Bind(&nan_loop); |
1487 { | 1487 { |
1488 Label continue_loop(assembler); | 1488 Label continue_loop(assembler); |
1489 assembler->GotoUnless( | 1489 assembler->GotoUnless( |
1490 assembler->UintPtrLessThan(index_var.value(), len_var.value()), | 1490 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
1491 &return_false); | 1491 &return_false); |
1492 Node* element_k = assembler->LoadFixedArrayElement( | 1492 Node* element_k = assembler->LoadFixedArrayElement( |
1493 elements, index_var.value(), 0, | 1493 elements, index_var.value(), 0, |
1494 CodeStubAssembler::INTPTR_PARAMETERS); | 1494 CodeStubAssembler::INTPTR_PARAMETERS); |
1495 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1495 assembler->GotoIf(assembler->TaggedIsSmi(element_k), &continue_loop); |
1496 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), | 1496 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), |
1497 heap_number_map), | 1497 heap_number_map), |
1498 &continue_loop); | 1498 &continue_loop); |
1499 assembler->BranchIfFloat64IsNaN( | 1499 assembler->BranchIfFloat64IsNaN( |
1500 assembler->LoadHeapNumberValue(element_k), &return_true, | 1500 assembler->LoadHeapNumberValue(element_k), &return_true, |
1501 &continue_loop); | 1501 &continue_loop); |
1502 | 1502 |
1503 assembler->Bind(&continue_loop); | 1503 assembler->Bind(&continue_loop); |
1504 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); | 1504 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
1505 assembler->Goto(&nan_loop); | 1505 assembler->Goto(&nan_loop); |
1506 } | 1506 } |
1507 } | 1507 } |
1508 | 1508 |
1509 assembler->Bind(&string_loop); | 1509 assembler->Bind(&string_loop); |
1510 { | 1510 { |
1511 Label continue_loop(assembler); | 1511 Label continue_loop(assembler); |
1512 assembler->GotoUnless( | 1512 assembler->GotoUnless( |
1513 assembler->UintPtrLessThan(index_var.value(), len_var.value()), | 1513 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
1514 &return_false); | 1514 &return_false); |
1515 Node* element_k = assembler->LoadFixedArrayElement( | 1515 Node* element_k = assembler->LoadFixedArrayElement( |
1516 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); | 1516 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
1517 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1517 assembler->GotoIf(assembler->TaggedIsSmi(element_k), &continue_loop); |
1518 assembler->GotoUnless(assembler->IsStringInstanceType( | 1518 assembler->GotoUnless(assembler->IsStringInstanceType( |
1519 assembler->LoadInstanceType(element_k)), | 1519 assembler->LoadInstanceType(element_k)), |
1520 &continue_loop); | 1520 &continue_loop); |
1521 | 1521 |
1522 // TODO(bmeurer): Consider inlining the StringEqual logic here. | 1522 // TODO(bmeurer): Consider inlining the StringEqual logic here. |
1523 Callable callable = CodeFactory::StringEqual(assembler->isolate()); | 1523 Callable callable = CodeFactory::StringEqual(assembler->isolate()); |
1524 Node* result = | 1524 Node* result = |
1525 assembler->CallStub(callable, context, search_element, element_k); | 1525 assembler->CallStub(callable, context, search_element, element_k); |
1526 assembler->Branch( | 1526 assembler->Branch( |
1527 assembler->WordEqual(assembler->BooleanConstant(true), result), | 1527 assembler->WordEqual(assembler->BooleanConstant(true), result), |
(...skipping 11 matching lines...) Expand all Loading... |
1539 Node* map = assembler->LoadMap(search_element); | 1539 Node* map = assembler->LoadMap(search_element); |
1540 | 1540 |
1541 assembler->Goto(&loop_body); | 1541 assembler->Goto(&loop_body); |
1542 assembler->Bind(&loop_body); | 1542 assembler->Bind(&loop_body); |
1543 assembler->GotoUnless( | 1543 assembler->GotoUnless( |
1544 assembler->UintPtrLessThan(index_var.value(), len_var.value()), | 1544 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
1545 &return_false); | 1545 &return_false); |
1546 | 1546 |
1547 Node* element_k = assembler->LoadFixedArrayElement( | 1547 Node* element_k = assembler->LoadFixedArrayElement( |
1548 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); | 1548 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
1549 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1549 assembler->GotoIf(assembler->TaggedIsSmi(element_k), &continue_loop); |
1550 | 1550 |
1551 Node* map_k = assembler->LoadMap(element_k); | 1551 Node* map_k = assembler->LoadMap(element_k); |
1552 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, | 1552 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, |
1553 &return_true, &continue_loop); | 1553 &return_true, &continue_loop); |
1554 | 1554 |
1555 assembler->Bind(&continue_loop); | 1555 assembler->Bind(&continue_loop); |
1556 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); | 1556 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
1557 assembler->Goto(&loop_body); | 1557 assembler->Goto(&loop_body); |
1558 } | 1558 } |
1559 } | 1559 } |
1560 | 1560 |
1561 assembler->Bind(&if_packed_doubles); | 1561 assembler->Bind(&if_packed_doubles); |
1562 { | 1562 { |
1563 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), | 1563 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), |
1564 hole_loop(assembler, &index_var), search_notnan(assembler); | 1564 hole_loop(assembler, &index_var), search_notnan(assembler); |
1565 Variable search_num(assembler, MachineRepresentation::kFloat64); | 1565 Variable search_num(assembler, MachineRepresentation::kFloat64); |
1566 | 1566 |
1567 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); | 1567 assembler->GotoUnless(assembler->TaggedIsSmi(search_element), |
| 1568 &search_notnan); |
1568 search_num.Bind(assembler->SmiToFloat64(search_element)); | 1569 search_num.Bind(assembler->SmiToFloat64(search_element)); |
1569 assembler->Goto(¬_nan_loop); | 1570 assembler->Goto(¬_nan_loop); |
1570 | 1571 |
1571 assembler->Bind(&search_notnan); | 1572 assembler->Bind(&search_notnan); |
1572 assembler->GotoIf(assembler->WordNotEqual( | 1573 assembler->GotoIf(assembler->WordNotEqual( |
1573 assembler->LoadMap(search_element), heap_number_map), | 1574 assembler->LoadMap(search_element), heap_number_map), |
1574 &return_false); | 1575 &return_false); |
1575 | 1576 |
1576 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1577 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
1577 | 1578 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1611 assembler->Goto(&nan_loop); | 1612 assembler->Goto(&nan_loop); |
1612 } | 1613 } |
1613 } | 1614 } |
1614 | 1615 |
1615 assembler->Bind(&if_holey_doubles); | 1616 assembler->Bind(&if_holey_doubles); |
1616 { | 1617 { |
1617 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), | 1618 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), |
1618 hole_loop(assembler, &index_var), search_notnan(assembler); | 1619 hole_loop(assembler, &index_var), search_notnan(assembler); |
1619 Variable search_num(assembler, MachineRepresentation::kFloat64); | 1620 Variable search_num(assembler, MachineRepresentation::kFloat64); |
1620 | 1621 |
1621 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); | 1622 assembler->GotoUnless(assembler->TaggedIsSmi(search_element), |
| 1623 &search_notnan); |
1622 search_num.Bind(assembler->SmiToFloat64(search_element)); | 1624 search_num.Bind(assembler->SmiToFloat64(search_element)); |
1623 assembler->Goto(¬_nan_loop); | 1625 assembler->Goto(¬_nan_loop); |
1624 | 1626 |
1625 assembler->Bind(&search_notnan); | 1627 assembler->Bind(&search_notnan); |
1626 assembler->GotoIf(assembler->WordEqual(search_element, undefined), | 1628 assembler->GotoIf(assembler->WordEqual(search_element, undefined), |
1627 &hole_loop); | 1629 &hole_loop); |
1628 assembler->GotoIf(assembler->WordNotEqual( | 1630 assembler->GotoIf(assembler->WordNotEqual( |
1629 assembler->LoadMap(search_element), heap_number_map), | 1631 assembler->LoadMap(search_element), heap_number_map), |
1630 &return_false); | 1632 &return_false); |
1631 | 1633 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1731 len_var.Bind(intptr_zero); | 1733 len_var.Bind(intptr_zero); |
1732 | 1734 |
1733 // Take slow path if not a JSArray, if retrieving elements requires | 1735 // Take slow path if not a JSArray, if retrieving elements requires |
1734 // traversing prototype, or if access checks are required. | 1736 // traversing prototype, or if access checks are required. |
1735 assembler->BranchIfFastJSArray(array, context, &init_len, &call_runtime); | 1737 assembler->BranchIfFastJSArray(array, context, &init_len, &call_runtime); |
1736 | 1738 |
1737 assembler->Bind(&init_len); | 1739 assembler->Bind(&init_len); |
1738 { | 1740 { |
1739 // Handle case where JSArray length is not an Smi in the runtime | 1741 // Handle case where JSArray length is not an Smi in the runtime |
1740 Node* len = assembler->LoadObjectField(array, JSArray::kLengthOffset); | 1742 Node* len = assembler->LoadObjectField(array, JSArray::kLengthOffset); |
1741 assembler->GotoUnless(assembler->WordIsSmi(len), &call_runtime); | 1743 assembler->GotoUnless(assembler->TaggedIsSmi(len), &call_runtime); |
1742 | 1744 |
1743 len_var.Bind(assembler->SmiToWord(len)); | 1745 len_var.Bind(assembler->SmiToWord(len)); |
1744 assembler->Branch(assembler->WordEqual(len_var.value(), intptr_zero), | 1746 assembler->Branch(assembler->WordEqual(len_var.value(), intptr_zero), |
1745 &return_not_found, &init_k); | 1747 &return_not_found, &init_k); |
1746 } | 1748 } |
1747 | 1749 |
1748 assembler->Bind(&init_k); | 1750 assembler->Bind(&init_k); |
1749 { | 1751 { |
1750 Label done(assembler), init_k_smi(assembler), init_k_heap_num(assembler), | 1752 Label done(assembler), init_k_smi(assembler), init_k_heap_num(assembler), |
1751 init_k_zero(assembler), init_k_n(assembler); | 1753 init_k_zero(assembler), init_k_n(assembler); |
1752 Node* tagged_n = assembler->ToInteger(context, start_from); | 1754 Node* tagged_n = assembler->ToInteger(context, start_from); |
1753 | 1755 |
1754 assembler->Branch(assembler->WordIsSmi(tagged_n), &init_k_smi, | 1756 assembler->Branch(assembler->TaggedIsSmi(tagged_n), &init_k_smi, |
1755 &init_k_heap_num); | 1757 &init_k_heap_num); |
1756 | 1758 |
1757 assembler->Bind(&init_k_smi); | 1759 assembler->Bind(&init_k_smi); |
1758 { | 1760 { |
1759 start_from_var.Bind(assembler->SmiUntag(tagged_n)); | 1761 start_from_var.Bind(assembler->SmiUntag(tagged_n)); |
1760 assembler->Goto(&init_k_n); | 1762 assembler->Goto(&init_k_n); |
1761 } | 1763 } |
1762 | 1764 |
1763 assembler->Bind(&init_k_heap_num); | 1765 assembler->Bind(&init_k_heap_num); |
1764 { | 1766 { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1830 | 1832 |
1831 assembler->Bind(&if_smiorobjects); | 1833 assembler->Bind(&if_smiorobjects); |
1832 { | 1834 { |
1833 Variable search_num(assembler, MachineRepresentation::kFloat64); | 1835 Variable search_num(assembler, MachineRepresentation::kFloat64); |
1834 Label ident_loop(assembler, &index_var), | 1836 Label ident_loop(assembler, &index_var), |
1835 heap_num_loop(assembler, &search_num), | 1837 heap_num_loop(assembler, &search_num), |
1836 string_loop(assembler, &index_var), simd_loop(assembler), | 1838 string_loop(assembler, &index_var), simd_loop(assembler), |
1837 undef_loop(assembler, &index_var), not_smi(assembler), | 1839 undef_loop(assembler, &index_var), not_smi(assembler), |
1838 not_heap_num(assembler); | 1840 not_heap_num(assembler); |
1839 | 1841 |
1840 assembler->GotoUnless(assembler->WordIsSmi(search_element), ¬_smi); | 1842 assembler->GotoUnless(assembler->TaggedIsSmi(search_element), ¬_smi); |
1841 search_num.Bind(assembler->SmiToFloat64(search_element)); | 1843 search_num.Bind(assembler->SmiToFloat64(search_element)); |
1842 assembler->Goto(&heap_num_loop); | 1844 assembler->Goto(&heap_num_loop); |
1843 | 1845 |
1844 assembler->Bind(¬_smi); | 1846 assembler->Bind(¬_smi); |
1845 assembler->GotoIf(assembler->WordEqual(search_element, undefined), | 1847 assembler->GotoIf(assembler->WordEqual(search_element, undefined), |
1846 &undef_loop); | 1848 &undef_loop); |
1847 Node* map = assembler->LoadMap(search_element); | 1849 Node* map = assembler->LoadMap(search_element); |
1848 assembler->GotoIf(assembler->WordNotEqual(map, heap_number_map), | 1850 assembler->GotoIf(assembler->WordNotEqual(map, heap_number_map), |
1849 ¬_heap_num); | 1851 ¬_heap_num); |
1850 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1852 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1896 | 1898 |
1897 assembler->Bind(¬_nan_loop); | 1899 assembler->Bind(¬_nan_loop); |
1898 { | 1900 { |
1899 Label continue_loop(assembler), not_smi(assembler); | 1901 Label continue_loop(assembler), not_smi(assembler); |
1900 assembler->GotoUnless( | 1902 assembler->GotoUnless( |
1901 assembler->UintPtrLessThan(index_var.value(), len_var.value()), | 1903 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
1902 &return_not_found); | 1904 &return_not_found); |
1903 Node* element_k = assembler->LoadFixedArrayElement( | 1905 Node* element_k = assembler->LoadFixedArrayElement( |
1904 elements, index_var.value(), 0, | 1906 elements, index_var.value(), 0, |
1905 CodeStubAssembler::INTPTR_PARAMETERS); | 1907 CodeStubAssembler::INTPTR_PARAMETERS); |
1906 assembler->GotoUnless(assembler->WordIsSmi(element_k), ¬_smi); | 1908 assembler->GotoUnless(assembler->TaggedIsSmi(element_k), ¬_smi); |
1907 assembler->Branch( | 1909 assembler->Branch( |
1908 assembler->Float64Equal(search_num.value(), | 1910 assembler->Float64Equal(search_num.value(), |
1909 assembler->SmiToFloat64(element_k)), | 1911 assembler->SmiToFloat64(element_k)), |
1910 &return_found, &continue_loop); | 1912 &return_found, &continue_loop); |
1911 | 1913 |
1912 assembler->Bind(¬_smi); | 1914 assembler->Bind(¬_smi); |
1913 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), | 1915 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), |
1914 heap_number_map), | 1916 heap_number_map), |
1915 &continue_loop); | 1917 &continue_loop); |
1916 assembler->BranchIfFloat64Equal( | 1918 assembler->BranchIfFloat64Equal( |
1917 search_num.value(), assembler->LoadHeapNumberValue(element_k), | 1919 search_num.value(), assembler->LoadHeapNumberValue(element_k), |
1918 &return_found, &continue_loop); | 1920 &return_found, &continue_loop); |
1919 | 1921 |
1920 assembler->Bind(&continue_loop); | 1922 assembler->Bind(&continue_loop); |
1921 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); | 1923 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
1922 assembler->Goto(¬_nan_loop); | 1924 assembler->Goto(¬_nan_loop); |
1923 } | 1925 } |
1924 } | 1926 } |
1925 | 1927 |
1926 assembler->Bind(&string_loop); | 1928 assembler->Bind(&string_loop); |
1927 { | 1929 { |
1928 Label continue_loop(assembler); | 1930 Label continue_loop(assembler); |
1929 assembler->GotoUnless( | 1931 assembler->GotoUnless( |
1930 assembler->UintPtrLessThan(index_var.value(), len_var.value()), | 1932 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
1931 &return_not_found); | 1933 &return_not_found); |
1932 Node* element_k = assembler->LoadFixedArrayElement( | 1934 Node* element_k = assembler->LoadFixedArrayElement( |
1933 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); | 1935 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
1934 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1936 assembler->GotoIf(assembler->TaggedIsSmi(element_k), &continue_loop); |
1935 assembler->GotoUnless(assembler->IsStringInstanceType( | 1937 assembler->GotoUnless(assembler->IsStringInstanceType( |
1936 assembler->LoadInstanceType(element_k)), | 1938 assembler->LoadInstanceType(element_k)), |
1937 &continue_loop); | 1939 &continue_loop); |
1938 | 1940 |
1939 // TODO(bmeurer): Consider inlining the StringEqual logic here. | 1941 // TODO(bmeurer): Consider inlining the StringEqual logic here. |
1940 Callable callable = CodeFactory::StringEqual(assembler->isolate()); | 1942 Callable callable = CodeFactory::StringEqual(assembler->isolate()); |
1941 Node* result = | 1943 Node* result = |
1942 assembler->CallStub(callable, context, search_element, element_k); | 1944 assembler->CallStub(callable, context, search_element, element_k); |
1943 assembler->Branch( | 1945 assembler->Branch( |
1944 assembler->WordEqual(assembler->BooleanConstant(true), result), | 1946 assembler->WordEqual(assembler->BooleanConstant(true), result), |
(...skipping 11 matching lines...) Expand all Loading... |
1956 Node* map = assembler->LoadMap(search_element); | 1958 Node* map = assembler->LoadMap(search_element); |
1957 | 1959 |
1958 assembler->Goto(&loop_body); | 1960 assembler->Goto(&loop_body); |
1959 assembler->Bind(&loop_body); | 1961 assembler->Bind(&loop_body); |
1960 assembler->GotoUnless( | 1962 assembler->GotoUnless( |
1961 assembler->UintPtrLessThan(index_var.value(), len_var.value()), | 1963 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
1962 &return_not_found); | 1964 &return_not_found); |
1963 | 1965 |
1964 Node* element_k = assembler->LoadFixedArrayElement( | 1966 Node* element_k = assembler->LoadFixedArrayElement( |
1965 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); | 1967 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
1966 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1968 assembler->GotoIf(assembler->TaggedIsSmi(element_k), &continue_loop); |
1967 | 1969 |
1968 Node* map_k = assembler->LoadMap(element_k); | 1970 Node* map_k = assembler->LoadMap(element_k); |
1969 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, | 1971 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, |
1970 &return_found, &continue_loop); | 1972 &return_found, &continue_loop); |
1971 | 1973 |
1972 assembler->Bind(&continue_loop); | 1974 assembler->Bind(&continue_loop); |
1973 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); | 1975 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
1974 assembler->Goto(&loop_body); | 1976 assembler->Goto(&loop_body); |
1975 } | 1977 } |
1976 } | 1978 } |
1977 | 1979 |
1978 assembler->Bind(&if_packed_doubles); | 1980 assembler->Bind(&if_packed_doubles); |
1979 { | 1981 { |
1980 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); | 1982 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); |
1981 Variable search_num(assembler, MachineRepresentation::kFloat64); | 1983 Variable search_num(assembler, MachineRepresentation::kFloat64); |
1982 | 1984 |
1983 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); | 1985 assembler->GotoUnless(assembler->TaggedIsSmi(search_element), |
| 1986 &search_notnan); |
1984 search_num.Bind(assembler->SmiToFloat64(search_element)); | 1987 search_num.Bind(assembler->SmiToFloat64(search_element)); |
1985 assembler->Goto(¬_nan_loop); | 1988 assembler->Goto(¬_nan_loop); |
1986 | 1989 |
1987 assembler->Bind(&search_notnan); | 1990 assembler->Bind(&search_notnan); |
1988 assembler->GotoIf(assembler->WordNotEqual( | 1991 assembler->GotoIf(assembler->WordNotEqual( |
1989 assembler->LoadMap(search_element), heap_number_map), | 1992 assembler->LoadMap(search_element), heap_number_map), |
1990 &return_not_found); | 1993 &return_not_found); |
1991 | 1994 |
1992 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1995 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
1993 | 1996 |
(...skipping 16 matching lines...) Expand all Loading... |
2010 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); | 2013 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
2011 assembler->Goto(¬_nan_loop); | 2014 assembler->Goto(¬_nan_loop); |
2012 } | 2015 } |
2013 } | 2016 } |
2014 | 2017 |
2015 assembler->Bind(&if_holey_doubles); | 2018 assembler->Bind(&if_holey_doubles); |
2016 { | 2019 { |
2017 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); | 2020 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); |
2018 Variable search_num(assembler, MachineRepresentation::kFloat64); | 2021 Variable search_num(assembler, MachineRepresentation::kFloat64); |
2019 | 2022 |
2020 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); | 2023 assembler->GotoUnless(assembler->TaggedIsSmi(search_element), |
| 2024 &search_notnan); |
2021 search_num.Bind(assembler->SmiToFloat64(search_element)); | 2025 search_num.Bind(assembler->SmiToFloat64(search_element)); |
2022 assembler->Goto(¬_nan_loop); | 2026 assembler->Goto(¬_nan_loop); |
2023 | 2027 |
2024 assembler->Bind(&search_notnan); | 2028 assembler->Bind(&search_notnan); |
2025 assembler->GotoIf(assembler->WordNotEqual( | 2029 assembler->GotoIf(assembler->WordNotEqual( |
2026 assembler->LoadMap(search_element), heap_number_map), | 2030 assembler->LoadMap(search_element), heap_number_map), |
2027 &return_not_found); | 2031 &return_not_found); |
2028 | 2032 |
2029 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 2033 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
2030 | 2034 |
(...skipping 27 matching lines...) Expand all Loading... |
2058 assembler->Bind(&return_not_found); | 2062 assembler->Bind(&return_not_found); |
2059 assembler->Return(assembler->NumberConstant(-1)); | 2063 assembler->Return(assembler->NumberConstant(-1)); |
2060 | 2064 |
2061 assembler->Bind(&call_runtime); | 2065 assembler->Bind(&call_runtime); |
2062 assembler->Return(assembler->CallRuntime(Runtime::kArrayIndexOf, context, | 2066 assembler->Return(assembler->CallRuntime(Runtime::kArrayIndexOf, context, |
2063 array, search_element, start_from)); | 2067 array, search_element, start_from)); |
2064 } | 2068 } |
2065 | 2069 |
2066 } // namespace internal | 2070 } // namespace internal |
2067 } // namespace v8 | 2071 } // namespace v8 |
OLD | NEW |