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 4820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4831 __ CheckPageFlag(regs_.object(), | 4831 __ CheckPageFlag(regs_.object(), |
4832 regs_.scratch0(), | 4832 regs_.scratch0(), |
4833 1 << MemoryChunk::SCAN_ON_SCAVENGE, | 4833 1 << MemoryChunk::SCAN_ON_SCAVENGE, |
4834 ne, | 4834 ne, |
4835 &dont_need_remembered_set); | 4835 &dont_need_remembered_set); |
4836 | 4836 |
4837 // First notify the incremental marker if necessary, then update the | 4837 // First notify the incremental marker if necessary, then update the |
4838 // remembered set. | 4838 // remembered set. |
4839 CheckNeedsToInformIncrementalMarker( | 4839 CheckNeedsToInformIncrementalMarker( |
4840 masm, kUpdateRememberedSetOnNoNeedToInformIncrementalMarker, mode); | 4840 masm, kUpdateRememberedSetOnNoNeedToInformIncrementalMarker, mode); |
4841 InformIncrementalMarker(masm, mode); | 4841 InformIncrementalMarker(masm); |
4842 regs_.Restore(masm); | 4842 regs_.Restore(masm); |
4843 __ RememberedSetHelper(object_, | 4843 __ RememberedSetHelper(object_, |
4844 address_, | 4844 address_, |
4845 value_, | 4845 value_, |
4846 save_fp_regs_mode_, | 4846 save_fp_regs_mode_, |
4847 MacroAssembler::kReturnAtEnd); | 4847 MacroAssembler::kReturnAtEnd); |
4848 | 4848 |
4849 __ bind(&dont_need_remembered_set); | 4849 __ bind(&dont_need_remembered_set); |
4850 } | 4850 } |
4851 | 4851 |
4852 CheckNeedsToInformIncrementalMarker( | 4852 CheckNeedsToInformIncrementalMarker( |
4853 masm, kReturnOnNoNeedToInformIncrementalMarker, mode); | 4853 masm, kReturnOnNoNeedToInformIncrementalMarker, mode); |
4854 InformIncrementalMarker(masm, mode); | 4854 InformIncrementalMarker(masm); |
4855 regs_.Restore(masm); | 4855 regs_.Restore(masm); |
4856 __ Ret(); | 4856 __ Ret(); |
4857 } | 4857 } |
4858 | 4858 |
4859 | 4859 |
4860 void RecordWriteStub::InformIncrementalMarker(MacroAssembler* masm, Mode mode) { | 4860 void RecordWriteStub::InformIncrementalMarker(MacroAssembler* masm) { |
4861 regs_.SaveCallerSaveRegisters(masm, save_fp_regs_mode_); | 4861 regs_.SaveCallerSaveRegisters(masm, save_fp_regs_mode_); |
4862 int argument_count = 3; | 4862 int argument_count = 3; |
4863 __ PrepareCallCFunction(argument_count, regs_.scratch0()); | 4863 __ PrepareCallCFunction(argument_count, regs_.scratch0()); |
4864 Register address = | 4864 Register address = |
4865 r0.is(regs_.address()) ? regs_.scratch0() : regs_.address(); | 4865 r0.is(regs_.address()) ? regs_.scratch0() : regs_.address(); |
4866 ASSERT(!address.is(regs_.object())); | 4866 ASSERT(!address.is(regs_.object())); |
4867 ASSERT(!address.is(r0)); | 4867 ASSERT(!address.is(r0)); |
4868 __ Move(address, regs_.address()); | 4868 __ Move(address, regs_.address()); |
4869 __ Move(r0, regs_.object()); | 4869 __ Move(r0, regs_.object()); |
4870 __ Move(r1, address); | 4870 __ Move(r1, address); |
4871 __ mov(r2, Operand(ExternalReference::isolate_address(masm->isolate()))); | 4871 __ mov(r2, Operand(ExternalReference::isolate_address(masm->isolate()))); |
4872 | 4872 |
4873 AllowExternalCallThatCantCauseGC scope(masm); | 4873 AllowExternalCallThatCantCauseGC scope(masm); |
4874 if (mode == INCREMENTAL_COMPACTION) { | 4874 __ CallCFunction( |
4875 __ CallCFunction( | 4875 ExternalReference::incremental_marking_record_write_function( |
4876 ExternalReference::incremental_evacuation_record_write_function( | 4876 masm->isolate()), |
4877 masm->isolate()), | 4877 argument_count); |
4878 argument_count); | |
4879 } else { | |
4880 ASSERT(mode == INCREMENTAL); | |
4881 __ CallCFunction( | |
4882 ExternalReference::incremental_marking_record_write_function( | |
4883 masm->isolate()), | |
4884 argument_count); | |
4885 } | |
4886 regs_.RestoreCallerSaveRegisters(masm, save_fp_regs_mode_); | 4878 regs_.RestoreCallerSaveRegisters(masm, save_fp_regs_mode_); |
4887 } | 4879 } |
4888 | 4880 |
4889 | 4881 |
4890 void RecordWriteStub::CheckNeedsToInformIncrementalMarker( | 4882 void RecordWriteStub::CheckNeedsToInformIncrementalMarker( |
4891 MacroAssembler* masm, | 4883 MacroAssembler* masm, |
4892 OnNoNeedToInformIncrementalMarker on_no_need, | 4884 OnNoNeedToInformIncrementalMarker on_no_need, |
4893 Mode mode) { | 4885 Mode mode) { |
4894 Label on_black; | 4886 Label on_black; |
4895 Label need_incremental; | 4887 Label need_incremental; |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5580 MemOperand(fp, 6 * kPointerSize), | 5572 MemOperand(fp, 6 * kPointerSize), |
5581 NULL); | 5573 NULL); |
5582 } | 5574 } |
5583 | 5575 |
5584 | 5576 |
5585 #undef __ | 5577 #undef __ |
5586 | 5578 |
5587 } } // namespace v8::internal | 5579 } } // namespace v8::internal |
5588 | 5580 |
5589 #endif // V8_TARGET_ARCH_ARM | 5581 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |