OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #if V8_TARGET_ARCH_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
6 | 6 |
7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 3137 matching lines...) Loading... |
3148 | 3148 |
3149 | 3149 |
3150 void RecordWriteStub::CheckNeedsToInformIncrementalMarker( | 3150 void RecordWriteStub::CheckNeedsToInformIncrementalMarker( |
3151 MacroAssembler* masm, | 3151 MacroAssembler* masm, |
3152 OnNoNeedToInformIncrementalMarker on_no_need, | 3152 OnNoNeedToInformIncrementalMarker on_no_need, |
3153 Mode mode) { | 3153 Mode mode) { |
3154 Label on_black; | 3154 Label on_black; |
3155 Label need_incremental; | 3155 Label need_incremental; |
3156 Label need_incremental_pop_scratch; | 3156 Label need_incremental_pop_scratch; |
3157 | 3157 |
3158 Register mem_chunk = regs_.scratch0(); | |
3159 Register counter = regs_.scratch1(); | |
3160 __ Bic(mem_chunk, regs_.object(), Page::kPageAlignmentMask); | |
3161 __ Ldr(counter, | |
3162 MemOperand(mem_chunk, MemoryChunk::kWriteBarrierCounterOffset)); | |
3163 __ Subs(counter, counter, 1); | |
3164 __ Str(counter, | |
3165 MemOperand(mem_chunk, MemoryChunk::kWriteBarrierCounterOffset)); | |
3166 __ B(mi, &need_incremental); | |
3167 | |
3168 // If the object is not black we don't have to inform the incremental marker. | 3158 // If the object is not black we don't have to inform the incremental marker. |
3169 __ JumpIfBlack(regs_.object(), regs_.scratch0(), regs_.scratch1(), &on_black); | 3159 __ JumpIfBlack(regs_.object(), regs_.scratch0(), regs_.scratch1(), &on_black); |
3170 | 3160 |
3171 regs_.Restore(masm); // Restore the extra scratch registers we used. | 3161 regs_.Restore(masm); // Restore the extra scratch registers we used. |
3172 if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) { | 3162 if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) { |
3173 __ RememberedSetHelper(object(), address(), | 3163 __ RememberedSetHelper(object(), address(), |
3174 value(), // scratch1 | 3164 value(), // scratch1 |
3175 save_fp_regs_mode(), MacroAssembler::kReturnAtEnd); | 3165 save_fp_regs_mode(), MacroAssembler::kReturnAtEnd); |
3176 } else { | 3166 } else { |
3177 __ Ret(); | 3167 __ Ret(); |
(...skipping 2357 matching lines...) Loading... |
5535 kStackUnwindSpace, NULL, spill_offset, | 5525 kStackUnwindSpace, NULL, spill_offset, |
5536 return_value_operand, NULL); | 5526 return_value_operand, NULL); |
5537 } | 5527 } |
5538 | 5528 |
5539 #undef __ | 5529 #undef __ |
5540 | 5530 |
5541 } // namespace internal | 5531 } // namespace internal |
5542 } // namespace v8 | 5532 } // namespace v8 |
5543 | 5533 |
5544 #endif // V8_TARGET_ARCH_ARM64 | 5534 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |