| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 __ movq(rcx, FieldOperand(rdx, HeapObject::kMapOffset)); | 563 __ movq(rcx, FieldOperand(rdx, HeapObject::kMapOffset)); |
| 564 | 564 |
| 565 // Check that it has indexed interceptor and access checks | 565 // Check that it has indexed interceptor and access checks |
| 566 // are not enabled for this object. | 566 // are not enabled for this object. |
| 567 __ movb(rcx, FieldOperand(rcx, Map::kBitFieldOffset)); | 567 __ movb(rcx, FieldOperand(rcx, Map::kBitFieldOffset)); |
| 568 __ andb(rcx, Immediate(kSlowCaseBitFieldMask)); | 568 __ andb(rcx, Immediate(kSlowCaseBitFieldMask)); |
| 569 __ cmpb(rcx, Immediate(1 << Map::kHasIndexedInterceptor)); | 569 __ cmpb(rcx, Immediate(1 << Map::kHasIndexedInterceptor)); |
| 570 __ j(not_zero, &slow); | 570 __ j(not_zero, &slow); |
| 571 | 571 |
| 572 // Everything is fine, call runtime. | 572 // Everything is fine, call runtime. |
| 573 __ pop(rcx); | 573 __ PopReturnAddressTo(rcx); |
| 574 __ push(rdx); // receiver | 574 __ push(rdx); // receiver |
| 575 __ push(rax); // key | 575 __ push(rax); // key |
| 576 __ push(rcx); // return address | 576 __ PushReturnAddressFrom(rcx); |
| 577 | 577 |
| 578 // Perform tail call to the entry. | 578 // Perform tail call to the entry. |
| 579 __ TailCallExternalReference( | 579 __ TailCallExternalReference( |
| 580 ExternalReference(IC_Utility(kKeyedLoadPropertyWithInterceptor), | 580 ExternalReference(IC_Utility(kKeyedLoadPropertyWithInterceptor), |
| 581 masm->isolate()), | 581 masm->isolate()), |
| 582 2, | 582 2, |
| 583 1); | 583 1); |
| 584 | 584 |
| 585 __ bind(&slow); | 585 __ bind(&slow); |
| 586 GenerateMiss(masm, MISS); | 586 GenerateMiss(masm, MISS); |
| (...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1362 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 1362 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
| 1363 // ----------- S t a t e ------------- | 1363 // ----------- S t a t e ------------- |
| 1364 // -- rax : receiver | 1364 // -- rax : receiver |
| 1365 // -- rcx : name | 1365 // -- rcx : name |
| 1366 // -- rsp[0] : return address | 1366 // -- rsp[0] : return address |
| 1367 // ----------------------------------- | 1367 // ----------------------------------- |
| 1368 | 1368 |
| 1369 Counters* counters = masm->isolate()->counters(); | 1369 Counters* counters = masm->isolate()->counters(); |
| 1370 __ IncrementCounter(counters->load_miss(), 1); | 1370 __ IncrementCounter(counters->load_miss(), 1); |
| 1371 | 1371 |
| 1372 __ pop(rbx); | 1372 __ PopReturnAddressTo(rbx); |
| 1373 __ push(rax); // receiver | 1373 __ push(rax); // receiver |
| 1374 __ push(rcx); // name | 1374 __ push(rcx); // name |
| 1375 __ push(rbx); // return address | 1375 __ PushReturnAddressFrom(rbx); |
| 1376 | 1376 |
| 1377 // Perform tail call to the entry. | 1377 // Perform tail call to the entry. |
| 1378 ExternalReference ref = | 1378 ExternalReference ref = |
| 1379 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); | 1379 ExternalReference(IC_Utility(kLoadIC_Miss), masm->isolate()); |
| 1380 __ TailCallExternalReference(ref, 2, 1); | 1380 __ TailCallExternalReference(ref, 2, 1); |
| 1381 } | 1381 } |
| 1382 | 1382 |
| 1383 | 1383 |
| 1384 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 1384 void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 1385 // ----------- S t a t e ------------- | 1385 // ----------- S t a t e ------------- |
| 1386 // -- rax : receiver | 1386 // -- rax : receiver |
| 1387 // -- rcx : name | 1387 // -- rcx : name |
| 1388 // -- rsp[0] : return address | 1388 // -- rsp[0] : return address |
| 1389 // ----------------------------------- | 1389 // ----------------------------------- |
| 1390 | 1390 |
| 1391 __ pop(rbx); | 1391 __ PopReturnAddressTo(rbx); |
| 1392 __ push(rax); // receiver | 1392 __ push(rax); // receiver |
| 1393 __ push(rcx); // name | 1393 __ push(rcx); // name |
| 1394 __ push(rbx); // return address | 1394 __ PushReturnAddressFrom(rbx); |
| 1395 | 1395 |
| 1396 // Perform tail call to the entry. | 1396 // Perform tail call to the entry. |
| 1397 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); | 1397 __ TailCallRuntime(Runtime::kGetProperty, 2, 1); |
| 1398 } | 1398 } |
| 1399 | 1399 |
| 1400 | 1400 |
| 1401 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { | 1401 void KeyedLoadIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { |
| 1402 // ----------- S t a t e ------------- | 1402 // ----------- S t a t e ------------- |
| 1403 // -- rax : key | 1403 // -- rax : key |
| 1404 // -- rdx : receiver | 1404 // -- rdx : receiver |
| 1405 // -- rsp[0] : return address | 1405 // -- rsp[0] : return address |
| 1406 // ----------------------------------- | 1406 // ----------------------------------- |
| 1407 | 1407 |
| 1408 Counters* counters = masm->isolate()->counters(); | 1408 Counters* counters = masm->isolate()->counters(); |
| 1409 __ IncrementCounter(counters->keyed_load_miss(), 1); | 1409 __ IncrementCounter(counters->keyed_load_miss(), 1); |
| 1410 | 1410 |
| 1411 __ pop(rbx); | 1411 __ PopReturnAddressTo(rbx); |
| 1412 __ push(rdx); // receiver | 1412 __ push(rdx); // receiver |
| 1413 __ push(rax); // name | 1413 __ push(rax); // name |
| 1414 __ push(rbx); // return address | 1414 __ PushReturnAddressFrom(rbx); |
| 1415 | 1415 |
| 1416 // Perform tail call to the entry. | 1416 // Perform tail call to the entry. |
| 1417 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC | 1417 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC |
| 1418 ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), | 1418 ? ExternalReference(IC_Utility(kKeyedLoadIC_MissForceGeneric), |
| 1419 masm->isolate()) | 1419 masm->isolate()) |
| 1420 : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); | 1420 : ExternalReference(IC_Utility(kKeyedLoadIC_Miss), masm->isolate()); |
| 1421 __ TailCallExternalReference(ref, 2, 1); | 1421 __ TailCallExternalReference(ref, 2, 1); |
| 1422 } | 1422 } |
| 1423 | 1423 |
| 1424 | 1424 |
| 1425 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { | 1425 void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
| 1426 // ----------- S t a t e ------------- | 1426 // ----------- S t a t e ------------- |
| 1427 // -- rax : key | 1427 // -- rax : key |
| 1428 // -- rdx : receiver | 1428 // -- rdx : receiver |
| 1429 // -- rsp[0] : return address | 1429 // -- rsp[0] : return address |
| 1430 // ----------------------------------- | 1430 // ----------------------------------- |
| 1431 | 1431 |
| 1432 __ pop(rbx); | 1432 __ PopReturnAddressTo(rbx); |
| 1433 __ push(rdx); // receiver | 1433 __ push(rdx); // receiver |
| 1434 __ push(rax); // name | 1434 __ push(rax); // name |
| 1435 __ push(rbx); // return address | 1435 __ PushReturnAddressFrom(rbx); |
| 1436 | 1436 |
| 1437 // Perform tail call to the entry. | 1437 // Perform tail call to the entry. |
| 1438 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); | 1438 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
| 1439 } | 1439 } |
| 1440 | 1440 |
| 1441 | 1441 |
| 1442 void StoreIC::GenerateMegamorphic(MacroAssembler* masm, | 1442 void StoreIC::GenerateMegamorphic(MacroAssembler* masm, |
| 1443 StrictModeFlag strict_mode) { | 1443 StrictModeFlag strict_mode) { |
| 1444 // ----------- S t a t e ------------- | 1444 // ----------- S t a t e ------------- |
| 1445 // -- rax : value | 1445 // -- rax : value |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1461 | 1461 |
| 1462 | 1462 |
| 1463 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 1463 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
| 1464 // ----------- S t a t e ------------- | 1464 // ----------- S t a t e ------------- |
| 1465 // -- rax : value | 1465 // -- rax : value |
| 1466 // -- rcx : name | 1466 // -- rcx : name |
| 1467 // -- rdx : receiver | 1467 // -- rdx : receiver |
| 1468 // -- rsp[0] : return address | 1468 // -- rsp[0] : return address |
| 1469 // ----------------------------------- | 1469 // ----------------------------------- |
| 1470 | 1470 |
| 1471 __ pop(rbx); | 1471 __ PopReturnAddressTo(rbx); |
| 1472 __ push(rdx); // receiver | 1472 __ push(rdx); // receiver |
| 1473 __ push(rcx); // name | 1473 __ push(rcx); // name |
| 1474 __ push(rax); // value | 1474 __ push(rax); // value |
| 1475 __ push(rbx); // return address | 1475 __ PushReturnAddressFrom(rbx); |
| 1476 | 1476 |
| 1477 // Perform tail call to the entry. | 1477 // Perform tail call to the entry. |
| 1478 ExternalReference ref = | 1478 ExternalReference ref = |
| 1479 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); | 1479 ExternalReference(IC_Utility(kStoreIC_Miss), masm->isolate()); |
| 1480 __ TailCallExternalReference(ref, 3, 1); | 1480 __ TailCallExternalReference(ref, 3, 1); |
| 1481 } | 1481 } |
| 1482 | 1482 |
| 1483 | 1483 |
| 1484 void StoreIC::GenerateNormal(MacroAssembler* masm) { | 1484 void StoreIC::GenerateNormal(MacroAssembler* masm) { |
| 1485 // ----------- S t a t e ------------- | 1485 // ----------- S t a t e ------------- |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1505 | 1505 |
| 1506 | 1506 |
| 1507 void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, | 1507 void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 1508 StrictModeFlag strict_mode) { | 1508 StrictModeFlag strict_mode) { |
| 1509 // ----------- S t a t e ------------- | 1509 // ----------- S t a t e ------------- |
| 1510 // -- rax : value | 1510 // -- rax : value |
| 1511 // -- rcx : name | 1511 // -- rcx : name |
| 1512 // -- rdx : receiver | 1512 // -- rdx : receiver |
| 1513 // -- rsp[0] : return address | 1513 // -- rsp[0] : return address |
| 1514 // ----------------------------------- | 1514 // ----------------------------------- |
| 1515 __ pop(rbx); | 1515 __ PopReturnAddressTo(rbx); |
| 1516 __ push(rdx); | 1516 __ push(rdx); |
| 1517 __ push(rcx); | 1517 __ push(rcx); |
| 1518 __ push(rax); | 1518 __ push(rax); |
| 1519 __ Push(Smi::FromInt(NONE)); // PropertyAttributes | 1519 __ Push(Smi::FromInt(NONE)); // PropertyAttributes |
| 1520 __ Push(Smi::FromInt(strict_mode)); | 1520 __ Push(Smi::FromInt(strict_mode)); |
| 1521 __ push(rbx); // return address | 1521 __ PushReturnAddressFrom(rbx); |
| 1522 | 1522 |
| 1523 // Do tail-call to runtime routine. | 1523 // Do tail-call to runtime routine. |
| 1524 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); | 1524 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); |
| 1525 } | 1525 } |
| 1526 | 1526 |
| 1527 | 1527 |
| 1528 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, | 1528 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 1529 StrictModeFlag strict_mode) { | 1529 StrictModeFlag strict_mode) { |
| 1530 // ----------- S t a t e ------------- | 1530 // ----------- S t a t e ------------- |
| 1531 // -- rax : value | 1531 // -- rax : value |
| 1532 // -- rcx : key | 1532 // -- rcx : key |
| 1533 // -- rdx : receiver | 1533 // -- rdx : receiver |
| 1534 // -- rsp[0] : return address | 1534 // -- rsp[0] : return address |
| 1535 // ----------------------------------- | 1535 // ----------------------------------- |
| 1536 | 1536 |
| 1537 __ pop(rbx); | 1537 __ PopReturnAddressTo(rbx); |
| 1538 __ push(rdx); // receiver | 1538 __ push(rdx); // receiver |
| 1539 __ push(rcx); // key | 1539 __ push(rcx); // key |
| 1540 __ push(rax); // value | 1540 __ push(rax); // value |
| 1541 __ Push(Smi::FromInt(NONE)); // PropertyAttributes | 1541 __ Push(Smi::FromInt(NONE)); // PropertyAttributes |
| 1542 __ Push(Smi::FromInt(strict_mode)); // Strict mode. | 1542 __ Push(Smi::FromInt(strict_mode)); // Strict mode. |
| 1543 __ push(rbx); // return address | 1543 __ PushReturnAddressFrom(rbx); |
| 1544 | 1544 |
| 1545 // Do tail-call to runtime routine. | 1545 // Do tail-call to runtime routine. |
| 1546 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); | 1546 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); |
| 1547 } | 1547 } |
| 1548 | 1548 |
| 1549 | 1549 |
| 1550 void StoreIC::GenerateSlow(MacroAssembler* masm) { | 1550 void StoreIC::GenerateSlow(MacroAssembler* masm) { |
| 1551 // ----------- S t a t e ------------- | 1551 // ----------- S t a t e ------------- |
| 1552 // -- rax : value | 1552 // -- rax : value |
| 1553 // -- rcx : key | 1553 // -- rcx : key |
| 1554 // -- rdx : receiver | 1554 // -- rdx : receiver |
| 1555 // -- rsp[0] : return address | 1555 // -- rsp[0] : return address |
| 1556 // ----------------------------------- | 1556 // ----------------------------------- |
| 1557 | 1557 |
| 1558 __ pop(rbx); | 1558 __ PopReturnAddressTo(rbx); |
| 1559 __ push(rdx); // receiver | 1559 __ push(rdx); // receiver |
| 1560 __ push(rcx); // key | 1560 __ push(rcx); // key |
| 1561 __ push(rax); // value | 1561 __ push(rax); // value |
| 1562 __ push(rbx); // return address | 1562 __ PushReturnAddressFrom(rbx); |
| 1563 | 1563 |
| 1564 // Do tail-call to runtime routine. | 1564 // Do tail-call to runtime routine. |
| 1565 ExternalReference ref(IC_Utility(kStoreIC_Slow), masm->isolate()); | 1565 ExternalReference ref(IC_Utility(kStoreIC_Slow), masm->isolate()); |
| 1566 __ TailCallExternalReference(ref, 3, 1); | 1566 __ TailCallExternalReference(ref, 3, 1); |
| 1567 } | 1567 } |
| 1568 | 1568 |
| 1569 | 1569 |
| 1570 void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { | 1570 void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { |
| 1571 // ----------- S t a t e ------------- | 1571 // ----------- S t a t e ------------- |
| 1572 // -- rax : value | 1572 // -- rax : value |
| 1573 // -- rcx : key | 1573 // -- rcx : key |
| 1574 // -- rdx : receiver | 1574 // -- rdx : receiver |
| 1575 // -- rsp[0] : return address | 1575 // -- rsp[0] : return address |
| 1576 // ----------------------------------- | 1576 // ----------------------------------- |
| 1577 | 1577 |
| 1578 __ pop(rbx); | 1578 __ PopReturnAddressTo(rbx); |
| 1579 __ push(rdx); // receiver | 1579 __ push(rdx); // receiver |
| 1580 __ push(rcx); // key | 1580 __ push(rcx); // key |
| 1581 __ push(rax); // value | 1581 __ push(rax); // value |
| 1582 __ push(rbx); // return address | 1582 __ PushReturnAddressFrom(rbx); |
| 1583 | 1583 |
| 1584 // Do tail-call to runtime routine. | 1584 // Do tail-call to runtime routine. |
| 1585 ExternalReference ref(IC_Utility(kKeyedStoreIC_Slow), masm->isolate()); | 1585 ExternalReference ref(IC_Utility(kKeyedStoreIC_Slow), masm->isolate()); |
| 1586 __ TailCallExternalReference(ref, 3, 1); | 1586 __ TailCallExternalReference(ref, 3, 1); |
| 1587 } | 1587 } |
| 1588 | 1588 |
| 1589 | 1589 |
| 1590 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { | 1590 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm, ICMissMode miss_mode) { |
| 1591 // ----------- S t a t e ------------- | 1591 // ----------- S t a t e ------------- |
| 1592 // -- rax : value | 1592 // -- rax : value |
| 1593 // -- rcx : key | 1593 // -- rcx : key |
| 1594 // -- rdx : receiver | 1594 // -- rdx : receiver |
| 1595 // -- rsp[0] : return address | 1595 // -- rsp[0] : return address |
| 1596 // ----------------------------------- | 1596 // ----------------------------------- |
| 1597 | 1597 |
| 1598 __ pop(rbx); | 1598 __ PopReturnAddressTo(rbx); |
| 1599 __ push(rdx); // receiver | 1599 __ push(rdx); // receiver |
| 1600 __ push(rcx); // key | 1600 __ push(rcx); // key |
| 1601 __ push(rax); // value | 1601 __ push(rax); // value |
| 1602 __ push(rbx); // return address | 1602 __ PushReturnAddressFrom(rbx); |
| 1603 | 1603 |
| 1604 // Do tail-call to runtime routine. | 1604 // Do tail-call to runtime routine. |
| 1605 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC | 1605 ExternalReference ref = miss_mode == MISS_FORCE_GENERIC |
| 1606 ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), | 1606 ? ExternalReference(IC_Utility(kKeyedStoreIC_MissForceGeneric), |
| 1607 masm->isolate()) | 1607 masm->isolate()) |
| 1608 : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); | 1608 : ExternalReference(IC_Utility(kKeyedStoreIC_Miss), masm->isolate()); |
| 1609 __ TailCallExternalReference(ref, 3, 1); | 1609 __ TailCallExternalReference(ref, 3, 1); |
| 1610 } | 1610 } |
| 1611 | 1611 |
| 1612 | 1612 |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1677 Condition cc = (check == ENABLE_INLINED_SMI_CHECK) | 1677 Condition cc = (check == ENABLE_INLINED_SMI_CHECK) |
| 1678 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) | 1678 ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) |
| 1679 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); | 1679 : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); |
| 1680 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1680 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
| 1681 } | 1681 } |
| 1682 | 1682 |
| 1683 | 1683 |
| 1684 } } // namespace v8::internal | 1684 } } // namespace v8::internal |
| 1685 | 1685 |
| 1686 #endif // V8_TARGET_ARCH_X64 | 1686 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |