| 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 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1262 void Builtins::Generate_ArrayIncludes(CodeStubAssembler* assembler) { | 1262 void Builtins::Generate_ArrayIncludes(CodeStubAssembler* assembler) { |
| 1263 typedef compiler::Node Node; | 1263 typedef compiler::Node Node; |
| 1264 typedef CodeStubAssembler::Label Label; | 1264 typedef CodeStubAssembler::Label Label; |
| 1265 typedef CodeStubAssembler::Variable Variable; | 1265 typedef CodeStubAssembler::Variable Variable; |
| 1266 | 1266 |
| 1267 Node* array = assembler->Parameter(0); | 1267 Node* array = assembler->Parameter(0); |
| 1268 Node* search_element = assembler->Parameter(1); | 1268 Node* search_element = assembler->Parameter(1); |
| 1269 Node* start_from = assembler->Parameter(2); | 1269 Node* start_from = assembler->Parameter(2); |
| 1270 Node* context = assembler->Parameter(3 + 2); | 1270 Node* context = assembler->Parameter(3 + 2); |
| 1271 | 1271 |
| 1272 Node* int32_zero = assembler->Int32Constant(0); | 1272 Node* intptr_zero = assembler->IntPtrConstant(0); |
| 1273 Node* int32_one = assembler->Int32Constant(1); | 1273 Node* intptr_one = assembler->IntPtrConstant(1); |
| 1274 | 1274 |
| 1275 Node* the_hole = assembler->TheHoleConstant(); | 1275 Node* the_hole = assembler->TheHoleConstant(); |
| 1276 Node* undefined = assembler->UndefinedConstant(); | 1276 Node* undefined = assembler->UndefinedConstant(); |
| 1277 Node* heap_number_map = assembler->HeapNumberMapConstant(); | 1277 Node* heap_number_map = assembler->HeapNumberMapConstant(); |
| 1278 | 1278 |
| 1279 Variable len_var(assembler, MachineRepresentation::kWord32), | 1279 Variable len_var(assembler, MachineType::PointerRepresentation()), |
| 1280 index_var(assembler, MachineRepresentation::kWord32), | 1280 index_var(assembler, MachineType::PointerRepresentation()), |
| 1281 start_from_var(assembler, MachineRepresentation::kWord32); | 1281 start_from_var(assembler, MachineType::PointerRepresentation()); |
| 1282 | 1282 |
| 1283 Label init_k(assembler), return_true(assembler), return_false(assembler), | 1283 Label init_k(assembler), return_true(assembler), return_false(assembler), |
| 1284 call_runtime(assembler); | 1284 call_runtime(assembler); |
| 1285 | 1285 |
| 1286 Label init_len(assembler); | 1286 Label init_len(assembler); |
| 1287 | 1287 |
| 1288 index_var.Bind(int32_zero); | 1288 index_var.Bind(intptr_zero); |
| 1289 len_var.Bind(int32_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->WordIsSmi(len), &call_runtime); |
| 1300 | 1300 |
| 1301 len_var.Bind(assembler->SmiToWord(len)); | 1301 len_var.Bind(assembler->SmiToWord(len)); |
| 1302 assembler->Branch(assembler->Word32Equal(len_var.value(), int32_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 Callable call_to_integer = CodeFactory::ToInteger(assembler->isolate()); | 1310 Callable call_to_integer = CodeFactory::ToInteger(assembler->isolate()); |
| 1311 Node* tagged_n = assembler->CallStub(call_to_integer, context, start_from); | 1311 Node* tagged_n = assembler->CallStub(call_to_integer, context, start_from); |
| 1312 | 1312 |
| 1313 assembler->Branch(assembler->WordIsSmi(tagged_n), &init_k_smi, | 1313 assembler->Branch(assembler->WordIsSmi(tagged_n), &init_k_smi, |
| 1314 &init_k_heap_num); | 1314 &init_k_heap_num); |
| 1315 | 1315 |
| 1316 assembler->Bind(&init_k_smi); | 1316 assembler->Bind(&init_k_smi); |
| 1317 { | 1317 { |
| 1318 start_from_var.Bind(assembler->SmiToWord32(tagged_n)); | 1318 start_from_var.Bind(assembler->SmiUntag(tagged_n)); |
| 1319 assembler->Goto(&init_k_n); | 1319 assembler->Goto(&init_k_n); |
| 1320 } | 1320 } |
| 1321 | 1321 |
| 1322 assembler->Bind(&init_k_heap_num); | 1322 assembler->Bind(&init_k_heap_num); |
| 1323 { | 1323 { |
| 1324 Label do_return_false(assembler); | 1324 Label do_return_false(assembler); |
| 1325 Node* fp_len = assembler->ChangeInt32ToFloat64(len_var.value()); | 1325 // This round is lossless for all valid lengths. |
| 1326 Node* fp_len = assembler->RoundIntPtrToFloat64(len_var.value()); |
| 1326 Node* fp_n = assembler->LoadHeapNumberValue(tagged_n); | 1327 Node* fp_n = assembler->LoadHeapNumberValue(tagged_n); |
| 1327 assembler->GotoIf(assembler->Float64GreaterThanOrEqual(fp_n, fp_len), | 1328 assembler->GotoIf(assembler->Float64GreaterThanOrEqual(fp_n, fp_len), |
| 1328 &do_return_false); | 1329 &do_return_false); |
| 1329 start_from_var.Bind(assembler->TruncateFloat64ToWord32(fp_n)); | 1330 start_from_var.Bind(assembler->ChangeInt32ToIntPtr( |
| 1331 assembler->TruncateFloat64ToWord32(fp_n))); |
| 1330 assembler->Goto(&init_k_n); | 1332 assembler->Goto(&init_k_n); |
| 1331 | 1333 |
| 1332 assembler->Bind(&do_return_false); | 1334 assembler->Bind(&do_return_false); |
| 1333 { | 1335 { |
| 1334 index_var.Bind(int32_zero); | 1336 index_var.Bind(intptr_zero); |
| 1335 assembler->Goto(&return_false); | 1337 assembler->Goto(&return_false); |
| 1336 } | 1338 } |
| 1337 } | 1339 } |
| 1338 | 1340 |
| 1339 assembler->Bind(&init_k_n); | 1341 assembler->Bind(&init_k_n); |
| 1340 { | 1342 { |
| 1341 Label if_positive(assembler), if_negative(assembler), done(assembler); | 1343 Label if_positive(assembler), if_negative(assembler), done(assembler); |
| 1342 assembler->Branch( | 1344 assembler->Branch( |
| 1343 assembler->Int32LessThan(start_from_var.value(), int32_zero), | 1345 assembler->IntPtrLessThan(start_from_var.value(), intptr_zero), |
| 1344 &if_negative, &if_positive); | 1346 &if_negative, &if_positive); |
| 1345 | 1347 |
| 1346 assembler->Bind(&if_positive); | 1348 assembler->Bind(&if_positive); |
| 1347 { | 1349 { |
| 1348 index_var.Bind(start_from_var.value()); | 1350 index_var.Bind(start_from_var.value()); |
| 1349 assembler->Goto(&done); | 1351 assembler->Goto(&done); |
| 1350 } | 1352 } |
| 1351 | 1353 |
| 1352 assembler->Bind(&if_negative); | 1354 assembler->Bind(&if_negative); |
| 1353 { | 1355 { |
| 1354 index_var.Bind( | 1356 index_var.Bind( |
| 1355 assembler->Int32Add(len_var.value(), start_from_var.value())); | 1357 assembler->IntPtrAdd(len_var.value(), start_from_var.value())); |
| 1356 assembler->Branch( | 1358 assembler->Branch( |
| 1357 assembler->Int32LessThan(index_var.value(), int32_zero), | 1359 assembler->IntPtrLessThan(index_var.value(), intptr_zero), |
| 1358 &init_k_zero, &done); | 1360 &init_k_zero, &done); |
| 1359 } | 1361 } |
| 1360 | 1362 |
| 1361 assembler->Bind(&init_k_zero); | 1363 assembler->Bind(&init_k_zero); |
| 1362 { | 1364 { |
| 1363 index_var.Bind(int32_zero); | 1365 index_var.Bind(intptr_zero); |
| 1364 assembler->Goto(&done); | 1366 assembler->Goto(&done); |
| 1365 } | 1367 } |
| 1366 | 1368 |
| 1367 assembler->Bind(&done); | 1369 assembler->Bind(&done); |
| 1368 } | 1370 } |
| 1369 } | 1371 } |
| 1370 | 1372 |
| 1371 static int32_t kElementsKind[] = { | 1373 static int32_t kElementsKind[] = { |
| 1372 FAST_SMI_ELEMENTS, FAST_HOLEY_SMI_ELEMENTS, FAST_ELEMENTS, | 1374 FAST_SMI_ELEMENTS, FAST_HOLEY_SMI_ELEMENTS, FAST_ELEMENTS, |
| 1373 FAST_HOLEY_ELEMENTS, FAST_DOUBLE_ELEMENTS, FAST_HOLEY_DOUBLE_ELEMENTS, | 1375 FAST_HOLEY_ELEMENTS, FAST_DOUBLE_ELEMENTS, FAST_HOLEY_DOUBLE_ELEMENTS, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1409 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1411 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
| 1410 assembler->Goto(&heap_num_loop); | 1412 assembler->Goto(&heap_num_loop); |
| 1411 | 1413 |
| 1412 assembler->Bind(¬_heap_num); | 1414 assembler->Bind(¬_heap_num); |
| 1413 Node* search_type = assembler->LoadMapInstanceType(map); | 1415 Node* search_type = assembler->LoadMapInstanceType(map); |
| 1414 assembler->GotoIf( | 1416 assembler->GotoIf( |
| 1415 assembler->Int32LessThan( | 1417 assembler->Int32LessThan( |
| 1416 search_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | 1418 search_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| 1417 &string_loop); | 1419 &string_loop); |
| 1418 assembler->GotoIf( | 1420 assembler->GotoIf( |
| 1419 assembler->WordEqual(search_type, | 1421 assembler->Word32Equal(search_type, |
| 1420 assembler->Int32Constant(SIMD128_VALUE_TYPE)), | 1422 assembler->Int32Constant(SIMD128_VALUE_TYPE)), |
| 1421 &simd_loop); | 1423 &simd_loop); |
| 1422 assembler->Goto(&ident_loop); | 1424 assembler->Goto(&ident_loop); |
| 1423 | 1425 |
| 1424 assembler->Bind(&ident_loop); | 1426 assembler->Bind(&ident_loop); |
| 1425 { | 1427 { |
| 1426 assembler->GotoUnless( | 1428 assembler->GotoUnless( |
| 1427 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1429 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1428 &return_false); | 1430 &return_false); |
| 1429 Node* element_k = | 1431 Node* element_k = assembler->LoadFixedArrayElement( |
| 1430 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1432 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 1431 assembler->GotoIf(assembler->WordEqual(element_k, search_element), | 1433 assembler->GotoIf(assembler->WordEqual(element_k, search_element), |
| 1432 &return_true); | 1434 &return_true); |
| 1433 | 1435 |
| 1434 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1436 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1435 assembler->Goto(&ident_loop); | 1437 assembler->Goto(&ident_loop); |
| 1436 } | 1438 } |
| 1437 | 1439 |
| 1438 assembler->Bind(&undef_loop); | 1440 assembler->Bind(&undef_loop); |
| 1439 { | 1441 { |
| 1440 assembler->GotoUnless( | 1442 assembler->GotoUnless( |
| 1441 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1443 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1442 &return_false); | 1444 &return_false); |
| 1443 Node* element_k = | 1445 Node* element_k = assembler->LoadFixedArrayElement( |
| 1444 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1446 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 1445 assembler->GotoIf(assembler->WordEqual(element_k, undefined), | 1447 assembler->GotoIf(assembler->WordEqual(element_k, undefined), |
| 1446 &return_true); | 1448 &return_true); |
| 1447 assembler->GotoIf(assembler->WordEqual(element_k, the_hole), | 1449 assembler->GotoIf(assembler->WordEqual(element_k, the_hole), |
| 1448 &return_true); | 1450 &return_true); |
| 1449 | 1451 |
| 1450 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1452 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1451 assembler->Goto(&undef_loop); | 1453 assembler->Goto(&undef_loop); |
| 1452 } | 1454 } |
| 1453 | 1455 |
| 1454 assembler->Bind(&heap_num_loop); | 1456 assembler->Bind(&heap_num_loop); |
| 1455 { | 1457 { |
| 1456 Label nan_loop(assembler, &index_var), | 1458 Label nan_loop(assembler, &index_var), |
| 1457 not_nan_loop(assembler, &index_var); | 1459 not_nan_loop(assembler, &index_var); |
| 1458 assembler->BranchIfFloat64IsNaN(search_num.value(), &nan_loop, | 1460 assembler->BranchIfFloat64IsNaN(search_num.value(), &nan_loop, |
| 1459 ¬_nan_loop); | 1461 ¬_nan_loop); |
| 1460 | 1462 |
| 1461 assembler->Bind(¬_nan_loop); | 1463 assembler->Bind(¬_nan_loop); |
| 1462 { | 1464 { |
| 1463 Label continue_loop(assembler), not_smi(assembler); | 1465 Label continue_loop(assembler), not_smi(assembler); |
| 1464 assembler->GotoUnless( | 1466 assembler->GotoUnless( |
| 1465 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1467 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1466 &return_false); | 1468 &return_false); |
| 1467 Node* element_k = | 1469 Node* element_k = assembler->LoadFixedArrayElement( |
| 1468 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1470 elements, index_var.value(), 0, |
| 1471 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1469 assembler->GotoUnless(assembler->WordIsSmi(element_k), ¬_smi); | 1472 assembler->GotoUnless(assembler->WordIsSmi(element_k), ¬_smi); |
| 1470 assembler->Branch( | 1473 assembler->Branch( |
| 1471 assembler->Float64Equal(search_num.value(), | 1474 assembler->Float64Equal(search_num.value(), |
| 1472 assembler->SmiToFloat64(element_k)), | 1475 assembler->SmiToFloat64(element_k)), |
| 1473 &return_true, &continue_loop); | 1476 &return_true, &continue_loop); |
| 1474 | 1477 |
| 1475 assembler->Bind(¬_smi); | 1478 assembler->Bind(¬_smi); |
| 1476 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), | 1479 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), |
| 1477 heap_number_map), | 1480 heap_number_map), |
| 1478 &continue_loop); | 1481 &continue_loop); |
| 1479 assembler->BranchIfFloat64Equal( | 1482 assembler->BranchIfFloat64Equal( |
| 1480 search_num.value(), assembler->LoadHeapNumberValue(element_k), | 1483 search_num.value(), assembler->LoadHeapNumberValue(element_k), |
| 1481 &return_true, &continue_loop); | 1484 &return_true, &continue_loop); |
| 1482 | 1485 |
| 1483 assembler->Bind(&continue_loop); | 1486 assembler->Bind(&continue_loop); |
| 1484 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1487 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1485 assembler->Goto(¬_nan_loop); | 1488 assembler->Goto(¬_nan_loop); |
| 1486 } | 1489 } |
| 1487 | 1490 |
| 1488 assembler->Bind(&nan_loop); | 1491 assembler->Bind(&nan_loop); |
| 1489 { | 1492 { |
| 1490 Label continue_loop(assembler); | 1493 Label continue_loop(assembler); |
| 1491 assembler->GotoUnless( | 1494 assembler->GotoUnless( |
| 1492 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1495 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1493 &return_false); | 1496 &return_false); |
| 1494 Node* element_k = | 1497 Node* element_k = assembler->LoadFixedArrayElement( |
| 1495 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1498 elements, index_var.value(), 0, |
| 1499 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1496 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1500 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); |
| 1497 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), | 1501 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), |
| 1498 heap_number_map), | 1502 heap_number_map), |
| 1499 &continue_loop); | 1503 &continue_loop); |
| 1500 assembler->BranchIfFloat64IsNaN( | 1504 assembler->BranchIfFloat64IsNaN( |
| 1501 assembler->LoadHeapNumberValue(element_k), &return_true, | 1505 assembler->LoadHeapNumberValue(element_k), &return_true, |
| 1502 &continue_loop); | 1506 &continue_loop); |
| 1503 | 1507 |
| 1504 assembler->Bind(&continue_loop); | 1508 assembler->Bind(&continue_loop); |
| 1505 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1509 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1506 assembler->Goto(&nan_loop); | 1510 assembler->Goto(&nan_loop); |
| 1507 } | 1511 } |
| 1508 } | 1512 } |
| 1509 | 1513 |
| 1510 assembler->Bind(&string_loop); | 1514 assembler->Bind(&string_loop); |
| 1511 { | 1515 { |
| 1512 Label continue_loop(assembler); | 1516 Label continue_loop(assembler); |
| 1513 assembler->GotoUnless( | 1517 assembler->GotoUnless( |
| 1514 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1518 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1515 &return_false); | 1519 &return_false); |
| 1516 Node* element_k = | 1520 Node* element_k = assembler->LoadFixedArrayElement( |
| 1517 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1521 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 1518 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1522 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); |
| 1519 assembler->GotoUnless(assembler->Int32LessThan( | 1523 assembler->GotoUnless(assembler->Int32LessThan( |
| 1520 assembler->LoadInstanceType(element_k), | 1524 assembler->LoadInstanceType(element_k), |
| 1521 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | 1525 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| 1522 &continue_loop); | 1526 &continue_loop); |
| 1523 | 1527 |
| 1524 // TODO(bmeurer): Consider inlining the StringEqual logic here. | 1528 // TODO(bmeurer): Consider inlining the StringEqual logic here. |
| 1525 Callable callable = CodeFactory::StringEqual(assembler->isolate()); | 1529 Callable callable = CodeFactory::StringEqual(assembler->isolate()); |
| 1526 Node* result = | 1530 Node* result = |
| 1527 assembler->CallStub(callable, context, search_element, element_k); | 1531 assembler->CallStub(callable, context, search_element, element_k); |
| 1528 assembler->Branch( | 1532 assembler->Branch( |
| 1529 assembler->WordEqual(assembler->BooleanConstant(true), result), | 1533 assembler->WordEqual(assembler->BooleanConstant(true), result), |
| 1530 &return_true, &continue_loop); | 1534 &return_true, &continue_loop); |
| 1531 | 1535 |
| 1532 assembler->Bind(&continue_loop); | 1536 assembler->Bind(&continue_loop); |
| 1533 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1537 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1534 assembler->Goto(&string_loop); | 1538 assembler->Goto(&string_loop); |
| 1535 } | 1539 } |
| 1536 | 1540 |
| 1537 assembler->Bind(&simd_loop); | 1541 assembler->Bind(&simd_loop); |
| 1538 { | 1542 { |
| 1539 Label continue_loop(assembler, &index_var), | 1543 Label continue_loop(assembler, &index_var), |
| 1540 loop_body(assembler, &index_var); | 1544 loop_body(assembler, &index_var); |
| 1541 Node* map = assembler->LoadMap(search_element); | 1545 Node* map = assembler->LoadMap(search_element); |
| 1542 | 1546 |
| 1543 assembler->Goto(&loop_body); | 1547 assembler->Goto(&loop_body); |
| 1544 assembler->Bind(&loop_body); | 1548 assembler->Bind(&loop_body); |
| 1545 assembler->GotoUnless( | 1549 assembler->GotoUnless( |
| 1546 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1550 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1547 &return_false); | 1551 &return_false); |
| 1548 | 1552 |
| 1549 Node* element_k = | 1553 Node* element_k = assembler->LoadFixedArrayElement( |
| 1550 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1554 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 1551 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1555 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); |
| 1552 | 1556 |
| 1553 Node* map_k = assembler->LoadMap(element_k); | 1557 Node* map_k = assembler->LoadMap(element_k); |
| 1554 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, | 1558 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, |
| 1555 &return_true, &continue_loop); | 1559 &return_true, &continue_loop); |
| 1556 | 1560 |
| 1557 assembler->Bind(&continue_loop); | 1561 assembler->Bind(&continue_loop); |
| 1558 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1562 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1559 assembler->Goto(&loop_body); | 1563 assembler->Goto(&loop_body); |
| 1560 } | 1564 } |
| 1561 } | 1565 } |
| 1562 | 1566 |
| 1563 assembler->Bind(&if_packed_doubles); | 1567 assembler->Bind(&if_packed_doubles); |
| 1564 { | 1568 { |
| 1565 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), | 1569 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), |
| 1566 hole_loop(assembler, &index_var), search_notnan(assembler); | 1570 hole_loop(assembler, &index_var), search_notnan(assembler); |
| 1567 Variable search_num(assembler, MachineRepresentation::kFloat64); | 1571 Variable search_num(assembler, MachineRepresentation::kFloat64); |
| 1568 | 1572 |
| 1569 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); | 1573 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); |
| 1570 search_num.Bind(assembler->SmiToFloat64(search_element)); | 1574 search_num.Bind(assembler->SmiToFloat64(search_element)); |
| 1571 assembler->Goto(¬_nan_loop); | 1575 assembler->Goto(¬_nan_loop); |
| 1572 | 1576 |
| 1573 assembler->Bind(&search_notnan); | 1577 assembler->Bind(&search_notnan); |
| 1574 assembler->GotoIf(assembler->WordNotEqual( | 1578 assembler->GotoIf(assembler->WordNotEqual( |
| 1575 assembler->LoadMap(search_element), heap_number_map), | 1579 assembler->LoadMap(search_element), heap_number_map), |
| 1576 &return_false); | 1580 &return_false); |
| 1577 | 1581 |
| 1578 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1582 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
| 1579 | 1583 |
| 1580 assembler->BranchIfFloat64IsNaN(search_num.value(), &nan_loop, | 1584 assembler->BranchIfFloat64IsNaN(search_num.value(), &nan_loop, |
| 1581 ¬_nan_loop); | 1585 ¬_nan_loop); |
| 1582 | 1586 |
| 1583 // Search for HeapNumber | 1587 // Search for HeapNumber |
| 1584 assembler->Bind(¬_nan_loop); | 1588 assembler->Bind(¬_nan_loop); |
| 1585 { | 1589 { |
| 1586 Label continue_loop(assembler); | 1590 Label continue_loop(assembler); |
| 1587 assembler->GotoUnless( | 1591 assembler->GotoUnless( |
| 1588 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1592 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1589 &return_false); | 1593 &return_false); |
| 1590 Node* element_k = assembler->LoadFixedDoubleArrayElement( | 1594 Node* element_k = assembler->LoadFixedDoubleArrayElement( |
| 1591 elements, index_var.value(), MachineType::Float64()); | 1595 elements, index_var.value(), MachineType::Float64(), 0, |
| 1596 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1592 assembler->BranchIfFloat64Equal(element_k, search_num.value(), | 1597 assembler->BranchIfFloat64Equal(element_k, search_num.value(), |
| 1593 &return_true, &continue_loop); | 1598 &return_true, &continue_loop); |
| 1594 assembler->Bind(&continue_loop); | 1599 assembler->Bind(&continue_loop); |
| 1595 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1600 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1596 assembler->Goto(¬_nan_loop); | 1601 assembler->Goto(¬_nan_loop); |
| 1597 } | 1602 } |
| 1598 | 1603 |
| 1599 // Search for NaN | 1604 // Search for NaN |
| 1600 assembler->Bind(&nan_loop); | 1605 assembler->Bind(&nan_loop); |
| 1601 { | 1606 { |
| 1602 Label continue_loop(assembler); | 1607 Label continue_loop(assembler); |
| 1603 assembler->GotoUnless( | 1608 assembler->GotoUnless( |
| 1604 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1609 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1605 &return_false); | 1610 &return_false); |
| 1606 Node* element_k = assembler->LoadFixedDoubleArrayElement( | 1611 Node* element_k = assembler->LoadFixedDoubleArrayElement( |
| 1607 elements, index_var.value(), MachineType::Float64()); | 1612 elements, index_var.value(), MachineType::Float64(), 0, |
| 1613 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1608 assembler->BranchIfFloat64IsNaN(element_k, &return_true, &continue_loop); | 1614 assembler->BranchIfFloat64IsNaN(element_k, &return_true, &continue_loop); |
| 1609 assembler->Bind(&continue_loop); | 1615 assembler->Bind(&continue_loop); |
| 1610 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1616 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1611 assembler->Goto(&nan_loop); | 1617 assembler->Goto(&nan_loop); |
| 1612 } | 1618 } |
| 1613 } | 1619 } |
| 1614 | 1620 |
| 1615 assembler->Bind(&if_holey_doubles); | 1621 assembler->Bind(&if_holey_doubles); |
| 1616 { | 1622 { |
| 1617 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), | 1623 Label nan_loop(assembler, &index_var), not_nan_loop(assembler, &index_var), |
| 1618 hole_loop(assembler, &index_var), search_notnan(assembler); | 1624 hole_loop(assembler, &index_var), search_notnan(assembler); |
| 1619 Variable search_num(assembler, MachineRepresentation::kFloat64); | 1625 Variable search_num(assembler, MachineRepresentation::kFloat64); |
| 1620 | 1626 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1632 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1638 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
| 1633 | 1639 |
| 1634 assembler->BranchIfFloat64IsNaN(search_num.value(), &nan_loop, | 1640 assembler->BranchIfFloat64IsNaN(search_num.value(), &nan_loop, |
| 1635 ¬_nan_loop); | 1641 ¬_nan_loop); |
| 1636 | 1642 |
| 1637 // Search for HeapNumber | 1643 // Search for HeapNumber |
| 1638 assembler->Bind(¬_nan_loop); | 1644 assembler->Bind(¬_nan_loop); |
| 1639 { | 1645 { |
| 1640 Label continue_loop(assembler); | 1646 Label continue_loop(assembler); |
| 1641 assembler->GotoUnless( | 1647 assembler->GotoUnless( |
| 1642 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1648 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1643 &return_false); | 1649 &return_false); |
| 1644 | 1650 |
| 1645 if (kPointerSize == kDoubleSize) { | 1651 if (kPointerSize == kDoubleSize) { |
| 1646 Node* element = assembler->LoadFixedDoubleArrayElement( | 1652 Node* element = assembler->LoadFixedDoubleArrayElement( |
| 1647 elements, index_var.value(), MachineType::Uint64()); | 1653 elements, index_var.value(), MachineType::Uint64(), 0, |
| 1654 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1648 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); | 1655 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); |
| 1649 assembler->GotoIf(assembler->Word64Equal(element, the_hole), | 1656 assembler->GotoIf(assembler->Word64Equal(element, the_hole), |
| 1650 &continue_loop); | 1657 &continue_loop); |
| 1651 } else { | 1658 } else { |
| 1652 Node* element_upper = assembler->LoadFixedDoubleArrayElement( | 1659 Node* element_upper = assembler->LoadFixedDoubleArrayElement( |
| 1653 elements, index_var.value(), MachineType::Uint32(), | 1660 elements, index_var.value(), MachineType::Uint32(), |
| 1654 kIeeeDoubleExponentWordOffset); | 1661 kIeeeDoubleExponentWordOffset, |
| 1662 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1655 assembler->GotoIf( | 1663 assembler->GotoIf( |
| 1656 assembler->Word32Equal(element_upper, | 1664 assembler->Word32Equal(element_upper, |
| 1657 assembler->Int32Constant(kHoleNanUpper32)), | 1665 assembler->Int32Constant(kHoleNanUpper32)), |
| 1658 &continue_loop); | 1666 &continue_loop); |
| 1659 } | 1667 } |
| 1660 | 1668 |
| 1661 Node* element_k = assembler->LoadFixedDoubleArrayElement( | 1669 Node* element_k = assembler->LoadFixedDoubleArrayElement( |
| 1662 elements, index_var.value(), MachineType::Float64()); | 1670 elements, index_var.value(), MachineType::Float64(), 0, |
| 1671 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1663 assembler->BranchIfFloat64Equal(element_k, search_num.value(), | 1672 assembler->BranchIfFloat64Equal(element_k, search_num.value(), |
| 1664 &return_true, &continue_loop); | 1673 &return_true, &continue_loop); |
| 1665 assembler->Bind(&continue_loop); | 1674 assembler->Bind(&continue_loop); |
| 1666 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1675 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1667 assembler->Goto(¬_nan_loop); | 1676 assembler->Goto(¬_nan_loop); |
| 1668 } | 1677 } |
| 1669 | 1678 |
| 1670 // Search for NaN | 1679 // Search for NaN |
| 1671 assembler->Bind(&nan_loop); | 1680 assembler->Bind(&nan_loop); |
| 1672 { | 1681 { |
| 1673 Label continue_loop(assembler); | 1682 Label continue_loop(assembler); |
| 1674 assembler->GotoUnless( | 1683 assembler->GotoUnless( |
| 1675 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1684 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1676 &return_false); | 1685 &return_false); |
| 1677 | 1686 |
| 1678 if (kPointerSize == kDoubleSize) { | 1687 if (kPointerSize == kDoubleSize) { |
| 1679 Node* element = assembler->LoadFixedDoubleArrayElement( | 1688 Node* element = assembler->LoadFixedDoubleArrayElement( |
| 1680 elements, index_var.value(), MachineType::Uint64()); | 1689 elements, index_var.value(), MachineType::Uint64(), 0, |
| 1690 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1681 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); | 1691 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); |
| 1682 assembler->GotoIf(assembler->Word64Equal(element, the_hole), | 1692 assembler->GotoIf(assembler->Word64Equal(element, the_hole), |
| 1683 &continue_loop); | 1693 &continue_loop); |
| 1684 } else { | 1694 } else { |
| 1685 Node* element_upper = assembler->LoadFixedDoubleArrayElement( | 1695 Node* element_upper = assembler->LoadFixedDoubleArrayElement( |
| 1686 elements, index_var.value(), MachineType::Uint32(), | 1696 elements, index_var.value(), MachineType::Uint32(), |
| 1687 kIeeeDoubleExponentWordOffset); | 1697 kIeeeDoubleExponentWordOffset, |
| 1698 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1688 assembler->GotoIf( | 1699 assembler->GotoIf( |
| 1689 assembler->Word32Equal(element_upper, | 1700 assembler->Word32Equal(element_upper, |
| 1690 assembler->Int32Constant(kHoleNanUpper32)), | 1701 assembler->Int32Constant(kHoleNanUpper32)), |
| 1691 &continue_loop); | 1702 &continue_loop); |
| 1692 } | 1703 } |
| 1693 | 1704 |
| 1694 Node* element_k = assembler->LoadFixedDoubleArrayElement( | 1705 Node* element_k = assembler->LoadFixedDoubleArrayElement( |
| 1695 elements, index_var.value(), MachineType::Float64()); | 1706 elements, index_var.value(), MachineType::Float64(), 0, |
| 1707 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1696 assembler->BranchIfFloat64IsNaN(element_k, &return_true, &continue_loop); | 1708 assembler->BranchIfFloat64IsNaN(element_k, &return_true, &continue_loop); |
| 1697 assembler->Bind(&continue_loop); | 1709 assembler->Bind(&continue_loop); |
| 1698 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1710 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1699 assembler->Goto(&nan_loop); | 1711 assembler->Goto(&nan_loop); |
| 1700 } | 1712 } |
| 1701 | 1713 |
| 1702 // Search for the Hole | 1714 // Search for the Hole |
| 1703 assembler->Bind(&hole_loop); | 1715 assembler->Bind(&hole_loop); |
| 1704 { | 1716 { |
| 1705 assembler->GotoUnless( | 1717 assembler->GotoUnless( |
| 1706 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1718 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1707 &return_false); | 1719 &return_false); |
| 1708 | 1720 |
| 1709 if (kPointerSize == kDoubleSize) { | 1721 if (kPointerSize == kDoubleSize) { |
| 1710 Node* element = assembler->LoadFixedDoubleArrayElement( | 1722 Node* element = assembler->LoadFixedDoubleArrayElement( |
| 1711 elements, index_var.value(), MachineType::Uint64()); | 1723 elements, index_var.value(), MachineType::Uint64(), 0, |
| 1724 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1712 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); | 1725 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); |
| 1713 assembler->GotoIf(assembler->Word64Equal(element, the_hole), | 1726 assembler->GotoIf(assembler->Word64Equal(element, the_hole), |
| 1714 &return_true); | 1727 &return_true); |
| 1715 } else { | 1728 } else { |
| 1716 Node* element_upper = assembler->LoadFixedDoubleArrayElement( | 1729 Node* element_upper = assembler->LoadFixedDoubleArrayElement( |
| 1717 elements, index_var.value(), MachineType::Uint32(), | 1730 elements, index_var.value(), MachineType::Uint32(), |
| 1718 kIeeeDoubleExponentWordOffset); | 1731 kIeeeDoubleExponentWordOffset, |
| 1732 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1719 assembler->GotoIf( | 1733 assembler->GotoIf( |
| 1720 assembler->Word32Equal(element_upper, | 1734 assembler->Word32Equal(element_upper, |
| 1721 assembler->Int32Constant(kHoleNanUpper32)), | 1735 assembler->Int32Constant(kHoleNanUpper32)), |
| 1722 &return_true); | 1736 &return_true); |
| 1723 } | 1737 } |
| 1724 | 1738 |
| 1725 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1739 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1726 assembler->Goto(&hole_loop); | 1740 assembler->Goto(&hole_loop); |
| 1727 } | 1741 } |
| 1728 } | 1742 } |
| 1729 | 1743 |
| 1730 assembler->Bind(&return_true); | 1744 assembler->Bind(&return_true); |
| 1731 assembler->Return(assembler->BooleanConstant(true)); | 1745 assembler->Return(assembler->BooleanConstant(true)); |
| 1732 | 1746 |
| 1733 assembler->Bind(&return_false); | 1747 assembler->Bind(&return_false); |
| 1734 assembler->Return(assembler->BooleanConstant(false)); | 1748 assembler->Return(assembler->BooleanConstant(false)); |
| 1735 | 1749 |
| 1736 assembler->Bind(&call_runtime); | 1750 assembler->Bind(&call_runtime); |
| 1737 assembler->Return(assembler->CallRuntime(Runtime::kArrayIncludes_Slow, | 1751 assembler->Return(assembler->CallRuntime(Runtime::kArrayIncludes_Slow, |
| 1738 context, array, search_element, | 1752 context, array, search_element, |
| 1739 start_from)); | 1753 start_from)); |
| 1740 } | 1754 } |
| 1741 | 1755 |
| 1742 void Builtins::Generate_ArrayIndexOf(CodeStubAssembler* assembler) { | 1756 void Builtins::Generate_ArrayIndexOf(CodeStubAssembler* assembler) { |
| 1743 typedef compiler::Node Node; | 1757 typedef compiler::Node Node; |
| 1744 typedef CodeStubAssembler::Label Label; | 1758 typedef CodeStubAssembler::Label Label; |
| 1745 typedef CodeStubAssembler::Variable Variable; | 1759 typedef CodeStubAssembler::Variable Variable; |
| 1746 | 1760 |
| 1747 Node* array = assembler->Parameter(0); | 1761 Node* array = assembler->Parameter(0); |
| 1748 Node* search_element = assembler->Parameter(1); | 1762 Node* search_element = assembler->Parameter(1); |
| 1749 Node* start_from = assembler->Parameter(2); | 1763 Node* start_from = assembler->Parameter(2); |
| 1750 Node* context = assembler->Parameter(3 + 2); | 1764 Node* context = assembler->Parameter(3 + 2); |
| 1751 | 1765 |
| 1752 Node* int32_zero = assembler->Int32Constant(0); | 1766 Node* intptr_zero = assembler->IntPtrConstant(0); |
| 1753 Node* int32_one = assembler->Int32Constant(1); | 1767 Node* intptr_one = assembler->IntPtrConstant(1); |
| 1754 | 1768 |
| 1755 Node* undefined = assembler->UndefinedConstant(); | 1769 Node* undefined = assembler->UndefinedConstant(); |
| 1756 Node* heap_number_map = assembler->HeapNumberMapConstant(); | 1770 Node* heap_number_map = assembler->HeapNumberMapConstant(); |
| 1757 | 1771 |
| 1758 Variable len_var(assembler, MachineRepresentation::kWord32), | 1772 Variable len_var(assembler, MachineType::PointerRepresentation()), |
| 1759 index_var(assembler, MachineRepresentation::kWord32), | 1773 index_var(assembler, MachineType::PointerRepresentation()), |
| 1760 start_from_var(assembler, MachineRepresentation::kWord32); | 1774 start_from_var(assembler, MachineType::PointerRepresentation()); |
| 1761 | 1775 |
| 1762 Label init_k(assembler), return_found(assembler), return_not_found(assembler), | 1776 Label init_k(assembler), return_found(assembler), return_not_found(assembler), |
| 1763 call_runtime(assembler); | 1777 call_runtime(assembler); |
| 1764 | 1778 |
| 1765 Label init_len(assembler); | 1779 Label init_len(assembler); |
| 1766 | 1780 |
| 1767 index_var.Bind(int32_zero); | 1781 index_var.Bind(intptr_zero); |
| 1768 len_var.Bind(int32_zero); | 1782 len_var.Bind(intptr_zero); |
| 1769 | 1783 |
| 1770 // Take slow path if not a JSArray, if retrieving elements requires | 1784 // Take slow path if not a JSArray, if retrieving elements requires |
| 1771 // traversing prototype, or if access checks are required. | 1785 // traversing prototype, or if access checks are required. |
| 1772 assembler->BranchIfFastJSArray(array, context, &init_len, &call_runtime); | 1786 assembler->BranchIfFastJSArray(array, context, &init_len, &call_runtime); |
| 1773 | 1787 |
| 1774 assembler->Bind(&init_len); | 1788 assembler->Bind(&init_len); |
| 1775 { | 1789 { |
| 1776 // Handle case where JSArray length is not an Smi in the runtime | 1790 // Handle case where JSArray length is not an Smi in the runtime |
| 1777 Node* len = assembler->LoadObjectField(array, JSArray::kLengthOffset); | 1791 Node* len = assembler->LoadObjectField(array, JSArray::kLengthOffset); |
| 1778 assembler->GotoUnless(assembler->WordIsSmi(len), &call_runtime); | 1792 assembler->GotoUnless(assembler->WordIsSmi(len), &call_runtime); |
| 1779 | 1793 |
| 1780 len_var.Bind(assembler->SmiToWord(len)); | 1794 len_var.Bind(assembler->SmiToWord(len)); |
| 1781 assembler->Branch(assembler->Word32Equal(len_var.value(), int32_zero), | 1795 assembler->Branch(assembler->WordEqual(len_var.value(), intptr_zero), |
| 1782 &return_not_found, &init_k); | 1796 &return_not_found, &init_k); |
| 1783 } | 1797 } |
| 1784 | 1798 |
| 1785 assembler->Bind(&init_k); | 1799 assembler->Bind(&init_k); |
| 1786 { | 1800 { |
| 1787 Label done(assembler), init_k_smi(assembler), init_k_heap_num(assembler), | 1801 Label done(assembler), init_k_smi(assembler), init_k_heap_num(assembler), |
| 1788 init_k_zero(assembler), init_k_n(assembler); | 1802 init_k_zero(assembler), init_k_n(assembler); |
| 1789 Callable call_to_integer = CodeFactory::ToInteger(assembler->isolate()); | 1803 Callable call_to_integer = CodeFactory::ToInteger(assembler->isolate()); |
| 1790 Node* tagged_n = assembler->CallStub(call_to_integer, context, start_from); | 1804 Node* tagged_n = assembler->CallStub(call_to_integer, context, start_from); |
| 1791 | 1805 |
| 1792 assembler->Branch(assembler->WordIsSmi(tagged_n), &init_k_smi, | 1806 assembler->Branch(assembler->WordIsSmi(tagged_n), &init_k_smi, |
| 1793 &init_k_heap_num); | 1807 &init_k_heap_num); |
| 1794 | 1808 |
| 1795 assembler->Bind(&init_k_smi); | 1809 assembler->Bind(&init_k_smi); |
| 1796 { | 1810 { |
| 1797 start_from_var.Bind(assembler->SmiToWord32(tagged_n)); | 1811 start_from_var.Bind(assembler->SmiUntag(tagged_n)); |
| 1798 assembler->Goto(&init_k_n); | 1812 assembler->Goto(&init_k_n); |
| 1799 } | 1813 } |
| 1800 | 1814 |
| 1801 assembler->Bind(&init_k_heap_num); | 1815 assembler->Bind(&init_k_heap_num); |
| 1802 { | 1816 { |
| 1803 Label do_return_not_found(assembler); | 1817 Label do_return_not_found(assembler); |
| 1804 Node* fp_len = assembler->ChangeInt32ToFloat64(len_var.value()); | 1818 // This round is lossless for all valid lengths. |
| 1819 Node* fp_len = assembler->RoundIntPtrToFloat64(len_var.value()); |
| 1805 Node* fp_n = assembler->LoadHeapNumberValue(tagged_n); | 1820 Node* fp_n = assembler->LoadHeapNumberValue(tagged_n); |
| 1806 assembler->GotoIf(assembler->Float64GreaterThanOrEqual(fp_n, fp_len), | 1821 assembler->GotoIf(assembler->Float64GreaterThanOrEqual(fp_n, fp_len), |
| 1807 &do_return_not_found); | 1822 &do_return_not_found); |
| 1808 start_from_var.Bind(assembler->TruncateFloat64ToWord32(fp_n)); | 1823 start_from_var.Bind(assembler->ChangeInt32ToIntPtr( |
| 1824 assembler->TruncateFloat64ToWord32(fp_n))); |
| 1809 assembler->Goto(&init_k_n); | 1825 assembler->Goto(&init_k_n); |
| 1810 | 1826 |
| 1811 assembler->Bind(&do_return_not_found); | 1827 assembler->Bind(&do_return_not_found); |
| 1812 { | 1828 { |
| 1813 index_var.Bind(int32_zero); | 1829 index_var.Bind(intptr_zero); |
| 1814 assembler->Goto(&return_not_found); | 1830 assembler->Goto(&return_not_found); |
| 1815 } | 1831 } |
| 1816 } | 1832 } |
| 1817 | 1833 |
| 1818 assembler->Bind(&init_k_n); | 1834 assembler->Bind(&init_k_n); |
| 1819 { | 1835 { |
| 1820 Label if_positive(assembler), if_negative(assembler), done(assembler); | 1836 Label if_positive(assembler), if_negative(assembler), done(assembler); |
| 1821 assembler->Branch( | 1837 assembler->Branch( |
| 1822 assembler->Int32LessThan(start_from_var.value(), int32_zero), | 1838 assembler->IntPtrLessThan(start_from_var.value(), intptr_zero), |
| 1823 &if_negative, &if_positive); | 1839 &if_negative, &if_positive); |
| 1824 | 1840 |
| 1825 assembler->Bind(&if_positive); | 1841 assembler->Bind(&if_positive); |
| 1826 { | 1842 { |
| 1827 index_var.Bind(start_from_var.value()); | 1843 index_var.Bind(start_from_var.value()); |
| 1828 assembler->Goto(&done); | 1844 assembler->Goto(&done); |
| 1829 } | 1845 } |
| 1830 | 1846 |
| 1831 assembler->Bind(&if_negative); | 1847 assembler->Bind(&if_negative); |
| 1832 { | 1848 { |
| 1833 index_var.Bind( | 1849 index_var.Bind( |
| 1834 assembler->Int32Add(len_var.value(), start_from_var.value())); | 1850 assembler->IntPtrAdd(len_var.value(), start_from_var.value())); |
| 1835 assembler->Branch( | 1851 assembler->Branch( |
| 1836 assembler->Int32LessThan(index_var.value(), int32_zero), | 1852 assembler->IntPtrLessThan(index_var.value(), intptr_zero), |
| 1837 &init_k_zero, &done); | 1853 &init_k_zero, &done); |
| 1838 } | 1854 } |
| 1839 | 1855 |
| 1840 assembler->Bind(&init_k_zero); | 1856 assembler->Bind(&init_k_zero); |
| 1841 { | 1857 { |
| 1842 index_var.Bind(int32_zero); | 1858 index_var.Bind(intptr_zero); |
| 1843 assembler->Goto(&done); | 1859 assembler->Goto(&done); |
| 1844 } | 1860 } |
| 1845 | 1861 |
| 1846 assembler->Bind(&done); | 1862 assembler->Bind(&done); |
| 1847 } | 1863 } |
| 1848 } | 1864 } |
| 1849 | 1865 |
| 1850 static int32_t kElementsKind[] = { | 1866 static int32_t kElementsKind[] = { |
| 1851 FAST_SMI_ELEMENTS, FAST_HOLEY_SMI_ELEMENTS, FAST_ELEMENTS, | 1867 FAST_SMI_ELEMENTS, FAST_HOLEY_SMI_ELEMENTS, FAST_ELEMENTS, |
| 1852 FAST_HOLEY_ELEMENTS, FAST_DOUBLE_ELEMENTS, FAST_HOLEY_DOUBLE_ELEMENTS, | 1868 FAST_HOLEY_ELEMENTS, FAST_DOUBLE_ELEMENTS, FAST_HOLEY_DOUBLE_ELEMENTS, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1888 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 1904 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
| 1889 assembler->Goto(&heap_num_loop); | 1905 assembler->Goto(&heap_num_loop); |
| 1890 | 1906 |
| 1891 assembler->Bind(¬_heap_num); | 1907 assembler->Bind(¬_heap_num); |
| 1892 Node* search_type = assembler->LoadMapInstanceType(map); | 1908 Node* search_type = assembler->LoadMapInstanceType(map); |
| 1893 assembler->GotoIf( | 1909 assembler->GotoIf( |
| 1894 assembler->Int32LessThan( | 1910 assembler->Int32LessThan( |
| 1895 search_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | 1911 search_type, assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| 1896 &string_loop); | 1912 &string_loop); |
| 1897 assembler->GotoIf( | 1913 assembler->GotoIf( |
| 1898 assembler->WordEqual(search_type, | 1914 assembler->Word32Equal(search_type, |
| 1899 assembler->Int32Constant(SIMD128_VALUE_TYPE)), | 1915 assembler->Int32Constant(SIMD128_VALUE_TYPE)), |
| 1900 &simd_loop); | 1916 &simd_loop); |
| 1901 assembler->Goto(&ident_loop); | 1917 assembler->Goto(&ident_loop); |
| 1902 | 1918 |
| 1903 assembler->Bind(&ident_loop); | 1919 assembler->Bind(&ident_loop); |
| 1904 { | 1920 { |
| 1905 assembler->GotoUnless( | 1921 assembler->GotoUnless( |
| 1906 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1922 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1907 &return_not_found); | 1923 &return_not_found); |
| 1908 Node* element_k = | 1924 Node* element_k = assembler->LoadFixedArrayElement( |
| 1909 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1925 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 1910 assembler->GotoIf(assembler->WordEqual(element_k, search_element), | 1926 assembler->GotoIf(assembler->WordEqual(element_k, search_element), |
| 1911 &return_found); | 1927 &return_found); |
| 1912 | 1928 |
| 1913 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1929 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1914 assembler->Goto(&ident_loop); | 1930 assembler->Goto(&ident_loop); |
| 1915 } | 1931 } |
| 1916 | 1932 |
| 1917 assembler->Bind(&undef_loop); | 1933 assembler->Bind(&undef_loop); |
| 1918 { | 1934 { |
| 1919 assembler->GotoUnless( | 1935 assembler->GotoUnless( |
| 1920 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1936 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1921 &return_not_found); | 1937 &return_not_found); |
| 1922 Node* element_k = | 1938 Node* element_k = assembler->LoadFixedArrayElement( |
| 1923 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1939 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 1924 assembler->GotoIf(assembler->WordEqual(element_k, undefined), | 1940 assembler->GotoIf(assembler->WordEqual(element_k, undefined), |
| 1925 &return_found); | 1941 &return_found); |
| 1926 | 1942 |
| 1927 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1943 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1928 assembler->Goto(&undef_loop); | 1944 assembler->Goto(&undef_loop); |
| 1929 } | 1945 } |
| 1930 | 1946 |
| 1931 assembler->Bind(&heap_num_loop); | 1947 assembler->Bind(&heap_num_loop); |
| 1932 { | 1948 { |
| 1933 Label not_nan_loop(assembler, &index_var); | 1949 Label not_nan_loop(assembler, &index_var); |
| 1934 assembler->BranchIfFloat64IsNaN(search_num.value(), &return_not_found, | 1950 assembler->BranchIfFloat64IsNaN(search_num.value(), &return_not_found, |
| 1935 ¬_nan_loop); | 1951 ¬_nan_loop); |
| 1936 | 1952 |
| 1937 assembler->Bind(¬_nan_loop); | 1953 assembler->Bind(¬_nan_loop); |
| 1938 { | 1954 { |
| 1939 Label continue_loop(assembler), not_smi(assembler); | 1955 Label continue_loop(assembler), not_smi(assembler); |
| 1940 assembler->GotoUnless( | 1956 assembler->GotoUnless( |
| 1941 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1957 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1942 &return_not_found); | 1958 &return_not_found); |
| 1943 Node* element_k = | 1959 Node* element_k = assembler->LoadFixedArrayElement( |
| 1944 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1960 elements, index_var.value(), 0, |
| 1961 CodeStubAssembler::INTPTR_PARAMETERS); |
| 1945 assembler->GotoUnless(assembler->WordIsSmi(element_k), ¬_smi); | 1962 assembler->GotoUnless(assembler->WordIsSmi(element_k), ¬_smi); |
| 1946 assembler->Branch( | 1963 assembler->Branch( |
| 1947 assembler->Float64Equal(search_num.value(), | 1964 assembler->Float64Equal(search_num.value(), |
| 1948 assembler->SmiToFloat64(element_k)), | 1965 assembler->SmiToFloat64(element_k)), |
| 1949 &return_found, &continue_loop); | 1966 &return_found, &continue_loop); |
| 1950 | 1967 |
| 1951 assembler->Bind(¬_smi); | 1968 assembler->Bind(¬_smi); |
| 1952 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), | 1969 assembler->GotoIf(assembler->WordNotEqual(assembler->LoadMap(element_k), |
| 1953 heap_number_map), | 1970 heap_number_map), |
| 1954 &continue_loop); | 1971 &continue_loop); |
| 1955 assembler->BranchIfFloat64Equal( | 1972 assembler->BranchIfFloat64Equal( |
| 1956 search_num.value(), assembler->LoadHeapNumberValue(element_k), | 1973 search_num.value(), assembler->LoadHeapNumberValue(element_k), |
| 1957 &return_found, &continue_loop); | 1974 &return_found, &continue_loop); |
| 1958 | 1975 |
| 1959 assembler->Bind(&continue_loop); | 1976 assembler->Bind(&continue_loop); |
| 1960 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 1977 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1961 assembler->Goto(¬_nan_loop); | 1978 assembler->Goto(¬_nan_loop); |
| 1962 } | 1979 } |
| 1963 } | 1980 } |
| 1964 | 1981 |
| 1965 assembler->Bind(&string_loop); | 1982 assembler->Bind(&string_loop); |
| 1966 { | 1983 { |
| 1967 Label continue_loop(assembler); | 1984 Label continue_loop(assembler); |
| 1968 assembler->GotoUnless( | 1985 assembler->GotoUnless( |
| 1969 assembler->Int32LessThan(index_var.value(), len_var.value()), | 1986 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 1970 &return_not_found); | 1987 &return_not_found); |
| 1971 Node* element_k = | 1988 Node* element_k = assembler->LoadFixedArrayElement( |
| 1972 assembler->LoadFixedArrayElement(elements, index_var.value()); | 1989 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 1973 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 1990 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); |
| 1974 assembler->GotoUnless(assembler->Int32LessThan( | 1991 assembler->GotoUnless(assembler->Int32LessThan( |
| 1975 assembler->LoadInstanceType(element_k), | 1992 assembler->LoadInstanceType(element_k), |
| 1976 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), | 1993 assembler->Int32Constant(FIRST_NONSTRING_TYPE)), |
| 1977 &continue_loop); | 1994 &continue_loop); |
| 1978 | 1995 |
| 1979 // TODO(bmeurer): Consider inlining the StringEqual logic here. | 1996 // TODO(bmeurer): Consider inlining the StringEqual logic here. |
| 1980 Callable callable = CodeFactory::StringEqual(assembler->isolate()); | 1997 Callable callable = CodeFactory::StringEqual(assembler->isolate()); |
| 1981 Node* result = | 1998 Node* result = |
| 1982 assembler->CallStub(callable, context, search_element, element_k); | 1999 assembler->CallStub(callable, context, search_element, element_k); |
| 1983 assembler->Branch( | 2000 assembler->Branch( |
| 1984 assembler->WordEqual(assembler->BooleanConstant(true), result), | 2001 assembler->WordEqual(assembler->BooleanConstant(true), result), |
| 1985 &return_found, &continue_loop); | 2002 &return_found, &continue_loop); |
| 1986 | 2003 |
| 1987 assembler->Bind(&continue_loop); | 2004 assembler->Bind(&continue_loop); |
| 1988 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 2005 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 1989 assembler->Goto(&string_loop); | 2006 assembler->Goto(&string_loop); |
| 1990 } | 2007 } |
| 1991 | 2008 |
| 1992 assembler->Bind(&simd_loop); | 2009 assembler->Bind(&simd_loop); |
| 1993 { | 2010 { |
| 1994 Label continue_loop(assembler, &index_var), | 2011 Label continue_loop(assembler, &index_var), |
| 1995 loop_body(assembler, &index_var); | 2012 loop_body(assembler, &index_var); |
| 1996 Node* map = assembler->LoadMap(search_element); | 2013 Node* map = assembler->LoadMap(search_element); |
| 1997 | 2014 |
| 1998 assembler->Goto(&loop_body); | 2015 assembler->Goto(&loop_body); |
| 1999 assembler->Bind(&loop_body); | 2016 assembler->Bind(&loop_body); |
| 2000 assembler->GotoUnless( | 2017 assembler->GotoUnless( |
| 2001 assembler->Int32LessThan(index_var.value(), len_var.value()), | 2018 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 2002 &return_not_found); | 2019 &return_not_found); |
| 2003 | 2020 |
| 2004 Node* element_k = | 2021 Node* element_k = assembler->LoadFixedArrayElement( |
| 2005 assembler->LoadFixedArrayElement(elements, index_var.value()); | 2022 elements, index_var.value(), 0, CodeStubAssembler::INTPTR_PARAMETERS); |
| 2006 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); | 2023 assembler->GotoIf(assembler->WordIsSmi(element_k), &continue_loop); |
| 2007 | 2024 |
| 2008 Node* map_k = assembler->LoadMap(element_k); | 2025 Node* map_k = assembler->LoadMap(element_k); |
| 2009 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, | 2026 assembler->BranchIfSimd128Equal(search_element, map, element_k, map_k, |
| 2010 &return_found, &continue_loop); | 2027 &return_found, &continue_loop); |
| 2011 | 2028 |
| 2012 assembler->Bind(&continue_loop); | 2029 assembler->Bind(&continue_loop); |
| 2013 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 2030 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 2014 assembler->Goto(&loop_body); | 2031 assembler->Goto(&loop_body); |
| 2015 } | 2032 } |
| 2016 } | 2033 } |
| 2017 | 2034 |
| 2018 assembler->Bind(&if_packed_doubles); | 2035 assembler->Bind(&if_packed_doubles); |
| 2019 { | 2036 { |
| 2020 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); | 2037 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); |
| 2021 Variable search_num(assembler, MachineRepresentation::kFloat64); | 2038 Variable search_num(assembler, MachineRepresentation::kFloat64); |
| 2022 | 2039 |
| 2023 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); | 2040 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); |
| 2024 search_num.Bind(assembler->SmiToFloat64(search_element)); | 2041 search_num.Bind(assembler->SmiToFloat64(search_element)); |
| 2025 assembler->Goto(¬_nan_loop); | 2042 assembler->Goto(¬_nan_loop); |
| 2026 | 2043 |
| 2027 assembler->Bind(&search_notnan); | 2044 assembler->Bind(&search_notnan); |
| 2028 assembler->GotoIf(assembler->WordNotEqual( | 2045 assembler->GotoIf(assembler->WordNotEqual( |
| 2029 assembler->LoadMap(search_element), heap_number_map), | 2046 assembler->LoadMap(search_element), heap_number_map), |
| 2030 &return_not_found); | 2047 &return_not_found); |
| 2031 | 2048 |
| 2032 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 2049 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
| 2033 | 2050 |
| 2034 assembler->BranchIfFloat64IsNaN(search_num.value(), &return_not_found, | 2051 assembler->BranchIfFloat64IsNaN(search_num.value(), &return_not_found, |
| 2035 ¬_nan_loop); | 2052 ¬_nan_loop); |
| 2036 | 2053 |
| 2037 // Search for HeapNumber | 2054 // Search for HeapNumber |
| 2038 assembler->Bind(¬_nan_loop); | 2055 assembler->Bind(¬_nan_loop); |
| 2039 { | 2056 { |
| 2040 Label continue_loop(assembler); | 2057 Label continue_loop(assembler); |
| 2041 assembler->GotoUnless( | 2058 assembler->GotoUnless( |
| 2042 assembler->Int32LessThan(index_var.value(), len_var.value()), | 2059 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 2043 &return_not_found); | 2060 &return_not_found); |
| 2044 Node* element_k = assembler->LoadFixedDoubleArrayElement( | 2061 Node* element_k = assembler->LoadFixedDoubleArrayElement( |
| 2045 elements, index_var.value(), MachineType::Float64()); | 2062 elements, index_var.value(), MachineType::Float64(), 0, |
| 2063 CodeStubAssembler::INTPTR_PARAMETERS); |
| 2046 assembler->BranchIfFloat64Equal(element_k, search_num.value(), | 2064 assembler->BranchIfFloat64Equal(element_k, search_num.value(), |
| 2047 &return_found, &continue_loop); | 2065 &return_found, &continue_loop); |
| 2048 assembler->Bind(&continue_loop); | 2066 assembler->Bind(&continue_loop); |
| 2049 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 2067 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 2050 assembler->Goto(¬_nan_loop); | 2068 assembler->Goto(¬_nan_loop); |
| 2051 } | 2069 } |
| 2052 } | 2070 } |
| 2053 | 2071 |
| 2054 assembler->Bind(&if_holey_doubles); | 2072 assembler->Bind(&if_holey_doubles); |
| 2055 { | 2073 { |
| 2056 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); | 2074 Label not_nan_loop(assembler, &index_var), search_notnan(assembler); |
| 2057 Variable search_num(assembler, MachineRepresentation::kFloat64); | 2075 Variable search_num(assembler, MachineRepresentation::kFloat64); |
| 2058 | 2076 |
| 2059 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); | 2077 assembler->GotoUnless(assembler->WordIsSmi(search_element), &search_notnan); |
| 2060 search_num.Bind(assembler->SmiToFloat64(search_element)); | 2078 search_num.Bind(assembler->SmiToFloat64(search_element)); |
| 2061 assembler->Goto(¬_nan_loop); | 2079 assembler->Goto(¬_nan_loop); |
| 2062 | 2080 |
| 2063 assembler->Bind(&search_notnan); | 2081 assembler->Bind(&search_notnan); |
| 2064 assembler->GotoIf(assembler->WordNotEqual( | 2082 assembler->GotoIf(assembler->WordNotEqual( |
| 2065 assembler->LoadMap(search_element), heap_number_map), | 2083 assembler->LoadMap(search_element), heap_number_map), |
| 2066 &return_not_found); | 2084 &return_not_found); |
| 2067 | 2085 |
| 2068 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); | 2086 search_num.Bind(assembler->LoadHeapNumberValue(search_element)); |
| 2069 | 2087 |
| 2070 assembler->BranchIfFloat64IsNaN(search_num.value(), &return_not_found, | 2088 assembler->BranchIfFloat64IsNaN(search_num.value(), &return_not_found, |
| 2071 ¬_nan_loop); | 2089 ¬_nan_loop); |
| 2072 | 2090 |
| 2073 // Search for HeapNumber | 2091 // Search for HeapNumber |
| 2074 assembler->Bind(¬_nan_loop); | 2092 assembler->Bind(¬_nan_loop); |
| 2075 { | 2093 { |
| 2076 Label continue_loop(assembler); | 2094 Label continue_loop(assembler); |
| 2077 assembler->GotoUnless( | 2095 assembler->GotoUnless( |
| 2078 assembler->Int32LessThan(index_var.value(), len_var.value()), | 2096 assembler->UintPtrLessThan(index_var.value(), len_var.value()), |
| 2079 &return_not_found); | 2097 &return_not_found); |
| 2080 | 2098 |
| 2081 if (kPointerSize == kDoubleSize) { | 2099 if (kPointerSize == kDoubleSize) { |
| 2082 Node* element = assembler->LoadFixedDoubleArrayElement( | 2100 Node* element = assembler->LoadFixedDoubleArrayElement( |
| 2083 elements, index_var.value(), MachineType::Uint64()); | 2101 elements, index_var.value(), MachineType::Uint64(), 0, |
| 2102 CodeStubAssembler::INTPTR_PARAMETERS); |
| 2084 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); | 2103 Node* the_hole = assembler->Int64Constant(kHoleNanInt64); |
| 2085 assembler->GotoIf(assembler->Word64Equal(element, the_hole), | 2104 assembler->GotoIf(assembler->Word64Equal(element, the_hole), |
| 2086 &continue_loop); | 2105 &continue_loop); |
| 2087 } else { | 2106 } else { |
| 2088 Node* element_upper = assembler->LoadFixedDoubleArrayElement( | 2107 Node* element_upper = assembler->LoadFixedDoubleArrayElement( |
| 2089 elements, index_var.value(), MachineType::Uint32(), | 2108 elements, index_var.value(), MachineType::Uint32(), |
| 2090 kIeeeDoubleExponentWordOffset); | 2109 kIeeeDoubleExponentWordOffset, |
| 2110 CodeStubAssembler::INTPTR_PARAMETERS); |
| 2091 assembler->GotoIf( | 2111 assembler->GotoIf( |
| 2092 assembler->Word32Equal(element_upper, | 2112 assembler->Word32Equal(element_upper, |
| 2093 assembler->Int32Constant(kHoleNanUpper32)), | 2113 assembler->Int32Constant(kHoleNanUpper32)), |
| 2094 &continue_loop); | 2114 &continue_loop); |
| 2095 } | 2115 } |
| 2096 | 2116 |
| 2097 Node* element_k = assembler->LoadFixedDoubleArrayElement( | 2117 Node* element_k = assembler->LoadFixedDoubleArrayElement( |
| 2098 elements, index_var.value(), MachineType::Float64()); | 2118 elements, index_var.value(), MachineType::Float64(), 0, |
| 2119 CodeStubAssembler::INTPTR_PARAMETERS); |
| 2099 assembler->BranchIfFloat64Equal(element_k, search_num.value(), | 2120 assembler->BranchIfFloat64Equal(element_k, search_num.value(), |
| 2100 &return_found, &continue_loop); | 2121 &return_found, &continue_loop); |
| 2101 assembler->Bind(&continue_loop); | 2122 assembler->Bind(&continue_loop); |
| 2102 index_var.Bind(assembler->Int32Add(index_var.value(), int32_one)); | 2123 index_var.Bind(assembler->IntPtrAdd(index_var.value(), intptr_one)); |
| 2103 assembler->Goto(¬_nan_loop); | 2124 assembler->Goto(¬_nan_loop); |
| 2104 } | 2125 } |
| 2105 } | 2126 } |
| 2106 | 2127 |
| 2107 assembler->Bind(&return_found); | 2128 assembler->Bind(&return_found); |
| 2108 assembler->Return(assembler->ChangeInt32ToTagged(index_var.value())); | 2129 assembler->Return(assembler->ChangeInt32ToTagged(index_var.value())); |
| 2109 | 2130 |
| 2110 assembler->Bind(&return_not_found); | 2131 assembler->Bind(&return_not_found); |
| 2111 assembler->Return(assembler->NumberConstant(-1)); | 2132 assembler->Return(assembler->NumberConstant(-1)); |
| 2112 | 2133 |
| 2113 assembler->Bind(&call_runtime); | 2134 assembler->Bind(&call_runtime); |
| 2114 assembler->Return(assembler->CallRuntime(Runtime::kArrayIndexOf, context, | 2135 assembler->Return(assembler->CallRuntime(Runtime::kArrayIndexOf, context, |
| 2115 array, search_element, start_from)); | 2136 array, search_element, start_from)); |
| 2116 } | 2137 } |
| 2117 | 2138 |
| 2118 } // namespace internal | 2139 } // namespace internal |
| 2119 } // namespace v8 | 2140 } // namespace v8 |
| OLD | NEW |