| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 743 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 754 // Perform tail call to the entry. | 754 // Perform tail call to the entry. |
| 755 ExternalReference ref = ExternalReference( | 755 ExternalReference ref = ExternalReference( |
| 756 IC_Utility(kKeyedLoadPropertyWithInterceptor)); | 756 IC_Utility(kKeyedLoadPropertyWithInterceptor)); |
| 757 __ TailCallExternalReference(ref, 2, 1); | 757 __ TailCallExternalReference(ref, 2, 1); |
| 758 | 758 |
| 759 __ bind(&slow); | 759 __ bind(&slow); |
| 760 GenerateMiss(masm); | 760 GenerateMiss(masm); |
| 761 } | 761 } |
| 762 | 762 |
| 763 | 763 |
| 764 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm) { | 764 void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, |
| 765 StrictModeFlag strict_mode) { |
| 765 // ----------- S t a t e ------------- | 766 // ----------- S t a t e ------------- |
| 766 // -- eax : value | 767 // -- eax : value |
| 767 // -- ecx : key | 768 // -- ecx : key |
| 768 // -- edx : receiver | 769 // -- edx : receiver |
| 769 // -- esp[0] : return address | 770 // -- esp[0] : return address |
| 770 // ----------------------------------- | 771 // ----------------------------------- |
| 771 Label slow, fast, array, extra, check_pixel_array; | 772 Label slow, fast, array, extra, check_pixel_array; |
| 772 | 773 |
| 773 // Check that the object isn't a smi. | 774 // Check that the object isn't a smi. |
| 774 __ test(edx, Immediate(kSmiTagMask)); | 775 __ test(edx, Immediate(kSmiTagMask)); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 794 // edx: JSObject | 795 // edx: JSObject |
| 795 // ecx: key (a smi) | 796 // ecx: key (a smi) |
| 796 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); | 797 __ mov(edi, FieldOperand(edx, JSObject::kElementsOffset)); |
| 797 // Check that the object is in fast mode and writable. | 798 // Check that the object is in fast mode and writable. |
| 798 __ CheckMap(edi, Factory::fixed_array_map(), &check_pixel_array, true); | 799 __ CheckMap(edi, Factory::fixed_array_map(), &check_pixel_array, true); |
| 799 __ cmp(ecx, FieldOperand(edi, FixedArray::kLengthOffset)); | 800 __ cmp(ecx, FieldOperand(edi, FixedArray::kLengthOffset)); |
| 800 __ j(below, &fast, taken); | 801 __ j(below, &fast, taken); |
| 801 | 802 |
| 802 // Slow case: call runtime. | 803 // Slow case: call runtime. |
| 803 __ bind(&slow); | 804 __ bind(&slow); |
| 804 GenerateRuntimeSetProperty(masm); | 805 GenerateRuntimeSetProperty(masm, strict_mode); |
| 805 | 806 |
| 806 // Check whether the elements is a pixel array. | 807 // Check whether the elements is a pixel array. |
| 807 __ bind(&check_pixel_array); | 808 __ bind(&check_pixel_array); |
| 808 // eax: value | 809 // eax: value |
| 809 // ecx: key (a smi) | 810 // ecx: key (a smi) |
| 810 // edx: receiver | 811 // edx: receiver |
| 811 // edi: elements array | 812 // edi: elements array |
| 812 GenerateFastPixelArrayStore(masm, | 813 GenerateFastPixelArrayStore(masm, |
| 813 edx, | 814 edx, |
| 814 ecx, | 815 ecx, |
| (...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1481 __ push(edx); // receiver | 1482 __ push(edx); // receiver |
| 1482 __ push(eax); // name | 1483 __ push(eax); // name |
| 1483 __ push(ebx); // return address | 1484 __ push(ebx); // return address |
| 1484 | 1485 |
| 1485 // Perform tail call to the entry. | 1486 // Perform tail call to the entry. |
| 1486 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); | 1487 __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
| 1487 } | 1488 } |
| 1488 | 1489 |
| 1489 | 1490 |
| 1490 void StoreIC::GenerateMegamorphic(MacroAssembler* masm, | 1491 void StoreIC::GenerateMegamorphic(MacroAssembler* masm, |
| 1491 Code::ExtraICState extra_ic_state) { | 1492 StrictModeFlag strict_mode) { |
| 1492 // ----------- S t a t e ------------- | 1493 // ----------- S t a t e ------------- |
| 1493 // -- eax : value | 1494 // -- eax : value |
| 1494 // -- ecx : name | 1495 // -- ecx : name |
| 1495 // -- edx : receiver | 1496 // -- edx : receiver |
| 1496 // -- esp[0] : return address | 1497 // -- esp[0] : return address |
| 1497 // ----------------------------------- | 1498 // ----------------------------------- |
| 1498 | 1499 |
| 1499 Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, | 1500 Code::Flags flags = Code::ComputeFlags(Code::STORE_IC, |
| 1500 NOT_IN_LOOP, | 1501 NOT_IN_LOOP, |
| 1501 MONOMORPHIC, | 1502 MONOMORPHIC, |
| 1502 extra_ic_state); | 1503 strict_mode); |
| 1503 StubCache::GenerateProbe(masm, flags, edx, ecx, ebx, no_reg); | 1504 StubCache::GenerateProbe(masm, flags, edx, ecx, ebx, no_reg); |
| 1504 | 1505 |
| 1505 // Cache miss: Jump to runtime. | 1506 // Cache miss: Jump to runtime. |
| 1506 GenerateMiss(masm); | 1507 GenerateMiss(masm); |
| 1507 } | 1508 } |
| 1508 | 1509 |
| 1509 | 1510 |
| 1510 void StoreIC::GenerateMiss(MacroAssembler* masm) { | 1511 void StoreIC::GenerateMiss(MacroAssembler* masm) { |
| 1511 // ----------- S t a t e ------------- | 1512 // ----------- S t a t e ------------- |
| 1512 // -- eax : value | 1513 // -- eax : value |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1610 | 1611 |
| 1611 __ bind(&restore_miss); | 1612 __ bind(&restore_miss); |
| 1612 __ pop(edx); | 1613 __ pop(edx); |
| 1613 | 1614 |
| 1614 __ bind(&miss); | 1615 __ bind(&miss); |
| 1615 __ IncrementCounter(&Counters::store_normal_miss, 1); | 1616 __ IncrementCounter(&Counters::store_normal_miss, 1); |
| 1616 GenerateMiss(masm); | 1617 GenerateMiss(masm); |
| 1617 } | 1618 } |
| 1618 | 1619 |
| 1619 | 1620 |
| 1620 void StoreIC::GenerateGlobalProxy(MacroAssembler* masm) { | 1621 void StoreIC::GenerateGlobalProxy(MacroAssembler* masm, |
| 1622 StrictModeFlag strict_mode) { |
| 1621 // ----------- S t a t e ------------- | 1623 // ----------- S t a t e ------------- |
| 1622 // -- eax : value | 1624 // -- eax : value |
| 1623 // -- ecx : name | 1625 // -- ecx : name |
| 1624 // -- edx : receiver | 1626 // -- edx : receiver |
| 1625 // -- esp[0] : return address | 1627 // -- esp[0] : return address |
| 1626 // ----------------------------------- | 1628 // ----------------------------------- |
| 1627 __ pop(ebx); | 1629 __ pop(ebx); |
| 1628 __ push(edx); | 1630 __ push(edx); |
| 1629 __ push(ecx); | 1631 __ push(ecx); |
| 1630 __ push(eax); | 1632 __ push(eax); |
| 1631 __ push(ebx); | 1633 __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes |
| 1634 __ push(Immediate(Smi::FromInt(strict_mode))); |
| 1635 __ push(ebx); // return address |
| 1632 | 1636 |
| 1633 // Do tail-call to runtime routine. | 1637 // Do tail-call to runtime routine. |
| 1634 __ TailCallRuntime(Runtime::kSetProperty, 3, 1); | 1638 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); |
| 1635 } | 1639 } |
| 1636 | 1640 |
| 1637 | 1641 |
| 1638 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm) { | 1642 void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, |
| 1643 StrictModeFlag strict_mode) { |
| 1639 // ----------- S t a t e ------------- | 1644 // ----------- S t a t e ------------- |
| 1640 // -- eax : value | 1645 // -- eax : value |
| 1641 // -- ecx : key | 1646 // -- ecx : key |
| 1642 // -- edx : receiver | 1647 // -- edx : receiver |
| 1643 // -- esp[0] : return address | 1648 // -- esp[0] : return address |
| 1644 // ----------------------------------- | 1649 // ----------------------------------- |
| 1645 | 1650 |
| 1646 __ pop(ebx); | 1651 __ pop(ebx); |
| 1647 __ push(edx); | 1652 __ push(edx); |
| 1648 __ push(ecx); | 1653 __ push(ecx); |
| 1649 __ push(eax); | 1654 __ push(eax); |
| 1650 __ push(ebx); | 1655 __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes |
| 1656 __ push(Immediate(Smi::FromInt(strict_mode))); // Strict mode. |
| 1657 __ push(ebx); // return address |
| 1651 | 1658 |
| 1652 // Do tail-call to runtime routine. | 1659 // Do tail-call to runtime routine. |
| 1653 __ TailCallRuntime(Runtime::kSetProperty, 3, 1); | 1660 __ TailCallRuntime(Runtime::kSetProperty, 5, 1); |
| 1654 } | 1661 } |
| 1655 | 1662 |
| 1656 | 1663 |
| 1657 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { | 1664 void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { |
| 1658 // ----------- S t a t e ------------- | 1665 // ----------- S t a t e ------------- |
| 1659 // -- eax : value | 1666 // -- eax : value |
| 1660 // -- ecx : key | 1667 // -- ecx : key |
| 1661 // -- edx : receiver | 1668 // -- edx : receiver |
| 1662 // -- esp[0] : return address | 1669 // -- esp[0] : return address |
| 1663 // ----------------------------------- | 1670 // ----------------------------------- |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1770 Condition cc = *jmp_address == Assembler::kJncShortOpcode | 1777 Condition cc = *jmp_address == Assembler::kJncShortOpcode |
| 1771 ? not_zero | 1778 ? not_zero |
| 1772 : zero; | 1779 : zero; |
| 1773 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 1780 *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); |
| 1774 } | 1781 } |
| 1775 | 1782 |
| 1776 | 1783 |
| 1777 } } // namespace v8::internal | 1784 } } // namespace v8::internal |
| 1778 | 1785 |
| 1779 #endif // V8_TARGET_ARCH_IA32 | 1786 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |