Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Side by Side Diff: src/arm/macro-assembler-arm.cc

Issue 421923003: Support for dynamic write-barrier counters everywhere. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | src/arm64/macro-assembler-arm64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #include <limits.h> // For LONG_MIN, LONG_MAX. 5 #include <limits.h> // For LONG_MIN, LONG_MAX.
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #if V8_TARGET_ARCH_ARM 9 #if V8_TARGET_ARCH_ARM
10 10
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 if (emit_debug_code()) { 514 if (emit_debug_code()) {
515 ldr(dst, FieldMemOperand(map, HeapObject::kMapOffset)); 515 ldr(dst, FieldMemOperand(map, HeapObject::kMapOffset));
516 cmp(dst, Operand(isolate()->factory()->meta_map())); 516 cmp(dst, Operand(isolate()->factory()->meta_map()));
517 Check(eq, kWrongAddressOrValuePassedToRecordWrite); 517 Check(eq, kWrongAddressOrValuePassedToRecordWrite);
518 } 518 }
519 519
520 if (!FLAG_incremental_marking) { 520 if (!FLAG_incremental_marking) {
521 return; 521 return;
522 } 522 }
523 523
524 // Count number of write barriers in generated code.
525 isolate()->counters()->write_barriers_static()->Increment();
526 // TODO(mstarzinger): Dynamic counter missing.
527
528 if (emit_debug_code()) { 524 if (emit_debug_code()) {
529 ldr(ip, FieldMemOperand(object, HeapObject::kMapOffset)); 525 ldr(ip, FieldMemOperand(object, HeapObject::kMapOffset));
530 cmp(ip, map); 526 cmp(ip, map);
531 Check(eq, kWrongAddressOrValuePassedToRecordWrite); 527 Check(eq, kWrongAddressOrValuePassedToRecordWrite);
532 } 528 }
533 529
534 Label done; 530 Label done;
535 531
536 // A single check of the map's pages interesting flag suffices, since it is 532 // A single check of the map's pages interesting flag suffices, since it is
537 // only set during incremental collection, and then it's also guaranteed that 533 // only set during incremental collection, and then it's also guaranteed that
(...skipping 20 matching lines...) Expand all
558 } 554 }
559 RecordWriteStub stub(isolate(), object, map, dst, OMIT_REMEMBERED_SET, 555 RecordWriteStub stub(isolate(), object, map, dst, OMIT_REMEMBERED_SET,
560 fp_mode); 556 fp_mode);
561 CallStub(&stub); 557 CallStub(&stub);
562 if (lr_status == kLRHasNotBeenSaved) { 558 if (lr_status == kLRHasNotBeenSaved) {
563 pop(lr); 559 pop(lr);
564 } 560 }
565 561
566 bind(&done); 562 bind(&done);
567 563
564 // Count number of write barriers in generated code.
565 isolate()->counters()->write_barriers_static()->Increment();
566 IncrementCounter(isolate()->counters()->write_barriers_dynamic(), 1, ip, dst);
567
568 // Clobber clobbered registers when running with the debug-code flag 568 // Clobber clobbered registers when running with the debug-code flag
569 // turned on to provoke errors. 569 // turned on to provoke errors.
570 if (emit_debug_code()) { 570 if (emit_debug_code()) {
571 mov(dst, Operand(BitCast<int32_t>(kZapValue + 12))); 571 mov(dst, Operand(BitCast<int32_t>(kZapValue + 12)));
572 mov(map, Operand(BitCast<int32_t>(kZapValue + 16))); 572 mov(map, Operand(BitCast<int32_t>(kZapValue + 16)));
573 } 573 }
574 } 574 }
575 575
576 576
577 // Will clobber 4 registers: object, address, scratch, ip. The 577 // Will clobber 4 registers: object, address, scratch, ip. The
(...skipping 13 matching lines...) Expand all
591 ldr(ip, MemOperand(address)); 591 ldr(ip, MemOperand(address));
592 cmp(ip, value); 592 cmp(ip, value);
593 Check(eq, kWrongAddressOrValuePassedToRecordWrite); 593 Check(eq, kWrongAddressOrValuePassedToRecordWrite);
594 } 594 }
595 595
596 if (remembered_set_action == OMIT_REMEMBERED_SET && 596 if (remembered_set_action == OMIT_REMEMBERED_SET &&
597 !FLAG_incremental_marking) { 597 !FLAG_incremental_marking) {
598 return; 598 return;
599 } 599 }
600 600
601 // Count number of write barriers in generated code.
602 isolate()->counters()->write_barriers_static()->Increment();
603 // TODO(mstarzinger): Dynamic counter missing.
604
605 // First, check if a write barrier is even needed. The tests below 601 // First, check if a write barrier is even needed. The tests below
606 // catch stores of smis and stores into the young generation. 602 // catch stores of smis and stores into the young generation.
607 Label done; 603 Label done;
608 604
609 if (smi_check == INLINE_SMI_CHECK) { 605 if (smi_check == INLINE_SMI_CHECK) {
610 JumpIfSmi(value, &done); 606 JumpIfSmi(value, &done);
611 } 607 }
612 608
613 if (pointers_to_here_check_for_value != kPointersToHereAreAlwaysInteresting) { 609 if (pointers_to_here_check_for_value != kPointersToHereAreAlwaysInteresting) {
614 CheckPageFlag(value, 610 CheckPageFlag(value,
(...skipping 14 matching lines...) Expand all
629 } 625 }
630 RecordWriteStub stub(isolate(), object, value, address, remembered_set_action, 626 RecordWriteStub stub(isolate(), object, value, address, remembered_set_action,
631 fp_mode); 627 fp_mode);
632 CallStub(&stub); 628 CallStub(&stub);
633 if (lr_status == kLRHasNotBeenSaved) { 629 if (lr_status == kLRHasNotBeenSaved) {
634 pop(lr); 630 pop(lr);
635 } 631 }
636 632
637 bind(&done); 633 bind(&done);
638 634
635 // Count number of write barriers in generated code.
636 isolate()->counters()->write_barriers_static()->Increment();
637 IncrementCounter(isolate()->counters()->write_barriers_dynamic(), 1, ip,
638 value);
639
639 // Clobber clobbered registers when running with the debug-code flag 640 // Clobber clobbered registers when running with the debug-code flag
640 // turned on to provoke errors. 641 // turned on to provoke errors.
641 if (emit_debug_code()) { 642 if (emit_debug_code()) {
642 mov(address, Operand(BitCast<int32_t>(kZapValue + 12))); 643 mov(address, Operand(BitCast<int32_t>(kZapValue + 12)));
643 mov(value, Operand(BitCast<int32_t>(kZapValue + 16))); 644 mov(value, Operand(BitCast<int32_t>(kZapValue + 16)));
644 } 645 }
645 } 646 }
646 647
647 648
648 void MacroAssembler::RememberedSetHelper(Register object, // For debug tests. 649 void MacroAssembler::RememberedSetHelper(Register object, // For debug tests.
(...skipping 3453 matching lines...) Expand 10 before | Expand all | Expand 10 after
4102 sub(result, result, Operand(dividend)); 4103 sub(result, result, Operand(dividend));
4103 } 4104 }
4104 if (ms.shift() > 0) mov(result, Operand(result, ASR, ms.shift())); 4105 if (ms.shift() > 0) mov(result, Operand(result, ASR, ms.shift()));
4105 add(result, result, Operand(dividend, LSR, 31)); 4106 add(result, result, Operand(dividend, LSR, 31));
4106 } 4107 }
4107 4108
4108 4109
4109 } } // namespace v8::internal 4110 } } // namespace v8::internal
4110 4111
4111 #endif // V8_TARGET_ARCH_ARM 4112 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/arm64/macro-assembler-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698