| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 5615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5626 | 5626 |
| 5627 // The first two instructions are generated with labels so as to get the | 5627 // The first two instructions are generated with labels so as to get the |
| 5628 // offset fixed up correctly by the bind(Label*) call. We patch it back and | 5628 // offset fixed up correctly by the bind(Label*) call. We patch it back and |
| 5629 // forth between a compare instructions (a nop in this position) and the | 5629 // forth between a compare instructions (a nop in this position) and the |
| 5630 // real branch when we start and stop incremental heap marking. | 5630 // real branch when we start and stop incremental heap marking. |
| 5631 // See RecordWriteStub::Patch for details. | 5631 // See RecordWriteStub::Patch for details. |
| 5632 __ jmp(&skip_to_incremental_noncompacting, Label::kNear); | 5632 __ jmp(&skip_to_incremental_noncompacting, Label::kNear); |
| 5633 __ jmp(&skip_to_incremental_compacting, Label::kFar); | 5633 __ jmp(&skip_to_incremental_compacting, Label::kFar); |
| 5634 | 5634 |
| 5635 if (remembered_set_action_ == EMIT_REMEMBERED_SET) { | 5635 if (remembered_set_action_ == EMIT_REMEMBERED_SET) { |
| 5636 __ RememberedSetHelper( | 5636 __ RememberedSetHelper(object_, |
| 5637 address_, value_, save_fp_regs_mode_, MacroAssembler::kReturnAtEnd); | 5637 address_, |
| 5638 value_, |
| 5639 save_fp_regs_mode_, |
| 5640 MacroAssembler::kReturnAtEnd); |
| 5638 } else { | 5641 } else { |
| 5639 __ ret(0); | 5642 __ ret(0); |
| 5640 } | 5643 } |
| 5641 | 5644 |
| 5642 __ bind(&skip_to_incremental_noncompacting); | 5645 __ bind(&skip_to_incremental_noncompacting); |
| 5643 GenerateIncremental(masm, INCREMENTAL); | 5646 GenerateIncremental(masm, INCREMENTAL); |
| 5644 | 5647 |
| 5645 __ bind(&skip_to_incremental_compacting); | 5648 __ bind(&skip_to_incremental_compacting); |
| 5646 GenerateIncremental(masm, INCREMENTAL_COMPACTION); | 5649 GenerateIncremental(masm, INCREMENTAL_COMPACTION); |
| 5647 | 5650 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 5668 1 << MemoryChunk::SCAN_ON_SCAVENGE, | 5671 1 << MemoryChunk::SCAN_ON_SCAVENGE, |
| 5669 not_zero, | 5672 not_zero, |
| 5670 &dont_need_remembered_set); | 5673 &dont_need_remembered_set); |
| 5671 | 5674 |
| 5672 // First notify the incremental marker if necessary, then update the | 5675 // First notify the incremental marker if necessary, then update the |
| 5673 // remembered set. | 5676 // remembered set. |
| 5674 CheckNeedsToInformIncrementalMarker( | 5677 CheckNeedsToInformIncrementalMarker( |
| 5675 masm, kUpdateRememberedSetOnNoNeedToInformIncrementalMarker, mode); | 5678 masm, kUpdateRememberedSetOnNoNeedToInformIncrementalMarker, mode); |
| 5676 InformIncrementalMarker(masm, mode); | 5679 InformIncrementalMarker(masm, mode); |
| 5677 regs_.Restore(masm); | 5680 regs_.Restore(masm); |
| 5678 __ RememberedSetHelper( | 5681 __ RememberedSetHelper(object_, |
| 5679 address_, value_, save_fp_regs_mode_, MacroAssembler::kReturnAtEnd); | 5682 address_, |
| 5683 value_, |
| 5684 save_fp_regs_mode_, |
| 5685 MacroAssembler::kReturnAtEnd); |
| 5680 | 5686 |
| 5681 __ bind(&dont_need_remembered_set); | 5687 __ bind(&dont_need_remembered_set); |
| 5682 } | 5688 } |
| 5683 | 5689 |
| 5684 CheckNeedsToInformIncrementalMarker( | 5690 CheckNeedsToInformIncrementalMarker( |
| 5685 masm, kReturnOnNoNeedToInformIncrementalMarker, mode); | 5691 masm, kReturnOnNoNeedToInformIncrementalMarker, mode); |
| 5686 InformIncrementalMarker(masm, mode); | 5692 InformIncrementalMarker(masm, mode); |
| 5687 regs_.Restore(masm); | 5693 regs_.Restore(masm); |
| 5688 __ ret(0); | 5694 __ ret(0); |
| 5689 } | 5695 } |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5745 // Let's look at the color of the object: If it is not black we don't have | 5751 // Let's look at the color of the object: If it is not black we don't have |
| 5746 // to inform the incremental marker. | 5752 // to inform the incremental marker. |
| 5747 __ JumpIfBlack(regs_.object(), | 5753 __ JumpIfBlack(regs_.object(), |
| 5748 regs_.scratch0(), | 5754 regs_.scratch0(), |
| 5749 regs_.scratch1(), | 5755 regs_.scratch1(), |
| 5750 &on_black, | 5756 &on_black, |
| 5751 Label::kNear); | 5757 Label::kNear); |
| 5752 | 5758 |
| 5753 regs_.Restore(masm); | 5759 regs_.Restore(masm); |
| 5754 if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) { | 5760 if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) { |
| 5755 __ RememberedSetHelper( | 5761 __ RememberedSetHelper(object_, |
| 5756 address_, value_, save_fp_regs_mode_, MacroAssembler::kReturnAtEnd); | 5762 address_, |
| 5763 value_, |
| 5764 save_fp_regs_mode_, |
| 5765 MacroAssembler::kReturnAtEnd); |
| 5757 } else { | 5766 } else { |
| 5758 __ ret(0); | 5767 __ ret(0); |
| 5759 } | 5768 } |
| 5760 | 5769 |
| 5761 __ bind(&on_black); | 5770 __ bind(&on_black); |
| 5762 | 5771 |
| 5763 // Get the value from the slot. | 5772 // Get the value from the slot. |
| 5764 __ movq(regs_.scratch0(), Operand(regs_.address(), 0)); | 5773 __ movq(regs_.scratch0(), Operand(regs_.address(), 0)); |
| 5765 | 5774 |
| 5766 if (mode == INCREMENTAL_COMPACTION) { | 5775 if (mode == INCREMENTAL_COMPACTION) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 5787 __ push(regs_.object()); | 5796 __ push(regs_.object()); |
| 5788 __ EnsureNotWhite(regs_.scratch0(), // The value. | 5797 __ EnsureNotWhite(regs_.scratch0(), // The value. |
| 5789 regs_.scratch1(), // Scratch. | 5798 regs_.scratch1(), // Scratch. |
| 5790 regs_.object(), // Scratch. | 5799 regs_.object(), // Scratch. |
| 5791 &need_incremental_pop_object, | 5800 &need_incremental_pop_object, |
| 5792 Label::kNear); | 5801 Label::kNear); |
| 5793 __ pop(regs_.object()); | 5802 __ pop(regs_.object()); |
| 5794 | 5803 |
| 5795 regs_.Restore(masm); | 5804 regs_.Restore(masm); |
| 5796 if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) { | 5805 if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) { |
| 5797 __ RememberedSetHelper( | 5806 __ RememberedSetHelper(object_, |
| 5798 address_, value_, save_fp_regs_mode_, MacroAssembler::kReturnAtEnd); | 5807 address_, |
| 5808 value_, |
| 5809 save_fp_regs_mode_, |
| 5810 MacroAssembler::kReturnAtEnd); |
| 5799 } else { | 5811 } else { |
| 5800 __ ret(0); | 5812 __ ret(0); |
| 5801 } | 5813 } |
| 5802 | 5814 |
| 5803 __ bind(&need_incremental_pop_object); | 5815 __ bind(&need_incremental_pop_object); |
| 5804 __ pop(regs_.object()); | 5816 __ pop(regs_.object()); |
| 5805 | 5817 |
| 5806 __ bind(&need_incremental); | 5818 __ bind(&need_incremental); |
| 5807 | 5819 |
| 5808 // Fall through when we need to inform the incremental marker. | 5820 // Fall through when we need to inform the incremental marker. |
| 5809 } | 5821 } |
| 5810 | 5822 |
| 5811 | 5823 |
| 5812 #undef __ | 5824 #undef __ |
| 5813 | 5825 |
| 5814 } } // namespace v8::internal | 5826 } } // namespace v8::internal |
| 5815 | 5827 |
| 5816 #endif // V8_TARGET_ARCH_X64 | 5828 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |